结对第二次作业
部门与学生匹配
GitHub链接:https://github.com/sixwwg/department-student
成员:
吴伟根 031502631
吴君毅 031502629
整体概况
- 1、生成代码
- 2、匹配法介绍
- 3、输出结果
- 4、相关学习
- 5、心得体会
生成代码介绍
void random_stu()//随机生成学生信息
{
for(int i=0;i<300;i++)//300个学生
{
int a;
a=random_num(1,11);//学生随机空闲时间的数目
for(int j=0;j<a;j++)//每个学生随机空闲时间的数目
{
stu[i].free_time[j]=random_freetime(i);
}
stu[i].student_no="031502"+num2str(100+i);//生成学号
a=random_num(0,5);//学生随机意向部门的数目
for(int j=0;j<a;j++)//意向部门
{
int b=random_num(0,19);
if(b<10)
{
stu[i].applications_department[j]="D00"+num2str(b);
}
else
{
stu[i].applications_department[j]="D0"+num2str(b);
}
}
a=random_num(1,8);
int num[8];
for(int j=0;j<a;j++)//兴趣标签
{
int b;
b=random_num(1,11);
for(int x=0;x<j;x++)//兴趣标签不能重复
{
if(num[x]==b)
{
b=random_num(1,11);
x=0;
}
}
num[j]=b;
stu[i].tags[j]=ttags[b];
}
}
}
void random_dep()//随机生成部门信息
{
for(int i=0;i<20;i++)//20个部门
{
int a;
a=random_num(1,11);//部门随机活动时间的数目
for(int j=0;j<a;j++)//每个部门随机活动时间的数目
{
dep[i].event_schedules[j]=random_freetime(i+300);
}
dep[i].member_limit=random_num(10,15);//限制人数
int b=random_num(0,19);//部门编号
if(b<10)
{
dep[i].department_no="D00"+num2str(b);
}
else
{
dep[i].department_no="D0"+num2str(b);
}
int num[8];
a=random_num(1,8);
for(int j=0;j<a;j++)//兴趣标签
{
int y;
y=random_num(1,11);
for(int x=0;x<j;x++)//兴趣标签不能重复
{
if(num[x]==y)
{
y=random_num(1,11);
x=0;
}
}
num[j]=y;
dep[i].tags[j]=ttags[y];
}
}
}
生成结果示例:https://github.com/sixwwg/department-student/blob/master/project/input_data.txt
这部分前期一起讨论具体实现过程,编码主要由吴君毅同学负责
不足:
- 1、空闲时间因为随机,虽然当天的时间段不会重复,但是因为星期几是随机出来的,所以星期的排列并不是按照从小到大的顺序排列,而是随机排列的。
- 2、因为没有给兴趣标签归类,所以给部门匹配出的兴趣标签会很杂,比如匹配给一个部门加上了游泳和电脑这两个标签,就会感觉这部门不太正经,后期优化下。
- 3、生成数据用了C++输出,然后自己加上格式,并没有用Json的库输出,在但是还是在json_CN上校验通过,输出了正确的Json格式。
匹配程序的思路及实现方式
数据建模
-
1、student结构体:学号student_no,空余时间free_time,兴趣tags,意向部门applications_department。
-
2、department结构体:部门编号department_no,活动时间表event_schedules,部门类型tags和上限人数member_limit以及save数组保存符合条件的学生学号。
-
3、主函数:生成函数调用,匹配函数体调用,输出结果。
-
4、思路:先按照学生的意向部门编号进行部门匹配,匹配成功后进行判断该学生的空闲时间与该部门的活动时间是否满足条件,具体为定义几个函数set_student()和set_department()对学生和部门的时间段进行处理,提取时间字符串中的周几和具体时间段的子字符串,存放到数组中。先判断周几是否一样,不一样直接跳出循环,一样则判断部门活动时间范围是否小于学生的空闲时间范围,若满足该条件就让计数变量count++,当count大于部门的上限人数时,count置为0,接着判断下一个意向部门是否符合条件。
-
5、代码:
void application(int num) { for (int i = 0; i<5; i++) //至多5个意向部门 { for (int j = 0; j<20; j++) //至多20个部门 { int count = 0; //计数变量 if (stu[num].applications_department[i] == dep[j].department_no) //第num个学生的第i个意向部门编号匹配到相应部门 { set_student(num); //对该学生的freetime进行处理 set_department(j); //对该部门的event_schedule进行处理 for (int stu_time_count = 0; stu_time_count<str1_count; stu_time_count++) //至多12个空闲时间段 { for (int dep_time_count = 0; dep_time_count<str2_count; dep_time_count++) //至多12个活动时间段 { if (str1[stu_time_count].compare(str4[dep_time_count]) == 0) //匹配星期几 { if (str2[stu_time_count].compare(str5[dep_time_count]) >= 0 && str3[stu_time_count].compare(str6[dep_time_count])<0) //时间段比较 { dep[j].save[count] = stu[num].student_no; //满足条件就将该学生的学号存入对应的数组 count++; stu[num].student_no = "0"; //计数加一 } } } } } } } }
-
6、实现方式流程图:
这部分主要由我负责
不足
- 1、循环太多,效率低下
- 2、匹配的点为编号和时间段,较为简单
代码规范
加注释、缩进以及大括号对齐,以及一些量的定义使用单词表示,使意思明朗一点
结果分析
输出的unlucky_student人数比较多,大概一百八左右,原因是匹配程序的选择条件比较简单,先是意向部门编号匹配然后再是时间匹配,而且是由于for语句循环的问题,就较为简单的输出该学生被一个部门入取后不再被其他部门入取。
心得体会
这次作业对我来说难度相当大了,一开始真的就是脑子空白,没思路,不知道从何下手开始做起。然后询问同学,才开始有一点点对这个题目的头绪,然后去百度了json,了解了一下。和吴君毅也是约了一个晚上找了一间教室讨论,进行最开始的生成函数的编码,头一次是盯着电脑看代码看几个小时的,感觉挺累的。听到别的班15号交作业,心生羡慕。不过后面生成函数编译成功后还是蛮开心的。经过这次作业,自己知道的太少,面对一个问题无从下手,说明自己编码经验严重不足,还得加把劲,努力提高自己的编码能力。完成作业的过程中,也能感受到自己对编码的兴趣在加深,就是那种从最开始看到bug却找不到方法解决就算了的态度慢慢的就是多问问同学,自己琢磨,解决bug。从中也了解了json,还有就是代码编码的规范有所提高,多写注释。