结队成员:

自己:

学号 姓名 性别
616 语恳

队友:

学号 姓名 性别 队友博客
618 炜坤 队友博客

github链接

项目要求

  • 1、输入的数据,另外写生成程序随机实现。
  • 2、为输入输出设计接口,为该匹配程序模块后期可能的整合入系统提供便利。
  • 3、输入输出采用 json 文本文件方式,可自由讨论确定细节内容,但需要明确并体现在博客中。
  • 4、需要为匹配算法确立几条分配或排序原则,比如 绩点优先、或兴趣优先、或活动时间优先、或其他等等,请你们结对讨论确定。
  • 5、对不同策略做出评价,并在博客中展示测试结果。提醒:对于同一组输入,输出的未被导师选中的学生数越少越好。
  • 6、博客中列出代码你们的代码规范要求。
  • 7、实现的程序语言以C/C++优先,部分同学如果对Java/C#掌握更加熟练也可接受。
  • 8、代码提交在GitHub上,并在博客中提供项目链接(注意不是Github个人主页)。
  • 9、两人博客中涉及到设计及代码展示可以相同,但是要求使用自己语言加以描述。

    设计说明

  • 接口设计(API)
  • void Generate_JSON(int N,int M); //随机产生需要输入的数据(需要部门数和学生数)
  • void ReadJson(Department* &department, Student* &student,int N,int M); //读入json文件
  • void match(Department* &department,Student* &student,int N,int M); //部门匹配学生
  • void output(Department* department, Student* student, int N, int M) //输出匹配结果

  • 内部实现设计(类图)

  • 匹配算法设计(思想/流程等)
  • 根据项目要求,设计两个类学生类和部门类,其中学生类包含学生的学号,姓名,志愿,绩点,兴趣以及空闲时间。部门类包含部门号,兴趣要求,绩点要求,活动时间,部门人数等。在主函数随机生成的若干学生和诺干部门中进行匹配。由于在部门占有较高主动权,所以以部门为单位,依次遍历学生,根据学生的绩点,兴趣以及空闲时间,判断是否能招。由于判断条件主次不一,我们分别设定兴趣吻合度,时间吻合度,以及绩点吻合度。
    匹配兴趣时,遍历学生的兴趣,发现1个跟部门要求相同的兴趣,对该学生评分加4分,两个加8分一次类推。同理,时间吻合度也是一个匹配的时间加4分。绩点要求,只要该生绩点大于要求绩点,该生评分加10分。最后算出每个学生的总评分,然后根据评分的大小进行排序,根据部门招募人数决定评分最高的几名学生入选。

  • 测试数据如何生成?
  • 创建一个数据生成器的头文件DataGenerator.h及类DataGenerator(包括各项属性的生成方式),分别定义定部门数据生成、学生数据生成(引用部门类和学生类)。
    学生:学号(S0315xxxx),姓名(A~Zxxx),性别(female/male),绩点(1~5分),兴趣标签(2~5个),空闲时间(2~10个),部门志愿(2~5个)。
    部门:编号(A~Zx),部门名称(同学生),人数限制(0~15人),活动时间(1~5个),标签(3~5个),绩点限制(1~3分)。
    有关字符串方面的数据均通过定义固定的string数组,随机生成数组下标来达成随机字符串的目的。
    基于最大数据(100,5000),学号和部门号均不重复,现阶段的随机形式也够用了,但这些数据离现实还是有很多差距,有待改进。

  • 如何评价自己的匹配算法?
    我们的匹配算法其实仅仅是根据老师要求上的几个判定条件写的,没有多加别的判断条件,所以匹配算法比较简单,但是还是能做到对学生基本的区分。还有就是,多次遍历导致计算量较大,还需要多加改进才行。

    关键代码解释

    志愿匹配函数:

  • 用于将学生与部门进行匹配的函数,函数中包含对学生评分的筛选。
  • 该函数针对单个单个部门和单个学生,具体要求多个部门对多个学生可在外部加入双重循环。部门根据当前学生的志愿进行查找,寻找是否有本部门的部门号,如果有则匹配,没有则跳出。匹配到学生时,首先判断本部门是否已达到人满,如果人未满,则直接将其放入预选名单中,并记录其评分,如果人满,则需要将该学生的评分算出,与预选名单中的学生评分进行比较,若发现该学生评分大于预选表中某学生的评分则将其放入预选表中,并将评分较低的学生淘汰。
