McCabe度量方法计算程序复杂度

 


 
 

McCabe度量方法计算程序复杂度

  McCabe 度量法是由 Thomas McCabe 提出的一种基于程序控制流的复杂性度量方法。McCabe 复杂性度量又称为环路度量,它认为程序的复杂性在很大程度上取决于控制的复杂性,单一的顺序程序结构最为简单,循环和选择构成的环路越多,程序就越复杂。这种方法以图论为工具,先画出程序图,然后用该图的环路数作为程序复杂性的度量值。程序图是退化的程序流程图,也就是说,把程序流程图中的每个处理符号都退化成一个结点,原来连接不同处理符号的流线变成连接不同点的有向弧,这样得到的有向图称为程序图,如下图所示。程序图仅描述程序内部的控制流程,完全不表现对数据的具体操作以及分支和循环的具体条件。
程序图
根据图论,在一个强连通的有向图 G 中,环的个数 V(G) 由以下公式给出:
V ( G ) = m − n + 2 p V(G) = m - n + 2p V(G)=mn+2p其中,V(G) 是有向图 G 中的环路数,m 是图 G 中弧的个数,n 是图 G 中的结点数,p 是图 G 中的强连通分量个数。在一个程序中,从程序图的入口点总能到达图中的任何一个结点,因此,程序总是连通的,但不是强连通的。为了使程序图成为强连通图,从图的入口点到出口点加一条用虚线表示的有向边,使图成为强连通图。 这样就可以使用上式计算环路复杂性了。
以上图为例,其中结点数 n = 6,弧数 m = 9,上图程序图的复杂性 p = 1,则有:
V ( G ) = m − n + 2 p = 9 − 6 + 2 = 5 V(G) = m - n + 2p = 9 - 6 + 2 = 5 V(G)=mn+2p=96+2=5即上图的 McCabe 环路复杂的度量值为 5。
  环路复杂性度量反映了程序(或模块)的控制结构的复杂性。McCabe 发现 V(G) = 10 是一个实际模块的上限。当模块的环路复杂度超过 10 时,要充分测试这个模块变得特别困难。

 
 
我在网上看到了三种计算环路复杂度的方法。
环形复杂度定量度量程序的逻辑复杂度。描绘程序控制流的流图之后,可以用下述3种方法中的任何一种来计算环形复杂度:
(1)流图中的区域数等于环形复杂度。
(2)流图G的环形复杂度 V(G) = E - N + 2,其中,E是流图中边的条数,N是结点数。
(3)流图G的环形复杂度 V(G) = P + 1,其中,P是流图中判定结点的数目。

看两个真题:
题目
(1)
1
左图复杂度:3;右图复杂度:5

(2)左图复杂度 8 - 7 + 2 = 3;右图复杂度 = 10 - 7 + 2 = 5
(3)左图:C、E => 2 + 1 = 3;右图:C、D、E、G => 4 + 1 = 5

 
 

 
 

 
 

 
 

题目举例


如下所示代码(用缩进表示程序块),要实现语句覆盖,至少需要()个测试用例。采用McCabe度量法计算该代码对应的程序流程图的环路复杂性为()。

问题一
  • A. 1
  • B. 2
  • C. 3
  • D. 4
问题二
  • A. 2
  • B. 1
  • C. 3
  • D. 4

【试题解析】∶本题考查环路复杂度和Mccabe度量计算的结合考查。
针对于伪代码而言,我们具体能够根据其关系判断,应该是将一组数据,按照从小到大的顺序进行排序的过程,实质是属于插入排序的算法。
首先对于第一个问题,要实现语句覆盖,至少需要多少个测试用例,我们只需要一组数据就能够得到不断重复排序后的输出结果。
对于第二个问题,计算环路复杂度,我们需要做个相关简图,如下图所示,可以根据环路公式V(G) =m-n+2也可以直接数闭环+1,得出其结果为3
l流程图
分析


采用McCabe度量法计算下图所示程序的环路复杂性为()。

  • A. 1
  • B. 2
  • C. 3
  • D. 4

【试题解析】∶环形复杂度V(G) = E - N + 2,其中,E 是流图中边的条数,N 是结点数。V(G) = E - N + 2 = 11 - 10 + 2 = 3。
分析


采用McCabe度量法计算下列程序图的环路复杂性为()。

  • A. 2
  • B. 3
  • C. 4
  • D. 5

【试题解析】∶McCabe 度量法先画出程序图,然后采用公式V(G) = m - n + 2 计算环路复杂度,其中 m 是有向弧的数量,n 是结点的数量。
本题结点数:8,边数:10。10 - 8 + 2 = 4。
分析


下图所示的程序流程图中有()条不同的简单路径。采用McCabe度量法计算该程序图的环路复杂性为()。

