简单的四则运算计算器程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Type getTop(){
return base[Size-1];}
int size(){
return Size;}
};
class Analyzer { public:
static int analysis(char *str,unsigned int& mark,char *returns) {
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;
{ 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"; } };
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)
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
template <class Type>
class STACK{
//定义栈类
private:
Type base[MAX];
int Size;
public:
STACK(){Size=0;};
void push(Type a){
base[Size]=a;
Size++;}
Type pop(){
return base[--Size];}
} else if(ch=='*'||ch=='/') {
if(sOperator.size()>0&&(sOperator.getTop().getpriority()==1)) {
b=sOperand.pop().get(); a=sOperand.pop().get(); switch(sOperator.pop().get()) { case '*':a=a*b;break; case '/':
指导教师批阅意见:
成绩评定:
备注:
指Biblioteka Baidu教师签字: 年月日
注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。 2、教师批改学生实验报告时间应在学生提交实验报告时间后 10 日内。
1
附件:程序源代码 // sizheyunsuan.cpp : Defines the entry point for the console application. #include<iostream.h> #include<string.h> const int MAX=100;
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=='(') {
简单的四则运算计算器程序
实验目的与要求: 目的:
1、掌握类、构造函数/析构函数、栈等概念,掌握字符串操作; 2、步了解类的设计方法,初步了解词法分析、表达式求值的算符优先算法等内容。 要求:
以接收由键盘输入的整数四则运算表达式(由整数和加、减、乘、除、圆括号组成), 计算出该表达式的值,然后输出结果。
char operF; int priority; public: Operator(){} Operator(char operf) {
operF=operf; switch(operf) { case'(':priority=-1;break; case'+':priority=0;break; case'-':priority=0;break; case'*':priority=1;break; case'/':priority=1;break; case')':priority=2;break; } } void set(char operf){ operF=operf; } char get(){ return operF;} int getpriority(){ return priority; } };
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) {
Operator oper('('); sOperator.push(oper); //cout<<"符号:"<<sOperator.getTop().get()<<"入栈\n"; } else if(ch==')') { while(sOperator.getTop().getpriority()!=-1) {
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";
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=='-') {
数据处理分析: 1、 接收用户输入,并作检查,判断用户是否正确输入。 2、如果输入正确,则进行计算:计算过程,跟踪栈出入结果,表达式分析如下图:
(见下一页)
1
计算过程,跟踪栈出入结果,表示如下:
结果验证,计算结果正确
1
实验结论: 上述的“四则运算表达式”算法可以计算任意正整数的四则运算表达式,输入的原始表 达式中的操作数只能为正整数、或者负数用 2 元表达式的形式,比方(-2)用(0-2)代 替,操作符包含加、减、乘、除和括号。原始表达式的长度 100 个字符(比这个长的表 达式,不多了吧),但必须符合正整数“四则运算表达式”的运算法则。
方法、步骤: 设计 2 个栈,分别用于存放操作数和操作符,其中操作符有优先级。栈内存放的操作数 用一个类名为 Operand 的类存放;操作符用 Operator 类存放,并且设置相应运算符的优 先级。将用户输入的整个四则运算表达式字符串可看作由操作数,运算符和左右括弧() 组成的字符串,并用事先定义的操作数类、操作符类来表示相应的对象。用一个叫分析 器的类(Analyzer)对输入的四则运算进行分析扫描,每次返回一个字符串;定义一个 名为 calculate 的函数将 Analyzer 的静态方法返回的字符串构造为相应的对象,放入各自 的栈,并利用四则运算规则,计算相应的结果。 calculate 函数利用四则运算的规则:乘、除优先级高于加、减,放入操作符栈的规则为: 1、操作符栈里符号进栈规则是,后进栈的操作符优先级必须高于已经进栈符号的优先级, 比方如果接收的操作符优先级等于或小于(<=)栈顶操作符优先级,则先对栈顶操作符 进行出栈,运算;再将后面的操作符入栈保存。这样保证操作符栈里符号优先级为由低 到高,符合优先级高的操作符先出栈,参与运算的规则。 2、遇到左括弧“(”时,先将左括弧“(”进栈,当扫描到右括弧“)”时候,取操作符 栈运算符出栈计算,直到栈顶为左括弧为止。 3、分析完输入字符串后,全部计算完成,计算结果便从操作数栈中取出。