2022秋软件工程 第二次结对编程作业

这个作业属于哪个课程https://bbs.csdn.net/forums/fzusdn
这个作业要求在哪里https://bbs.csdn.net/topics/608425848
这个作业的目标设计一个点名算法
学号072003403
队友学号032002217
博客链接链接

作业描述

栋哥对大家第一次结对编程作业的原型设计感到很满意,为了尽快让同学们使用上软件,于是栋哥花一晚上时间开发了一个点名小程序。但是在上线运行过后,发现了一些问题:大多数老师习惯在每次上课后或下课前的一小段时间内进行点名。如果采用全点的方式,在这段时间里,后端服务器需要处理大量的请求,拥塞导致响应速度变慢,给点名小程序带来极差的使用体验。采用随机抽点的方式,能够有效减少并发量,但是无法保证点名的质量,难以有效抓出没有到教室的同学。所以栋哥急需大家设计一个算法来解决这个问题,要求能够最小化向后端发送的请求次数,最大化抓出缺勤同学的数量。

具体要求

定义5门课程,每个课程班级人数为90人,一学期共20次课。每门课程均有5-8位同学缺席了该学期80%的课,此外每次课程均还有0-3位同学由于各种原因缺席。

参数定义

  • 请求次数:定义在一次点名中,获取一位同学是否到达课堂的情况为一次请求。
  • 有效点名:一位同学缺席该课程的一次课,算法在这次课上抽点到该同学,视为一次有效点名,一次课可包含多次有效点名。

评价标准

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-42Z1i6FM-1665580765480)(https://img-community.csdnimg.cn/images/a125a226e09e47b4bdca1b38ca3a44ab.png “#left”)]

重难点分析

怎么使用最少的点名次数进行最多次有效点名,重心在于检索经常缺课的58人,如果为了检索剩下的82到85个人中的三个人,这样耗费的时间必然是前者的几十倍。思路如下:既然已经不是全点,必然有缺漏,假设一个班级二十次点名全点,那么是100%的命中但E的大小是(511)/90 期望为0.089。当然也可以前几次全点,后几次用算法点名,但都达不到E的比较大的值(因为一个班级就20次点名),不妨就第一次全点,最大可能的找出经常缺课的那58人,并进行标记,当生成点名表(数据集)时被标记的有80%的概率缺课,同时缺课次数加一。58随机生成最为定值,不考虑第一次来了后面全不来等情况,如果要考虑,请采用全点方式。

//  定义学生类,id是唯一标识,absent是缺席次数,tag标记为经常迟到的5~8人
    static class Student {
        int id;
        int absent;
        int tag;
    }
            for (int i = 1; i <= 90; i++)
            {
//                如果是被标记了的,会有一个大概率缺课
                if(students[i].tag==1)
                {
                    if(random.nextInt(1000)<800)
                    {
                        students[i].absent++;
//  每次点名都会排序,最经常迟到的会排在最前面,为了使E最大只点名最前面的十个人,点到没来次数加一
                        if(i<10)  valid++;
                    }
                }
//                否则只会有个小概率缺课(反正都会漏点,为了让E更大漏点无所谓
//                (就像偶尔生病请假等小概率没必要浪费算法规模))
               else {
                   int a= random.nextInt(1000);
//                 随机数生成要对应概率生成,这是转换后a的动态区间(0~3缺课)也是动态的
                   while (a>((3.000/82)*1000))
                   {
                       a=random.nextInt(1000);
                   }
                if(random.nextInt(1000)<a) students[i].absent++;
                if(i<=10)
                    {
                        students[i].absent++;
                        valid++;
                    }
                }
            }

E的最终结果

0.5514285714285714
0.555
0.5614285714285714
0.56
0.5492857142857143
0.5528571428571428
0.5457142857142857
0.5571428571428572
0.5471428571428572
0.5485714285714286
结果趋近于0.55 稳定,且有一定效率,实际上因为第一次的全点拉低了概率,第二次开始的点名十次大约都有7~8次命中。

习进度条

PSP及学习进度条

PSP

PSPPersonal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划4050
Estimate估计这个任务需要多少时间4050
Development开发650720
Analysis需求分析 (包括学习新技术)150160
Design Spec生成设计文档3030
Design Review设计复审 (和同事审核设计文档)3040
Coding Standard代码规范 (为目前的开发制定合适的规范)2025
Design具体设计3045
Coding具体编码240260
Code Review代码复审6060
Test测试(自我测试,修改代码,提交修改)90100
Reporting报告9090
Test Report测试报告3025
Size Measurement计算工作量2030
Postmortem & Process Improvement Plan事后总结, 并提出过程改进计划4035
合计820910

学习进度条

第N周本周学习耗时(小时)累计学习耗时重要成长
166学习了有关流的相关概念,构思如何解决算法问题,设计算法思想,构建基本的数据参数模型
2814学习了流的具体操作,完善算法,确定算法结果,分析实际实现情况

代码仓库

  • github仓库链接

  • commit记录

  • 在这里插入图片描述

结对照片

在这里插入图片描述

结对感受

有了上次的结对基础,我们对对方各自擅长的地方也有一定的了解,所以前期的分工安排上很快达成了一致。这次我们使用的语言是Java,两个人之前没有写过java,所以刚开始打代码感觉十分困难,但是通过不断的查阅资料,最终还算是顺利完成,并且也掌握了一定的java基础。
次结对作业较与第一次结对作业对我们来说难度不小,从设计算法到编写代码,我们都花费了不少时间去学习,学习如何创建数据集等等,而且通过本次实验,我我也更加深刻理解了结对的意义,与队友分工合作完成任务,不仅提高了效率,也从对方那里学习到了不少东西,得到了不少收获。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值