McCabe度量法

概念

McCabe 度量法,也被称为循环复杂度(Cyclomatic Complexity),是由 Thomas J. McCabe, Sr. 在 1976 年提出的一种软件程序复杂度的量度方法。循环复杂度是一种量化代码复杂度的方式,主要用于衡量一个程序单元(如函数、方法、模块等)的复杂度。它通过测量程序中线性独立路径的数量来实现,这个数量由程序的控制流图中的边、节点和连通分量决定。

McCabe复杂性度量又称环路度量,其计算公式为:V(G)= m-n+2或V(G)= 闭合区域+1 ,其中m和n分别代表图中的边数顶点数

(2009年上半年软件设计师上午试卷32题)McCabe度量法是通过定义环路复杂度,建立程序复杂性的度量,它基于一个程序模块的程序图中环路的个数。下图所示程序图的程序复杂度是()。

555e1f2f3fa24a43b3c12c9f6c37c764.png

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

有向弧数:8
节点数:7
V(G)= 有向弧数-节点数+2 = 3
闭合区域:2
V(G)= 闭合区域+1 = 3

(2009年下半年软件设计师上午试卷32题)某程序的程序图如下所示,运用McCabe度量法对其进行度量,其环路复杂度是()

3633997781cd5330637a9ebd8a13d5ff.jpeg
A.2   B.3   C.4   D.5

有向弧数:10
节点数:7
V(G)= 有向弧数-节点数+2 = 5
闭合区域:4
V(G)= 闭合区域+1 = 5

(2010年上半年软件设计师上午试卷36题)某程序的程序图如下图所示,运用McCabe度量法对其进行度量,其环路复杂度是()

1f3b21088a8d6f49f3849f8da4a33323.png
A.4   B.5   C.6   D.8

有向弧数:11
节点数:7
V(G) = 有向弧数-节点数+2 = 6
封闭区域 = 5
V(G) = 闭合区域+1 = 6

(2010年下半年软件设计师上午试卷32题)McCabe度量法,以下程序图的复杂性度量值为()。

4ebdc6d1eb51140a1810d485cd35ed8d.jpeg
A.4   B.5   C.6   D.7

有向弧数:9
节点数:7
V(G) = 有向弧数-节点数+2 = 4
封闭区域:3
V(G)= 封闭区域+1 = 4

(2012年上半年软件设计师上午试卷33题)采用McCabe度量法计算下列程序图的环路复杂性为()。
2fedf663af64f46168bfa61fe8229489.jpeg
A.2   B.3   C.4   D.5

有向弧数:10
节点数:9
V(G) = 有向弧数-节点数+2 = 3
封闭区域:2
V(G) = 封闭区域+1 = 3

 

(2012年下半年软件设计师上午试卷31题)采用McCabe度量法计算下图的环路复杂件为()。
e57b6b4f3669df27d8404acd9e74ad8e.png
A.2   B.3   C.4   D.5

有向弧数:12
节点数:10
V(G) = 有向弧数-节点数+2 = 4
封闭区域:3
V(G) = 封闭区间+1 = 4

(2013年上半年软件设计师上午试卷31题)若采用McCabe度量法计算环路复杂性,则对于下图所示的程序图,其环路复杂度为()。

5cdc898011434d359d43f33fef51dd5d.png

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

有向弧数:11
节点数:9
V(G) = 有向弧数-节点数+2 = 4
封闭区域:3
V(G) = 封闭区域+1 = 4

(2014年上半年软件设计师上午试卷32题) 采用McCabe度量法计算下列程序图的环路复杂性为()。

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

422488c30713449a9f0f5fe1e1d2be0f.png

有向弧数:12
节点数:10
V(G) = 有向弧数-节点数+2 = 4
封闭区域:3
V(G) = 封闭区域+1 = 4

(2014年下半年软件设计师上午试卷35题) 采用McCabe度量法计算该程序图的环路复杂性为()。

A.3   B.4   C.5   D.6

e79ca4e782534cd2937afe93b0464189.png

有向弧数:12
节点数:11
V(G) = 有向弧数-节点数+2 = 3
封闭区域:2
V(G) = 封闭区域+1 = 3

(2015年上半年软件设计师上午试卷35题) 采用McCabe度量法计算下列程序图的环路复杂性为()。

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

9ce6945218d748f3a6d0cfbd2976b1a5.png

有向弧数:10
节点数:8
V(G) = 有向弧数-节点数+2 = 4
封闭区域:3
V(G) = 封闭区域+1 = 4

(2015年下半年软件设计师上午试卷36题) 采用McCabe度量法算出该程序的环路复杂性为()。
ef0989888fe5eba430b35d3cf50dce64.png

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

画图
有向弧数:10
节点数:8
V(G) = 有向弧数-节点数+2 = 4
封闭区域:3
V(G) = 封闭区域+1 = 4

(2016年上半年软件设计师上午试卷36题) 采用McCabe度量法计算下图所示程序的环路复杂性为()。
6c66f642fdcd29fa1c9881f4121c29db.jpeg
A.1   B.2   C.3   D.4

