C++ 행렬 연산 계산기 (역행렬 구하기 포함)
프로그래밍

C++ 행렬 연산 계산기 (역행렬 구하기 포함)

반응형

C++로 행렬 연산 계산기를 만들어 보았다. 연산자에 i를 입력하면 역행렬도 구할 수 있다.

 

 

반응형

[소스코드]

#include <stdio.h>

int main() {
    float A[2][2]; //첫번째 2x2행렬 생성
    float B[2][2]; //두번째 2x2행렬 생성
    float C[2][2] = { 0,0,0,0 }; //결과 2x2행렬 생성, 0으로 초기화
    char c; //연산자

    printf("수행할 연산자를 입력하시오: ");
    scanf_s("%c", &c); //연산자를 입력 받음
    
    //만약 연산자가 i일 경우 배열 A만 입력받음
    if (c == 105) {
        printf("2x2 행렬을 입력하시오: ");
        scanf_s("%f %f %f %f", &A[0][0], &A[0][1], &A[1][0], &A[1][1]);
        printf("\n");

        float D = *(*(A + 0) + 0)* *(*(A + 1) + 1) - *(*(A + 0) + 1)* *(*(A + 1) + 0); // 역행렬의 D값인 ad-bc를 구한다.

        //역행렬이 존재하지 않는 조건은 ad-bc=0 이다.
        if (D == 0) { 
            printf("\n역행렬이 존재하지 않습니다.");
        }

        //역행렬이 존재한다면 역행렬을 구해 C에 저장한다. 포인터 역참조 연산자를 이용
        else {
            C[0][0] = (1 / D)* *(*(A + 1) + 1);
            C[0][1] = -(1 / D)* *(*(A + 0) + 1);
            C[1][0] = -(1 / D)* *(*(A + 1) + 0);
            C[1][1] = (1 / D)* *(*(A + 0) + 0);

            //결과 출력
            printf("연산의 결과는\n\n");
            for (int i = 0; i < 2; i++) {
                for (int j = 0; j < 2; j++) {
                    printf("%5.1f", *(*(C + i) + j));
                }
                printf("\n"); //행, 열의 줄바꿈
            }
            }
        
    }

    //만약 입력된 연산자가 +, -, * 이면 2개의 행렬을 입력받아 각각 A, B에 저장
    else if(c==43 || c==42 || c==45) {
        printf("첫 번째 2x2 행렬을 입력하시오: ");
        scanf_s("%f %f %f %f", &A[0][0], &A[0][1], &A[1][0], &A[1][1]);
        printf("두 번째 2x2 행렬을 입력하시오: ");
        scanf_s("%f %f %f %f", &B[0][0], &B[0][1], &B[1][0], &B[1][1]);
        printf("\n");

        //연산자가 + 인경우, 포인터 역참조 연산자를 이용
        if (c == 43) {
            for (int i = 0; i < 2; i++) {
                for (int j = 0; j < 2; j++) {
                    C[i][j] = *(*(A + i) + j) + *(*(B + i) + j);
                }
            }
        }

        //연산자가 - 인경우, 포인터 역참조 연산자를 이용
        else if (c == 45) {
            for (int i = 0; i < 2; i++) {
                for (int j = 0; j < 2; j++) {
                    C[i][j] = *(*(A + i) + j) - *(*(B + i) + j);
                }
            }
        }

        //연산자가 * 인경우, 포인터 역참조 연산자를 이용
        else if (c == 42) {
            for (int i = 0; i < 2; i++) {
                for (int j = 0; j < 2; j++) {
                    for (int k = 0; k < 2; k++) {
                        C[i][j] += *(*(A + i) + k) * *(*(B + k) + j); //행렬의 곱셈을 쉽게 구하기 위해 생각한 방식이다.
                    }
                }
            }
        }

        //결과 출력
        printf("연산의 결과는\n\n");
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 2; j++) {
                printf("%5.1f ", *(*(C + i) + j));
            }
            printf("\n"); //행, 열의 줄바꿈
        }
    }

    //만약 그외의 문자를 입력하면 오류를 출력
    else {
        printf("잘못된 연산자 입니다.");
    }
    printf("\n");
    
    return 0;
    
}
반응형

'프로그래밍' 카테고리의 다른 글

C++ 틱택토 게임 (Tic Tac Toe)  (5) 2018.02.05
    # 테스트용