软件工程结对第二次作业

同学A : 031502630 - 吴松青

同学B : 031502644 - 邹星

github:传一波


目录:

一:数据生成程序"程序原理及考虑因素

二:数据建模及匹配程序的思路及实现方式:

三:代码规范:

四:结果评估:

五:结队感想)


一:数据生成程序"程序原理及考虑因素:

最“好”的数据:https://github.com/qianxuanj/Sector-allocation/blob/master/input.txt

第一步先初始化关于时间分配的数组,day[ ]包括七天(周一到周天),hour[ ]只包括8:00-22:00(考虑到不宜太晚出门,通宵等),而兴趣标签就取模板中的几个(共10个)。

第二部先写几个工具函数,方便后面的操作,首先是部门初始化函数,先初始化共20个部门的编号D001-D020,然后写一个getId函数,用来随机生成学生的学号,且用标记的方法来确定是唯一的编号(如Sxxxxxx),最后写一个生成随机时间的函数,使用flag[ ][ ]数组来标记是否生成的随机时间重复。

第三步就是部门与学生各自的初始数据生成的函数,首先是部门information_dep(int n),n代表其内部生成的部门数量,生成一个2-5的随机数s,代表此部门的活动时间数(感觉不宜太多,5个很多了,还是学习重要)。再生成一个10-15的随机数代表部门纳新数。然后生成2-9的部门标签数(有些部门可能很全面)。然后循环20次,就生成20个信息完备的部门了。学生部分也是差不多如此,不同的就是标签必须取部门中有的,在这方面,用了一个标记数组标记该标签是否被部门使用过,若没有,则不添加给学生,这里学生的标签也就设置了2-6个(一般不会有很多兴趣,也方便之后的筛选),还有一点,学生的空闲时间设置的比部门多,因为考虑到学生可不只参加一个部门的活动,如此学生信息部分就也完成了。


二:数据建模及匹配程序的思路及实现方式:

输入和储存数据:

首先是导入要输入的数据,这里我们刚开始采用的是通过对txt文件中的内容进行逐行读取来获取我们的input_data.txt中的数据(这里没有注意到可以用json是一大失误) ,后来有同学在微信上询问有关json的问题以及我们又认真查看了一次结对作业的要求后,然后这里我们采用的是通过使用JSON格式来获取我们的input_data.txt中的数据(最后两天才开始改也是很急,,,之前没接触过,,有点慌)。而存储数据时,学生数据和部门数据分为不同的类:Student和Department。我们采用了动态数组的方法去存储活动时间,兴趣标签和学生对于自己的部门志愿这三种数据,其余数据则是用string和整型数组或者整型变量来存储。

匹配方法:

刚开始进行分配的时候学生的数量是比部门多的。所以先通过扫描学生来进行匹配。首先提取学生的志愿部门编号,然后把编号放到部门数组中去寻找相应的部门。找到了该部门后,首先先检查自己是否已经有了已被纳入的部门,如果有,则先对自己已纳入的部门和该部门进行活动时间冲突检查,如果有冲突,由于部门意愿可是按照优先级从高到底的顺序排序的,所以已纳入的部门一定是优先级高于现在进行匹配的部门,于是跳过该名学生对此部门的匹配。如果没有冲突或者尚未被纳入部门中,则进行对该部门的检验。这里有4种情况:

1.当找到该部门时,该部门的纳入人数为0,则直接将该名学生纳入此部门。

2.当找到该部门时,发现该部门有纳入但人数还没满。此时则将该名学生与已纳入的学生进行排序。排序标准是兴趣标签先排,再排活动时间。这样就能保证部门的纳入人员数组的最后的学生一定是最不适合该部门的学生。

3.当找到该部门时,发现该部门纳入人数已满。此时则将该名学生与该部门的已纳入人员数组的最后的学生进行比较。先比兴趣标签,再比活动时间。如果该学生比那个最后的学生更加适合这个部门的话,将该名学生与那名最后的学生交换。并且重新进行排序,找到该学生在其相应的数组中的位置,如果没有最后的那名学生更合适的话,则不替换。


三:代码规范:

1.缩进:(差不多是以vs里自动生成的排版),语句块的“{”“}”配对对齐,并与其前一行对齐,语句块类的语句缩进每个“}”单独占一行。
2.对齐:原则上关系密切的行应对齐,对齐包括类型、修饰、名称、参数等各部分对齐。
3.命名规范:命名尽量用英文简写或者首字母,函数方法使用驼峰法。

部分关键代码佐证:

string getId(string x)
{
	string s_id = x;
	do 
	{
		for (int i = 0; i < 6; i++) 
		{
			s_id = s_id + to_string(rand() % 10) ;
		}
	} while (id[s_id]);
	id[s_id] = true;
	return s_id;
}

四:结果评估:

用助教发布的例子用来测试,结果是有几十名同学落选,然后基本每个部门都收入了人员,其中大部分都是收入了满足的人数,这样的情况我们还是可以接受的,同时和现实中的部门纳新结果是比较符合的。但是同样也有一些问题我们并未来得及去考虑,就是要是纳入了优先级较高的部门,部门活动时间冲突的情况还是很令人难受的,虽然加入了喜欢的部门,但是活动时间冲突,而此时又发生学生被部门所淘汰的情况,真是得不偿失。本来是想再次优化的,但由于json的问题和时间问题,所以并没有解决。


五:结队感想

咋说咧,,,恩,这是我们第二次结对了,相比上次合作,沟通与交流多了许多,也更加了解了对方的优缺点,因为国庆期间我们都在学校,彼此交流的机会多了很多(也很苦逼的想方案),所以才能更加了解对方。队友的想法很多,有些特别给我启发,也对这次的作业帮助很多,他的代码能力也很不错,学习能力也强,所以我们合作的效率还是很高的,能说的问题也是想法,虽然他的想法很多,但避免不了跟我的一些想法有些冲突,避免不了一番辩论,幸运的是最后协调的解决了问题,总得来说,这次的合作还是很愉快的。

原文地址:https://www.cnblogs.com/Kaloneme/p/7643105.html