早教吧作业答案频道 -->其他-->
编写程序模拟带括号的计算器
题目详情
编写程序模拟带括号的计算器
▼优质解答
答案和解析
#include
#include
#include
#include
#include
double fun1();
double fun2();
double fun3();
double fun4();
double fun5();
char calc[64];
int n;
double fun1()
{
double t;
t=fun2(); //先看有无乘除,将乘除计算完后再计算加减
while((calc[n]=='+')||(calc[n]=='-'))
{
switch(calc[n]) //计算加减时,再看后面的数有无乘除,将乘除计算完后再计算加减
{
case '+':n++,t=t+fun2();break;
case '-':n++,t=t-fun2();break;
}
}
return(t);
}
double fun2()
{
double t;
t=fun3(); //先看有无乘方,将乘方计算完后再计算乘除
while((calc[n]=='*')||(calc[n]=='/'))
{
switch(calc[n]) //计算乘除时,再看后面的数有无乘方,将乘方计算完后再计算乘除
{
case '*':n++,t=t*fun3();break;
case '/':n++,t=t/fun3();break;
}
}
return(t);
}
double fun3()
{
double t;
t=fun4(); //先看有无括号,将括号里的计算完后再计算乘方
while(calc[n]=='^')
{
n++,t=pow(t,fun4()); //计算乘方时,再看后面的数有无括号运算,将括号里的计算完后再计算乘方
}
return(t);
}
double fun4() //如此,将fun4()的值返回时(有括号的先算括号里的,再将计算值返回,起到去括号的目的),逐级按乘方、乘、除、加、减的次序进行计算,满足优先法则
{
char num[16];
int i=0;
double t;
if(calc[n]=='(')
{
n++,t=fun1(),n++; //遇括号时,先将括号里的值算出,再返回t给上一级
}
else if(fun5())
{
while(fun5()) //将与数字相关的符号赋予num[]
{
num[i++]=calc[n++];
}
num[i]='\0';
t=atof(num); //净num[]转换成数字
}
return(t); //返回t给上一级
}
double fun5()
{
if(((calc[n]>='0'&&calc[n]0&&(calc[n-1]=='+'||calc[n-1]=='-'||calc[n-1]=='*'||calc[n-1]=='/'||calc[n-1]=='^'||calc[n-1]=='(')))
return(1); //是与数字相关的,如数字字符、小数点、正负号,返回1
else
return(0); //加、减、乘、除、乘方时,返回0
}
int main(void)
{
int ds1,ds2;
loop:
n=0;
printf("Input a calculation method like 1+2^(3-4)*5/10=↙\nPlease:");
gets(calc); //输入表达式
for(ds1=0;calc[ds1]!='\0';ds1++) //去掉非运算符,如空格
if(!((calc[ds1]>='0'&&calc[ds1]
#include
#include
#include
#include
double fun1();
double fun2();
double fun3();
double fun4();
double fun5();
char calc[64];
int n;
double fun1()
{
double t;
t=fun2(); //先看有无乘除,将乘除计算完后再计算加减
while((calc[n]=='+')||(calc[n]=='-'))
{
switch(calc[n]) //计算加减时,再看后面的数有无乘除,将乘除计算完后再计算加减
{
case '+':n++,t=t+fun2();break;
case '-':n++,t=t-fun2();break;
}
}
return(t);
}
double fun2()
{
double t;
t=fun3(); //先看有无乘方,将乘方计算完后再计算乘除
while((calc[n]=='*')||(calc[n]=='/'))
{
switch(calc[n]) //计算乘除时,再看后面的数有无乘方,将乘方计算完后再计算乘除
{
case '*':n++,t=t*fun3();break;
case '/':n++,t=t/fun3();break;
}
}
return(t);
}
double fun3()
{
double t;
t=fun4(); //先看有无括号,将括号里的计算完后再计算乘方
while(calc[n]=='^')
{
n++,t=pow(t,fun4()); //计算乘方时,再看后面的数有无括号运算,将括号里的计算完后再计算乘方
}
return(t);
}
double fun4() //如此,将fun4()的值返回时(有括号的先算括号里的,再将计算值返回,起到去括号的目的),逐级按乘方、乘、除、加、减的次序进行计算,满足优先法则
{
char num[16];
int i=0;
double t;
if(calc[n]=='(')
{
n++,t=fun1(),n++; //遇括号时,先将括号里的值算出,再返回t给上一级
}
else if(fun5())
{
while(fun5()) //将与数字相关的符号赋予num[]
{
num[i++]=calc[n++];
}
num[i]='\0';
t=atof(num); //净num[]转换成数字
}
return(t); //返回t给上一级
}
double fun5()
{
if(((calc[n]>='0'&&calc[n]0&&(calc[n-1]=='+'||calc[n-1]=='-'||calc[n-1]=='*'||calc[n-1]=='/'||calc[n-1]=='^'||calc[n-1]=='(')))
return(1); //是与数字相关的,如数字字符、小数点、正负号,返回1
else
return(0); //加、减、乘、除、乘方时,返回0
}
int main(void)
{
int ds1,ds2;
loop:
n=0;
printf("Input a calculation method like 1+2^(3-4)*5/10=↙\nPlease:");
gets(calc); //输入表达式
for(ds1=0;calc[ds1]!='\0';ds1++) //去掉非运算符,如空格
if(!((calc[ds1]>='0'&&calc[ds1]
看了 编写程序模拟带括号的计算器...的网友还看了以下:
9分之4乘中括号0.75-括号16分之7-0.25括号中括号的简便计算4/9×[0.75-(7/1 2020-04-07 …
一个表达式中包括变量、常量、操作符、圆括号,圆括号可以嵌套,编写程序判断表达式中的括号是否正确匹配 2020-04-27 …
计算120/3*4-4,并试着利用小括号改变算式的运算顺序,并计算结果.你有哪几种不同的算法? 2020-07-18 …
请问如果像这样的整式x²-{x²-x²-(x²-1)-1-1}-1有三种括号,大括号,中括号,小括 2020-07-18 …
1199这四个数字用加,减,乘,除,中括号,小括号,最后要等于10不能重复不能漏掉数字,数字顺序可以 2020-11-03 …
合并同类项.(1)(3x-5y)-(6x+7y)+(9x-2y)=3x-5y-6x-7y+9x-2y 2020-11-11 …
如果一条算式里有中括号和小括号,这样计算完小括号后中括号要不要边变成小括号? 2020-11-27 …
阅读下面的文字,完成1~4题。计算机软件包括计算机程序及其有关文档。计算机程序是指为了得到某种结果而 2020-12-14 …
程序设计基础(C/C++)课程设计》内容包括:b.设计任务书;模板在后面;c.整体设计说明;d.各个 2021-01-21 …
脱式计算练习题小学四年级水平要求:千以内加减法,三位数乘除两位数,之内的加减乘除,包括括号的三步混合 2021-01-22 …
相关搜索:编写程序模拟带括号的计算器