软件测评师(中级)|画控制流图手把手教程
1.控制流图概念
控制流图(Control Flow Graph, CFG)也叫控制流程图,是一个过程或程序的抽象表现,是用在编译器中的一个抽象数据结构,由编译器在内部维护,代表了一个程序执行过程中会遍历到的所有路径。它用图的形式表示一个过程内所有基本块执行的可能流向, 也能反映一个过程的实时执行过程
个人理解:代码中所有可行路径构成的有向控制流绘制的图
2.控制流图组成
2.1.控制节点:圆圈/圆圈+节点序号
2.2.控制流线:有向箭头
3.控制流圈复杂度计算的三种方式
3.1.画出控制流图后,通过控制流线和控制节点计算:
V(G)=m-n+2 -- m为控制流线的条数 -- n为控制流节点
3.2.通过控制流图中的密封区域计算:
V(G)=A+1
-- A为密封的区域个数,1为未密封的外部区域
3.3.通过判定点的个数来计算:
V(G)=P+1
-- P为判定节点的个数
4.常见的控制流图
5.真题详解
5.1条件判断知识补充
考试一般考察对以上几种基础语句的组合构图,经常涉及到多种条件判断,同时也掌握对c语言基础知识的掌握程度。
5.1.1语句中常用到的判定符号
关系运算符
大于:>、大于等于:>=、等于:==、小于:<、小于等于:<=、不等于:!=
逻辑运算符
C语言中提供了三种逻辑运算符,分别是逻辑与(&&)、逻辑或(||)和逻辑非(!)。这些运算符在C语言中的使用情况和优先级如下:
- 逻辑与(&&):当两个条件都为真时,整个表达式才为真。如果第一个条件为假,则整个表达式的结果已经确定为假,此时不会计算第二个条件。
- 逻辑或(||):当两个条件中至少有一个为真时,整个表达式就为真。只有当两个条件都为假时,整个表达式才为假。
- 逻辑非(!):这个运算符将一个条件的结果取反。如果条件为真,则结果为假;如果条件为假,则结果为真
相关关键字
continue语句
在C语言中用于跳过当前循环中剩余的代码,直接进入下一次循环的判断条件。它的使用可以减少不必要的计算或操作,提高程序的效率。continue语句通常与for、while和do-while循环结构一起使用,可以在循环中的任何位置使用。在使用continue时,需要注意循环的条件和循环变量的更新,以避免出现死循环或逻辑错误。
for (int i = 0; i < 10; i++) { if (i == 7) { continue; // 当i等于7时,跳过本次循环 } printf("%d ", i); // i==7的时候,不打印7 } // 输出结果:0 1 2 3 4 5 6 8 9
中断语句break关键字
是C语言中的关键字,用于跳出循环或switch语句的执行。break语句通常用于在满足某个条件时提前终止循环,或在switch语句中匹配到某个case后跳出。
for (int i = 0; i < 5; i++) { if (i==3) { break; // 跳出循环 } printf("%d",i); } //循环外 printf("循环结束"); //输出结果:0 1 2 循环结束
switch (条件) { case 1: // 相应的代码 break; // 跳出switch语句 case 2: // 相应的代码 break; // 跳出switch语句 default: // 相应的代码 }
return关键字
在c语言中用于将函数的执行结果返回给调用函数,并终止当前函数的执行
```void peintpassage() { printf("使用return\n"); return; printf("本条语句不会被执行哦\n");
5.2真题画控制流图
2010年真题下午卷
【问题1答案】程序中的逻辑判断子语句如下:
i<=k
m%i==0
i>=k+1
【问题2答案】 白盒测试用例设计方法:判定覆盖法又称为逻辑覆盖,是通过对程序逻辑结构的遍历实现程序的覆盖
【问题3答案】
控制流程图:(条件是为了便于理解,正式作图的时候不需要标)
环路复杂度V(G)=控制流线-节点+2=8-6+2=4
环路复杂度V(G)=密封区域+1=3+1=4
环路复杂度V(G)=判定节点数+1 =3+1=4 /通过代码看判断条件
注:环路复杂度任选一种答题即可
总结
- 根据控制流图计算复杂度,如果没有代码,只有控制流图的情况下,尽可能使用【控制流线-节点+2】的方式计算V(G),这种情况一般会出现在选择题中,如果有代码没有图,可以使用【判定点+1】的方式计算V(G)
- 画控制流图正确与否可以通过计算3种复杂度计算结果相同来校验图是否画正确
- 本题的代码中没有给定具体的节点,那么我们可以根据判定节点画图,重点必须包含本题代码的所有判定节点路径
2011年真题下午卷
【问题1答案】
【问题2答案】
解析:本题给出了画控制流图的节点数,具体可见代码中//数字,本题代码中给出了节点数为12个,这种题给了节点,那么我们做图的时候节点中需要有数字标明是几号节点
图不需要跟标准答案一致,只要保证节点和控制流线链接正确即可
或者
复杂度V(G)=6
总结
画图技巧:分析每个判定节点可能执行的路径(为真的路径、为假的路径)有哪些,只要每个节点可能执行的路径全部分析正确,控制流图就掌握了80%,另外20%,细心一定要细心,不要把线连错啦;不要把各条件的括号看错,不要画线不带箭头,导致失分(这些都是我画图的时候出现的错误)
画图尽可能保证当前节点画完,在接着画下一个节点,这样不容易出错;另外画完后记得多检查下
【问题3答案】
构造一个6个字符构成的字符串(设置x,y,z,u,v,w6个字符),使得每个字符覆盖一条基本路径。其中,x='r', y='f', z∈['0','9'], u<'0', v>'9'并且v!='f',w为任意,这6个字符可以任意排列。例如:mode="r0faa"
参考文档
https://blog.csdn.net/weixin_64021180/article/details/133999576
https://blog.csdn.net/qq_44654974/article/details/106179849
https://blog.csdn.net/weixin_41162823/article/details/103385017