#include<iostream>
#include<conio.h>
#include<stack>
#include<string>
#include<cstdlib>
#include<math.h>
using namespace std;
void init(string& s){
cout << "enter the expression:";
cin >> s;
s += "#";
}
void error(int tag){
switch(tag){
case 1:
cout<<"wrong operator!"<<endl;
break;
case 2:
cout<<"wrong operand!"<<endl;
break;
}
}
bool is_optr(char c){
string optr_string("+-*/()AS#");
for(int i=0;i<optr_string.size();i++)
if(c==optr_string[i])
return true;
return false;
}
char precede(char op1, char op2){
string tab[9];
tab[0]=">><<<><<>";
tab[1]=">><<<><<>";
tab[2]=">>>><><<>";
tab[3]=">>>><><<>";
tab[4]="<<<<<=<<E";
tab[5]=">>>>E>>>>";
tab[6]=">>>><>>>>";
tab[7]=">>>><>>>>";
tab[8]="<<<<<E<<=";
string optr_string("+-*/()AS#");
int op1_loc,op2_loc;
for(op1_loc=0;op1_loc<optr_string.size();op1_loc++)
if(optr_string[op1_loc]==op1)break;
for(op2_loc=0;op2_loc<optr_string.size();op2_loc++)
if(optr_string[op2_loc]==op2)break;
return tab[op1_loc][op2_loc];
}
double operate(double x,char op,double y){
switch(op){
case '+': return x+y; break;
case '-': return x-y; break;
case '*': return x*y; break;
case '/': return x/y; break;
case 'A': return fabs(y);break;
case 'S': return sqrt(y);break;
}
return -1;
}
double cal(string& s){
stack<char>optr;
optr.push('#');
stack<double>opnd;
char c=s[0];
s.erase(0,1);
while(c!='#'||optr.top()!='#'){
if(!is_optr(c)){
if(c>='0'&&c<='9'){
string num;
num.insert(num.begin(),c);
int loc=0;
while(!is_optr(s[loc]))
loc++;
string num2(s,0,loc);
num+=num2;
s.erase(0,loc);
double x=atof(num.c_str());
opnd.push(x);
c=s[0];
s.erase(0,1);
} else {
error(2);
return -1;
}
}else{
switch(precede(optr.top(),c)){
case '<': optr.push(c); c=s[0]; s.erase(0,1); break;
case '=': optr.pop(); c=s[0]; s.erase(0,1); break;
case '>':
char op;
op=optr.top();
optr.pop();
double a,b;
a=opnd.top();
opnd.pop();
if(op!='S'&&op!='A'){
b=opnd.top();
opnd.pop();
}
double res;
res=operate(b,op,a);
opnd.push(res);
break;
case 'E':
error(1);
return -1;
}
}
}
return opnd.top();
}
int main(){
string expression;
double value;
init(expression);
value=cal(expression);
cout<<value<<endl;
getch();
return 0;
}
计算器程序(C++)
4星 · 超过85%的资源 需积分: 10 176 浏览量
2008-06-06
11:13:20
上传
评论 1
收藏 13KB RAR 举报
liuenhai211
- 粉丝: 11
- 资源: 17
最新资源
- WANGSHANGYINHANG-4.2.9.031406-android
- docker&docker-compose离线安装包(centos)
- 滑动窗口是一种流量控制技术,用于在数据传输过程中进行拥塞控制和流量调节4.txt
- Nacos如何支持服务发现和注册-基于词频统计的分析.txt
- :基于java打造的深度学习框架,帮助你快速搭建神经网络,实现模型推理与训练,引擎支持自动求导,多线程与GPU运算
- 第九次作业(XY图,XY图显示,三维曲面,数字波形图)
- 微信小程序实战案例:打造高效便捷的在线书店.zip
- 1.0.5win(1)(1).exe
- ESP8266 WiFi模块入门教程:从连接到配置.zip
- 词频统计:从基础到实践的应用指南.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