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

结队成员:

自己:

学号姓名性别
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) //输出匹配结果

  • 内部实现设计(类图)

1221263-20171015193749152-1529612145.png

  • 匹配算法设计(思想/流程等)
  • 根据项目要求,设计两个类学生类和部门类,其中学生类包含学生的学号,姓名,志愿,绩点,兴趣以及空闲时间。部门类包含部门号,兴趣要求,绩点要求,活动时间,部门人数等。在主函数随机生成的若干学生和诺干部门中进行匹配。由于在部门占有较高主动权,所以以部门为单位,依次遍历学生,根据学生的绩点,兴趣以及空闲时间,判断是否能招。由于判断条件主次不一,我们分别设定兴趣吻合度,时间吻合度,以及绩点吻合度。
    匹配兴趣时,遍历学生的兴趣,发现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个部门的情况
  • 测试结果概况描述
    1221263-20171015193923793-1071876535.png
  • 测试输入数据片段展示及完整数据链接
{
    "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个部门的情况
  • 测试结果概况描述
    1221263-20171015194104746-1173972340.png
  • 测试输入数据片段展示及完整数据链接
{
    "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个部门的情况
  • 测试结果概况描述
    1221263-20171015194112090-1163575569.png
  • 测试输入数据片段展示及完整数据链接
{
    "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个部门
1221263-20171018013403099-296754753.png

遇到的困难及解决方法

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

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

  • 是否解决
  • 解决。

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

对队友的评价

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

学习进度条

第N周新增代码(行)累计代码(行)本周学习耗时(小时)累计学习耗时(小时)重要成长
130030066重拾C++,初学PHP
20000学习了原型设计软件的操作及NABCD概念
312009001010接触了jason,巩固了c++

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值