中易网

求一个c语言的计算器源程序 支持括号优先级 谢谢

答案:3  悬赏:70  
解决时间 2021-02-14 14:21
求一个c语言的计算器源程序 支持括号优先级 谢谢
最佳答案
这个比较麻烦,大概思路是把一个“算式”分成很多“因子”相互加减出来的,每个“因子”是很多“算式”相互乘除出来的。这是递归定义的,需要用递归函数分析。递归跳出条件是遇到数字。
比如(3+2)*4*5就首先认为是个算式,发现这个算式只有一个因子(就是没有该层没有加减号)。
然后认为(3+2)*4*5是一个因子,发现是由三个算式(3+2) 4 5相乘出来的。
然后认为3+2是一个算式,是由3 2 两个因子相加出来的,于是返回5。
于是因子(3+2)*4*5就是5*4*5了,返回100。
于是算式(3+2)*4*5就是100,返回100。
这样就计算完成了。

给你代码吧,我不太会用C风格的方式写,只会C++,输入输出用的是c++的风格
#include
#include
#include

double factor_value();
double term_value();
double expression_value();
main()
{
cout << "Enter an expression: ";
cout << "The result is " << expression_value() << endl;
}
double expression_value() {//求一个表达式的值
double result = term_value();//求第一项的值
bool more = true;
while( more) {
char op = cin.peek();//从cin流中看一个
//字符,但不取出
if( op == '+' || op == '-' ) {
cin.get();
int value = term_value();
if( op == '+' ) result += value;
else result -= value;
}
else more = false;
}
return result;
}
double term_value() //求一个项的值
{
double result = factor_value(); //求第一个因子的值
bool more = true;
while(more) {
char op = cin.peek();
if( op == '*' || op == '/') {
cin.get();
int value = factor_value();
if( op == '*') result *= value;
else result /= value;
}
else more = false;
}
return result;
}
double factor_value() //求一个因子的值
{
double result = 0;
char c = cin.peek();
if( c == '(') {
cin.get();
result = expression_value();
cin.get();
}
else {
while(isdigit(c)) {
result = 10 * result + c - '0';
cin.get();
c = cin.peek();
}
}
return result;
}
全部回答
#include void main() {float x,y,z; char ch,ch; do { printf("输入x,y"); scanf("%f,%f",x,y); printf("请输入运算符+,-,*,/"); scanf("%c",ch); swith(ch) {case '+': z=x+y;printf("x+y=%f",z);break; case '-': z=x-y;printf("x-y=%f",z);break; case '*': z=x*y;printf("x*y=%f",z);break; case '/': if(y!=0) {z=x/y;printf("x/y=%f",z);break;} else printf("除数不能为零");break; default: printf("运算符不合法"); } printf("是否继续输入y/n?"); scantf("%c",ch1); } while(ch1='y'||ch1='Y'); } }
给你讲思路吧,先找括号,把()里面的内容计算出来,从最里层的()开始计算,计算后把原()里面的内容替换新的计算出来的数字,然后再找上一层(),直到没有(),把()里计算的算法可以写个函数,每次调用下就好了。这个主要是处理字符串的方法
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
三国大时代中绍蝉在哪?
new 3dsll ntr怎么用
一家人生活超市这个地址在什么地方,我要处理
请问咽喉炎也会咳出浓痰来吗
大家觉得梁羽生小说下的卓一航什么星座?
时光·咖啡我想知道这个在什么地方
新加坡psb学院附近的公寓有哪些
炒菜的时候加水,加什么水好?凉水?开水?还
平淡的日子里,安静,简单,没有
新三板(全国中小企业股权转让系统)申报文件
天韵和城怎么去啊,有知道地址的么
奥迪A4L和Q7哪个速度快
保险柜打不开了按按键 键灯也不亮了!是没电
从东营火车站到东营区胜中社区运兴小区怎么走
如何弄坏电脑主机电源,看不出来是人为的,用
推荐资讯
为什么我头发遇水就直????
怎么用手机下载证书向导
内球面相对于外圆柱面的形位公差怎样标注
谈谈你对公约的认识
CorelDRAW可以设计木门么 设计木门都需要什么
神舟t6ti x7怎么禁用触摸板
中国移动(天汾人民路指定专营店)怎么去啊,有
running man 120115里iu 唱的歌
我的恒语H-1手机卡得要命,想拿去卖了,值多
富力又一城A区西门在什么地方啊,我要过去处
蓝藻的用处
和别人同一网线,别人看电影我打游戏为什么延
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?