• 结队项目——第二次作业


    作业地址:http://www.cnblogs.com/easteast/p/7604534.html

    1)我和我的队友

    2)我的Github地址:Github

    3)生成的数据:input_data.txt

    部分数据截图:

    数据生成原理以及考虑的因素:

      数据主要是生成标签和学生的空闲时间段,学生和部门的编号取值是依次递增的,所以在定义的时候先自定义10个标签,部门的活动时间和学生的空闲时间也是自定义一天中的4个时间段,然后搭配上一周七天的时间进行随机匹配。

     定义:

    • 定义两个结构体学生和部门
    • 部门中包含自身的编号、招生人数、标签以及活动时间
    • 学生中包含学生编号、空闲时间、自身兴趣标签、意愿部门等等。

    实现:

    • 编号都可以按照一定的顺序递增
    • 部门招收人数通过随机函数可以定义在10-15人之间
    • 在标签方面,采用二进制的方式来存储信息,随机生成4-6个部门标签
    • 部门活动时间采用与标签类似的方法,定义一个二维数组,第一个表示当天是否有空,第二个是表示当天有空的时间段在四个时间段中是哪一个
    • 在学生信息定制过程中,意愿部门是随机生成1-5个
    • 在整个信息定制过程中,rand()函数用的非常频繁,也是生成信息的核心部分。

    处理数据:

    •    在完成基本的定制数据后,就是将数据处理成json格式,json数据本身处理起来并不是很麻烦,但是用c语言却是第一次,在没有什么头绪的情况下,参考了部分博客,最终选择引用的方式,引用头文件,调用里面的函数生成对象以及数组 一步步嵌套输出,最终达到要求的数据。

    考虑的因素:

    • 数据合理:学生的兴趣标签来自部门的兴趣标签;学生的空闲时间一天会有两个时间段,而部门的活动时间一天只能一次。

    4)数据建模及匹配程序的思路及实现方式

    模型和思路:

      

     实现:

    • 读取文件中的数据并解析,将整体文件保存成字符串,从中取出有用的数据存起来。
    • 在匹配中利用时间和标签初步筛选对应的符合学生,时间匹配是利用字符串函数截取有效的时间,将学生的时间和部门的时间比较是否存在包含关系,即可判断是否产生时间冲突。标签的匹配和信息的存储主要是由队友实现,用的是结构体指针,大致的思路就是分别定义部门和学生的结构体,部门的里面有部门编号,纳新人数,已收人数和指向学生结构体的指针,学生的里面有学生在遍历时出现的顺序以及和部门相同的标签个数。开个20大小的部门结构体数组,遍历学生的时候可以纳入就malloc一个学生结构体,初始化有关信息,接到相应部门后面。
    • 用一个数组flag[300]存取是否学生被录取信息,如果录取就存为1,否则就是0,最后输出未被录取的flag=0的unlucky-sudent也很好理解。

    5)遵循的代码规范

    代码规范:

    1. 变量命名
    2. 代码段对齐
    3. 加上适当的注释
    4. 写上一段代码后可以利用print来输出结果测试,以便为了后期优化和修正

    生成最终Json字符串的代码:

    for(i = 0; i < 20; i++)
    {
        sp1 = department[i].next;
        /*生成unlucky_department*/
        if(sp1 == NULL)
        {
            cJSON_AddItemToArray(unluckyD, cJSON_CreateString(department[i].d_no));
        }
        else
        {
            /*生成admitted*/ 
            cJSON *admittedDno, *admittedS;
            admittedDno = cJSON_CreateObject();
            admittedS = cJSON_CreateArray();
            cJSON_AddItemToObject(admittedDno, "member", admittedS);
            while(sp1 != NULL)
            {
                cJSON_AddItemToArray(admittedS, cJSON_CreateString(student[sp1->order]));
                flg[sp1->order] = 1;
                sp1 = sp1->next;
            }
            cJSON_AddStringToObject(admittedDno, "department_no", department[i].d_no);
            cJSON_AddItemToArray(admitted, admittedDno);
        }
    }
    for(i = 0; i < 300; i++)
    {
        if(!flg[i])
        {
            /*生成unlucky_student*/
            cJSON_AddItemToArray(unluckyS, cJSON_CreateString(student[i]));
        }
    }
    /*生成输出json字符串*/ 
    char *out = cJSON_Print(rootOut);
     

    6)结果评估

    利用作业上提供的input_data.txt用自己的程序匹配结果输出结果如下图:

     通过助教给出的输入测试样例来测试的话有180多个未被录取的学生,再看看输出的测试样例好像也是180多个,那基本上是可以的,通过自己生成的数据测试,学生录取的会比这个高不少,不过整体上不影响最后的结果,大致的匹配结果对上了就行。

    7)结对感受

      结对作业已经进行了两次了,从第一次的陌生到慢慢磨合,已经有了一定的默契。这一次的任务跟第一次不一样,需要动手编码,考验自己的代码水平,个人感觉这次作业的难点是在于匹配程序和处理json数据。不过虽然这次作业可供完成的时间周期很长,有一个多礼拜的时间,但是恰逢国庆和中秋两个节日,配合上可能没有很好,大部分都是通过线上交流,不过线上交流有很大的弊端,不是很清楚的表达自己的意思和理解队友的意思,只有后两天才能在宿舍面对面一起讨论还没有解决的一些细节,进度不能够很好把握,好在最后还是讨论出来了最后的结果,不过可能在部分程序优化上没有做的很出色。这次算是比第一次有点进步,下次还要再继续加油吧。

  • 相关阅读:
    维护没有源代码的遗留 Java 项目
    项目管理软件
    Web系统页面打印技术实现与分析
    包饺子
    深入理解浏览器兼容性模式
    无法加载ISAPI 筛选器 当前配置只支持加载为 AMD64 处理器体系结构创建的映像
    命令行下IIS的配置脚本Adsutil.vbs
    浏览器开发工具的秘密
    高速公路坐标高程计算软件3.6版本发布
    VB模拟键盘输入的N种方法
  • 原文地址:https://www.cnblogs.com/forfly/p/7637890.html
Copyright © 2020-2023  润新知