第六次作业--结对编程第二次作业
结队成员:
自己:
学号 | 姓名 | 性别 |
---|---|---|
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
第六次作业--结对编程第二次作业相关推荐
- 软件工程(2019)结对编程第二次作业
结对编程第二次作业 利用普普通通的游戏引擎实现普普通通的电梯调度算法 这是我的结对伙伴张斯豪同学的排版异常诡异的博客(狗头). 单元测试 对关键Elevator类中的WhetherAccept进行单元 ...
- 软件工程——结对编程第二次作业
目录 1. 题目及要求 2. 功能的设计 3. GUI(图形用户界面)的设计 4. 容错机制的设计 4.1 选择运算符的容错处理 4.2 最大值和题目数输入的容错处理 4.3 打开文件容错处理 4.4 ...
- 南京邮电大学java程序设计作业在线编程第二次作业
王利国的"Java语言程序设计第2次作业(2018)"详细 作业结果详细 总分:100 选择题得分:60 1. 表达式9==8&&3<7的运算结果是( ) ...
- 第六次作业--结对编程第二次
本次作业deadline: 2017-10-10 21:00 根据上一次结对作业的背景,实现一个分配算法,根据输入信息,输出: 部门和学生间的匹配信息(一个学生可以确认多个他所申请的部门,一个部门可以 ...
- 罗杰软工第三次作业——结对编程
BUAA-2023软件工程结对编程博客作业 项目 这个作业属于哪个课程 2023北航敏捷软件工程 这个作业的要求在哪里 结对项目-最长英语单词链 我在这个课程的目标是 学习并实践软件工程开发的方法论. ...
- 20172303 20172322 2017-2018-2 暑假作业 结对编程项目-舒尔特方格(及获小黄衫感想)...
20172303 20172322 2017-2018-2 暑假作业 结对编程项目-舒尔特方格(及获小黄衫感想) 项目介绍 结对伙伴 姓名:张昊然 学号:20172322 舒尔特方格简介 舒尔特方格是 ...
- ASE第三次作业——结对编程
ASE第三次作业--结对编程 成员:张贺 杨涛 石恩升 github地址:https://github.com/ThomasMrY/ASE-project-MSRA 题目简介: 此次编程的题目是--统 ...
- 第二次软件综合实验专题作业——结对编程 1759103 李思佳 、 1759107 陶彦婷
结对编程 本次作业由 1759103 李思佳 与 1759107 陶彦婷 共同完成 经过一番讨论,我们决定用JAVA来完成这次作业.选择JAVA的原因大致可以分为以下三点:(1)我们学过的语言一共有三 ...
- 软件工程第二次作业——结对编程
1.组队成员: 刘宗彦 1500802097 黄亚东 1500802109 博客地址 2.代码链接(coding地址): 四则运算计算器 3.界面及功能截图: 四则运算计算器的界面如下图所示: 四则运 ...
最新文章
- 转载:用 Tomcat 和 Eclipse 开发 Web 应用程序
- 指纹传感器沾水便失效的原因解析
- 高级软件工程第七次作业:东理三剑客团队作业-随笔6
- 遭遇IE8下的JavaScript兼容问题
- 如何区分Android wrap_content和fill_parent的详细说明
- linux ns,Linux Namespace (ns)
- windows如何调整某个应用程序的音量 c++_微软对重启Windows 10的应用程序进行控制测试...
- CSU 1785: 又一道简单题
- make工具和Makefile基础语法(含有交叉编译、pthread_create()的处理)
- Mac Generating Pods project Abort trap: 6
- 在eclipse中创建maven项目错误的解决方法:Could not resolve archetype org.apache.maven.archetypes:maven-archetype-qu
- python 元组是什么_python元组是什么?python元组的用法介绍
- linux gdb 脚本,如何写gdb命令脚本
- 初识Hadoop入门介绍
- ETL工具-Taskctl在Windows作业类型的使用(Soap服务驱动)
- c语言中srand的作用,C++随机数(rand和srand)函数用法详解
- c语言 日期加减天数返回日期 闰年,日期计算器(多图)
- 数字计算机所有的信息是采用什么表示的,第2课在计算机中如何表示信息
- 计算机语言 帕斯卡,帕斯卡命名法
- matlab噪声滤波分析,应用Matlab对含噪声语音信号进行频谱分析及滤波
热门文章
- To My Little Princess
- 使用fiddler实现苹果ios手机抓包--的补充
- VC++对话框的任意扩展
- 跳跃游戏(jump-game)图解
- 关于“知识蒸馏“,你想知道的都在这里!
- SwiftUI:属性装饰器的理解@State,@Binding,@ObservedObject,@Published,@Environment,@EnvironmentObject
- SQLServer存储过程大全
- ai突破性技术_人工智能还没有突破
- 将算术表达式((a+b)+c*(d+e)+f)*(g+h) 转化为二叉树。并分别写出对该二叉树进行 先序、中序、后续和层次遍历得到的结果
- Linux入门操作指南