지식인 풀이
# include <stdio.h>
# include <stdlib.h>
# include <stdbool.h>
# include <time.h>
# define NR 10 // ROW
# define NC 10 // COL
# define ERROR 1
# define SIZE 3
typedef struct MatOne {
/*
default 10 by 10 행렬
*/
int arr[NR][NC];
int row; // arrOne의 행
int col; // arrOne의 열
}MatInfo;
// function prototype -----------
void init(MatInfo** param);
void sizeRowCol(MatInfo** param);
void matValueInsert(MatInfo** param);
bool sizeCompare(MatInfo** M1, MatInfo** M2, MatInfo** M3);
void mulMatResult(MatInfo** M1, MatInfo** M2, MatInfo** M3);
void mulMatPrintf(MatInfo** M3);
void Tmatrix(MatInfo** M3);
// ------------------------------
int main(void) {
int i;
bool bValue = false;
MatInfo* matrix[3] = { 0, };
for (i = 0; i < 3; i++) {
matrix[i] = (MatInfo*)malloc(sizeof(MatInfo));
if (matrix[i] == NULL) {
printf("malloc error ... \n");
exit(ERROR);
}
else {
//matrix[i] != NULL
init(&matrix[i]);
if (i == 0 || i == 1) {
printf("%02d 번째 행렬 사이즈 조정\n", i + 1);
sizeRowCol((matrix + i));
matValueInsert((matrix + i));
printf("=====================\n");
}
}
}
bValue = sizeCompare(&matrix[0], &matrix[1], &matrix[2]);
if (bValue) {
printf("행렬 곱이 가능 합니다.\n");
mulMatResult(&matrix[0], &matrix[1], &matrix[2]);
printf("행렬 곱 ======================\n");
mulMatPrintf(&matrix[2]);
printf("==============================\n");
printf("전치행렬 ======================\n");
Tmatrix(&matrix[2]);
printf("==============================\n");
}
else {
printf("행렬 곱이 불가능 합니다.\n");
exit(ERROR);
}
for (i = 0; i < SIZE; i++) {
free(matrix[i]);
}
return 0;
}
// ------------------------------
void init(MatInfo** param) {
// 데이터 초기화 작업
int i, j;
for (i = 0; i < NR; i++) {
for (j = 0; j < NC; j++) {
(**param).arr[i][j] = 0;
}
}
(**param).row = 0x0;
(**param).col = 0x0;
} // end of init function
void sizeRowCol(MatInfo** param) {
while (1) {
// 행의 크기 입력
printf("row size input: ");
scanf("%d", &(*param)->row);
// 열의 크기 입력
printf("column size input: ");
scanf("%d", &(*param)->col);
if (((**param).row > 0 && (**param).row <= NR-1) &&
((**param).col > 0 && (**param).col <= NC-1)) {
printf("범위 성공!!! \n");
break;
}
else {
printf("plz : 0 < N <= %d \n",NR);
}
}
} // end of sizeRowCol function
void matValueInsert(MatInfo** param) {
srand((unsigned)time(NULL));
int i, j;
// 랜덤으로 데이터 적재
for (i = 0; i < (**param).row; i++) {
for (j = 0; j < (**param).col; j++) {
(** param).arr[i][j] = rand() % 20 + 1;
// range : 1 <= N <= 20
}
}
// 데이터 출력
for (i = 0; i < (**param).row; i++) {
for (j = 0; j < (**param).col; j++) {
printf("%02d", (** param).arr[i][j]);
if (j != (**param).col - 1) {
printf(" ");
}
}
printf("\n");
}
} // end of matValueInsert function
bool sizeCompare(MatInfo** M1, MatInfo** M2, MatInfo** M3) {
/*
case 1) A(2by4) x B(4by2) = C(2by2)
case 2) A(2by4) x B(3by2) = 행렬 곱셈 불가
결론 : 앞행렬의 열과 뒤행렬의 행의 크기가 같아야 연산 가능
*/
if ((**M1).col == (**M2).row) {
(**M3).row = (**M1).row;
(**M3).col = (**M2).col;
return true;
}
else {
return false;
}
} // end of sizeCompare function
void mulMatResult(MatInfo** M1, MatInfo** M2, MatInfo** M3) {
int i, j, k; // index
int temp;
for (i = 0; i < (**M1).row; i++) {
for (k = 0; k < (**M2).col; k++) {
temp = 0x0;
for (j = 0; j < (**M1).col; j++) {
temp += (**M1).arr[i][j] * (**M2).arr[j][k];
}
(**M3).arr[i][k] = temp;
}
}
} // end of matMatResult function
void mulMatPrintf(MatInfo** M3) {
int i, j;
for (i = 0; i < (**M3).row; i++) {
// 행
for (j = 0; j < (**M3).col; j++) {
// 열
printf("%02d", (**M3).arr[i][j]);
if (j != (**M3).col - 1) {
printf(" ");
}
}
printf("\n");
}
} // end of matMatPrintf function
void Tmatrix(MatInfo** M3) {
int Tmatrix[NR][NC] = { 0, };
int i, j; // index
for (i = 0; i < (** M3).col; i++) {
for (j = 0; j < (** M3).row; j++) {
Tmatrix[i][j] = (** M3).arr[j][i];
/*
00 => 00
01 => 10
*/
printf("%02d", Tmatrix[i][j]);
if (j != (** M3).row - 1) {
printf(" ");
}
}
printf("\n");
}
} // end of Tmatrix function