有向弧数:11
节点数:10
V(G) = 有向弧数-节点数+2 = 3
封闭区域:2
V(G) = 封闭区域+1 = 3

(2017年上半年软件设计师上午试卷36题)对下图所示的程序流程图采用 McCabe 度量法计算其环路复杂度为()。

f85f519cb5ff44c9885fcc4b453a522b.png

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

补充有向弧和节点

955186f80aca41bcafb8603662cc24e2.png

有向弧数:16
节点数:14
V(G) = 有向弧数-节点数+2 = 4
封闭区域:3
V(G) = 封闭区域+1 = 4

(2018年上半年软件设计师上午试卷35题)对下图所示的程序流程图采用McCabe度量法计算器环路复杂度为()。
6c9a7b9ac51d131b0e7c5672286b3744.jpeg
A.2   B.3   C.4  D.5

补充有向弧和节点
7bd0cd4e53e3cc37b8f0b2f77e91ba8a.png
有向弧数:13
节点数:12
V(G) = 有向弧数-节点数+2 = 3
封闭区域:2
V(G) = 封闭区域+1 = 3

(2018年下半年软件设计师上午试卷35题)对以下的程序伪代码(用缩进表示程序块)采用McCabe度量法计算其环路复杂度为()。
73a8572162f5bb695bbd1d9543cba1ae.jpeg
A.2  B.3   C.4   D.5
画图

30b282d930594c3a9ec113d09ca2f3ee.png

补充有向弧和节点
14255fa1ec8c41e74c578e633755aa2e.png
有向弧数:20
节点数:18
V(G) = 有向弧数-节点数+2 = 4
封闭区域:3
V(G) = 封闭区域+1 = 4

(2016年上半年试题)对下图所示流程图采用白盒测试方法进行测试,若要满足路径覆盖,则至少需要___个测试用例。采用McCabe度量法计算该程序对环路复杂性为___

47ec3d33de894229a5bae12496bb98b6.png

路径覆盖是指设计若干个测试用例,覆盖程序中的所有路径。
上图中一共有6条路径:12345678,1234568,1235678,123568,12678,1268。
根据McCabe度量法环路复杂性公式V(g)=m-n+2,图中m=10,n=8,V(g)=10-8+2=4。
那么答案应是:6个用例,环路复杂度为4。

 

(2015年上半年试题)若采用白盒测试方法测试以下代码,并满足条件覆盖,则至少需要___个测试用例。采用McCabe度量法算出该程序的环路复杂性为___。

int find_max(int i, int j, int k){
    int max;
    if(i > j) {
        if(i > k){
           max = i;
        } else {
           max = k;
        }
    } else {
        if(j > k) {
            max = j;
        } else {
            max = k;
        }
    }
    return max;
}

bf2de35af6c44d4fb24acd94dc5512dc.png

 要满足条件覆盖,要求三个判断框的Y和N至少要经过一次,即:1Y2Y,1Y2N,1N3Y,1N3N,至少需要4个测试用例。
根据McCabe度量法环路复杂性公式V(g)=m-n+2,图中m=9,n=7, V(g)=9-7+2=4。
那么答案应是:4个用例,环路复杂度为4。

 

McCabe 循环复杂度的主要用途是什么?
A. 预测程序的执行时间
B. 衡量程序的性能
C. 预测程序的维护难度
D. 计算程序的物理行数

循环复杂度 V(G) = E - N + 2P 中的 P 代表什么?
A. 程序中的过程数量
B. 程序控制流图中的节点数量
C. 程序控制流图中的连通分量数量
D. 程序控制流图中的边的数量

如何通过循环复杂度来指导测试?
A. 确保每个函数至少被执行一次
B. 确保测试覆盖所有可能的路径
C. 测试所有的全局变量
D. 仅测试最复杂的功能

如果一个函数的循环复杂度非常高,我们应该怎么做?
A. 增加更多的测试用例
B. 忽略,因为复杂度不影响性能
C. 重构函数,减少复杂度
D. 增加函数的注释量

循环复杂度对于代码重构的意义是什么?
A. 指导代码的优化方向
B. 减少代码的物理行数
C. 提高程序的运行速度
D. 增加代码的复用率

在控制流图中,一个循环结构通常会如何影响循环复杂度?
A. 不会影响复杂度
B. 降低复杂度
C. 增加复杂度
D. 复杂度取决于循环的类型

答案及讲解
C. 预测程序的维护难度。循环复杂度直接关联到代码的理解和维护难度,而不是执行时间或性能。
C. 程序控制流图中的连通分量数量。P 代表的是连通分量的数量,这在大多数情况下等于 1。
B. 确保测试覆盖所有可能的路径。循环复杂度的数值可以帮助确保测试能够覆盖到代码中的每一个独立路径。
C. 重构函数,减少复杂度。当函数的循环复杂度过高时,应该通过重构来降低其复杂度,以提高代码的可读性和可维护性。
A. 指导代码的优化方向。通过减少循环复杂度,可以指导开发者对代码进行优化,使其更容易理解和维护。
C. 增加复杂度。循环结构会增加程序的路径数量,从而增加循环复杂度。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛定谔的猫1981

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值