软件工程(2018)结对编程第二次作业

一.题目要求

题目1:
我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:
能够自动生成四则运算练习题
可以定制题目数量
用户可以选择运算符
用户设置最大数(如十以内、百以内等)
用户选择是否有括号、是否有小数
用户选择输出方式(如输出到文件、打印机等)
最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)

二.角色分配

1.驾驶员

能够完成全部代码工作,程序基本实现全部要求功能,并将代码上传至coding.net或者GitHub代码托管系统中

能够对导航员在本次编程工作中起到的作用给出客观评价,并完成500字以上的总结,并且上传和队友工作时的照片

2.领航员

能够辅助驾驶员完成全部代码工作,并且为关键函数选用合适的覆盖标准设计测试用例,并编写代码进行单元自动测试。

能够根据上次作业的代码检查表对驾驶员的本次工作进行评价。

能够对本次工作完成500字以上的总结。

在这一次的结对作业中,我扮演的角色是驾驶员。

三.主要函数功能介绍

1.对增加括号的处理方法

void Addparentheses(char *a, int k)//增添括号
{

	int m, c, b;
	char *p1, *p2;
	p1 = a;
	m = rand() % (k - 1);
	p1 = p1 + m;
	p2 = p1;
	p1 = p1 + (k - m);
	for (b = 0; b < k - m; b++)
	{
		*p1 = *(p1 - 1);
		p1--;
	}
	*p1 = '(';
	c = rand() % (k - m + 1);
	c = c + m;

	while (1)
	{
		if ((c - m < 2) || (c - m == k))//判读两个括号是否是紧挨着
		{
			c = rand() % (k - m + 1);
			c = c + m;
		}
		else
			break;
	}
	p2 = a + c;
	p1 = a + k + 1;
	for (b = 0; b < k + 1 - c; b++)
	{
		*p1 = *(p1 - 1);
		p1--;
	}
	*p1 = { ')' };
}

2.输出四则运算中数字部分的函数

void showopernumber(int *oper, int i)//输出数字
{
	float n;
	int m;
	{
		if (FloatingpointNumbers == 1)//判断是否需要转换成小数
		{
			m = randomnumber(4);
			if (m == 2)
			{
				n = theFloatingpointNumbers();
				cout << *(oper + i) + n;
			}
			else
				cout << *(oper + 1);
		}
		if (FloatingpointNumbers == 0)
			cout << *(oper + 1);

	}
}

3.输出整体四则运算算式的函数

void show(char *symbol, int *oper, int a)//输出最后结果
{
	
	char *p1, *p2;
	int *p3;
	int  i, m;
	char n;
	p1 = symbol;
	p2 = p1;
	p3 = oper;
	if (division == 1)
	{
		if (*p1 == '(')
		{
			cout << *p1;
			outfile << *p1;
			p1++;
			for (i = 0; i < a; i++)
			{

				showopernumber(oper, i);
				if (*p1 == ')')
				{
					cout << *p1 << *(p1 + 1);
					outfile << *p1 << *(p1 + 1);
					p1 = p1 + 2;
				}
				else
				{
					cout << *p1;
					p1++;
					outfile << *p1;
				}
			}
			p1 = p2;
			cout << endl << endl;
		}
		if (*p1 != '(')
		{
			for (i = 0; i < a; i++)
			{
				//cout << oper[i];
				//outfile << oper[i];
				showopernumber(oper, i);
				if (*(p1 + 1) == '(')
				{
					cout << *p1 << *(p1 + 1);
					outfile << *p1 << *(p1 + 1);
					p1 = p1 + 2;
				}
				else if (*p1 == ')')
				{
					cout << *p1 << *(p1 + 1);
					outfile << *p1 << *(p1 + 1);
					p1 = p1 + 2;
				}
				else
				{
					cout << *p1;
					p1++;
					outfile << *p1;
				}
			}
			p1 = p2;
			cout << endl << endl;
			outfile << endl;
		//	outfile.close();
		}
	}
	if (division == 0)
	{
		for (i = 0; i < a; i++)
		{
			showopernumber(oper, i);
			cout << symbol[i];
			outfile << oper[i] << symbol[i];
		}
		cout << endl << endl;
	}
}

全部代码请点击这里:https://git.dev.tencent.com/jiawacjiajia/zuidalianxuzishuzuhe.git

四.运行结果

因为本人实力有限,所以没能编写出图形界面。但是已经基本实现了除图形界面外所有的功能。

总结

  这次是第二次的结对编程作业,老师布置的两道题目均有难度。第一道四则运算的题目虽然容易上手但是需求很多,第二道题虽然需求不多但是核心算法很难理解也很难实现。经过我和我的领航员那绪博同学讨论,我们决定选择第一题进行编程。前面的几个需求,比如用户选择运算符,设置最大数,设置生成题目都很容易的完成了。但是在遇到对括号进行处理的时候,我遇到了很大的困难。主要是括号的位置的特殊性,一对括号的中间必须要夹着一个其他的运算符,两个括号的位置不能字符存放数组的第一个和最后一个。这时候我将这个问题与我的领航员进行了讨论,他为我梳理了整个括号处理的流程,并且将算法画成了流程图。在他的帮助下我顺利完成了在字符数组中加入括号的这一功能函数。但是在输出算式的时候,我又遇到了新的问题,因为加入了括号的原因,字符数组里面存储的字符要比操作数数组里面的数字多两个,这样的话就没有办法让他们按顺序输出出来。我尝试了很多方法,但是越写越复杂,所需要考虑的因素就越多。这时候那绪博告诉我说我可以用指针,这样的话只需要对指针的下一个元素进行判断就可以,而且循环次数也是一样的。在他的建议下,我重新写了输出模块,并且正确的输出了算式,再进行调试,修复一些微小的BUG,这次的结对编程作业便顺利完成了。很感谢那绪博同学在这次作业中对我的帮助,他是一个十分优秀的领航员,在我遇到编程困难的时候能以一条清晰的思路为我分析问题,解决问题。我会向他多学习,努力提高自己的实力。

posted @ 2019-05-05 17:36  贾娃  阅读(213)  评论(0编辑  收藏  举报