void Department::willmatching(Student &s)
{if (D_Limit != 0){for (int i = 0; i < 5; i++){if (s.S_Choice[i] == D_No){           if (numofstu < D_Limit){student[numofstu] = s.S_No;m[numofstu] = cmp(s.GPA, s.S_Schedules, s.S_Tags, GPA_Limit, D_Schedules, D_Tags);numofstu++;}else if (numofstu > D_Limit){m[numofstu] = cmp(s.GPA, s.S_Schedules, s.S_Tags, GPA_Limit, D_Schedules, D_Tags);for (int u = 0; u < D_Limit; u++){if (m[numofstu] > m[u]){                           m[u] = m[numofstu];student[u] = student[numofstu];break;}}}}}}
}

评分计算函数

  • 用于计算各学生的评分,根据不同的条件要求,对学生进行评分,算出部们对学生的总评分。
  • 对于学生的兴趣条目与部门的兴趣要求进行匹配,发现一个相同的对该学生评分加4分,两个加8分,一次类推。同理对时间表也是发现一个相同的加4分,对于绩点要求,学生绩点高于部门要求绩点,评分加十分。
int  cminterests(string* s_interest, string* d_interest)
{int i, j, n = 0, n1 = 0, mark = 0;for (i = 0; i < n; i++){for (j = 0; j < n1; j++){if (s_interest[i] == d_interest[j]){mark = mark + 1;}}}mark = mark * 4;return mark;
}
int  cmschedual(string* s_che, string* d_che)
{int i, j, n = 0, n1 = 0, mark = 0;for (i = 0; i < 10; i++){if (s_che[i] == "")break;for (j = 0; j < 5; j++){if (d_che[j] == "")break;if (s_che[i] == d_che[j]){mark = mark + 1;}}}mark = mark * 4;return mark;
}
int  cmpoint(float p1, float p2)
{int mark = 0;if (p1 >= p2){mark = mark + 10;}return mark;
}
int  cmp(float point, string* schedual, string* interests, float point1, string* schedual1, string* interests1)
{int mark;mark = cminterests(interests, interests1) + cmschedual(schedual, schedual1) + cmpoint(point, point1);return mark;
}

