简单的四则运算计算器程序
for(;int(str[mark])>=48&&int(str[mark])<=57;) returns[i++]=str[mark++];
returns[i]='\0'; return 0; } } };
void calculate(char *temp,STACK<Operator>& sOperator,STACK<Operand>& sOperand) {
b=sOperand.pop().get(); a=sOperand.pop().get(); switch(sOperator.pop().get()) { case '*':a=a*b;break; case '/':
{ if(b==0) { cout<<"程序错误,0 作为除数出现!"; } else a=a/b;
class Operand{ private:
double operS; public:
Operand(){} Operand(double opers){
operS=opers; } void set(double opers){
operS=opers; } double get() {
return operS;} }; class Operator{ private:
}break; case '+':a=a+b;break; case '-':a=a-b;break; default:{}break; } Operand oper(a); sOperand.push(oper); //cout<<"计算,并将结果压:"<<sOperand.getTop().get()<<"入栈\n"; //cout<<"计算 1 次\n"; } if(sOperator.getTop().getpriority()==-1) sOperator.pop(); } else if(ch=='+'||ch=='-') {
Operator oper('('); sOperator.push(oper); //cout<<"符号:"<<sOperator.getTop().get()<<"入栈\n"; } else if(ch==')') { while(sOperator.getTop().getpriority()!=-1) {
简单的四则运算计算器程序
实验目的与要求: 目的:
1、掌握类、构造函数/析构函数、栈等概念,掌握字符串操作; 2、步了解类的设计方法,初步了解词法分析、表达式求值的算符优先算法等内容。 要求:
以接收由键盘输入的整数四则运算表达式(由整数和加、减、乘、除、圆括号组成), 计算出该表达式的值,然后输出结果。
1
template <class Typete:
Type base[MAX];
int Size;
public:
STACK(){Size=0;};
void push(Type a){
base[Size]=a;
Size++;}
Type pop(){
return base[--Size];}
{ if(b==0) { cout<<"程序错误,0 作为除数出现!"; }
1
else a=a/b;
}break; default:{}break; } Operand oper(a); sOperand.push(oper); //cout<<"计算,并将结果压:"<<sOperand.getTop().get()<<"入栈\n"; //cout<<"计算 1 次\n"; } Operator oper(ch); sOperator.push(oper); //cout<<"符号:"<<sOperator.getTop().get()<<"入栈\n"; } //-------------------------} else { int t=0; for(unsigned int i=0;i<strlen(temp);i++) { t=t*10+int((temp[i])-48); } double a=double(t); Operand operS(a); sOperand.push(operS); //cout<<"操作数数:"<<sOperand.getTop().get()<<"入栈\n"; } };
if(temp[0]=='('||temp[0]==')'||temp[0]=='*'||temp[0]=='+'||temp[0]=='-'||temp[0]=='/') {
//cout<<"符号:"<<temp[0];
1
//-------------------------//calculate 计算 char ch=temp[0]; double a,b; if(ch=='(') {
while(sOperator.size()>0&&(sOperator.getTop().getpriority()==1||sOperator.getTop().getprior
1
ity()==0)) { b=sOperand.pop().get(); a=sOperand.pop().get(); switch(sOperator.pop().get()) { case '*':a=a*b;break; case '/': { if(b==0) { cout<<"程序错误,0 作为除数出现!"; } else a=a/b; }break; case '+':a=a+b;break; case '-':a=a-b;break; default:{}break; } Operand oper(a); sOperand.push(oper); //cout<<"计算,并将结果压:"<<sOperand.getTop().get()<<"入栈\n"; //cout<<"计算 1 次\n"; } Operator oper(ch); sOperator.push(oper); //cout<<"符号:"<<sOperator.getTop().get()<<"入栈\n";
int i=0; if(str[mark]=='('||str[mark]==')'||str[mark]=='*'||str[mark]=='+'||str[mark]== '-'||str[mark]=='/')
{ returns[0]=str[mark++]; return 0;
} else if(int(str[mark])>=48&&int(str[mark])<=57) {
1
实验过程及内容: 实验中整个用一个名为 sizheyunsuan.cpp 的 C++源文件。详细过程见附件程序清单。
该源文件中相关类的成员变量以及成员函数如下所示: 类:
Operand:操作数类,包含私有成员 operS,表示操作数的数值。 Operator:操作符类,包含私有成员 operF,priority,分别表示操作符的符号,以及 运算优先级。 template <class Type> class STACK:用于存放操作数和操作符的栈 Analyzer : 字 符 串 扫 描 分 析 类 , 包 含 静 态 函 数 analysis(char *str,unsigned int& mark,char *returns) 函数: void calculate(char *temp,STACK<Operator>& sOperator,STACK<Operand>& sOperand): 对扫描返回的字符串分析,构造相应的对象,并依照运算规则进行计算。 void main():程序主函数。 对象以及变量: STACK<Operator> sOperator:存放操作数的栈 STACK<Operand> sOperand:存放操作符的栈 Analyzer analyzer:扫描分析器 char Str_input[MAX]:存放用户输入的四则表达式 char temp[12]:存放分析器返回的字符串 unsigned int mark:“游标”的作用,标示分析器每一次调用分析操作对应的输入字 符串的位置。 运算结果图示:((2+5)*3-4*6+5)/2+10-6*(3-1)
} else if(ch=='*'||ch=='/') {