#include<iostream.h>
#include<math.h>
#include<stdlib.h>
bool existChar(); // 检查是否有可用的数据
double getData(); // 获取一个数据
double jsBds(); // 计算表达式的值
double js(double,double,char); // 计算两个数的计算结果
//检测输入流中是否有可用的数据,忽略空格及制表,遇到换行说明已无可用数据。
//有数据返回true,否则返回假
bool existChar()
{
char c;
while(true)
{
c=cin.peek(); // 若无数据,则cin.peek()返回-1
if( c==10 || !(c==' '||c==9) ) // 若取得的是换行(10),也认为无数据
break;
cin.get(); // 把数据读出来忽略掉
}
return c!=10; // 只要不是换行,就认为有数据
}
// 从流中取一个数据
// 若不能取得数据,则认为是表达式错误
double getData()
{
int err=1; // 默认表达式有错误
double d;
if (existChar()) // 不能取得数据认为有错
{
char c=cin.peek();
if(c=='(') // 是(,处理括号
{
cin.get();
return jsBds();
}
else
{
cin>>d; // 获取数据
err=cin.fail(); // 是否读到数据
}
}
if(err) // 读数据错误,结束程序
{
cout<<"表达式错误\n";
exit(1);
}
return d; // 返回读取的数据
}
// 根据运算符 f 进行计算
double js(double n1,double n2,char f)
{
if(f=='+') return n1+n2; // 加
if(f=='-') return n1-n2; // 减
if(f=='*') return n1*n2; // 乘
if(f=='/') return n1/n2; // 除
if(f=='\\')return int(n1/n2); // 整除
if(f=='%') return fmod(n1,n2); // 余数
if(f=='^') return pow(n1,n2); // 指数
cout<<"表达式错误\n";
exit(1);
}
// 计算表达式的值
// 计算优先级:
// 1、() + - ( 小括号 正 负 )
// 2、^ ( 指数 )
// 3、* / \ % ( 乘 除 整除 取余 )
// 4、+ - ( 加 减 )
double jsBds()
{
double n1=0,n2=getData(),n3,n4; // 保存数据
char f='+',f2,f3; // 保存运算符
while(true)
{
if(!existChar())
return js(n1,n2,f); // 就两个数据进行运算
cin>>f2; // 取第2个运算符
if(f2=='-'||f2=='+'||f2==')') // 是 +、-、)
{
n1=js(n1,n2,f);
if(f2==')')return n1; // 是 ) 返回
f=f2; // 看做第1个运算符
n2=getData();
continue;
}
else if(f2=='^') // 是 指数计算
{
n3=getData();
n2=js(n2,n3,f2);
continue;
}
n3=getData(); // 取第三个数据
while(existChar())
{
cin>>f3; // 取第3个运算符
if(f3=='^') // 是 指数 运算
{
n4=getData(); // 取第四个数据
n3=js(n3,n4,f3);
continue;
}
cin.putback(f3);
break;
}
n2=js(n2,n3,f2); // 进行 乘、除、整除、取余 计算
}
}
void main()
{
cout<<"请输入表达式:";
cout<<" 表达式的值= "<<jsBds()<<endl;
}
请输入表达式:5.4 % 2
表达式的值= 1.4
Press any key to continue
请输入表达式:2*(3+4
表达式的值= 14
Press any key to continue
请输入表达式:2*(-3*(6.8\2-1
表达式的值= -12
Press any key to continue
请输入表达式:((1.5+2)*3-4)%2+10
表达式的值= 10.5
Press any key to continue
请输入表达式:(2.5+3.5)*2^3^4-100
表达式的值= 24476
Press any key to continue