实验二结对编程
1 实验内容及要求
1.1 教学内容及要求
完成结对项目,实现代码复审。
1.2 实验要求
首先在同学中找一个同伴,范围不限,可以在1~3班中随意组合,不要找同组的成员,女同学尽量找男同学结对,但是不做强制要求。
1.2.1 实验题目
本次作业要求两个人合作完成,驾驶员和导航员角色自定,鼓励大家在工作期间角色随时互换,这里会布置两个题目,请各组成员根据自己的爱好任选一题。
题目1:
我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:
① 能够自动生成四则运算练习题
② 可以定制题目数量
③ 用户可以选择运算符
④ 用户设置最大数(如十以内、百以内等)
⑤ 用户选择是否有括号、是否有小数
⑥ 用户选择输出方式(如输出到文件、打印机等)
⑦ 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)
题目2
现有一新建办公大厦,共有21层,共有四部电梯,所有电梯基本参数如下表所示,其使用规定如下:
① 楼层号为0~20,其中0号为地下一层
② 有楼层限制的电梯不在相应楼层停靠,如单双层
③ 所有电梯采用统一按钮控制
④ 请根据上述要求设计并实现一个电梯控制程序,使得用户平均等待时间尽可能小,如果有图形显示就更好了。
|
电梯编号 |
可服务楼层 |
最大乘客数量 |
最大载重量 |
|
1 |
全部楼层 |
10 |
800 kg |
|
2 |
单层 |
10 |
800 kg |
|
3 |
双层 |
10 |
800 kg |
|
4 |
全部楼层 |
20 |
2000 kg |
1.2.2实验要求
(1) 驾驶员
① 能够完成全部代码工作,程序基本实现全部要求功能,并将代码上传至GitHub代码托管系统中。
② 能够对导航员在本次编程工作中起到的作用给出客观评价,并完成500字以上的总结,并且上传和队友工作时的照片。
(2) 领航员
① 能够辅助驾驶员完成全部代码工作,并且为关键函数选用合适的覆盖标准设计测试用例,并编写代码进行单元自动测试。
② 利用结对编程作业的代码检查表(表1.2)对驾驶员的本次工作进行评价,并同时填写PSP 0.1工作记录表。
③ 能够对本次工作完成500字以上的总结。
表1.1工作记录表
|
项目 |
预计 |
实际 |
|
设计时间 |
|
|
|
编码时间 |
|
|
|
测试时间 |
|
|
|
代码行数 |
|
|
|
测试代码行数 |
|
|
|
错误数量 |
|
|
|
错误修复时间 |
|
|
|
开发总时间 |
|
|
1.2.3选做题
从以往个人完成的项目中选择一个作品,例如:以往的具有比较完整功能的小系统,代码至少要大于100行。
(1) 将代码上传至个人GitHub系统中,并将代码地址交给对方;
(2) 对同伴的作品进行代码复审,并参照C/C++代码审查表和 Java代码审查表 这两篇博文的内容将检查内容填入以下代码审查表中;
表1.2代码审查表
|
序号 |
重要性 |
审查项 |
结论 |
|
1 |
重要/不重要 |
审查表中待检查内容 |
填写是/否/无(是代表符合规范,否代表不符合规范,无代表代码不涉及该项内容) |
|
2 |
|
|
|
(3) 将对伙伴审查的结果以表格的形式写到自己的作业里,作业中应该附有伙伴作业的GitHub代码地址。
(4) 对同伴的代码写一篇500字以上的评论,介绍同伴的优缺点
2 实验步骤
2.1实验过程
2.1.1实验代码
github代码地址:homework2/mc.cpp at main · machao223201062219/homework2 (github.com)
2.1.2实验过程
(1) 本人角色
担任角色:驾驶员
结对伙伴姓名:王唯伊
结对伙伴学号:223201062128
(2) 程序设计
Ran函数流程图如下:
图1 Ran函数流程图
shu函数流程图如下:
图2 shu函数流程图
Create1函数流程图如下:
图3 create1函数流程图
qian函数流程图如下:
图4 qian函数流程图
hou函数流程图如下:
图5 hou函数流程图
Create2函数流程图如下:
图6 create2函数流程图
cun函数流程图如下:
图7 cun函数流程图
main函数流程图如下:
图8 main函数流程图
图9 运行结果截图
图10 结对工作照片1
图11 结对工作照片2
图12 结对工作照片3
2.2选做题实验过程
(1)GitHub代码地址:homework2.1/mc.cpp at main · machao223201062219/homework2.1 (github.com)
(2)实验题目
飞机零部件通常包括机身,机翼,发动机,动力装置,起落架五部分,每个零部件都包含以下信息:零部件名称(可以用拼音),出厂时间,价格,编号(出厂时间,价格和编号可以自己设定,但保证至少有一个零部件的出厂时间大于5年)。要求实现以下3个函数。
实现如下功能:
(1)零部件信息显示功能:显示所有零部件的信息(零部件名称,出厂价时间,价格,编号)。
(2)排序功能:根据零部件价格进行排序,输出价格最高和价格最低的零部件信息(零部件名称,出厂价时间,价格,编号)。
(3)价格更改功能:输出出场时间大于5年的零部件,对于出厂时间大于5年的零部件,修改其价格为原价格的一半,并显示该零部件的信息(零部件名称,出厂价时间,价格,编号)。
(3)设计思路
1) 定义一个结构体来存放零部件的信息
2) 定义第一个函数,并遍历输出所有零部件的信息
3) 定义第二个函数,使用冒泡排序法对零部件的信息按价格进行排序,并输出价格最高的零部件信息
4) 定义第三个函数,将出厂时间大于5年的零部件筛选出来,并将价格改为原价格的一半然后输出
(4)算法设计
1) 第一个函数遍历输出结构体
2) 第二个函数,使用冒泡排序法对零部件的信息按价格进行排序
3) 第三个函数,使用for循环套if语句筛选大于5年的零部件信息并改为原价格一半然后输出
(5)流程图如下
图13 飞机零部件流程图
(6)运行结果
图14 运行结果截图
(7)对结对伙伴的评价
在本次结对编程的过程中,我和王唯伊同学合作完成,在完成过程中,我充当驾驶员的角色,王唯伊同学充当领航员的角色。在编码实现的过程中,我们首先对四则运算算法进行了系统的分析,四则运算的五种情况有:加、减、乘、除和混合运算。其中加减乘除这四种运算规则单调,实现起来也较为简单,对于每一部分的完成过程也是较为相似的,在编写代码的过程中,王唯伊同学在我身边一直监督我在代码编辑过程中有什么错误,这样一来,大大的减小了代码出现语法错误和编辑错误的几率。同时,两个人合作的过程中,对于代码也会提出来一些较为优化的编译方法,这为代码的美观性以及减小代码的冗余起到了很重要的作用。在编译混合运算的过程中,开始的时候是一筹莫展,通过对网上一些算法思想的阅读,慢慢梳理出来一个实现算法的清晰流程,相对于一个人来说,两个人共同完成一个代码,减小了工作量,同时对彼此也是一个很好的督促和鼓励。
在整体编写前,我做了一些基础的准备,先是查找了大量资料,对四则运算的实现过程有了基本的认识,然后又画了些流程图,想好了思路。然后我们一起讨论选择了最优的方案。在编写过程中,领航员对于我在编写代码的时候存在的一些语法错误及时的进行提示,同时也提出了一些优化代码的想法,这对我编程过程非常的有利,在领航员的积极领导之下,我在编程的过程当中,感觉自己的思路非常的清晰,这样状态下编辑出来的代码也具有很高的可读性,通过和领航员的配合,我自己也切身的感受到了结对编程带来的好处,在结对编程的过程当中,思路清晰,同时对方的一些想法也会改变自己的编程习惯,有很多好的建议不仅在这次编程中非常有用,在以后的编程过程中也会带来很好的编程体验。
王唯伊同学在这次结对编程作业的过程中,完成的很好,通过两个人的共同努力,顺利的完成了本次结对编程作业。领航员的学科基础非常好,这种良好的专业能力促使我们在编程之前的算法设计过程中非常的顺利,从而使得整个编程过程都很得心应手。同时,领航员的模块思想非常的好,我们在编程过程中,使用了很多的模块化内容,这种举措使得代码本身不再是牵一发而动全身。在结对编程的过程中,受领航员的影响,面对棘手的问题,我也不再是焦急,而是沉着分析,两个人一起配合结焦问题。总的来说,这次结对编程对彼此都是一个很好的提升,希望以后能有更多的合作机会。
3 总结与体会
在这次结对编程中,我感觉变化最大的就是在项目初期,我和领航员王唯伊同学一起讨论题目的大致流程以及具体功能实现确定了程序框架和实现方法,方向确定好之后,代码实现就容易多了,相比以往,两个人在一起头脑风暴,交流想法,并且能即时沟通反馈,在方向确定和程序框架的确立上比以往高效的很多。在本次项目中,我也学到了很多知识掌握了很多经验,第一个就是随机数的产生问题,一开始不了解随机数的产生原理,导致产生的随机数都是一样的,后来经查找资料弄明白了原理,rand()函数是按指定的顺序来产生整数,使用 rand() 生成随机数之前需要用随机发生器的初始化函数 srand(unsigned seed)(也位于 stdlib.h 中) 进行伪随机数序列初始化,seed 又叫随机种子,通俗讲就是,如果每次提供的 seed 是一样的话,最后每一轮生成的几个随机值也都是一样的,因此叫伪随机数,所以需要每次提供不同的 seed 达到完全的随机,所以我增加了一个种子变化函数解决了产生连续随机数的问题;第二就是在单元测试的时候发现可以运行的代码检测失败,看了错误报告查百度明白了原因,发现了自己编程的潜在的不良习惯和一些新学到的知识,例如在子函数中向主函数返回临时变量就通不过检测,我通过将变量设置在主函数通过传参的方式改正了,还有就是string库的strcpy,strcat等函数通不过检测需要改成strcpy_s,strcat_s。
很多人讲说,这次作业难度不大,我确实感觉到这次作业比较有意思,但是最深的感觉还是难度比较大,我们这次采用的C语言来开发。我觉得最难的部分也是最有趣的部分,就是对随机生成的数的计算处理的编写,通过看她写的代码还是了解到了自己的不足和缺点。同时,我们一边编写程序,一遍讨论功能实现的方法,对于同一个问题,我们都有自己的理解和解决方法,这就需要我们展现讨论问题的态度和方法。
在写程序的过程中,我们由于自身水平受限,有很多技能没有,功能算法也有很大的盲区,比如正则表达式,但好在我们用良好的沟通来弥补水平不足的缺点,提高工作交流能力,也为以后的工作打下了基础。
在各个阶段我们对于代码的编写都会产生分歧产生分歧,但最终以”试试吧“成功解决了。两个人的想法也并不算多,一旦有分歧,我们就会把有分歧的两个方法都试一下,选取效果更好的方法,如果没有更好,就自动让步。通过这次作业,也让我知道合作的重要性,以前的代码全是自己一个人想,一个人做,这次作业的效果是,明显感觉到合作的效率高,而且可以集思广益,。我们全程的交流中,双方都有自己的优点展示,都有想法的闪光点,有这么多优点的结对编程,自然也有每个人必须忍受习惯的改变。但是,最大的好处是平时一个人编写的话很难发现,尤其是一些细小的错误,但是往往他人就很容易看出来,还能学习到很多新的东西。
总的来说,这次的作业的基本要求都完成了,也有一个小缺点就是对算式答案的计算在有的运算方法中并不是很正确,有一些错误的处理没有做的很好,但我感觉我们做成这样子已经很不错了,我们也认识到了团队中每个角色的重要性,每个角色都是软件开发过程中不可缺少的部分。

浙公网安备 33010602011771号