结对作业——第二次作业
1.结对成员
031502339 叶港晨,031502309 候振源
2.项目链接
https://github.com/houzhenyuan/department_student
3.生成数据
链接:
“数据生成”程序原理和考虑的因素:
我一共使用了两个方法来完成生成程序,其中第一个方法我是在c++中利用jsoncpp库结合rand()的使用来随机生成json格式的数据。利用Json::Value来生成一个个节点,然后再调用append()函数把一个个节点接到他们的父节点上,最后形成一个完整的json对象,之后利用toStyledString()函数把这个对象转换为字符串,之后就把字符串输出到文件就完成了数据生成的任务。其中多次调用rand()函数来决定每个学生或部门的空闲时间数量、兴趣标签数量、空闲时间、兴趣标签等值。但是由于出现了暂时无法解决的bug,所以已经将此程序舍弃。第二种方法就是利用rand()函数与循环嵌套直接生成字符串,然后通过string拼接最后生成一个完整的json格式的字符串,并且输出。这种方法比较简单但是很繁杂,是不得已的选择。
int num1 = (rand() % 5) + 1;
for (int m = 0; m<num1; m++)
{
int dep = (rand() % 20) + 1;
stringstream ss4;
string str4;
ss4<<dep;
ss4>>str4;
if(dep < 10)
{
output = output + "\"D00" + str4 + "\"";
if(m != num1-1)
{
output = output + ",";
}
}else{
output = output + "\"D0" + str4 + "\"";
if(m != num1-1)
{
output = output + ",";
}
}
}
以上为随机生成申请部门的部分代码。
4.数据建模及匹配程序的思路及实现方式
我们采用了兴趣优先匹配的算法。首先读入数据后,将所有数据分别存入各个学生类和部门类中。从第一个学生开始,遍历他所申请的部门,如果这是第一个志愿,则记录score为10,第二个志愿则score值为9,以此类推。然后分别进入相应的部门类,查询活动时间是否和学生空闲时间匹配,如果匹配,则进入下一个判断,否则直接淘汰。活动时间匹配之后,进行的是兴趣标签的判定,如果该学生兴趣标签中有一个标签与该部门标签所包含的标签相同,则score++,如果两个相同则score+2,以此类推来进行优先级分类。然后之后再根据score的大小进行排序,实现优先录取,完成匹配。
class Student
{
public:
string student_no;
string free_time[15];
string applications_department[20];
string tags[15];
int free_time_n;
int applications_department_n;
int tags_n;
}Student[300];
class Department
{
public: string department_no;
string event_schedules[15];
string tags[15];
int member_limit;
int event_schedules_n;
int tags_n;
}Department[20];
以上代码为学生类和部门类的数据结构,记录每个学生、部门的标签数量以及空闲时间数量便于之后调用。
5.代码规范
为自己的代码添加简单的注释,以及名字比较长的变量或属性使用下划线命名的规范,示例如下:
for (int i = 0; i < root["students"].size(); i++)
{
Student[i].student_no = root["students"][i]["student_no"].asString();
//记录空闲时间数量
Student[i].free_time_n = root["students"][i]["free_time"].size();
for (int j = 0; j < root["students"][i]["free_time"].size(); j++)
{
Student[i].free_time[j] = root["students"][i]["free_time"][j].asString();
}
//记录申请部门数量
Student[i].applications_department_n = root["students"][i]["applications_department"].size();
for (int m = 0; m < root["students"][i]["applications_department"].size(); m++)
{
Student[i].free_time[m] = root["students"][i]["applications_department"][m].asString();
}
//记录标签数量
Student[i].tags_n = root["students"][i]["tags"].size();
for (int n = 0; n < root["students"][i]["tags"].size(); n++)
{
Student[i].free_time[n] = root["students"][i]["tags"][n].asString();
}
6.结果评估
不满意。利用生成程序生成的input_data示例以及作业中提供的示例来进行匹配,每次都有100~200人是属于unlucky这一部分的,效率极差,稍微看了一下之后感觉在匹配部分以及输出部分可能有地方出现了错误,需要修改。
7.结对感受
因为很晚才开始做,所以做的很赶,不过也还是花了很多时间。深有体会的事情是结对编程中双方的分工不同,而每个部分代码的长度都很长而且也不是很容易理解,这就导致了经常出现解释了很久还是互相不知道各自代码的思路,所以经常需要对方根据自己的想法重新写某一部分的代码。抛开结对编程不提,软工实践这门课经常会出现一些让人费解的问题,很难解决,而且每次不是编码,而是配置环境要花很大一部分的时间,我对于把这么多时间花在配置环境上,觉得很浪费。