031502533 熊立强
031502538 俞鋆
作业
github
###最好的数据及分析 [数据](https://github.com/juin1997/Couple-Homework-/blob/master/Project_IntelligebtPairing/input_data.txt) 随机生成的数据分布教均匀,最大差距在20左右。 ![](http://images2017.cnblogs.com/blog/1011927/201710/1011927-20171009214653668-708748452.png) ![](http://images2017.cnblogs.com/blog/1011927/201710/1011927-20171009214709199-500383790.png) ![](http://images2017.cnblogs.com/blog/1011927/201710/1011927-20171009214729262-1228922629.png) ![](http://images2017.cnblogs.com/blog/1011927/201710/1011927-20171009214742152-1822634196.png) ![](http://images2017.cnblogs.com/blog/1011927/201710/1011927-20171009214755105-1600277791.png) ![](http://images2017.cnblogs.com/blog/1011927/201710/1011927-20171009214805559-737441224.png) ![](http://images2017.cnblogs.com/blog/1011927/201710/1011927-20171009214820387-181377669.png)
-
原理
学生编号和部门编号都是固定的,只需要有一个初始值,后面一个一个加上去即可。
其他的数据都是用随机数生成的,为了使随机数分布均匀,先使用srand(time(NULL))让生成的随机数不容易重复,时间中的星期几用字符串数组随机生成,开始时间随机一个822的数字,使生成的时间合理化,结束时间随机一个从开始时间后到23点的时间,选择的部门也只要在019间随机就行,标签用字符串数组,随机数字即可选中。 -
考虑因素
数据是不是固定的,有没有范围限制,这样的数据合不合理,一般人的数据会是怎么样的。
数据建模及匹配程序的思路及实现方法
-
思路
数据建模的问题主要是需要生成分布比较均匀合理的数据,不能太多人选同一个部门,也不能一个部门没人选,学生的空闲时间和部门的活动时间都不能是大晚上,一个人和部门的标签在现实中也不会太多;而匹配程序的问题主要在于优先级,标签,志愿和时间这三个的优先级,根据这三个的数据给部门分配学生。 -
实现方式
我数据建模的实现方式很直接,固定的数据就用一个初始值,后面一个一个加上去即可。其他数据就随机生成。匹配的实现方式就是将学生部门时间的匹配程度,标签匹配程度,学生的志愿都算出一定的分数,学生进入志愿中分数最高的部门,如果一个部门满了就将分数低的踢出去。
时间随机生成
for(tLoop=0;tLoop<i;tLoop++)
{
if(tLoop==0) tWeek=Rand(0,7);
else tWeek=(tWeek+1)%7;
tString=Week[tWeek];
tStart=Rand(8,22); //活动开始时间限制在8点到22点
tString+=ToString(tStart);
tString+=":00~";
tString+=ToString(Rand(tStart+1,24)); //活动结束时间限制在24点
tString+=":00\"";
if(tLoop==i-1)
fout<<" \""+tString<<endl;
else
fout<<" \""+tString+","<<endl;
}
读取文件,用cJSON解析文件
string d;
ifstream infile;
infile.open("input_data.txt"); //打开输入文件
string s;
while(getline(infile,s)) //将文件中的内容全部转为字符串
{
d=d+s;
}
cJSON* json = cJSON_Parse(d.c_str());
代码规范
1.标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解。
实例:
int i,stu, //定义学生循环的变量
tLoop, //定义循环生成时间的变量
tWeek, //定义生成时间是星期几的变量
tStart, //定义时间开始时间的变量
appliDepart, //定义学生报的部门循环的变量
appliDepartNum, //定义学生报的部号
depart, //定义部门循环的变量
tags, //定义标签循环的变量
tagStart; //定义开始标签的变量
string tString; //定义用来输出的字符串
-
一般情况下,源程序有效注释量必须在20%以上。
-
注释的内容要清楚、明了,含义准确,防止注释二义性。
-
边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。
-
注释应与其描述的代码相近,对代码的注释放在其上方或者右边,不可放在下面,放于上方则需与其上面的代码用空行隔开。
-
数据结构声明(包括数组、结构、类、枚举等),如果其命名不是充分自注释的,必须加以注释。对数据结构的注释应放在其上方相邻位置,不可放在下面;对结构中的每个域的注释放在此域的右方.
实例:
struct Student //定义学生结构体
{
LISTSTRING FTDay; //定义学生空闲时间是星期几
LISTINT FTStart; //定义学生空闲时间的开始时间
LISTINT FTEnd; //定义学生空闲时间的结束时间
string StudentNo; //定义学生的学号
string ApliDepart[5]; //定义学生报的部门
LISTSTRING Tag; //定义学生的兴趣标签
};
结果评估(完成中)
结对感受
- 感受
首先,我觉得本次结对作业我和我的队友是很失败的。失败的理由有三:
一、我们就只在放假前讨论了一下,之后都是线上交流,有时候等对方回一句话都要几个小时,效率十分低下。
二、分工的时候我写生成和读取数据程序,我的队友写匹配程序,这样的话如果我不写完的话,他根本无法对程序进行评估,有什么不足,最终导致了我们的程序无法在规定的时间完成,只写了生成和读取数据程序。
三、我们的积极性不够,放假期间没怎么做作业,等到假期快结束才开始做,也是无法完成作业的重要原因。
在本次作业中,我也学到了很多,比如了解到了JSON的格式和使用方法,学会使用C语言的第三方库cJSON来解析文件,中途遇到了很多编译上的困难,最终大都克服了。 - 建议
不要应该是同学就不好意思开口,有些时候只要问一下对方就能解决问题了,但由于是同学不好意思开口,就自己一个人搞呀搞,最后发现一直在做无用功,太浪费时间了。在学校的时候就应该多在一起讨论问题,不能依赖于线上交流,在线上注意力不够集中,完全不能专心讨论。