结对项目第二次作业

1.结对成员的学号及姓名: 031502641-郑珍发 031502513-黄逸飞

2.首页给出项目的Github链接https://github.com/emperor-fa/matching

3.贴出你们生成的一组最“好”的数据(给出对应链接即可),并详细说明"数据生成"程序的原理以及你们所考虑的因素

  • 最“好”的数据链接
  • 数据生成"程序的原理:以学生(300)数据为例:先生成学生的空闲时间的开始时间点(我参照例子设置个数为8,时长为2小时);还有星期数组,部门号码数组(20)和标签数组(10)。生成空闲时间:首先生成一个7-18的随机数,代表学生freetime的个数,定义一个星期7*开始时间8的数组,代表空闲时间,为了不重复,定义一个数组的0-55数组,表示空闲时间的序号,然后随机选取0-55数组的序号,确定星期和时间,选定则在0-55数组中删去;生成学号:固定前几个数字加上学生序号加1;生成志愿部门:先随机生成一个1-5的数组,代表志愿部门的个数,然后随机生成0-19的序号,确定部门号码,选定则删去该序号;生成学生标签:先生成一个2-4的随机数,代表学生标签个数,然后随机生成0-9的序号,确定标签,选定则删去该序号。 部门数据的生成与学生类似。
  • 我们所考虑的因素主要有数据随机性与不重复性和实现难度。

4.详细说明你们数据建模及匹配程序的思路及实现方式

  • 首先得先读数据:我并未用到json格式的读取,因为刚开始并未去深究json,只注意到例子。所以按照自己的想法按行读取,以“”"students": [“”作为学生数据读取标志,以“{”作为一个学生数据的开始标志,以“"free_time": [”为学生空闲时间读取标志,以“"applications_department": [”作为学生志愿部门的读取标志,以 “"tags": [”作为学生标签读取标志,以“],”或“]”为以上的读取结束标志,在这些开始标志和结束标志之间就是要读的数据;以“"student_no":”为学号读取标志,以“},”作为一个学生数据读取结束标志,以上数据都存进一个学生类的实例中。部门数据的读取与学生类似。
  • 接下来就是匹配:我的想法是按照学生顺序,把每个学生的志愿从高级到低级依次加入志愿部门,若低级志愿部门的活动时间与高级志愿部门的活动时间冲突,则低级志愿部门不加入(事先比较各部门的活动时间,得到一个冲突二维数组),每加入一个部门则join+1。待300个学生都加入部门后,对部门进行扫描,若加入人数多于限制人数,则按照兴趣,活动时间的优先顺序进行排序(为兴趣标签相同个数和活动时间与空闲时间相同个数,时间的比较分为提取星期的比较和提取时间并转为数字的比较),删除后面的人,删除的人join-1。
  • 最后是输出:先扫描学生,把学生的join为0的学号输出。再扫描部门,输出member中的学号。

5.你们在代码遵循了一定的规范,在博客中描述结对团队遵循的代码规范,并截取部分关键代码佐证说明。

  • 代码规范:我们将头文件与源文件分开,头文件定义类和声明函数和全局变量,源文件又以功能的不同分成几个,在main中定义全局变量,其他相关函数定义在用到该函数的源文件中。
  • 部分关键代码
#ifndef HEAD_HPP
#define HEAD_HPP
#include<string>
#include<vector>
using namespace std;
void read();
void time_conflict();
void match();
void output();
class Student {
public:
    //Student();
    vector<string> free_time;    //空闲时间
    string student_no;       //学号
    vector<string> application_department;    //志愿部门
    vector<string> tags;    //学生标签
    int join;       //加入部门数
};
class Department {
public:
    vector<string> event_schedules;    //常规活动
    int member_limit;       //限制人数
    string department_no;       //部门编号
    vector<string>tags;        //部门标签
    vector<int>member;
};
extern Student stu[300];
extern Department depart[20];
extern int conflict[20][20];
#endif

6.结果评估。对于程序的匹配结果,你们是否满意?请对你们程序处理结果进行分析。

  • 程序的匹配结果,我们还算满意。
  • 以发布例子为例,按照我的程序,处理结果是,未加入部门的学生为十几个,未收到人数的部门为0,部门招收人数不定但未超过限制人数。结果分析:我认为是因为招收没有规则,只要有报就可以加入,所以未收到人数的部门为0,但是要求该部门不与更高级志愿活动冲突,这样学生报部门较少的学生可能只加入一个部门或部门招收的人数不满限制人数;根据兴趣,活动时间的优先级排序,一些所加入部门较少的学生被删除的话该学生加入部门人数就为0。该程序并未进行二次遍历,即比如一个学生先加入第一个志愿,本可以加入第二个志愿但与第一个志愿冲突不加入,然后由于条件差被第一志愿剔除,本可加入第二志愿,导致第一志愿第二志愿都没加入,但是我想如果再遍历一遍,那么可能每个部门都是近满的,这样也不是很好。

7.已经尝试过结对编码,你一定很多话要说。请发表结对感受,以及两个人对彼此结对中的闪光点或建议的分享

  • 这是第二次结对作业,感受良多。由于遇到国庆,并无法按照老师说的那样一人在前面敲代码,一人在后面看。但是我们还是利用现代通信工具QQ进行实时交流和讨论。先说一下优点吧,优点在于,结对在编码遇到问题时可以互帮互助,比如遇到困难时可以一起思考讨论提出解决方案,而且在交流过程中可以找出对方的想法或方案中不足的地方并进行完善,在编码过程中也可以找到对方忽略的地方和未发现的错误。再说说缺点,在交流过程中对方不明白自己的想法时很难去描述清楚,即想法交流困难,还有就是在方案观点不同等发生的矛盾,还有就是编码习惯和方式的不同很难改变和融合。
  • 闪光点和建议的分享:比如原本时间的比较是直接进行字符串的比较,后来发现时间有个位数如8,所以无法进行字符串比较,最后的建议结果是逐个字符提取,根据.和~判断开始时间和结束时间并转化为数字,如8:00变成800;还有在如何判断学生的志愿之间的活动产生冲突,若每个学生的志愿部门比较一下活动时间进行判断那非常麻烦,最后的建议结果是先判断各个部门之间的冲突关系,并将其存入二维数组,这样节省了很多时间。

转载于:https://www.cnblogs.com/emperor-fa/p/7642124.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值