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工作记录表
项目 |
预计 |
实际 |
设计时间 |
2h |
2h20m |
编码时间 |
2h |
1h30m |
测试时间 |
1h |
40m |
代码行数 |
250 |
195 |
测试代码行数 |
200 |
146 |
错误数量 |
6 |
7 |
错误修复时间 |
1h |
30m |
开发总时间 |
6h |
5h |
实验要求:
(1) 驾驶员
① 能够完成全部代码工作,程序基本实现全部要求功能,并将代码上传至GitHub代码托管系统中。
② 能够对导航员在本次编程工作中起到的作用给出客观评价,并完成500字以上的总结,并且上传和队友工作时的照片。
(2) 领航员
① 能够辅助驾驶员完成全部代码工作,并且为关键函数选用合适的覆盖标准设计测试用例,并编写代码进行单元自动测试。
② 利用结对编程作业的代码检查表(表1.2)对驾驶员的本次工作进行评价,并同时填写PSP 0.1工作记录表。
③ 能够对本次工作完成500字以上的总结。
表1.1工作记录表
项目 |
预计 |
实际 |
设计时间 |
2h |
2h20m |
编码时间 |
2h |
1h30m |
测试时间 |
1h |
40m |
代码行数 |
250 |
195 |
测试代码行数 |
200 |
146 |
错误数量 |
6 |
7 |
错误修复时间 |
1h |
30m |
开发总时间 |
6h |
5h |
2 实验步骤
2.1实验过程
2.1.1实验代码
给出博客园截图:
博客园网址: GTH123的主页 - 博客园 (cnblogs.com)
github的代码地址:https://github.com/ljl922/-/blob/main/p60.cpp
2.1.2实验过程
(1) 本人角色:
自己在本次结对项目中所担任角色:领航员
结对伙伴姓名:刘佳玲 学号:223201062114
(2)
根据驾驶员和领航员的工作分工,分别撰写。
驾驶员:系统的实现过程、算法设计、结对工作照片等
领航员:代码测试覆盖标准456/test.c at main · 1Gt2/456 (github.com)
测试用例:
代码检查表
序号 |
重要性 |
审查项 |
结论(是代表符合规范,否代表不符合规范,无代表代码不涉及该项内容) |
1 |
不重要 |
头文件和定义文件的名称是否合理? |
是 |
2 |
不重要 |
头文件和定义文件的目录结构是否合理? |
是 |
3 |
不重要 |
版权和版本声明是否完整? |
无 |
4 |
重要 |
头文件是否使用了 ifndef/define/endif 预处理块? |
无 |
5 |
不重要 |
头文件中是否只存放“声明”而不存放“定义”? |
否 |
6 |
不重要 |
空行是否得体? |
是 |
7 |
不重要 |
代码行内的空格是否得体? |
是 |
8 |
不重要 |
长行拆分是否得体? |
是 |
9 |
不重要 |
“{” 和 “}” 是否各占一行并且对齐于同一列? |
是 |
10 |
重要 |
一行代码是否只做一件事?如只定义一个变量,只写一条语句。 |
是 |
11 |
重要 |
If、for、while、do等语句自占一行,不论执行语句多少都要加 “{}”。 |
是 |
12 |
重要 |
在定义变量(或参数)时,是否将修饰符 * 和 & 紧靠变量名?注释是否清晰并且必要? |
是 |
13 |
重要 |
注释是否有错误或者可能导致误解? |
无 |
14 |
重要 |
类结构的public, protected, private顺序是否在所有的程序中保持一致? |
无 |
15 |
重要 |
命名规则是否与所采用的操作系统或开发工具的风格保持一致? |
否 |
16 |
不重要 |
标识符是否直观且可以拼读? |
是 |
17 |
不重要 |
标识符的长度应当符合“min-length && max-information”原则? |
是 |
18 |
重要 |
程序中是否出现相同的局部变量和全部变量? |
否 |
19 |
不重要 |
类名、函数名、变量和参数、常量的书写格式是否遵循一定的规则? |
是 |
20 |
不重要 |
静态变量、全局变量、类的成员变量是否加前缀? |
无 |
21 |
重要 |
如果代码行中的运算符比较多,是否已经用括号清楚地确定表达式的操作顺序? |
是 |
22 |
不重要 |
是否编写太复杂或者多用途的复合表达式? |
否 |
23 |
重要 |
是否将复合表达式与“真正的数学表达式”混淆? |
否 |
24 |
重要 |
是否用隐含错误的方式写if语句? 例如将布尔变量直接与TRUE、FALSE或者1、0进行比较。 |
否 |
25 |
重要 |
是否用隐含错误的方式写if语句? 例如将浮点变量用“==”或“!=”与任何数字比较。 |
否 |
26 |
重要 |
是否用隐含错误的方式写if语句? 例如将指针变量用“==”或“!=”与NULL比较。 |
否 |
27 |
不重要 |
如果循环体内存在逻辑判断,并且循环次数很大,是否已经将逻辑判断移到循环体的外面? |
是 |
28 |
重要 |
Case语句的结尾是否忘了加break? |
否 |
29 |
重要 |
是否忘记写switch的default分支? |
否 |
30 |
重要 |
使用goto 语句时是否留下隐患? 例如跳过了某些对象的构造、变量的初始化、重要的计算等。 |
无 |
31 |
不重要 |
是否使用含义直观的常量来表示那些将在程序中多次出现的数字或字符串? |
是 |
32 |
不重要 |
在C++ 程序中,是否用const常量取代宏常量? |
无 |
33 |
重要 |
如果某一常量与其它常量密切相关,是否在定义中包含了这种关系? |
是 |
34 |
不重要 |
是否误解了类中的const数据成员?因为const数据成员只在某个对象 |
无 |
35 |
不重要 |
生存期内是常量,而对于整个类而言却是可变的。 |
是 |
36 |
不重要 |
参数的书写是否完整?不要贪图省事只写参数的类型而省略参数名字。 |
否 |
37 |
不重要 |
参数命名、顺序是否合理? |
是 |
38 |
不重要 |
参数的个数是否太多? |
是 |
39 |
不重要 |
是否使用类型和数目不确定的参数? |
是 |
40 |
不重要 |
是否省略了函数返回值的类型? |
是 |
41 |
不重要 |
函数名字与返回值类型在语义上是否冲突? |
是 |
42 |
重要 |
是否将正常值和错误标志混在一起返回?正常值应当用输出参数获得,而错误标志用return语句返回。 |
否 |
43 |
重要 |
在函数体的“入口处”,是否用assert对参数的有效性进行检查? |
无 |
44 |
重要 |
使用滥用了assert? 例如混淆非法情况与错误情况,后者是必然存在的并且是一定要作出处理的。 |
无 |
45 |
重要 |
return语句是否返回指向“栈内存”的“指针”或者“引用”? |
无 |
46 |
不重要 |
是否使用const提高函数的健壮性?const可以强制保护函数的参数、返回值,甚至函数的定义体。“Use const whenever you need” |
无 |
47 |
重要 |
用malloc或new申请内存之后,是否立即检查指针值是否为NULL?(防止使用指针值为NULL的内存) |
否 |
48 |
重要 |
是否忘记为数组和动态内存赋初值? |
否 |
49 |
重要 |
数组或指针的下标是否越界? |
是 |
50 |
重要 |
动态内存的申请与释放是否配对?(防止内存泄漏) |
否 |
51 |
重要 |
是否有效地处理了“内存耗尽”问题? |
否 |
52 |
重要 |
是否修改“指向常量的指针”的内容? |
是 |
53 |
重要 |
是否出现野指针?例如(1)指针变量没有被初始化;(2)用free或delete释放了内存之后,忘记将指针设置为NULL。 |
无 |
54 |
重要 |
是否将malloc/free 和 new/delete 混淆使用? |
无 |
55 |
重要 |
malloc语句是否正确无误?例如字节数是否正确?类型转换是否正确? |
无 |
56 |
重要 |
在创建与释放动态对象数组时,new/delete的语句是否正确无误? |
无 |
57 |
不重要 |
重载函数是否有二义性? |
无 |
58 |
重要 |
是否混淆了成员函数的重载、覆盖与隐藏? |
无 |
59 |
不重要 |
运算符的重载是否符合制定的编程规范? |
无 |
60 |
不重要 |
是否滥用内联函数?例如函数体内的代码比较长,函数体内出现循环。 |
无 |
工作记录表:
工作记录表
项目 |
预计 |
实际 |
设计时间 |
2h |
2h20m |
编码时间 |
2h |
1h30m |
测试时间 |
1h |
40m |
代码行数 |
250 |
195 |
测试代码行数 |
200 |
146 |
错误数量 |
6 |
7 |
错误修复时间 |
1h |
30m |
开发总时间 |
6h |
5h |
对驾驶员的评价:
刘佳玲同学的编码能力非常强,当拿到一个代码时会有一个清晰的思路,并且能够在很短的时间内写出一个实现小功能的函数,基本上在写完一段函数之后没有什么大的错误,但是也提出一点小小的建议,在函数名和变量名的命名规则上应该加以修改,这样就很完美了,在这次编程过程中,刘佳玲同学对出现的一些问题所提出的建议非常有效,很快就解决了问题。我也学到了很多东西。
3实验过程
通过这次结对编程,我真正体会到了结对编程的意义所在,编写代码的高效性很大程度的体现了出来,人总是有缺点的,两个人的合作将这个问题很好的避免了,结对编程不仅知识单纯的任务分配,对于两个人的协作也是很好的考验和锻炼,但对两个人的脾气秉性有很大的考验。
通过这次结对编程,对我的代码编写能力有了一定的提升,与队友之间的合作和默契也有很大的帮助,这次结对编程我是领航员,在编写代码之前我们对整个作业进行了讨论和分析,对编程的方向和思路有了一个大致的轮廓,确定了几个实现功能的函数和编写过程中可能遇到的困难,同学们帮助了我许多,然后就开始了编程,在编写代码的过程中,基本上没有遇到什么大的问题,有些问题在编写之前已经有了大致的解决思路和方法,所以整个编写过程很顺利,在进行代码测试是,有驾驶员的帮助和意见,省去了很多不必要的过程,节省了很多时间,对测试路径进行分析并完成单元测试,整个编码过程都在预计时间内完成。
本次的结对编程作业让我对于合作有了根深地感受,正所谓:“二人同心,其利断金!”合作的目的不仅仅是单纯的分工,而是两个人写作发挥出自己做大的能力,并且有助于两个人的成长,不知局限于写代码的能力,也提升了两个人的沟通能力,互相学习。