| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 510 人关注过本帖
标题:逆波兰计算器问题
只看楼主 加入收藏
南国神画
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:51
专家分:124
注 册:2013-10-24
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
逆波兰计算器问题
         今天看了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;

}
      
      
搜索更多相关主题的帖子: 计算器 command include 源代码 double 
2013-10-24 20:41
南国神画
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:51
专家分:124
注 册:2013-10-24
收藏
得分:0 
这个问题我猜测主要出现在对输入的读取上,好像应该是或许字符或者操作数上除了问题,那个getop()好像有问题。可又不知道到底这样的能不能实现至少两个正数相加的计算,当然负数部分还没处理。主要是求大家看看,这样够完整么?
2013-10-24 20:50
Rexfield
Rank: 6Rank: 6
来 自:幻想乡
等 级:侠之大者
威 望:1
帖 子:240
专家分:484
注 册:2010-7-28
收藏
得分:20 
粗略看了一下这个程序,有两个问题:
一是似乎没有优先级区分;
二是应该有两个栈,一个放操作数,另一个放操作符。

总觉得你这个程序很诡异,既不是LL也不是LR,还有局部变量使用前记得初始化。
收到的鲜花

If you're not failing every now and again, it's a sign you're not doing anything very innovative.
2013-10-24 22:01
南国神画
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:51
专家分:124
注 册:2013-10-24
收藏
得分:0 
回复 3楼 Rexfield
谢谢你的解答,呵呵,我也是好不容易才看懂一部分,主要是书上的例子,琢磨了这么久,其实还有好多问题,但编译没错,就是一下子跳到default情况,貌似根本没存进栈中,可是又不知道那个地方有问题,看了网上别人写的类似的版本的,总觉得这个程序缺了一些东西,哎,现在都懵了。
2013-10-24 22:07
快速回复:逆波兰计算器问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.080733 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved