행렬의 곱셈 로직
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);
}