편집 기록

편집 기록
  • 프로필 엽토군님의 편집
    날짜2019.10.08

    c언어로 선형방정식의 해를 구하는 프로그램인데


    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <assert.h>
    int main(void) {
        char* arr = (char*)malloc(sizeof(char) * 40);//equation pointer
        char* st[3] = { NULL, };//store manipulated pointer
        int len[3] = { 0, };//length of st[i]
        int i = 0, j = 0;
        float num[3] = { 0.0, }, ore[3] = { 0.0, }, ans;
        printf("Put your linear equation\n");
        scanf("%s", arr);
        int l = strlen(arr);
    
        arr = (char*)realloc(arr, sizeof(char)*l);
    
        for (i = 0;i<3;i++)
            st[i] = (char*)malloc(sizeof(char)*l);
        //sprintf를 이용하기 위해서는, 크기가 할당된 포인터 혹은
        //배열을 이용해야만 한다. 
        for (i = 0;i<l;i++) {
            while (arr[i]<48 || arr[i]>57)
                i++;
            num[j] = atof(arr + i);
            sprintf(st[j], "%.0f", num[j]);
            len[j] = strlen(st[j]);
    
            if (arr[i + len[j] - 1] >= 48 && arr[i + len[j] - 1] <= 57) {
                assert(arr[i + len[j] - 1]<48 || arr[i + len[j] - 1]>57);
                num[j] = atof(arr + i);
                sprintf(st[j + 1], "%.0f", num[j]);
                len[j + 1] = strlen(st[j]);
            }
            if (arr[i - 1] == '-') {
                num[j] = -1 * num[j];
                len[j]++;
            }
            printf("num[%d]=%.0f,st[%d]= %s,len[%d]=%d,i=%d\n", j, num[j], j, st[j], j, len[j], i);
    
            j++;
            if (j>2 && arr[l - 1] == 'x') break; // <---- Q1)
        }
    
        printf("arr[len[0]]= '%c', arr[len[0]+len[1]+1]='%c'\n", arr[len[0]], arr[len[0] + len[1] + 1]);
        if (arr[len[0]] == 'x') {
            ore[0] = num[0];
            ore[1] = num[1];
            ore[2] = num[2];
        }
        else if (arr[len[0]] == '=') {
            if (arr[len[0] + len[1] + 1] == 'x') {
                ore[0] = num[1];
                ore[1] = num[2];
                ore[2] = num[0];
            }
            else {
                ore[0] = num[2];
                ore[1] = num[1];
                ore[2] = num[0];
            }
        }
        else {
            ore[0] = num[1];
            ore[1] = num[0];
            ore[2] = num[2];
        }
    
        for (j = 0;j<3;j++)
            printf("ore[%d]=%.0f\n", j, ore[j]);
        ans = (ore[2] - ore[1]) / ore[0];
        printf("x=%.2f", ans);
        free(arr);
        for (i = 0;i<3;i++)
            free(st[i]);
    
        return 0;
    }
    

    여기에서,

    Q1) 이라고 적어놓은 부분의 코드는 c=b+ax의 형태에서 해당 부분의 코드로 진입하지 않아 어거지로 설정해놓은 코드입니다. 왜 c=b+ax는 이 코드를 통과하지 못하는 건가요? 이를 해결하려면 어떻게 해야 하나요?

    그리고,

    각 계수 혹은 상수가 두 자리 이상의 정수가 될 경우, 제가 짠 코드에서는 이상이 발생합니다. 이를 해결하기 위해서 len[i]를 이용하는 방법도 써 봤습니다만, 소용이 없더군요. 이를 해결하려면 어떻게 해야 하나요?

  • 프로필 nowp님의 편집
    날짜2019.10.04

    c언어로 선형방정식의 해를 구하는 프로그램인데


    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <assert.h>
    int main(void) {
        char* arr = (char*)malloc(sizeof(char) * 40);//equation pointer
        char* st[3] = { NULL, };//store manipulated pointer
        int len[3] = { 0, };//length of st[i]
        int i = 0, j = 0;
        float num[3] = { 0.0, }, ore[3] = { 0.0, }, ans;
        printf("Put your linear equation\n");
        scanf("%s", arr);
        int l = strlen(arr);
    
        arr = (char*)realloc(arr, sizeof(char)*l);
    
        for (i = 0;i<3;i++)
            st[i] = (char*)malloc(sizeof(char)*l);
        //sprintf를 이용하기 위해서는, 크기가 할당된 포인터 혹은
        //배열을 이용해야만 한다. 
        for (i = 0;i<l;i++) {
            while (arr[i]<48 || arr[i]>57)
                i++;
            num[j] = atof(arr + i);
            sprintf(st[j], "%.0f", num[j]);
            len[j] = strlen(st[j]);
    
            if (arr[i + len[j] - 1] >= 48 && arr[i + len[j] - 1] <= 57) {
                assert(arr[i + len[j] - 1]<48 || arr[i + len[j] - 1]>57);
                num[j] = atof(arr + i);
                sprintf(st[j + 1], "%.0f", num[j]);
                len[j + 1] = strlen(st[j]);
            }
            if (arr[i - 1] == '-') {
                num[j] = -1 * num[j];
                len[j]++;
            }
            printf("num[%d]=%.0f,st[%d]= %s,len[%d]=%d,i=%d\n", j, num[j], j, st[j], j, len[j], i);
    
            j++;
            if (j>2 && arr[l - 1] == 'x') break; // <---- Q1)
        }
    
        printf("arr[len[0]]= '%c', arr[len[0]+len[1]+1]='%c'\n", arr[len[0]], arr[len[0] + len[1] + 1]);
        if (arr[len[0]] == 'x') {
            ore[0] = num[0];
            ore[1] = num[1];
            ore[2] = num[2];
        }
        else if (arr[len[0]] == '=') {
            if (arr[len[0] + len[1] + 1] == 'x') {
                ore[0] = num[1];
                ore[1] = num[2];
                ore[2] = num[0];
            }
            else {
                ore[0] = num[2];
                ore[1] = num[1];
                ore[2] = num[0];
            }
        }
        else {
            ore[0] = num[1];
            ore[1] = num[0];
            ore[2] = num[2];
        }
    
        for (j = 0;j<3;j++)
            printf("ore[%d]=%.0f\n", j, ore[j]);
        ans = (ore[2] - ore[1]) / ore[0];
        printf("x=%.2f", ans);
        free(arr);
        for (i = 0;i<3;i++)
            free(st[i]);
    
        return 0;
    }
    

    여기에서,

    Q1) 이라고 적어놓은 부분의 코드는 c=b+ax의 형태에서 해당 부분의 코드로 진입하지 않아 어거지로 설정해놓은 코드입니다. 왜 c=b+ax는 이 코드를 통과하지 못하는 건가요? 이를 해결하려면 어떻게 해야 하나요?

    그리고,

    각 계수 혹은 상수가 두 자리 이상의 정수가 될 경우, 제가 짠 코드에서는 이상이 발생합니다. 이를 해결하기 위해서 len[i]를 이용하는 방법도 써 봤습니다만, 소용이 없더군요. 이를 해결하려면 어떻게 해야 하나요?

  • 프로필 알 수 없는 사용자님의 편집
    날짜2019.10.03

    c언어로 선형방정식의 해를 구하는 프로그램인데


    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <assert.h>
    int main(void) {
        char* arr=(char*)malloc(sizeof(char)*40);//equation pointer
        char* st[3]={NULL,};//store manipulated pointer
        int len[3]={0,};//length of st[i]
        int i=0,j=0;
        float num[3]={0.0,},ore[3]={0.0,},ans;
        printf("Put your linear equation\n");
        scanf("%s",arr);
        int l=strlen(arr);
    
        arr=(char*)realloc(arr,sizeof(char)*l);
    
        for(i=0;i<3;i++)
        st[i]=(char*)malloc(sizeof(char)*l);
        //sprintf를 이용하기 위해서는, 크기가 할당된 포인터 혹은
        //배열을 이용해야만 한다. 
        for(i=0;i<l;i++){
            while(arr[i]<48||arr[i]>57)
            i++;
        num[j]=atof(arr+i);
        sprintf(st[j],"%.0f",num[j]);
        len[j]=strlen(st[j]);
    
        if(arr[i+len[j]-1]>=48&&arr[i+len[j]-1]<=57){
            assert(arr[i+len[j]-1]<48||arr[i+len[j]-1]>57);
            num[j]=atof(arr+i);
        sprintf(st[j+1],"%.0f",num[j]);
        len[j+1]=strlen(st[j]);
    }
        if(arr[i-1]=='-'){
        num[j]=-1*num[j];
        len[j]++;
    }
        printf("num[%d]=%.0f,st[%d]= %s,len[%d]=%d,i=%d\n", j,num[j],j,st[j],j,len[j],i );
    
        j++;
        if(j>2&&arr[l-1]=='x') break; ---Q1)
    }
    
    printf("arr[len[0]]= '%c', arr[len[0]+len[1]+1]='%c'\n",arr[len[0]], arr[len[0]+len[1]+1]);
        if(arr[len[0]]=='x'){
            ore[0]=num[0];
            ore[1]=num[1];
            ore[2]=num[2];
        }
        else if(arr[len[0]]=='='){
            if(arr[len[0]+len[1]+1]=='x'){
            ore[0]=num[1];
            ore[1]=num[2];
            ore[2]=num[0];
        }
        else{
            ore[0]=num[2];
            ore[1]=num[1];
            ore[2]=num[0];
        }
        }
        else{
        ore[0]=num[1];
        ore[1]=num[0];
        ore[2]=num[2];
    }
    
    for(j=0;j<3;j++)
        printf("ore[%d]=%.0f\n",j,ore[j]);
        ans=(ore[2]-ore[1])/ore[0];
        printf("x=%.2f",ans);
        free(arr);
        for(i=0;i<3;i++)
        free(st[i]);
    
        return 0;
    }
    

    여기에서,

    Q1)이라고 적어놓은 부분의 코드는 c=b+ax의 형태에서 해당 부분의 코드로 진입하지 않아 어거지로 설정해놓은 코드입니다. 왜 c=b+ax는 이 코드를 통과하지 못하는 건가요? 이를 해결하려면 어떻게 해야 하나요?

    그리고,

    각 계수 혹은 상수가 두 자리 이상의 정수가 될 경우, 제가 짠 코드에서는 이상이 발생합니다. 이를 해결하기 위해서 len[i]를 이용하는 방법도 써 봤습니다만, 소용이 없더군요. 이를 해결하려면 어떻게 해야 하나요?