逆波兰计算器问题
今天看了C经典教材上的例子,琢磨了好久,其中的大部分都已明白,只是现在程序能够运行,但总是出现"error:unknow command “提示。无奈,不知道是神书上的程序不完整还是怎么回事?
源代码:
#include<stdio.h>
#include<stdlib.h>
#include <ctype.h>
#include<math.h>
#define MAXOP 100 //操作数或运算符的最大长度
#define NUMBER '0' //标识数字符
int getop(char []);//获取下一个字符或操作数
void push(double );//进栈操作
double pop(void);//出栈操作
int getch(void);
void ungetch(int );
#define MAXVAL 100 //栈的最大深度
int sp=0; //下一个空闲栈位置
double val[MAXVAL];//值栈
#define BUFSIZE 100//缓冲区长度
char buf[BUFSIZE];//缓冲区
int bufp=0;//下一个空闲位置
int main(){
int type;//取字符
char s[MAXOP];//定义字符串
double op2;//确定后入栈的为除数或减数
//double atof(char s[]);//试用
//分情况讨论
while((type=getop(s))!=EOF){
switch(type){
case NUMBER:
push(atof(s));
break;
case '+':
push(pop()+pop());
break;
case '-':
op2=pop();
push(pop()-op2);
break;
case '*':
push(pop()*pop());
break;
case '/':
op2=pop();
if(op2!=0.0)
push(pop()/op2);
else
printf("error:zero devisor \n");
break;
case '%':
op2=pop();
if(op2!=0.0){
push(fmod(pop(),op2));
}
else
printf("error:zero divisior\n");
break;
case '\n':
printf("\t%.8g\n",pop());
break;
default :
printf("error:unknow command %s\n",s);
break;
}
}
return 0;
}
//下面进行出,入栈操作
void push(double f){
if(sp<MAXVAL)
val[sp++]=f;
else
printf("error:stack full,can't push %g\n",f);
}
double pop(void ){
if(sp>0)
return val[--sp];
else{
printf("error:stack empty\n");
return 0.0;
}
}
//或许操作数或运算符函数
//先声明两个外部变量函数
//字符压回输入
int getop(char s[]){
int i,c;
while((s[0]=c=getch())==' '||c=='\t');
s[1]='\0';
if(!isdigit(c)||c!='.')
return c; //不是数
i=0;
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;
}
//定义两个“反读”需要的两个函数
int getch(void){
return (bufp>0)?buf[--bufp]:getchar();
}
void ungetch(int c){
if(bufp>=BUFSIZE)
printf("ungetch:too many characters\n");
else
buf[bufp++]=c;
}