课程作业四

分为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 

};`

算法实现
采用两个栈先将表达式转化为逆波兰式,再计算。
实现过程:

  1. 设两个栈s1,s2 ;

  2. 中缀式的左端开始逐个读取字符,逐序进行如下步骤:

  • 若是操作数,则分析出完整的运算数,直接压入栈s2;

  • 若是运算符,则分情况讨论:

  • 若是'(',则直接压入栈s1;

  • 若是')',则将距离栈s1栈顶的最近的'('之间的运算符,逐个出栈,依次压入栈s2,此时抛弃'(';

  • 若是除'('和')'外的运算符,则再分如下情况讨论:

              若当前栈s1的栈顶元素为'(',则直接压入栈s1;

              若当前栈s1的栈顶元素不为'(',则与栈s1的栈顶元素比较,若优先级大于栈s1栈顶运算符优先级,则直接压入栈s1。否者,将栈s1的栈顶运算符弹出,压入栈s2中,直到栈s1的栈顶运算符优先级别低于(不包括等于)该字符优先级,或栈s2的栈顶运算符为'(',此时再则压入栈s1;

3.在进行完2后,检查栈s1是否为空,若不为空,则将栈中元素依次弹出并压入栈s2中(不包括'#');      

  

4.完成上述步骤后,栈s2便为逆波兰式输出结果。但是栈s2应做一下逆序处理,因为此时表达式的首字符位于栈底;

posted @ 2017-05-15 19:48  daydreams  阅读(107)  评论(0编辑  收藏  举报