개발 기록/행렬 계산기

행렬 계산기 개발 일지 - 8

LiDARian 2021. 5. 30. 00:03
반응형

남은 자료형에 의한 에러, indices의 쓰레기값 미관리에 의한 에러, call by pointer 문제까지 모두 해결하였다.
텍스트를 행렬로 바꾸는기능은 어떻게 완성을 했다.

겨우 이 정도 사이즈의 프로그램이긴 하지만, 디버거를 제대로 써본적도 처음이라 뭐가 뭔지도 제대로 모르고 우왕좌왕하고 너무 정신없었다.

그리고 무엇보다 아직 언어의 이해도가 충분하지 않다는 것을 알게 되었다. call by value와 call by reference(C언어의 경우에는 pointer로 이를 대체한다.)를 구분을 못했다는 게 좀 컸던 거 같다. 그리고 다차원배열을 등가 포인터로 변환하는 것도 제대로 몰랐었고.

일단은 계산기 개발은 여기서 멈추고, C언어 자체에 대한 공부를 더 깊이있게하고, 컴퓨터구조와 운영체제 공부를 더 해야할 것 같다.

마지막?은 아니지만 다음 포스팅에는 개발하면서 깨달은점을 정리해서 올리겠다.

추후에 더 기능을 업데이트하겠다.

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define TEXT_LENGTH 512
#define MATMAXNUMBER 10

typedef struct Matrix{
    // row and coloum
    int n;
    int m;

    // data of matrix
    char ** matData;
    char textMat[TEXT_LENGTH];
} Matrix;

void parseText2Matrix(Matrix *matStruct){
    int len = strlen(matStruct->textMat);
    int num = 0;    // temporary space for sum
    int numtemp[10] = {0}; // temporary space for number from textMat
    int z, i; // row and column
    int x, y;
    int j, k;
    z = i = x = y = 0;

    for(i = 0; i <= len; i++){
        if(((matStruct->textMat)[i] == ',') || i >= len){
            for(j = 1; j <= z; j++){
                //multiply 10 for z-j times
                for(k = 1; k <= (z - j); k++){
                    numtemp[j - 1] = numtemp[j - 1] * 10;
                }
                num = num + numtemp[j - 1];
            }

            matStruct->matData[x][y] = num;

            // initializtion
            num = 0;
            for(; z >= 0; z--){
                numtemp[z] = 0;
            }
            z = 0;
            y++;
            if(y >= matStruct->m){ y=0; x++; }
        }
        else{
            // turn character to integer
            numtemp[z] = matStruct->textMat[i] - '0';
            z++;
        }
    }
}

Matrix *initializeMatrix(Matrix * matStruct){
    //이제 행과 열을 모두 0으로 초기화한다.
    matStruct->matData = malloc(sizeof(char*) * matStruct->n);
    for(int i = 0; i < matStruct->n; i++){
        matStruct->matData[i] = calloc(matStruct->m, sizeof(char*) * matStruct->m);
    }
    return matStruct;
}


void getMatrix(Matrix * matStruct){
    printf("행의 크기 n, 열의 크기 m을 차례로 입력하세요.");
    scanf("%d %d", &(matStruct->n), &(matStruct->m));
    if((matStruct->n) > 5 || (matStruct->m) > 5){
        printf("본 계산기는 5x5까지만 지원합니다.\n");
        return ;
    }

    matStruct = initializeMatrix(matStruct);
    printf("데이터를 입력해주세요.");
    scanf("%s", matStruct->textMat);
    parseText2Matrix(matStruct);
}


void showMatrix(Matrix * matStruct){
    int i = 0, j = 0; // 각각 행과 열 상징
    printf("\n");
    for(i = 0; i < matStruct->n; i++){
        for(j = 0; j < matStruct->m; j++){
            printf("%d ", matStruct->matData[i][j]);
        }
        printf("\n");
    }
}

void editMatrix(Matrix * matStruct){
    printf("%s\n", matStruct->textMat);
    getMatrix(matStruct);
}


void killData(Matrix * matStruct){
    for (int i = 0; i < matStruct->n; i++){
        free(matStruct->matData[i]);
    }
    free(matStruct->matData);
}

int main(){
    int matIndex = 0;
    Matrix *matBox[MATMAXNUMBER];

    Matrix initMat;
    matBox[matIndex] = &initMat;

    // Information
    printf("최대 5x5 행렬을 지원합니다.\n\n");
    printf("행렬의 값을 텍스트로 입력해주세요. ','는 열 방향에서 왼쪽으로 오른쪽으로 하나씩 개행시킵니다.\n");
    printf("숫자와 , 외의 값을 입력하시면 에러납니다...\n");
    printf("아직까지는 정수형만 지원합니다. 그리고 0인 원소 생략하지 말아주세요!\n");

    getMatrix(matBox[matIndex]);
    showMatrix(matBox[matIndex]);

    return 0;
}

실행결과는 아래와 같이 정상적으로 나온다.

반응형