早教吧作业答案频道 -->其他-->
编写程序模拟带括号的计算器
题目详情
编写程序模拟带括号的计算器
▼优质解答
答案和解析
#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]
看了 编写程序模拟带括号的计算器...的网友还看了以下:
会计核算的主要计量单位是()A实物计量单位B劳动计量单位C货币计量单位D时间计量单位 2020-04-06 …
会计核算软件与手工会计核算的相同点有( )。A.目标都是进行会计核算,提供与决策信息相关的会计信 2020-05-19 …
关于电算化会计核算的基本流程描述错误的是( )。A.会计电算化会计核算跟手工会计核算流程基本相 2020-05-19 …
下列说法中正确的有( )。A.会计准则是制定会计核算制度和组织会计核算的基本规范B.处置无形资产 2020-05-19 …
会计核算的基本前提包括持续经营、会计分期、货币计量和( )。A.自然人B.会计主体C.会计客体D.会 2020-05-22 …
会计资料是会计核算的重要成果,主要是指( )等会计核算专业资料。A.会计凭证B.会计账簿C.财务会计 2020-06-07 …
原始记录不仅是统计核算和会计核算的基础,而且也是( )。A.业务核算的依据B.效益核算的 2020-06-07 …
下列不属于会计核算的基本方法是().A.会计确认B.会计计算C.会计记录D.会计报告答案竟然是B, 2020-06-15 …
[判断题]填制会计凭证是会计核算的方法之一,也是会计核算工作的起始环节()A、正确B、错误 2020-06-15 …
请问,U890里是如何同时使用双计量单位的就是一个存货有两种计量单位,打个比方,就是原料购进时是既 2020-06-15 …
相关搜索:编写程序模拟带括号的计算器