用C++写了一个简易四则运算计算器,大部分写好了,但是还是有点小BUG,希望指导一下。
- C/C++ code
#include<iostream>using namespace std;//数组模拟堆栈struct stack{ double a[200]; double top;}Stack;//初始化一个空栈void IniteStack(){ Stack.top=0;}//堆栈的弹出方法double Pop(){ if(Stack.top==0) return 0; else return Stack.a[(int)--Stack.top];}//将元素压入栈的方法void Push(double m){ Stack.a[(int)Stack.top]=m; Stack.top++;}//主函数double main(){ //建立一个足够长的数组(可以存放200个元素) char str[200],*p,*q; char flag; double m,sum,n,k; IniteStack(); cout<<"请输入中缀表达式:"; while(cin>>str&&str[0]!='0') { p=q=str; sum=0.0; //通过p指针指向char型数组元素,并通过算法把数组中的元素转换成原本要输入的数字进行处理 while(*p) { m=0.0; while(1) { if((*p>='0' && *p<='9') || *p=='.') { if(*p>='0' && *p<='9') { while(*p>='0' && *p<='9') { m=m*10+(double)*p-'0'; p++; } } if(*p=='.') { double y=0.1; p++; while(*p>='0' && *p<='9') { m= m + y*(double)(*p-'0'); y= y/10; p++; } p--; } } else flag = 'a';break; } //计算器核心算法,通过对运算符的判断和堆栈操作来实现运算 switch(*q) { case '+': Push(m);break; case '-': Push(-m);break; case '*': k=Pop(); Push(k*m);break; case '/': if(m == 0) { cout<<"除数不能为0!"<<endl; return 0; } else { k=Pop(); Push(k/m);break; } default: if(q==str) Push(m); break; } q=p; p++; } while(n=Pop()) { sum+=n; } if(flag == 'a') cout<<"非法的表达式!"<<endl; else cout<<"求值结果为:"<<sum<<endl; break; } return 0;}如果是计算类似10+1.123的话可以得到正确结果,但是计算1.123+10的话就出错了(我试了一下,只要第一个数带有小数点就不行…),请帮我看一下错误出在哪了…谢谢~
[解决办法]
加断点,单步调试
[解决办法]
自行对比.
建议.
1.LS所言.
2.测试调试, 思考, 测试调试, 思考 ...... finish
- C/C++ code
m=0.0; while(1) { if((*p>='0' && *p<='9') || *p=='.') { if(*p>='0' && *p<='9') { while(*p>='0' && *p<='9') { m=m*10+(double)*p-'0'; p++; } } if(*p=='.') { double y=0.1; p++; while(*p>='0' && *p<='9') { m= m + y*(double)(*p-'0'); y= y/10; p++; } //p--; } } else flag = 'a';break; } cout << "m=" << m <<endl; cout << "p=" << p << endl; //计算器核心算法,通过对运算符的判断和堆栈操作来实现运算 switch(*q) { case '+': Push(m);break; case '-': Push(-m);break; case '*': k=Pop(); Push(k*m);break; case '/': if(m == 0) { cout<<"除数不能为0!"<<endl; return 0; } else { k=Pop(); Push(k/m);break; } default: if(q==str) Push(m); break; } //finish. if(*p == '\0' || *p == '\n') break;