问题一
  • A. 3
  • B. 4
  • C. 5
  • D. 6
问题二
  • A. 3
  • B. 4
  • C. 5
  • D. 6

【试题解析】∶环形复杂度定量度量程序的逻辑复杂度。描绘程序控制流的流图之后,可以用下述 3 种方法中的任何一种来计算环形复杂度。
(1)流图中的区域数等于环形复杂度。
(2)流图 G 的环形复杂度 V(G) = E - N + 2,其中,E 是流图中边的条数,N 是结点数。
(3)流图 G 的环形复杂度 V(G) = P + 1,其中,P 是流图中判定结点的数目。
这种环路度量法,计算的思路是这样的:它是考虑控制的复杂程度,即条件选择的分支繁杂程度。
图中有 3 次简单的判断(循环体内物理的判断个数是 2 个,但是逻辑上,至少要走 3 次判断(第一个判断要做⑵次才能走到程序的出口。所以说图中有3次简单的判断。)。故 3 条简单路径,形成3块环形区域,区域复杂度为 3。
分析


采用McCabe度量法计算下列程序图的环路复杂性为()。

  • A. 2
  • B. 3
  • C. 4
  • D. 5

【试题解析】∶McCabe 度量法是通过定义环路复杂度,建立程序复杂性的度量,它基于一个程序模块的程序图中环路的个数。计算有向图 G 的环路复杂性的公式为:V(G) = m - n + 2,其中 V(G) 是有向图 G 中的环路个数,m 是 G 中的有向弧数,n 是 G 中的节点数。
图中 m 为 8,n 为 6,则 m - n + 2 = 4。
分析


软件的复杂性主要体现在程序的复杂性。()是度量软件复杂性的一个主要参数。若采用McCabe度量法计算环路复杂性,则对于下图所示的程序图,其环路复杂度为()。

问题一
  • A. 代码行数
  • B. 常量的数量
  • C. 变量的数量
  • D. 调用的库函数的数量
问题二
  • A. 2
  • B. 3
  • C. 4
  • D. 5

【试题解析】∶代码行数度量法以程序的总代码行数作为程序复杂性的度量值。
McCabe 度量法先画出程序图,然后采用公式 V(G) = m - n + 2计算环路复杂度,其中 m 是有向弧的数量,n 是结点的数量。在本题中,结点数为 9,弧为 11,所以环路复杂度为 11 - 9 + 2 = 4。
分析


采用McCabe度量法计算下图的环路复杂性为()。

  • A. 2
  • B. 3
  • C. 4
  • D. 5

【试题解析】∶本题考查环路复杂性的计算,是考试中常考的一个知识点。对于这类试题,我们可以采用边的条数-结点数+2这个公式来计算。在本题给出的图中,结点个数为6,而边的条数为8条(注意最上面的表和语句2过去的边是重合的,因此可视为同一条边),因此环路复杂性为4。
分析


采用McCabe度量法计算下列程序图的环路复杂性为()。

  • A. 2
  • B. 3
  • C. 4
  • D. 5

【试题解析】∶McCabe 度量法是一种基于程序控制流的复杂性度量方法。采用这种方法要先画出程序图,然后采用公式 V(G) = m - n + 2计算环路复杂度。其中,m 是图 G 中弧的个数,n 是图 G 中的结点数。本题图中结点数为 9,边数为 10,所以环路复杂度为 10 - 9 + 2 = 3。
分析


根据 McCabe 度量法,以下程序图的复杂性度量值为()。

  • A. 4
  • B. 5
  • C. 6
  • D. 7

【试题解析】∶常见的程序复杂性度量法主要有 McCabe 度量法和代码行度量法。其中 McCabe 度量法是一种基于程序控制流的复杂性度量方法。 McCabe 定义的程序复杂性度量值又称环路复杂度,它基于一个程序模块的程序图中环路的个数。计算有向图G的环路复杂性的公式:
V(G) = m - n + 2
其中,V(G) 是有向图 G 中的环路个数,m 是图 G 中有向弧个数,n 是图 G 中结点个数。在本题中 m 的值应该是 9,而 n 的值是 7。所以根据公式最后计算的结果为 4。
分析


某程序的程序图如下图所示,运用McCabe度量法对其进行度量,其环路复杂度是()。

  • A. 4
  • B. 5
  • C. 6
  • D. 8

【试题解析】∶McCabe 度量法是一种基于程序控制流的复杂性度量方法。采用这种方法先画出程序图,然后采用公式 V(G) = m - n + 2 计算环路复杂度。其中,m 是图 G 中弧的个数,n 是图 G 中的结点数。图中结点数为 7,边数为 11,所以环路复杂度为 11 - 7 + 2 = 6。
分析

猜你喜欢

转载自blog.csdn.net/qq_43448856/article/details/123520356
今日推荐