행렬의 곱셈 로직
0. 행렬로 사용할 2차원 배열을 만듬 < 구조체로 만듬 >
0-2. 구조체 배열로 만들어서 [0]배열은 A행렬, [1]배열은 B행렬, [2]배열은 A*B행렬로 사용
1. 사용자로부터 m,k를 입력받음
2. 각 행의 요소들을 정수형으로 입력받음
3. 정수들이 저장된 배열을 인덱스로 나누어서 [0]배열에 넣음 (m*k행렬 완성)
4. n을 입력받음
5. n개수만큼 정수를 입력함
6. 문자열이 저장된 배열을 인덱스로 나누어서 [1]배열에 넣음 (k*n행렬 완성)
7. for문 2번 중첩으로 (m*k)*(k*n)구한 후 [2]배열에 넣음 (AB행렬 완성)
8. 최종 출력
#include <stdio.h> #define max 10 typedef struct { int array[max][max]; // 행렬을 나타내는 2차원 배열 }matrix_type; typedef matrix_type * matrix_ptr; matrix_type matrix[3]; void multiply(int m, int k, int n) { // m*k행렬을 담는 2차원 배열 (=) matrix[0].array[m][k] // k*n행렬을 담는 2차원 배열 (=) matrix[1].array[k][n] // (m*k)*(k*n)행렬을 담을 2차원 배열 (=) matrix[2].array[m][n] int sum; // 임시변수 for (int i = 0; i < m; i++) { // 3. (2)를 A행렬의 행만큼 반복 <아래 사항> for (int j = 0; j < n; j++) { // 2. (1)을 B행렬의 열만큼 반복 <더해진 것을 AB행렬 요소에 넣기> sum = 0; for (int h = 0; h < k; h++) { // 1. A행렬의 열만큼, B행렬의 행만큼 반복 <곱하고 더하기> sum += matrix[0].array[i][h] * matrix[1].array[h][j]; // A행렬의 요소 인덱스는 [i][h], B행렬의 요소 인덱스는 [h][j] } matrix[2].array[i][j] = sum; } } } void input_processing(int a, int b, matrix_ptr m) { // matrix[0]이 오면 a=m(행), b=k(열) // matrix[1]이 오면 a=k(행), b=n(열) for (int i = 0; i < a; i++) { printf("○ %d행의 요소를 입력하세요:", i + 1); for (int j = 0; j < b; j++) scanf_s("%d", &m->array[i][j]); } // scanf는 띄어쓰기가 들어가면 (저장 후) 멈춤 -> 다시 for문으로 감 (열 개수 만큼 반복) } void display(int situation, int *m, int *k, int *n) { switch (situation) { case 0: printf("<< 문제 >>\n\n"); printf("m*k행렬 A와 k*n행렬 B가 주어졌을 때 AB를 구하여라\n\n"); printf("1. m*k행렬에서 m,k 값을 입력해주세요\n < ex) 2*2행렬을 하고 싶으면 -> 2 2 > :"); scanf_s("%d%d", m, k); printf("\nm*k행렬은 %d*%d행렬입니다!!", *m, *k); printf("\n%d열만큼 요소를 입력해주세요!! < ex) 3열인 행렬이면 1 2 3 >\n\n", *k); break; case 1: printf("\n2. k*n행렬에서 n 값을 입력해주세요 (현재 k=%d)\n < ex) k*4행렬을 하고 싶으면 -> 4 > :", *k); scanf_s("%d", n); printf("\nk*n행렬은 %d*%d행렬입니다!!", *k, *n); printf("\n%d열만큼 요소를 입력해주세요!! < ex) 3열인 행렬이면 1 2 3 >\n\n", *n); break; case 2: printf("\n\n<< 정답 >>\n"); printf("\nA행렬 (m*k)을 구하면 ↓↓ \n"); for (int i = 0; i < *m; i++) { for (int j = 0; j < *k; j++) printf("%d ", matrix[0].array[i][j]); printf("\n"); } printf("\nB행렬 (k*n)을 구하면 ↓↓ \n"); for (int i = 0; i < *k; i++) { for (int j = 0; j < *n; j++) printf("%d ", matrix[1].array[i][j]); printf("\n"); } printf("\nAB행렬 (m*n)을 구하면 ↓↓ \n"); for (int i = 0; i < *m; i++) { for (int j = 0; j < *n; j++) printf("%d ", matrix[2].array[i][j]); printf("\n"); } break; } } int main(void) { int m, k, n; // m*k 행렬 구하기 display(0, &m, &k, &n); input_processing(m, k, &matrix[0]); // k*n 행렬 구하기 display(1, &m, &k, &n); input_processing(k, n, &matrix[1]); // 행렬 및 행렬의 곱 구하기 multiply(m, k, n); display(2, &m, &k, &n); }