课程作业四
分为3个类:input,operate,和output
`class input
{
private:
int userans[20];//用户输入的答案
int quesnum;//题目数量
public:
void setuserans(int a);
void setquesnum(int a);
int getquesnum();
char* getuserans();
};`
`class output
{
private:
bool judge;//判断用户答案是否错误
char expression[20];//运算式
int userans;//用户答案
int correctans;//正确答案
public:
void printsummary();//打印解题报告
void printjudge();//判断答案对错,从而决定如何反馈信息
void setjudge(bool a);//传入判断值
void setuserans(int a);
void setcorrectnum(int a);
};`
`class operation
{
private:
bool judge;
char experssion[20];
int correctans;
int userans;
public:
char random();//生成随机数
void setexpression();//生成运算式
bool judgment();//判断结果是否是整数
void bolan();//转成逆波兰表达式
int calculate();//计算
void eornot(char *a);//判断用户输入是否有e
};`
算法实现
采用两个栈先将表达式转化为逆波兰式,再计算。
实现过程:
-
设两个栈s1,s2 ;
-
中缀式的左端开始逐个读取字符,逐序进行如下步骤:
-
若是操作数,则分析出完整的运算数,直接压入栈s2;
-
若是运算符,则分情况讨论:
-
若是'(',则直接压入栈s1;
-
若是')',则将距离栈s1栈顶的最近的'('之间的运算符,逐个出栈,依次压入栈s2,此时抛弃'(';
-
若是除'('和')'外的运算符,则再分如下情况讨论:
若当前栈s1的栈顶元素为'(',则直接压入栈s1;
若当前栈s1的栈顶元素不为'(',则与栈s1的栈顶元素比较,若优先级大于栈s1栈顶运算符优先级,则直接压入栈s1。否者,将栈s1的栈顶运算符弹出,压入栈s2中,直到栈s1的栈顶运算符优先级别低于(不包括等于)该字符优先级,或栈s2的栈顶运算符为'(',此时再则压入栈s1;
3.在进行完2后,检查栈s1是否为空,若不为空,则将栈中元素依次弹出并压入栈s2中(不包括'#');
4.完成上述步骤后,栈s2便为逆波兰式输出结果。但是栈s2应做一下逆序处理,因为此时表达式的首字符位于栈底;