问题描述
- 求助这个程序到底哪里的问题?
-
#include
#include
#define thestacksize 100
#define stackincrement 10
#define overflow -1
#define ok 1
#define error 0
typedef struct{
char top;
char *base;
int stacksize;
}sqstack;
int initstack(sqstack s){
s.base=(char)malloc(thestacksize*sizeof(char));
if(!s.base)exit(overflow);
s.top=s.base;
s.stacksize=thestacksize;
return ok;
}
int gettop(sqstack s){
char e;
if(s.top==s.base)return error;
e=*(s.top-1);
return ok;
}
int push(sqstack s,char e){
if(s.top-s.base>=s.stacksize){
s.base=(char*)realloc(s.base,(s.stacksize+stackincrement)*sizeof(char));
if(!s.base)exit(overflow);
s.top=s.base+s.stacksize;
s.stacksize+=stackincrement;
}
s.top++=e;
return ok;
}
int pop(sqstack s,char e){
if(s.top==s.base)return error;
e=--s.top;
return ok;
}
char precede(char p1,char p2){
char p[7][7] = {{'>', '>', '<', '<', '<', '>', '>'},
{'>', '>', '<', '<', '<', '>', '>'},
{'>', '>', '>', '>', '<', '>', '>'},
{'>', '>', '>', '>', '<', '>', '>'},
{'<', '<', '<', '<', '<', '=', ' '},
{'>', '>', '>', '>', ' ', '>', '>'},
{'<', '<', '<', '<', '<', ' ', '='}};
int r,l;
switch(p1){
case'+':
r=1;
break;
case'-':
r=2;
break;
case'*':
r=3;
break;
case'/':
r=4;
break;
case'(':
r=5;
break;
case')':
r=6;
break;
case'#':
r=7;
break;
default:
break;
}
switch(p2){
case'+':
l=1;
break;
case'-':
l=2;
break;
case'*':
l=3;
break;
case'/':
l=4;
break;
case'(':
l=5;
break;
case')':
l=6;
break;
case'#':
l=7;
break;
default:
break;
}
return (p[r][l]);
}
int ifoptr(char c){
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')return ok;
else return error;
}
int operate(int a,char p,int b){
if(p=='+')return(a+b);
else if(p=='-')return(a-b);
else if(p=='*')return(a*b);
else return(a/b);
}
int evaluateexpression(){
char p,c;
int a,b;
sqstack optr;
sqstack opnd;
initstack(optr);
initstack(opnd);
push(optr,'#');
c=getchar();
while(c!='#'||gettop(optr)!='#'){
if(!ifoptr(c)){push(opnd,c);c=getchar();}
else
switch(precede(gettop(optr),c)){
case'<':
push(optr,c);
c=getchar();
break;
case'=':
pop(optr,p);c=getchar();
break;
case'>':
pop(optr,p);
pop(opnd,a);
pop(opnd,b);
push(opnd,operate(a,p,b));
break;
default:
break;
}
}
return gettop(opnd);
}
int main() {
char e;
printf("input an expression (end with '#'):n");
e=evaluateexpression();
printf("result:n");
printf("%dn",e);
}表达式求值的程序,编译可以通过,运行后就项目停止运行了,看了很久到底哪里除了问题??求教,谢谢各位了~
解决方案
直接设置断点,编译器单步跟踪,调试一下。刚好可以提高自己分析能力
解决方案二:
代码都不能编译
while (c != '#' || gettop(optr) != '#')
gettop只有一个参数
status gettop(sqstack s, char e)
这里函数定义明明有两个
解决方案三:
程序错误太多了,比如
int initstack(sqstack s)
这里你调试下就会发现,根本没法初始化,得修改成
int initstack(sqstack& s)
修改了以后
int r, l;
以及下面的switch
根本没有给r赋值,结果数组又越界了。
别的不看了。
就想说一点常识性的问题。
程序必须保持随时可调试可运行的状态,写一块就要看这一块对不对,这样才能每次排错只要检查新写的代码就行了,大部分问题就在这个范围内。
而不是闷头写了一大篇,才想到要调试。这种程序几乎没法调试。
另一个作为常识的是,变量一定要在定义的时候初始化,你根本没有这个习惯。
还有代码要写得简单易读,而不是炫技*s.top++=e;
这种代码不是自己折磨自己么?
另外,要学习调试程序,调试程序比写程序更重要,如果你不会调试程序,就不要往下学新的编程的知识,先学怎么调试。
初学者一定要把习惯养好。
解决方案四:
如楼上所言,感觉重要的不是这个程序的错误在哪,而是怎么找出程序的错误。编译器单步跟踪,或者二分法加打印语句~定位错误位置~
解决方案五:
有邮箱吗,我给你发一个求表达式值的源程序,学习数据结构的时候写的。
解决方案六:
一步一步调试,这样提高能力。
时间: 2024-08-03 18:51:44