언어/c언어

c언어 행렬 구현

파아랑새 2016. 2. 25. 22:38

#include <stdio.h>
typedef int Matrix;
#define ROW 2
#define COL 2
#define X *
#define TRUE 1
#define FALSE 0
//------------------ << Function >> ---------------------------
//Func[1]
void data_input(int (*arr)[2], int (*brr)[2]);
//Func[2]
void Matrix_Multiplication(int (*arr)[2], int (*brr)[2], int (*crr)[2]);
//Func[3]
int Matrix_Determin(int (*tmp)[2]);
//Func[4]
void Inverse_Matrix(int (*tmp)[2]);
//----------------- <<    Main    >> --------------------------
int main(void){
    Matrix A_MA[ROW][COL];
    Matrix B_MA[ROW][COL];
    Matrix C_MA[ROW][COL];
    int indexi, indexj;
    //initiallize ------------------------------------
    for (indexi = 0; indexi< ROW; indexi++) {
        for (indexj = 0; indexj< COL; indexj++) {
            A_MA[indexi][indexj] = 0;
            B_MA[indexi][indexj] = 0;
            C_MA[indexi][indexj] = 0;
        }
    }
    //------------------------------------------------
    data_input(A_MA, B_MA);
    Matrix_Multiplication(A_MA, B_MA, C_MA);
    Inverse_Matrix(A_MA);
    return 0;
}
//----------------<< Func[1] >>----------------------
void data_input(int (*arr)[2], int (*brr)[2]) {
    //[1] arr[ROW][COL] data input!!!!
    int i, j;
    for(i = 0; i<ROW; i++) {
        for(j = 0; j<COL; j++) {
            printf("arr[%d][%d] input >>>        ", i, j);
            scanf("%d", &arr[i][j]);
            }
    }
    //[2] brr[ROW][COL] data input!!!!
    for(i = 0; i<ROW; i++) {
        for(j = 0; j<COL; j++) {
            printf("brr[%d][%d] input >>>        ", i, j);
            scanf("%d", &brr[i][j]);
        }
    }
    //[3] arr[ROW][COL] data printf!!!!
    printf(" ------------<< arr >>-------------- \n");
    for(i = 0; i<ROW; i++) {
        for(j = 0; j<COL; j++) {
            printf("arr[%2d][%2d] = [%2d] ", i, j, *(*(arr+i)+j));
            if( j == COL-1) printf("\n");
        }
    }
    //[4] brr[ROW][COL] data printf!!!!
    printf(" ------------<< brr >>-------------- \n");
    for(i = 0; i<ROW; i++) {
        for(j = 0; j<COL; j++) {
            printf("brr[%2d][%2d] = [%2d] ", i, j, *(*(brr+i)+j));
            if( j== COL-1) printf("\n");
        }
    }
}
void Matrix_Multiplication(int (*arr)[2], int (*brr)[2], int (*crr)[2]) {
    int i, j, k;
    int sum = 0;
    for (k = 0; k<2; k++)    {
        for (i=0; i<ROW; i++)    {
            for (j = 0; j<COL; j++)    {
                sum = sum + *(*(arr+k)+j) X *(*(brr+j)+i);
                // 00 * 00 + 01 * 10
                // 00 * 01 + 01 * 11
                // 10 * 00 + 11 * 10
                // 10 * 01 + 11 * 11
            }
            *(*(crr+k)+ i) = sum;
            sum = 0;
        }
    }
    printf(" ------------<< crr >>-------------- \n");
    for(i = 0; i<ROW; i++) {
        for(j = 0; j<COL; j++) {
            printf("crr[%2d][%2d] = [%2d] ", i, j, *(*(crr+i)+j));
            if( j== COL-1) printf("\n");
        }
    }
}
int Matrix_Determin(int (*tmp)[2]) {
/*
    A =    [ a11    a12]
           [ a21    a22]
   det(A) = a11*a22 - a12*a21
*/
    int determin = 0;
    determin = tmp[0][0]*tmp[1][1] - tmp[0][1]*tmp[1][0] ;
    printf("determin is [%d] \n", determin);
    if ( determin == 0 )    return FALSE;
    else return determin;
}   
void Inverse_Matrix(int (*tmp)[2]) {
    int i, j;
    int det = 0;
    int tmp_i = 0;
    det = Matrix_Determin(tmp);
    if(det == 0){
        printf(" not inverse \n");
        return;//END
    }
    else
    {    printf("inverse\n");
        /*
        1/D(A) [ a22    -a12]
               [-a21     a11]
        */
        tmp_i = tmp[0][0];
        tmp[0][0] = tmp[1][1];
        tmp[1][1] = tmp_i;
        tmp[0][1] = (-1) X tmp[0][1];
        tmp[1][0] = (-1) X tmp[1][0];

        for(i = 0; i<ROW; i++) {
            for(j = 0; j<COL; j++) {
                printf("[%2d] / det[%2d] ", tmp[i][j],det);
                if(j== COL-1) printf("\n");
            }
        }
    }
}