求问一道题 编写程序对表达式求值

[复制链接]
查看11 | 回复2 | 2021-1-27 06:45:35 | 显示全部楼层 |阅读模式
Enteranexpression:1+2.5*3
Value:10.5
表达式中运算符只能为+-*/,表达式从左向右求值,运算符的优先级相同,运算符可多个。
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:45:35 | 显示全部楼层
voidcal()
{
charop;
doubleL,R;
cin>>L;
while(cin>>op>>R){
switch(op){
case'+':L+=R;break;
case'-':L-=R;break;
case'*':L*=R;break;
case'/':L/=R;break;
default:assert(false);
}
}
cout
回复

使用道具 举报

千问 | 2021-1-27 06:45:35 | 显示全部楼层
仅供参考:/*---------------------------------------
函数型计算器(VC++6.0,Win32Console)程序由yu_hua于2007-07-27设计完成
功能:
目前提供了10多个常用数学函数:
⑴正弦sin
⑵余弦cos
⑶正切tan
⑷开平方sqrt
⑸反正弦arcsin
⑹反余弦arccos
⑺反正切arctan
⑻常用对数lg
⑼自然对数ln
⑽e指数exp
⑾乘幂函数∧
用法:
如果要求2的32次幂,可以打入2^32
如果要求30度角的正切可键入tan(Pi/6)
注意不能打入:tan(30)
如果要求1.23弧度的正弦,有几种方法都有效:
sin(1.23)
sin1.23
sin1.23
如果验证正余弦的平方和公式,可打入sin(1.23)^2+cos(1.23)^2或sin1.23^2+cos1.23^2
此外两函数表达式连在一起,自动理解为相乘如:sin1.23cos0.77+cos1.23sin0.77就等价于sin(1.23)*cos(0.77)+cos(1.23)*sin(0.77)
当然你还可以依据三角变换,再用sin(1.23+0.77)也即sin2验证一下。
本计算器充分考虑了运算符的优先级因此诸如:2+3*4^2实际上相当于:2+(3*(4*4))
另外函数名前面如果是数字,那么自动认为二者相乘.
同理,如果某数的右侧是左括号,则自动认为该数与括弧项之间隐含一乘号。
如:3sin1.2^2+5cos2.1^2相当于3*sin2(1.2)+5*cos2(2.1)
又如:4(3-2(sqrt5-1)+ln2)+lg5相当于4*(3-2*(√5-1)+loge(2))+log10(5)
此外,本计算器提供了圆周率Pi键入字母时不区分大小写,以方便使用。
----------------------------------------*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
usingnamespacestd;
constcharTab=0x9;
constintDIGIT=1;
constintMAXLEN=16384;
chars[MAXLEN],*endss;
intpcs=15;
doublefun(doublex,charop[],int*iop){
while(op[*iop-1]
switch(op[*iop-1]){
case7:x=sin(x);(*iop)--;break;
case8:x=cos(x);(*iop)--;break;
case9:x=tan(x);(*iop)--;break;
case10:x=sqrt(x);(*iop)--;break;
case11:x=asin(x);(*iop)--;break;
case12:x=acos(x);(*iop)--;break;
case13:x=atan(x);(*iop)--;break;
case14:x=log10(x);(*iop)--;break;
case15:x=log(x);(*iop)--;break;
case16:x=exp(x);(*iop)--;break;
}
returnx;
}
doublecalc(char*expr,char**addr){
staticintdeep;//递归深度
staticchar*fname[]={"sin","cos","tan","sqrt","arcsin","arccos","arctan","lg","ln","exp",NULL};
doubleST[10]={0.0};//数字栈
charop[10]={'+'};//运算符栈
charc,*rexp,*pp,*pf;
intist=1,iop=1,last,i;
if(!deep){
pp=pf=expr;
do{
c=*pp++;
if(c!=''&&c!=Tab)
*pf++=c;
}while(c!='\0');
}
pp=expr;
if((c=*pp)=='-'||c=='+'){
op[0]=c;
pp++;
}
last=!DIGIT;
while((c=*pp)!='\0'){
if(c=='('){//左圆括弧
deep++;
ST[ist++]=calc(++pp,addr);
deep--;
ST[ist-1]=fun(ST[ist-1],op,&iop);
pp=*addr;
last=DIGIT;
if(*pp=='('||isalpha(*pp)&&strnicmp(pp,"Pi",2)){//目的是:当右圆括弧的右恻为左圆括弧或函数名字时,默认其为乘法
op[iop++]='*';
last=!DIGIT;
c=op[--iop];
gotooperate;
}
}
elseif(c==')'){//右圆括弧
pp++;
break;
}elseif(isalpha(c)){
if(!strnicmp(pp,"Pi",2)){
if(last==DIGIT){
cout=ist){
coutNUL");//中文代码页
coutNUL");//中文代码页
cout2){
for(a=2;a
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行