软件测评师(中级)|画控制流图手把手教程

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

 

posted @ 2024-04-03 16:17  小墨儿  阅读(3964)  评论(4编辑  收藏  举报