求一个c语言的计算器源程序 支持括号优先级 谢谢
答案:3 悬赏:70
解决时间 2021-02-14 14:21
- 提问者网友:巴黎塔下许过得承诺
- 2021-02-14 10:06
求一个c语言的计算器源程序 支持括号优先级 谢谢
最佳答案
- 二级知识专家网友:一场云烟
- 2021-02-14 10:54
这个比较麻烦,大概思路是把一个“算式”分成很多“因子”相互加减出来的,每个“因子”是很多“算式”相互乘除出来的。这是递归定义的,需要用递归函数分析。递归跳出条件是遇到数字。
比如(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;
}
比如(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;
}
全部回答
- 1楼网友:蜜罐小熊
- 2021-02-14 12:45
#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');
}
}
- 2楼网友:心与口不同
- 2021-02-14 11:32
给你讲思路吧,先找括号,把()里面的内容计算出来,从最里层的()开始计算,计算后把原()里面的内容替换新的计算出来的数字,然后再找上一层(),直到没有(),把()里计算的算法可以写个函数,每次调用下就好了。这个主要是处理字符串的方法
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