目录
一、考点:基于控制流的设计用例
阅读下列C程序,回答问题1至问题3,将解答填入答题纸的对应栏内。
能被400整除,或者能被4整除但不能被100整除的都是闰年,其余的年份均为平年。
![](https://i-blog.csdnimg.cn/blog_migrate/5c1c95b0c7c58b4d9ac3c4979683ae90.png)
【问题1】
请针对上述C程序给出满足100%DC(判定覆盖)所需的逻辑条件。(6分)
PS:100%DC(判定覆盖)意味着所有判定结果的真假都要被测试用例覆盖。解题思路:(1)找出所有判定;(2)使得每个判定条件的每个结果(真和假)在程序中都被覆盖到。
答:
![](https://i-blog.csdnimg.cn/blog_migrate/25067d55353e59091d482460ac217e64.png)
【问题2】
请画出上述程序的控制流图,并计算其环路复杂度V(g)。(9分)
![](https://i-blog.csdnimg.cn/blog_migrate/e6ee524aa10f54aa2f093338a7291097.png)
V(g)=10+1=11
28-19+2
二、控制流程图绘制注意事项
1、复合条件表达式要拆成嵌套的单条件结构;
-
“ 与(&&) ”是在为真的条件中嵌套第二个条件;
-
“ 或(||) ”是在为假的条件中嵌套第二个条件;
-
如下图所示
![](https://i-blog.csdnimg.cn/blog_migrate/82f8c9f769a74c400387cc1bac56b678.png)
2、建议先绘制逻辑与为真的情况、逻辑或为假的情况
3、控制流图一定是起于一个节结点终于一个节点的
4、汇聚结点
-
当一段程序代码在执行的过程中没有共同执行的部分,就需要在程序的控制流图后加一个汇聚结点(一个空圈圈);
-
例如程序控制流在分叉之后直接结束了,没有这两个分叉共同执行的后续代码,就需要加一个空圈圈作为汇聚结点( 分叉之后没有闭合就需要加一个汇聚结点);
-
当控制流分叉之后还有分叉(if...else...语句后还有并行的if...else...语句),控制流图中不需要汇聚结点,直接将上一个分叉的控制流连到下一个分叉的控制流即可。
三、McCabe圈复杂度计算方法
推荐使用第三种
-
V(g)=边的数量-结点数量+2;
-
V(g)=判断节点数+1
-
V(g)=封闭区域数+1
![](https://i-blog.csdnimg.cn/blog_migrate/3ddb2aa638e901ec88d818371417c4a3.png)