第四次课程作业

第四次课程作业

采取面向对象的方法,四则运算自动出题软件,根据需求可以划分为几个类?每个类具有什么属性?每个类具有什么行为?

根据我的代码划分为两个类。


class Equation    //算式类
{
private:
	char a[10];//用字符数组存放生成的算式
public:
	void generateExpresion();//用于生成运算式
	friend int calculateResult(Equation &);//用于计算
	int randomOperation();//生成随机运算符
	int randomNumber();//生成随机数
	char trans_operation();//转换运算符
	void get();//输出算式
};
int calculateResult(Equation &)
{
	
}
class Statistics//统计类
{
private:
	int right;
public:
	void judge(int ans, int s);//判断用户答案是否正确
	int get();
};
void print(int c)//输出统计结果
{

}

采取面向对象的方法,四则运算自动出题软件,根据需求可以划分为几个类?每个类具有什么属性?每个类具有什么行为?

随机生成类能够随机生成各种类运算式,同时将运算符传递给转化类;转化类将随机生成的运算符(转化前为数字)转化为符号传入运算类;运算类则负责计算结果,并将计算结果交给统计类;统计类则统计最终结果并判断答案是否正确。

该自动出题软件采取何种算法或者是如何实现的?可以采用流程图描述的方法。

由于生成的式子种类是固定几种的,所以计算方法是再写对应几种的计算函数分别计算。导致函数庞杂,显得很乱。前几天看数据结构-栈和队列内容的时候无意间看到后缀表达式这种方法,它能够适应各种算式的计算。就和蔡子阳探讨了下这个方法。


  • 我们把平时所用的标准四则运算表达式“9+(3-1)X3+10/2"叫做中缀表达式。转化为后缀表达式的规则为:从左到右遍历中缀表达式,若是数字就输出(即成为后缀表达式的一部分);若是符号,则判断其与栈顶符号的优先级,若是右括号或优先级高于栈顶符号则栈顶元素依次出栈并输出,并将当前符号进栈。
  • 以9+(3-1)*3+10/2为例
  1. 初始化一空栈,用来对符号进出栈使用。

  2. 第一个字符是数字9,输出9,将后面的“+”进栈。

  3. 第三个字符是“(”,左括号进栈。

  4. 第四个字符是数字3,输出,总表达式为9 3,接着是“-”,进栈。

  5. 接下来是数字1,输出,总表达式为9 3 1,后面是符号“)”,此时,我们需要去匹配之前的“(”,所以栈顶依次出栈,并 输出,直到“(”出栈为止。此时总的输出表达式9 3 1 -。

  6. 紧接着是“X”,因为此时的栈顶符号为“+”号,优先级低于“X”,因此不输出,“X”进栈,接着是数字3,输出,总的表达式为9 3 1 - 3.

  7. 之后是符号“+”,此时当前栈顶元素“X”比“+”优先级高,因此栈中元素出栈并输出(没有比加号更低的优先级,所以全出栈),总输出表达式为9 3 1 - 3 * +。然后将当前这个符号”+“进栈。

  8. 接着数字10,输出,总表达式为9 3 1 - 3 * + 10.后是符号”/“进栈。

  9. 最后一个数字2,输出,总的表达式为9 3 1 - 3 * + 10 2.

  10. 因为已经到最后,所以将栈中符号全部出栈并输出,最终输出的后缀表达式结果为9 3 1 - 3 * + 10 2 / +。

  • 接下来用得到的后缀表达式进行计算
  • 规则:从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到是符号,就将栈顶的两个数字出栈,进行运算,运算结果进栈。直到获得最终结果。
  1. 初始化一个空栈。此栈用来对要运算的数字进出使用。

  2. 后缀表达式中前三个全是数字,所以9 3 1 进栈。

  3. 接下来是”-“,所以将栈中1出栈作为减数,3为被减数,得到2进栈。

  4. 数字3进栈

  5. 后面是”*“,将2和3出栈得到6进栈。

  6. 下面是”+“,所以6和9出栈得到15进栈。

  7. 接着是10和2进栈。

  8. 接下来是符号”/“,2和10出栈得到5进栈。

  9. 最后一个符号”+“,将15和5出栈得到最终结果20进栈。

  10. 结果是20出栈,栈变为空。

原文地址:https://www.cnblogs.com/lzhkami/p/6858837.html