软件工程第四次作业
博客信息 | 沈阳航空航天大学计算机学院2020软件工程作业 |
---|---|
作业要求 | https://edu.cnblogs.com/campus/sau/Computer1701-1705/homework/10685 |
课程目标 | 熟悉一个“高质量”软件的开发过程 |
作业目标 | 结对编程练习 |
一:题目要求
我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:
·能够自动生成四则运算练习题
·可以定制题目数量
·用户可以选择运算符
·用户设置最大数(如十以内、百以内等)
·用户选择是否有括号、是否有小数
·用户选择输出方式(如输出到文件、打印机等)
·最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)
二:结对编程成员及分配
驾驶员:崔宏斌,编写代码对队友做出评价
领航员:李军辉,辅助驾驶员完成代码,对同伴做出评价,设计单元测试用例及代码审查
三:代码审查及运行结果
1.代码审查
序号 | 重要性 | 审查项 | 结论(是代表符合规范,否代表不符合规范,无代表代码不涉及该项内容) |
---|---|---|---|
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 | 不重要 | 是否滥用内联函数?例如函数体内的代码比较长,函数体内出现循环。 | 无 |
2.代码运行结果
四:单元测试
1.单元测试代码
void TestMethod1()
{
int exam_num=6;
int brac_sum=2;
int i=1;
if(exam_num==6)
{
if(brac_sum==2)
{
int temp=i;
i--;
}
int max_num=10;
int is_brac=1;
int is_deci=1;
int t=0;
int chioce=1;
int judge=0;
char output[6]=gen_exam();
Assert::AreEqual(standard, output);
};
2.运行结果
3.单元测试结果
五:工作记录表
项目 | 预计 | 实际 |
---|---|---|
设计时间 | 2h | 1h20m |
编码时间 | 2h | 5h30m |
测试时间 | 1h | 5h |
代码行数 | 200 | 169 |
测试代码行数 | 100 | 83 |
错误数量 | 5 | 1 |
错误修复时间 | 1h | 30m |
开发总时间 | 5h | 12h |
六:合作记录
七:总结
1.对驾驶员的评价
崔宏斌同学的编写代码能力非常优秀,有着清晰的思路,并且能够在很短的时间内写出一个实现小功能的函数,基本上在写完一段函数之后没有错误,阅读起来也十分容易,这份严谨的学习工作态度让我钦佩。阅读他的代码,我也学到了不同的思路和编程技巧,对我起到了很大帮助。
2.总结
通过这次结对编程,我享受到了结对编程的好处,编写代码和学习代码的高效性得到了体现,一个人动手开头难,两个人的合作对两个人都是一种提升,结对编程不仅知识单纯的任务分配,对于两个人的协作也是很好的考验和锻炼。
通过这次结对编程,对我的代码编写能力有了一定的提升,与队友之间的合作和默契也有很大的帮助,这次结对编程我是领航员,在编写代码之前我们对整个作业进行了讨论和分析,对编程的方向和思路有了一个大致的轮廓,确定了几个实现功能的函数和编写过程中可能遇到的困难,然后就开始了编程,在编写代码的过程中,基本上没有遇到什么大的问题,有些问题在编写之前已经有了大致的解决思路和方法,所以整个编写过程很顺利,在进行代码测试是,有驾驶员的帮助和意见,省去了很多不必要的过程,节省了很多时间,对测试路径进行分析并完成单元测试,整个编码成功完成。
本次的结对编程作业让我们两人都成长进步,学会如何共同工作,交流相互帮助,以后再遇到难题,可以凭借学到的方法和经验再次合作,不再害怕挑战,结对编程也让我们有了责任感,相互督促,共同进步。问题得到了解决,但对我而言最大的收获就是学会了合作。