实验目的
1. 了解模块过程分析方法
2. 掌握程序流图绘制方法
3. 了解程序流程图绘制工具的使用
4. 掌握程序流图及其绘制方法
实验内容
(一)实验内容
请选择附件中给出的C++程序源代码或者Java程序源代码(两个文件选一个,其中java需在isLeap或isValid选一和在incDays或decDays选一),根据下列要求完成实验内容:
1. 绘制程序流程图:分析程序的模块(以函数为单位),并使用Visio等工具完成该程序的程序流程图。
2. 绘制程序流图:根据程序流程图,绘制程序流图(见第5章ppt)。
3. 计算程序流图的环形复杂度。
注意程序流程图与程序流图的差异:(1)合并连续的无分支节点(2)分解条件表达式。
(二)要求:
1. 请按要求完成上述实验内容,在实验报告中要详细描述实验的各个步骤,图文并茂。
2. 请大家按照指定的软件工程实验报告模板,高质量的完成实验报告内容。
实验分析及过程
1.分析附件中给出的C++程序源代码
这段C++代码的主要思路是计算给定整数的阶乘。
用户输入: 获取用户输入的整数,限制在0到1000之间。
结果数组初始化: 创建一个用于存储计算结果的数组,初始化为全零。
初始值设置: 将结果数组的第一个元素设置为1,作为初始值。
阶乘计算: 使用嵌套循环,外循环控制乘法操作的次数,内循环执行每个元素与新数字的相乘。
处理进位: 在每次乘法后,检查数组元素是否大于等于10,若是,则将进位加到高位。
打印结果: 从数组的最高位开始,逆序打印计算结果。
核心算法:
从最高位开始往后推算,如果满10,就向后进位
2.使用Visio等工具完成该程序的程序流程图
3.绘制数据流图。
4. 计算流图的环形复杂度。
环形复杂度可定量度量程序的逻辑复杂性。
利用流图计算环形复杂度的方法 :
流图中的区域数等于环形复杂度V(G)=6。
流图G的环形复杂度V(G)=E – N + 2=22-18+2=6,其中E是流图中边的条数,N是流图中的节点数。
流图G的环形复杂度V(G)= P + 1=5+1=6,其中P流图中判定节点的数目。
5.设计一些测试用例(程序输入),使得所有程序块都至少被执行一次
程序输入一:1(正确)
程序输入二:0(正确)
程序输入三:8(错误)(正确答案应为40320)。
程序输入四:10(错误)(正确答案应为3628800)
程序输入五:7(错误)(正确答案应为5040)
经测试发现,仅0,1,2,3,4的阶乘计算结果正确。
6.执行这些测试用例,并分析语句覆盖率
显然除了以下代码段,其他语句均无判断分支,覆盖率均为100%。
所以仅对于以下语句进行语句覆盖率测试。
测试代码如下:
理论运行次数为num*STORE_SIZE,实际运行次数为cnt
因此语句覆盖率为cnt / num / STORE_SIZE
通过自动化测试进行1-1000的语句覆盖率测试:
可以看到,随着num的增大,语句覆盖率也在随之增大
如下图所示
实验结论
通过本次实验了解模块过程分析方法,掌握了程序流图绘制方法。
了解了程序流程图绘制工具的使用,掌握了基于图覆盖的测试方法。
(by 归忆)