언어/c언어

지식인 풀이

파아랑새 2018. 10. 9. 17:30


# 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