📄 科学计算器2.0.cpp
字号:
//07.10.16
//程序功能:将输入的运算表达式转换成逆波兰式,并输出计算结果
//例:
// 输入 123+345*(24+345/(567-81/9))
// 输出 123 345 24 345 567 81 9 / - / + * +
// 结果 8616.31
#include <iostream>
#include <string>
#include <stdlib.h>
#include <conio.h>
#include "stack.h" // 栈类头文件
using namespace std;
void message(){ //信息函数 提示相关信息及注意事项
cout <<"四则科学计算器2.0... "<<endl <<endl;
cout <<"注:经过改进,此程序已经可以处理输入数据为小数的四则运算;"<<endl;
cout <<endl;
cout <<" 此程序未对输入的表达式做查错处理,请保证输入的是数学四则运算表达式,"<<endl;
cout <<" 否则将会出现不可预计的后果;"<<endl;
cout <<endl;
cout <<" 此程序的计算数及计算结果均用 double 型数据储存,所以基本可以忽略浮点" <<endl;
cout <<" 型数据存在的舍去误差。但结果只输出6位有效数字,其中第六位为近似值" <<endl;
cout <<endl;
cout <<" 此程序亦无对溢出进行处理,一般不会溢出。";
cout <<endl <<endl <<endl;
cout <<" -------07.10.22改 (by yuwq07)" <<endl;
}
int cmp(int x,int y){ //优先级比较函数
if(x==43||x==45) x=1;
else x=2;
if(y==43||y==45) y=1;
else y=2;
if(x<y) return 0;
return 1;
}
void change(Stack<char> s,string str1,string &str2){ //逆波兰转换函数
int i;
char a;
for(i=0;i<str1.size();i++){
if(str1[i]<58&&str1[i]>47||str1[i]==46){
str2+=str1[i];
continue;
}
if(str1[i]==40){
s.Push(40);
continue;
}
if(str1[i]==41){
s.Pop(a);
while(a!=40){
str2+=32;
str2+=a;
s.Pop(a);
}
continue;
}
while(s.GetTop(a)&&a!=40&&cmp(a,str1[i])){
str2+=32;
s.Pop(a);
str2+=a;
}
str2+=32;
s.Push(str1[i]);
}
while(s.GetTop(a)){
str2+=32;
s.Pop(a);
str2+=a;
}
}
int judge(string str,int &p){ //判断运算符函数:如果为运算符,返回 1;否则返回 0;
if(str[p]>47&&str[p]<58) return 0;
p-=2;
return 1;
}
double count(double id1,double id2,int op){ //四则运算函数
double sum;
switch(op){
case 42: sum=id1*id2; break;
case 43: sum=id1+id2; break;
case 45: sum=id1-id2; break;
case 47: sum=id1/id2; break;
}
return sum;
}
double change_num(string str,int &p){ //数据转换函数
int i=0,j; //把数字字符串转换成相对应的数字
double sum=0.0,t;
while(str[p]!=32&&p>=0){ //32为空格的ASCII码
if(str[p]==46){ //46为小数点的ASCII码
t=1;
for(j=0;j<i;j++)
t=t*10;
sum=sum/t;
i=0;
p--;
}
else{
t=str[p--]-48;
for(j=0;j<i;j++)
t=t*10;
sum+=t;
i++;
}
}
p--;
return sum;
}
double summation(string str,int &p){ //表达式计算函数
double id1,id2; //根据所求得的逆波兰式计算表达式的值
int op=str[p];
if(judge(str,p)){
id2=summation(str,p);
id1=summation(str,p);
return count(id1,id2,op);
}
return change_num(str,p);
}
void task(){ //任务函数 执行要完成的任务
string str1,str2;
Stack<char> s;
s.InitStack();
cout <<"输入要计算的数学表达式" <<endl; //求逆波兰式
cin >>str1;
change(s,str1,str2);
cout <<endl <<"该数学表达式的逆波兰式为" <<endl;
cout <<str2 <<endl <<endl;
double sum; //计算表达式的值
int p=str2.size()-1;
sum=summation(str2,p);
cout <<"计算得到该表达式的值为:" <<endl;
cout <<sum <<endl <<endl <<endl;
}
int main(){ //主函数
message(); //输入相关信息
system("pause");
do{
system("cls");
task();
cout <<"按ESC退出,按其它键继续..." <<endl;
}while(getch()!=27);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -