软件工程(2019)第五次作业——四则运算器


1.题目

  我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:

  • 能够自动生成四则运算练习题
  • 可以定制题目数量
  • 用户可以选择运算符
  • 用户设置最大数(如十以内、百以内等)
  • 用户选择是否有括号、是否有小数
  • 用户选择输出方式(如输出到文件、打印机等)
  • 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)

2.任务分配

  驾驶员:郭田恬
  领航员:孙宏云

3.实现过程

(1)分析问题:
  通过题目确定本次程序具体要实现的功能。用户可选择的内容:题目数量,计算数的个数,计算数的最大值,式子中需要用到的运算符,是否是小数计算,是否需要括号。本次程序可生成两个计算数的运算式、三个计算数的运算式(有括号与无括号)。

(2)类的定义:
  根据上述分析,定义一个类,存放一些功能函数与数据。具体内容如下:

class Four_ari_op
{
public:
	Four_ari_op();
	~Four_ari_op();
	void init(int qnum, int opnum, int maxnum, int brackets, int snumber, int fileout, char opor[]);
	void Getnumber();//输出随机数
	int Getposition();//括号位置的选择
	void Fun();//生成四则运算式

	ofstream outfile;//文件
private:
	int Getnumber1();//随机整数的产生
	float Getnumber2();//随机小数的产生
	void Gettwo();//生成 a x b 形式
	int Getop();//运算符的选择

	int Qnum;//题目数量(1~50)
	int OPnum;//计算数的个数(2或3)
	int Maxnum;//计算数的最大数(10~100)
	bool Brackets;//括号存在否(为真则存在,否则不存在)
	bool Snumber;//小数存在否(为真则存在,否则不存在)
	bool Fileout;//是否用文件的形式输出(为真则输出,否则不输出)
	char Opor[6];//存储用户使用的运算符
	int Onum;//运算符个数
	int flag;//除数标志 为1表示是除数
};

(3)函数功能:

   ①随机整数的生成。

int Four_ari_op::Getnumber1()//随机整数的产生  
{
	int result;
	result = random(Maxnum) + flag;   //flag=0则表示生成0~maxnum,flag=1则表示生成1~maxnum
	if (result == Maxnum)
	{
		result--;   //由于不能达到最大值,顾减一
	}
	return result;
}

   ②随机小数的生成。

float Four_ari_op::Getnumber2()//随机小数的产生  
{
	int result1;
	float result2, result;
	result1 = random(Maxnum);   //生成0~maxnum
	result2 = random(10)*0.1;//生成0~1之间的小数
	result = result1 + result2;
	if (result > Maxnum)
	{
		result--;   //由于不能超过最大值,顾减一
	}
	return result;
}

   ③括号位置的选择与运算符的选择。
    由于运算符存放在字符数组中,便可随机生成数字来代表字符数组的下标,进而确定选定的运算符。

int Four_ari_op::Getposition()//括号位置的选择
{
	return random(2);//随机生成0~1
}

int Four_ari_op::Getop()//运算符的选择  
{
	return random(Onum-1);//随机生成0~Onum-1
}

   ④输出随机数。
    这里需要分两种情况考虑,根据Snumber值来判断是小数还是整数。

void Four_ari_op::Getnumber()//输出随机数
{
	if (Snumber)//小数
	{
		float n = Getnumber2();
		cout << n << " ";
		if (Fileout)
		{
			outfile << n << " ";
		}
	}
	else //整数
	{
		int n = Getnumber1();
		cout << n << " ";
		if (Fileout)
		{
			outfile << n << " ";
		}
	}
}

   ⑤输出axb形式。
    随机生成一个数+随机生成一个运算符+随机生成一个数。需强调的是当选择的运算符为除号时,需要给一个标志来保证下一个数不为零。

void Four_ari_op::Gettwo()//生成 a x b 形式
{
	Getnumber();
	int n = Getop();
	if (Opor[n] == '/')
	{
		flag = 1;//表示下一个数为除数
	}
	cout << Opor[n] << " ";
	if (Fileout)
	{
		outfile << Opor[n] << " ";
	}
	Getnumber();
	flag = 0;
}

   ⑥生成运算式。
    分为两种运算式形式。一位两个计算数的运算式,二为三个计算数的运算式。在第二种运算式中则分为有无括号两种,根据上述第三个函数来确定括号的具体位置并实现。

  整体代码的上传地址

4.评价及总结

  本次程序编写,开始时经过与领航员的探讨确定了用户可选择的内容。领航员进行了分析,确定了需要实现的具体内容,并辅助完成了整体代码的编写。代码编写完毕后,由领航员进行了测试,提出了文件的输出要求没有实现,还有小数输出的问题。之后经过改进,最后完成了代码的编写,基本实现了要求内容。本次作业基本完成了所要求的内容,刚开始进行便写时有想用到C#进行编写,这样可以编写出界面,观赏性更高。但是由于自身能力不够,对C#的了解不够,便选择了C++进行编写。本次作业的完成还有很多的不足,一没有写出界面,代码只是很简单地用Dos界面显示出最基本的内容,这是我们下一个需要进行改进的地方;二所考虑的运算式过于简单,没有更明确的选择来供用户进行更高进准的选择。作业的完成情况不是很好,希望我可以在此次作业的基础上能对自己进行更加严格的要求,增进自己的知识内容,不会在想使用的时候又发现自己不会。
  总的来说,完成过程还是很愉快的。这次我更加体会到了两人结对完成的好处,希望之后还会有收获。

posted on 2019-05-06 20:37  郭田恬  阅读(264)  评论(0编辑  收藏  举报