2.1实验过程
2.1.1实验代码
(1)博客园地址:
(2)github源代码:https://github.com/Caroliu96/Four-Arithmetic-Operation-.git
(3)博客园截图
2.1.2实验过程
(1) 本人角色:领航员
(2)
驾驶员:系统的实现过程、算法设计、结对工作照片
1.系统的实现过程
本实验要求完成小学四则运算自动生成程序,随机数的获取和答案的输出较为交单,重点主要聚焦于运算方式的选择种类。因此,主要采取分治法将大问题分步处理,寄将运算方式分类处理,分为简单运算和混合运算两类,其中简单运算又分为整数和小数,混合运算在此基础上又分为有括号和无括号,进而把运算方式分解为具体的几个小问题来处理。
2.算法设计
(1)封装随机取数的函数
(2)封装输出答案的函数
(3)封装不同取数类型对应的不同运算方式的函数(小数+整数)
在对运算方式的分类过程中,我们按照如上这些小步骤分布封装小函数来实现功能,将这些算法写成了独立函数,通过主函数调用,这样就大大精简了主函数的操作,提高了代码可读性。
领航员:代码测试覆盖标准、测试用例、代码检查表、工作记录表等。
- 代码测试覆盖标准
使用语句覆盖标准,测试用例如下:
① 10 1 100 1 1 1 1
② 10 2 100 2 2 2 2
③ 10 3 100 1 1 1 1
④ 10 4 100 1 1 1 1
⑤ 10 5 100 1 1 1 1
- 工作记录
表1.1工作记录表
项目 |
预计 |
实际 |
设计时间 |
1h |
1h |
编码时间 |
2h |
3h |
测试时间 |
2h |
3h |
代码行数 |
300 |
300 |
测试代码行数 |
290 |
290 |
错误数量 |
1 |
1 |
错误修复时间 |
2022/11/12 |
2022/11/12 |
开发总时间 |
5h |
8h |
- 代码检查表
程序的版式 |
||
重要性 |
审查项 |
结论 |
|
空行是否得体? |
Y |
|
代码行内的空格是否得体? |
Y |
|
长行拆分是否得体? |
Y |
|
“{” 和 “}” 是否各占一行并且对齐于同一列? |
Y |
重要 |
一行代码是否只做一件事?如只定义一个变量,只写一条语句。 |
Y |
重要 |
If、for、while、do等语句自占一行,不论执行语句多少都要加 “{}”。 |
Y |
重要 |
在定义变量(或参数)时,是否将修饰符 * 和 & 紧靠变量名?注释是否清晰并且必要? |
Y |
重要 |
注释是否有错误或者可能导致误解? |
N |
重要 |
类结构的public, protected, private顺序是否在所有的程序中保持一致? |
N |
|
|
|
命名规则 |
||
重要性 |
审查项 |
结论 |
重要 |
命名规则是否与所采用的操作系统或开发工具的风格保持一致? |
Y |
|
标识符是否直观且可以拼读? |
N |
|
标识符的长度应当符合“min-length && max-information”原则? |
N |
重要 |
程序中是否出现相同的局部变量和全部变量? |
Y |
|
类名、函数名、变量和参数、常量的书写格式是否遵循一定的规则? |
N |
|
静态变量、全局变量、类的成员变量是否加前缀? |
N |
|
|
|
表达式与基本语句 |
||
重要性 |
审查项 |
结论 |
重要 |
如果代码行中的运算符比较多,是否已经用括号清楚地确定表达式的操作顺序? |
Y |
|
是否编写太复杂或者多用途的复合表达式? |
N |
重要 |
是否将复合表达式与“真正的数学表达式”混淆? |
N |
重要 |
是否用隐含错误的方式写if语句? 例如 |
|
|
(1)将布尔变量直接与TRUE、FALSE或者1、0进行比较。 |
N |
|
(2)将浮点变量用“==”或“!=”与任何数字比较。 |
N |
|
(3)将指针变量用“==”或“!=”与NULL比较。 |
N |
|
如果循环体内存在逻辑判断,并且循环次数很大,是否已经将逻辑判 |
|
|
断移到循环体的外面? |
Y |
重要 |
Case语句的结尾是否忘了加break? |
N |
重要 |
是否忘记写switch的default分支? |
N |
重要 |
使用goto 语句时是否留下隐患? 例如跳过了某些对象的构造、变量的初始化、重要的计算等。 |
N |
|
|
|
常量 |
||
重要性 |
审查项 |
结论 |
|
是否使用含义直观的常量来表示那些将在程序中多次出现的数字或字符串? |
N |
|
在C++ 程序中,是否用const常量取代宏常量? |
N |
重要 |
如果某一常量与其它常量密切相关,是否在定义中包含了这种关系? |
N |
|
是否误解了类中的const数据成员?因为const数据成员只在某个对象 |
N |
|
生存期内是常量,而对于整个类而言却是可变的。 |
N |
|
|
|
函数设计 |
||
重要性 |
审查项 |
结论 |
|
参数的书写是否完整?不要贪图省事只写参数的类型而省略参数名字。 |
Y |
|
参数命名、顺序是否合理? |
Y |
|
参数的个数是否太多? |
N |
|
是否使用类型和数目不确定的参数? |
Y |
|
是否省略了函数返回值的类型? |
N |
|
函数名字与返回值类型在语义上是否冲突? |
N |
重要 |
是否将正常值和错误标志混在一起返回?正常值应当用输出参数获得,而错误标志用return语句返回。 |
N |
重要 |
在函数体的“入口处”,是否用assert对参数的有效性进行检查? |
N |
重要 |
使用滥用了assert? 例如混淆非法情况与错误情况,后者是必然存在的并且是一定要作出处理的。 |
N |
重要 |
return语句是否返回指向“栈内存”的“指针”或者“引用”? |
N |
|
是否使用const提高函数的健壮性?const可以强制保护函数的参数、返回值,甚至函数的定义体。“Use const whenever you need” |
N |
3 总结与体会
此次作业我担任的是领航员的角色。这次作业让我更加深刻地认识到,“驾驶员”是在“行驶”过程中必不可少的,但一个人精力有限。所以“领航员”也是十分重要的,他可以协助“驾驶员”找到更好的路径,及时改正错误的路线,高效率的到达“目的地”。
我们在确定选择的题目后,就确定思路,包括可能需要哪些功能函数,整体的结构等。
项目难点主要如下:随机数的生成,随即符号的穿插,括号匹配的检测、随机算式答案的计算以及界面的生成。随机数的生成采用当前时间对(数值最大-数值最小)取余再加最小数值;在随机符号穿插方面我们同样采取与随机数相似的办法,即将符号存入数组中,而随机插入的符号以数组下标来决定;对于括号匹配检测,采取逆波兰式进行括号匹配检测;对于答案的计算则是通过直接读取文件里的字符串转化成数值再进行计算;
完成后程序依然有些许不足:1. 没能用图形界面显示出来。2. 程序的部分功能可以更加完善,考虑的问题的方面不全面。
我们两人配合默契,在作业的完成的过程比较愉快。在过程中,我们两个可以互相学习,巩固我的编程知识。除此之外,此次编程作业也让我对问题思考得更加全面,要对各种可能性进行考虑,不断的完善代码。
这次任务有收获也有教训,专注才能高效率高质量的完成一件事,三心二意只会得不偿失。
标签:语句,结对,重要,函数,是否,代码,编程,实验,参数 From: https://www.cnblogs.com/Buoyant-1011/p/16885756.html