c++制作只有加减乘除计算器,大佬救救孩子吧!困了三天了

qq_45090953 2019-05-25 03:39:08
先说明下题:Hdu 1237..,简单计算器 制作一个简单计算器,只有加减乘除(没有括号),并且大于0,每个数和字符之间有空格。(保留两位小数) 例如 1 + 2 4 + 2 * 5 - 7 / 11 输出 3.00 13.36 我的思路是式子是一串字符串,我提取出数字到a[] 加减乘除这些字符到b[],然后先不计算总体结果,如果是减就把减后面的数变为负数,加不变,如果是乘就把乘后面的数等于后面的乘前面的,并把前面的赋值为零,除法类似,这样最后把a[]加起来就是总了,可是我输入很多数据测试后都对了,提交后是wa,下面是我的代码,求指教错误,大神。 #include<iostream> #include<string> #include<iomanip> #include<stdio.h> using namespace std; int main() { string s; double sum=0,r=0; double a[200]; int j=0,h=0; char c[200]; while(getline(cin,s)) { if(s[0]=='0'){break;} sum=0; h=0;j=0; for(int i=0;i<200;i++) { a[i]=0; c[i]='u'; } for(int i=0;i<s.length();i++) { if(s[i]>='0'&&s[i]<='9') { r=r*10+s[i]-'0'; while(s[i+1]>='0'&&s[i+1]<='9') { r=r*10+s[i+1]-'0'; i++; } a[h]=r; r=0; h++; } if(s[i]=='+'||s[i]=='/'||s[i]=='*'||s[i]=='-') { c[j]=s[i]; j++; } } for(int i=0;i<j;i++) { if(c[i]=='-') { a[i+1]=-a[i+1]; } if(c[i]=='*') { a[i+1]=a[i]*a[i+1]; a[i]=0; } if(c[i]=='/') { a[i+1]=a[i]/a[i+1]; a[i]=0; } } for(int i=0;i<h;i++) { sum+=a[i]; } printf("%.2lf\n",sum); } return 0; }
...全文
165 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_45090953 2019-05-26
  • 打赏
  • 举报
回复
引用 6 楼 Italink的回复:
不好意思啊,没看清楚,见谅 你看你代码逻辑上当s[0]=='0'就结束了,这个是题目条件吗?如果是的话,是否可能出现"0+2/3",这样的表达式,是否还需要考虑字符串的长度。 另外,你用200空间存储这些数字和运算符,是否符合题目的数据范围? 还有,题目有没有说除数为0做如何处理? 还有一点小建议就是,代码风格有点乱,一行一条语句,写的整齐一点,看起来也舒服
感谢你的指点,乱是因为这是用手机发的,格式变了,题目条件没有打全我,你找出了关键问题,我这个无法算 0+1之类的,现在已经解决了,谢谢
qq_45090953 2019-05-26
  • 打赏
  • 举报
回复
引用 8 楼 victory_ig的回复:
感觉问题比较多,首先不需要iomanip头文件,其次去掉s为零退出的程序,最大的问题应该是你会发现输出时无法退出循环,在程序printf后加一个break就行了
太睿智了你,多的东西是之前写的忘记删除了,程序要求输0结束,我只考虑第一个是0情况,所以运行一直错误,只要把if(s[0]==`0')后面加个&&s.length==1就可以了
qq_45090953 2019-05-26
  • 打赏
  • 举报
回复
引用 11 楼 伊航的回复:
别废话,直接给分。()
真无语你,问题没看出来,还在这大言不惭,最讨厌就是一副高高在上的样子,我尊敬谦虚的强者,你这样的真让人厌恶
HQChart 2019-05-26
  • 打赏
  • 举报
回复
还是建议根据标准的编译原理来写, 词法分析->语法分析->AST-> 执行器。 目前都是很成熟的了。 不要自己想当然就写。
super_admi 2019-05-26
  • 打赏
  • 举报
回复
一般来说,像这种表达式,要进行转换的,一般将中缀表达式转为后缀表达式(也叫逆波兰表达式)。
伊航 2019-05-26
  • 打赏
  • 举报
回复
别废话,直接给分。()
victory_ig 2019-05-25
  • 打赏
  • 举报
回复
感觉问题比较多,首先不需要iomanip头文件,其次去掉s为零退出的程序,最大的问题应该是你会发现输出时无法退出循环,在程序printf后加一个break就行了
Italink 2019-05-25
  • 打赏
  • 举报
回复
另外就是,输入的数都是整数,还是有浮点数
Italink 2019-05-25
  • 打赏
  • 举报
回复
不好意思啊,没看清楚,见谅 你看你代码逻辑上当s[0]=='0'就结束了,这个是题目条件吗?如果是的话,是否可能出现"0+2/3",这样的表达式,是否还需要考虑字符串的长度。 另外,你用200空间存储这些数字和运算符,是否符合题目的数据范围? 还有,题目有没有说除数为0做如何处理? 还有一点小建议就是,代码风格有点乱,一行一条语句,写的整齐一点,看起来也舒服
qq_45090953 2019-05-25
  • 打赏
  • 举报
回复
引用 3 楼 Italink的回复:
你这样的算,能算出4 + 2 * 5 - 7 / 11=13.36?考虑运算优先级了吗?这个需要构造一颗计算树或者采用栈来计算
你运行下就知道了,我运行几十遍都得出来了,别被惯性给约束啊
qq_45090953 2019-05-25
  • 打赏
  • 举报
回复
引用 2 楼 伊航的回复:
幼稚,你都编程吗?你懂算法吗!
我不懂,你想表达什么?直接说啊
Italink 2019-05-25
  • 打赏
  • 举报
回复
你这样的算,能算出4 + 2 * 5 - 7 / 11=13.36?考虑运算优先级了吗?这个需要构造一颗计算树或者采用栈来计算
伊航 2019-05-25
  • 打赏
  • 举报
回复
幼稚,你都编程吗?你懂算法吗!
qq_45090953 2019-05-25
  • 打赏
  • 举报
回复
开始吧a[],b[]赋值是为了输入多次不影响

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