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

软考软件设计师McCabe环路复杂度,09年的两个题,为什么不一样?—from 百度知道

为什么上半年的答案是8-7+2=3 弧数为8,节点为7,没问题;
下半年的却是9-7+2=4 下半年的弧为什么不是10呢 ?谢谢!

这里写图片描述
这个啊,我也困惑了好久,后来找资料看了下,计算方法其实有3种:
环形复杂度定量度量程序的逻辑复杂度。描绘程序控制流的流图之后,可以用下述3种方法中的任何一种来计算环形复杂度。
(1)流图中的区域数等于环形复杂度。
(2)流图G的环形复杂度V(G)=E-N+2,其中,E是流图中边的条数,N是结点数。
(3)流图G的环形复杂度V(G)=P+1,其中,P是流图中判定结点的数目。
自己是这样理解的:
这种环路度量法,计算的思路是这样的:它是考虑控制的复杂程度,即条件选择的分支繁杂程度。
这个可能比较抽象,还是用例题来说吧。看图:
这里写图片描述
分别用三种方法来计算2道题
第一题图到了c开始条件判断形成分支D,E;E这里又按条件来判断是否继续到F还是按一个自环做循环然后再到F,然后再回到B
(1)流图中的区域数等于环形复杂度。
注意区域块可以看作是按不同条件形成的数据操作分支块,比如橙色块就可以看做满足Z < t那条分支(下面那个图还要满足cond==true)处理的数据操作块,注意了,下面那个图G节点不是有个自环的循环吗?为什么那个循环不自成一块,而节点E的自环就要自成一块呢?你要这样理解:下图的G点不错是有自环,但是这个自环按MCCABE的理解对整个系统的复杂度没影响,其实就是没有形成分支,即数据到了G节点都要做循环,也就是说下图的G节点搞个自环是来干扰大家的,完全可以把它简化成上面图的G点。而E节点的自环注意有个条件P<=5,也就是说这个自环是条件判断的结果,也就是说对复杂度有影响所以不能忽略,假如这里把条件P<=5去掉,也就是说到了E节点先不管三七二十一先来做个循环再去判断然后再去到F的话那E点的自环也应该忽略。
所以按区域划分:上图3块,下图4块。复杂度分别是:3,4
(2)流图G的环形复杂度V(G)=E-N+2,其中,E是流图中边的条数,N是结点数。
有了前面的分析,现在就好做了:
上图:8-7+2=3
下图:9-7+2=4(注意E不是10,因为G节点的自环弧线要忽略掉
(3)流图G的环形复杂度V(G)=P+1,其中,P是流图中判定结点的数目。
判断节点:
上图:C,E,2个点,复杂度2+1=3
下图:CED,3个点,复杂度3+1=4

McCabe度量方法计算程序复杂度—from csdn博客

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

### 如何根据流通图计算 McCabe 环路复杂度 McCabe 度量法,也称为环路复杂性度量,是一种基于程序控制流的复杂性度量方法。为了理解如何通过流通图来计算 McCabe 环路复杂度 V(G),需要先了解几个基本概念。 #### 流通图定义 流通图 (Control Flow Graph, CFG) 是一种表示程序执行路径的数据结构。它由节点和边组成,其中每个节点代表一个基本块(即一系列顺序执行的语句),每条边则表示从一个基本块到另一个基本块可能存在的转移关系[^1]。 #### 计算公式 对于给定的一个程序流程图 G ,其 McCabe 的环路复杂度 V(G) 可以按照如下方式计算: \[ V(G)=E-N+2P \] 这里, - \( E \) 表示流通图中的边数; - \( N \) 表示流通图中的结点数目; - \( P \) 则指代连通分量的数量,在大多数情况下特别是单入口单出口的情况下,\( P=1 \)。 另一种更直观的理解是将环路复杂度视为独立路径数量加一。所谓独立路径是指除了起点终点外至少存在一条不同的边或顶点的新路径。因此也可以简单地认为:每当遇到条件分支时就增加了一个额外的选择机会从而增加了复杂程度。 下面给出一段简单的 Python 伪代码用于展示如何构建并分析这样的图形: ```python def calculate_mccabe_complexity(cfg_edges, cfg_nodes): """ Calculate the McCabe cyclomatic complexity of a given control flow graph. :param cfg_edges: Number of edges in the Control Flow Graph :param cfg_nodes: Number of nodes in the Control Flow Graph :return: Cyclomatic Complexity Value """ p = 1 # Assuming single entry and exit point mccabe_value = cfg_edges - cfg_nodes + 2 * p return mccabe_value ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值