1. 程式人生 > >C程式設計語言4-6課後題參考答案不正確

C程式設計語言4-6課後題參考答案不正確

4-6如果採用官方“配套”(其實是另外的人寫的)參考書的話,答案程式碼是不正確的,無法順利達到目的。不過稍加修改即可:

首先,全域性定義var引數(名字自己定),main程式碼和推薦的一致:

int var;//定義var在這裡

main(){
    int type,i;
    double op1,op2,v;
    char s[MAXOP];
    void clean(void);
    double vars[26];

    for(i=0;i<26;i++)
        vars[i]=0.0;
    while((type=getop(s)) !=EOF){
        switch(type){
        case NUMBER:
            push(atof(s));
            break;
        case '+':
            push(pop()+pop());
            break;
        case FUNC:
            mathFunc(s);
            break;
        case '*':
            push(pop()*pop());
            break;
        case '-':
            op2=pop();
            push(pop()-op2);
            break;
        case '/':
            op2=pop();
            if(op2!=0.0)
                push(pop()/op2);
            else
                printf("error:zero divisor\n");
            break;
        case '%'://模除運算
            op2=pop();
            if(op2!=0.0)
                push(fmod(pop(),op2));
            else
                printf("除數不可為0\n");
            break;
        case'\n':
            printf("\t%.8g\n",pop());
            break;
        case '?':
            //列印棧頂元素
            op2=pop();
            printf("\t%.8g\n",op2);
            push(op2);
            break;
        case 'c':
            //清空棧
            clean();
            break;
        case 's':
            op1=pop();
            op2=pop();
            push(op1);
            push(op2);
            break;
        case '=':
            pop();
            if(var>='A' &&var<='Z'){
                vars[var-'A']=pop();
                }
            else
                printf("記錄變數失敗");
            break;
        default:
            if (type>='A' &&type<='Z')
                push(vars[type-'A']);
            else if (type=='v')
                push(v);
            else
                printf("error:unknown command %s\n",s);
            break;
        }
    }
    return 0;
}

接下來,修改getop,增加大寫字母檢測:
int getop(char s[]){
    int i,c;

    while((s[0]=c=getch())==' '||c=='\t')
        ;
    s[1]='\0';
    i=0;
    if(isupper(c)){//增加大寫字母檢測
        var=c;
        return c;
    }
    if(islower(c)){
        int p=c;
        //在這裡C被改變了,所以需要用新變數暫存,否則達不到預期結果
        while(islower(s[++i]=c=getch()))
            ;
        s[i]='\0';
        if(c!=EOF){
            ungetch(c);
            }
        if(strlen(s)>1){
            return FUNC;
        }
        else{
            return p;
        }
    }
    if (!isdigit(c) && c!='.'&& c!='-')
        return c;

    //在這裡檢驗負數
    if(c == '-'){
        if(isdigit(s[++i]=c=getch())){
            while (isdigit(s[++i]=c=getch()))
                ;
        }
        else if((s[++i]=c=getch())=='.'){
            while (isdigit(s[++i]=c=getch()))
                ;
        }
        else{
            if(c!=EOF)
                ungetch(c);
            return '-';
            }
        }
    if(isdigit(c))
        while (isdigit(s[++i]=c=getch()))
            ;
    if(c == '.')
        while (isdigit(s[++i]=c=getch()))
            ;
    s[i]='\0';
    if(c!=EOF)
        ungetch(c);
    return NUMBER;
}

OK了,其實方法不止這一個。