镕羽 发表于 2012-8-19 16:54:44

实在找不到错,但结果显示是while循环里有问题。谁有时间帮忙纠错,感激不尽!

#include <stdio.h>

int k=0,n=0;

int row,col;
   char priority={
          '>','>','<','<','<','>','>',
          '>','>','<','<','<','>','>',
          '>','>','>','>','<','>','>',
          '>','>','>','>','<','>','>',
          '<','<','<','<','<','=',
          '>','>','>','>',' ','>','>',
          '<','<','<','<','<',' ','=',
          };

/*简单的带括号的计算器,即输入一串表达式,求值*/
int In(char c,char *p){
    int i;
    for(i=0;i<7;i++)
    if(c==p)
    return 1;
    else return 0;
    }/*判断c是否为运算符*/

void push(char *p,char c){
   p=c;
   k++;
   }
void pop(char *p,char *c){
   k--;
   *c=p;
   }

void pushd(int *q,int a){
   q=a;
   n++;
   }   
void popd(int*q,int *a) {
   n--;
   *a=q;
   }

char gettop(char *p,int g){
   return p;
   }
int gettopd(int *q,int l){
    return q;
    }

int detect(char c){
    int i;
    char op={'+','-','*','/','(',')','#'};
    for(i=0;i<7;i++){
                     if(c=op)
                     return i;
                     }
    }

char precede(char c,char f){
   row=detect(c);
   col=detect(f);
   return priority;
   }

int operate(int e,char theta,int b){
    switch(theta){
                  case'+':
                        return (e+b);break;
                  case'-':
                        return (e-b);break;      
                  case'*':
                        return (e*b);break;
                  case'/':
                        return (e/b);break;
                  }
    }

int main(){
    int a=0,b,e,j=0,h;char c,f,x,theta;
    char C;push(C,'#');/*符号栈*/
    char d;/*暂时存储字符,再转换成十进制数存入 栈D中*/
    int D; c=getchar();/*数据栈*/

    char OP={'+','-','*','/','(',')','#'};

    while(c!='#'||gettop(C,k)!='#'){
                                  if(!In(c,OP)){d=c;c=getchar();}/*判断是否在符号数组内,不在则用d数组存起来,为后来转变十进制用*/

                                  else
                                  {

                                    for(h=0;h<j;h++)                                    
                                       a=a*10+(d-'0');                                                                                                         
                                    pushd(D,a);/*转化为十进制入栈*/

                                    printf("%d\n",a);   /*感觉这里有问题 加了这一句检测,发现这个while及 switch段有问题 ,不停地打印a=0*/

                                    j=0;a=0;

                                    switch(precede(gettop(C,k),c)){
                                                                   case '<':
                                                                           printf("%c\n",c);push(C,c);c=getchar();break;
                                                                   case '=':
                                                                           pop(C,&x); c=getchar();break;
                                                                   case '>':
                                                                           pop(C,&theta); popd(D,&b);popd(D,&e);
                                                                           pushd(D,operate(e,theta,b));
                                                                           break;   
                                                                   default :
                                                                           break;      
                                                                   }
                                    }
                                  }


                                  a=gettopd(D,n);
                                  printf("%d\n",a);

                                  getchar();
    }


simon3322 发表于 2012-8-19 18:12:36

{:5_154:}看不下去了...一跑全是0啊...

镕羽 发表于 2012-8-19 18:24:51

simon3322 发表于 2012-8-19 18:12 static/image/common/back.gif
看不下去了...一跑全是0啊...

是啊while 那里有问题找不出来

xw007110 发表于 2012-8-19 18:54:52

刚才我帮你DeBug了一下,用的是1+2#这个运算。发现那个小c变量一直都是‘+’变量,没改变。你的很多变量没有初始化,我看到各种乱码,而且你的堆栈操作都没进行检查,所以导致错误没有分析出来。我没看你的程序逻辑,所以就不帮你查错误在哪了。有问题再问

foolisheep 发表于 2012-8-19 19:02:12

我表示我的计算器写了四百多行啊……你的这么精炼……

simon3322 发表于 2012-8-19 19:05:53

镕羽 发表于 2012-8-19 18:24 static/image/common/back.gif
是啊while 那里有问题找不出来

看不出来具体有哪些问题,不过发现一些小问题了

simon3322 发表于 2012-8-19 19:19:38

镕羽 发表于 2012-8-19 18:24 static/image/common/back.gif
是啊while 那里有问题找不出来

查出来了,你gettop返回的char不对~

simon3322 发表于 2012-8-19 19:19:41

镕羽 发表于 2012-8-19 18:24 static/image/common/back.gif
是啊while 那里有问题找不出来

查出来了,你gettop返回的char不对~

镕羽 发表于 2012-8-19 19:22:25

foolisheep 发表于 2012-8-19 19:02 static/image/common/back.gif
我表示我的计算器写了四百多行啊……你的这么精炼……

参照的严蔚敏书上的代码

镕羽 发表于 2012-8-19 19:22:41

simon3322 发表于 2012-8-19 19:19 static/image/common/back.gif
查出来了,你gettop返回的char不对~

该怎么弄?

镕羽 发表于 2012-8-19 19:23:32

xw007110 发表于 2012-8-19 18:54 static/image/common/back.gif
刚才我帮你DeBug了一下,用的是1+2#这个运算。发现那个小c变量一直都是‘+’变量,没改变。你的很多变量没有 ...

好 谢谢这是参照严蔚敏的伪代码改的

simon3322 发表于 2012-8-19 19:25:47

镕羽 发表于 2012-8-19 19:22 static/image/common/back.gif
该怎么弄?

k值始终不对,gettop实现的问题吧?

jose 发表于 2012-8-19 20:12:50

掌握正确的调试技巧很重要,加油

wkmatt 发表于 2012-8-22 23:44:03

只看到主函数开头!发现你的得到栈顶数据的两个函数不正确!你的k是栈顶的上一个!所以gettop中应return p[--g],gettopd也是如此!

镕羽 发表于 2012-9-5 17:49:42

wkmatt 发表于 2012-8-22 23:44 static/image/common/back.gif
只看到主函数开头!发现你的得到栈顶数据的两个函数不正确!你的k是栈顶的上一个!所以gettop中应return p[ ...

嗯 谢谢 回头试试~~

poiu9080 发表于 2012-9-5 19:09:07

所以为什么要用
--g
而不用
g-1
页: [1]
查看完整版本: 实在找不到错,但结果显示是while循环里有问题。谁有时间帮忙纠错,感激不尽!