C程式設計語言4-6課後題參考答案不正確
阿新 • • 發佈:2019-02-16
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了,其實方法不止這一個。