전산수학 – Matrix * Matrix. c (행렬의 곱셈)

행렬의 곱셈 로직

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);

}

Leave a Reply

Your email address will not be published. Required fields are marked *