运行及测试结果展示

  • 运行结果为有匹配部门的学生及其选中的部门,有匹配学生的部门及其选入的学生名单
    为匹配到学生的部门,未匹配到部门的学生。
  • 完整数据链接
  • 测试200位同学,20个部门的情况
  • 测试结果概况描述
  • 测试输入数据片段展示及完整数据链接
{"department": [{"Department_No": "D087","Department_Name": "H867","Limit": 3,"GPA_Limit": 1.1069999933242798,"Tags": ["programing","basketball","film","dancing","running"],"Schedules": ["Sat.9: 00~10: 00","Fri.13: 00~14: 00","Wed.13: 00~14: 00","Tue.19: 00~20: 00","Wed.9: 00~10: 00"]},{"Department_No": "D062","Department_Name": "H174","Limit": 1,"GPA_Limit": 2.4739999771118166,"Tags": ["travelling","hiking","basketball","swimming","English"],"Schedules": ["Thu.19: 00~20: 00"]},.....```- 测试输出数据片段展示及[完整数据链接](https://github.com/liyuken/diliucizuoye/tree/master/test/)

{
"matched_department_view": [
{
"department_no": "D087",
"chosen_students": [
"S031500435",
"S031501608",
"S031508124"
]
},
{
"department_no": "D062",
"chosen_students": [
"S031504347"
]
},
{
"department_no": "D084",
"chosen_students": [
"S031502714",
"S031506434",
"S031503323",
"S031504005",
"S031508933",
"S031504339",
"S031504409",
"S031508606",
"S031504627",
"S031507531",
"S031507641"
]
},
"standalone_departments": [
"D092",
"D091"
],
"standalone_students": [
"S031502852",
"S031501222",
"S031508038",
"S031506137",
"S031501149",
"S031500014",
"S031507024",
"S031505205",
"S031505725",
- **测试500位同学,30个部门的情况** - 测试结果概况描述 ![](http://images2017.cnblogs.com/blog/1221263/201710/1221263-20171015194053809-1401450901.png) - 测试输入数据片段展示及[完整数据链接](https://github.com/liyuken/diliucizuoye/tree/master/test/)
{
"department": [
{
"Department_No": "D042",
"Department_Name": "S141",
"Limit": 1,
"GPA_Limit": 1.8980000019073487,
"Tags": [
"film",
"math",
"sports",
"swimming",
"travelling"
],
"Schedules": [
"Sun.21: 00~22: 00",
"Sun.20: 00~21: 00"
]
},
{
"Department_No": "D077",
"Department_Name": "B520",
"Limit": 8,
"GPA_Limit": 1.5379999876022339,
"Tags": [
"dancing",
"swimming",
"game"
],
"Schedules": [
"Wed.9: 00~10: 00",
"Fri.21: 00~22: 00",
"Mon.9: 00~10: 00"
]
},
- 测试输出数据片段展示及[完整数据链接](https://github.com/liyuken/diliucizuoye/tree/master/test/){
"matched_department_view": [
{
"department_no": "D042",
"chosen_students": [
"S031505929"
]
},
{
"department_no": "D077",
"chosen_students": [
"S031504701",
"S031508922",
"S031508632",
"S031503702",
"S031508414",
"S031500038",
"S031508523",
"S031505004"
]
},
{
"department_no": "D063",
"chosen_students": [
"S031501654",
"S031503205",
"S031506213",
"S031507959",
"S031505035",
"S031500735",
"S031506715",
"S031503157",
"S031505921",
"S031503035",
"S031502451",
"S031502355",
"S031504214",
"S031508232"
]
},
```

  • 测试1000位同学,50个部门的情况
  • 测试结果概况描述
  • 测试输入数据片段展示及完整数据链接
{"department": [{"Department_No": "D027","Department_Name": "G845","Limit": 10,"GPA_Limit": 2.9040000438690187,"Tags": ["running","hiking","reading"],"Schedules": ["Mon.21: 00~22: 00"]},{"Department_No": "D091","Department_Name": "I720","Limit": 5,"GPA_Limit": 2.5739998817443849,"Tags": ["sports","music","travelling","math","English"],"Schedules": ["Wed.13: 00~14: 00","reading"]},```- 测试输出数据片段展示及[完整数据链接](https://github.com/liyuken/diliucizuoye/tree/master/test/)

{
"matched_department_view": [
{
"department_no": "D027",
"chosen_students": [
"S031507325",
"S031503359",
"S031507141",
"S031508603",
"S031505059",
"S031503650",
"S031504418",
"S031500937",
"S031500310",
"S031507038"
]
},
{
"department_no": "D091",
"chosen_students": [
"S031505307",
"S031508045",
"S031504656",
"S031508513",
"S031506740"
]
},
{
"department_no": "D079",
"chosen_students": [
"S031505352",
"S031506410",
"S031500919",
"S031507053",
"S031503759",
"S031508419",
"S031503512",
"S031500806",
"S031503621",
"S031507116",
"S031507408",
"S031507702",
"S031508058",
"S031503014"
]
},
```

  • 测试5000位同学,100个部门的情况
  • 测试结果概况描述
  • 测试输入数据片段展示及完整数据链接
{"department": [{"Department_No": "D062","Department_Name": "R449","Limit": 3,"GPA_Limit": 1.7549999952316285,"Tags": ["dancing","game","painting","sports","swimming"],"Schedules": ["Sun.9: 00~10: 00"]},{"Department_No": "D008","Department_Name": "B439","Limit": 2,"GPA_Limit": 1.8799999952316285,"Tags": ["programing","dancing","painting","hiking","reading"],"Schedules": ["Mon.16: 00~17: 00","Thu.9: 00~10: 00","Sun.13: 00~14: 00"]},```
- 测试输出数据片段展示及[完整数据链接](https://github.com/liyuken/diliucizuoye/tree/master/test/)

{
"matched_department_view": [
{
"department_no": "D062",
"chosen_students": [
"S031504203",
"S031502320",
"S031502028"
]
},
{
"department_no": "D008",
"chosen_students": [
"S031501242",
"S031503131"
]
},
{
"department_no": "D078",
"chosen_students": [
"S031504022",
"S031502028"
]
},
{
"department_no": "D094",
"chosen_students": [
"S031507955",
"S031502314",
"S031503612",
"S031502258",
"S031508532",
"S031500105"
]
},
{
"department_no": "D072",
"chosen_students": [
"S031508705",
"S031500603",
"S031503635",
"S031506657",
"S031507502",
"S031504046",
"S031503022",
"S031505705",
"S031504402",
"S031502806",
"S031506526"
]
},
```

改进后的程序

-测试输出数据片段 5000个学生及200个部门

遇到的困难及解决方法

  • 困难描述
  • 第一次接触jason,并不是很了解。由于代码量比较大,所以测试起来有点麻烦。

  • 做过哪些尝试
  • 网上搜集资料,利用开元的代码。

  • 是否解决
  • 解决。

  • 有何收获
  • 了解了jason的用法,以及加强了对代码的理解及应用。

对队友的评价

  • 有哪些好的地方值得学习
  • 有钻研精神,踏实恳干,态度好。
  • 有哪些不好或者需要改进的地方
  • 打代码打的较慢。
PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 50 40
· Estimate · 估计这个任务需要多少时间 50 50
Development 开发 200 450
· Analysis · 需求分析 (包括学习新技术) 50 60
· Design Spec · 生成设计文档 0 0
· Design Review · 设计复审 (和同事审核设计文档) 0 0
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 0 0
· Design · 具体设计 150 200
· Coding · 具体编码 0 0
· Code Review · 代码复审 0 0
· Test · 测试(自我测试,修改代码,提交修改) 30 50
Reporting 报告 50 100
· Test Report · 测试报告 5 5
· Size Measurement · 计算工作量 30 20
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 30 30
合计 610 1005

学习进度条

第N周 新增代码(行) 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
1 300 300 6 6 重拾C++,初学PHP
2 0 0 0 0 学习了原型设计软件的操作及NABCD概念
3 1200 900 10 10 接触了jason,巩固了c++

转载于:https://www.cnblogs.com/liyuken/p/7673823.html

第六次作业--结对编程第二次作业相关推荐

  1. 软件工程(2019)结对编程第二次作业

    结对编程第二次作业 利用普普通通的游戏引擎实现普普通通的电梯调度算法 这是我的结对伙伴张斯豪同学的排版异常诡异的博客(狗头). 单元测试 对关键Elevator类中的WhetherAccept进行单元 ...

  2. 软件工程——结对编程第二次作业

    目录 1. 题目及要求 2. 功能的设计 3. GUI(图形用户界面)的设计 4. 容错机制的设计 4.1 选择运算符的容错处理 4.2 最大值和题目数输入的容错处理 4.3 打开文件容错处理 4.4 ...

  3. 南京邮电大学java程序设计作业在线编程第二次作业

    王利国的"Java语言程序设计第2次作业(2018)"详细 作业结果详细 总分:100 选择题得分:60  1. 表达式9==8&&3<7的运算结果是( ) ...

  4. 第六次作业--结对编程第二次

    本次作业deadline: 2017-10-10 21:00 根据上一次结对作业的背景,实现一个分配算法,根据输入信息,输出: 部门和学生间的匹配信息(一个学生可以确认多个他所申请的部门,一个部门可以 ...

  5. 罗杰软工第三次作业——结对编程

    BUAA-2023软件工程结对编程博客作业 项目 这个作业属于哪个课程 2023北航敏捷软件工程 这个作业的要求在哪里 结对项目-最长英语单词链 我在这个课程的目标是 学习并实践软件工程开发的方法论. ...

  6. 20172303 20172322 2017-2018-2 暑假作业 结对编程项目-舒尔特方格(及获小黄衫感想)...

    20172303 20172322 2017-2018-2 暑假作业 结对编程项目-舒尔特方格(及获小黄衫感想) 项目介绍 结对伙伴 姓名:张昊然 学号:20172322 舒尔特方格简介 舒尔特方格是 ...

  7. ASE第三次作业——结对编程

    ASE第三次作业--结对编程 成员:张贺 杨涛 石恩升 github地址:https://github.com/ThomasMrY/ASE-project-MSRA 题目简介: 此次编程的题目是--统 ...

  8. 第二次软件综合实验专题作业——结对编程 1759103 李思佳 、 1759107 陶彦婷

    结对编程 本次作业由 1759103 李思佳 与 1759107 陶彦婷 共同完成 经过一番讨论,我们决定用JAVA来完成这次作业.选择JAVA的原因大致可以分为以下三点:(1)我们学过的语言一共有三 ...

  9. 软件工程第二次作业——结对编程

    1.组队成员: 刘宗彦 1500802097 黄亚东 1500802109 博客地址 2.代码链接(coding地址): 四则运算计算器 3.界面及功能截图: 四则运算计算器的界面如下图所示: 四则运 ...

最新文章

  1. 转载:用 Tomcat 和 Eclipse 开发 Web 应用程序
  2. 指纹传感器沾水便失效的原因解析
  3. 高级软件工程第七次作业:东理三剑客团队作业-随笔6
  4. 遭遇IE8下的JavaScript兼容问题
  5. 如何区分Android wrap_content和fill_parent的详细说明
  6. linux ns,Linux Namespace (ns)
  7. windows如何调整某个应用程序的音量 c++_微软对重启Windows 10的应用程序进行控制测试...
  8. CSU 1785: 又一道简单题
  9. make工具和Makefile基础语法(含有交叉编译、pthread_create()的处理)
  10. Mac Generating Pods project Abort trap: 6
  11. 在eclipse中创建maven项目错误的解决方法:Could not resolve archetype org.apache.maven.archetypes:maven-archetype-qu
  12. python 元组是什么_python元组是什么?python元组的用法介绍
  13. linux gdb 脚本,如何写gdb命令脚本
  14. 初识Hadoop入门介绍
  15. ETL工具-Taskctl在Windows作业类型的使用(Soap服务驱动)
  16. c语言中srand的作用,C++随机数(rand和srand)函数用法详解
  17. c语言 日期加减天数返回日期 闰年,日期计算器(多图)
  18. 数字计算机所有的信息是采用什么表示的,第2课在计算机中如何表示信息
  19. 计算机语言 帕斯卡,帕斯卡命名法
  20. matlab噪声滤波分析,应用Matlab对含噪声语音信号进行频谱分析及滤波

热门文章

  1. To My Little Princess
  2. 使用fiddler实现苹果ios手机抓包--的补充
  3. VC++对话框的任意扩展
  4. 跳跃游戏(jump-game)图解
  5. 关于“知识蒸馏“,你想知道的都在这里!
  6. SwiftUI:属性装饰器的理解@State,@Binding,@ObservedObject,@Published,@Environment,@EnvironmentObject
  7. SQLServer存储过程大全
  8. ai突破性技术_人工智能还没有突破
  9. 将算术表达式((a+b)+c*(d+e)+f)*(g+h) 转化为二叉树。并分别写出对该二叉树进行 先序、中序、后续和层次遍历得到的结果
  10. Linux入门操作指南