租凭和租赁:求一个C++程序(设计一个模拟计算器)

来源:百度文库 编辑:神马品牌网 时间:2024/05/04 19:10:32
题目要求:对包含加,减,乘,除,括号运算符及SQR和ABS函数的任意整型表达式进行求解

//author: ***
//course designing for data structures and program design in c++
//time:***
/*
a simulant calculator
description: requiring design a simulant calculator ,which could take operations such as +,-,*,/ ,( ),or functon SQR ,ABS
condition:inputted expression can limit into int type.therefore ,you must check the expression for exactness.if the errors
take place ,the program would give an alarm.

*/

#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;
}