判定节点法的核心:每多一个分叉,就多一条独立路径的可能
判定节点可以理解成程序控制流发生选择的地方。典型例子是 if、while、for、case 这类结构。它们会让程序不再只是一路顺下去,而是出现不同走法。
常用公式是 V(G)=判定节点数+1。这个 +1 可以理解成没有任何判定时,程序至少也有一条基本路径。每增加一个判定点,就增加一份路径复杂度。
哪些通常算判定节点
if 判断、while 循环、for 循环、case 分支通常都要关注。它们共同特点是:会改变控制流的走向。普通赋值、普通计算、普通输出语句通常不算判定节点。
有同学会问:循环算不算?算。因为循环至少有“继续循环”和“退出循环”两种控制走向。不要只把 if 当判定,while 和 for 也常考。
| 结构 | 是否通常算判定节点 | 提醒 |
|---|---|---|
| if | 是 | 最典型的二分支判断 |
| while / for | 是 | 有继续执行和退出循环两种走向 |
| case / switch | 是 | 多分支结构,具体数法要看题目给法 |
| 赋值语句 | 否 | 不改变控制流 |
| 输出语句 | 否 | 只是顺序执行动作 |
小例子:3个判定节点怎么算
如果题目说某程序控制流图中有 3 个判定节点,那么 V(G)=3+1=4。这个答案表示进行基本路径测试时,至少要设计 4 条独立路径。
注意,这里的 4 不是说随便测 4 组输入就一定充分,而是从控制流结构角度给出的最低路径覆盖提示。真正设计测试用例时,还要结合条件取值和业务规则。
代入过程
判定节点数 = 3。
V(G)=3+1=4。
基本路径测试至少关注 4 条独立路径。
判定法和边点法怎么选
题目给判定节点数,就优先用判定法;题目给边数和节点数,就优先用边点法;题目给图且区域容易看清,也可以用区域法。软考不会奖励你用最复杂的方法,能稳定算对才是重点。
如果图比较复杂,判定节点数和边点法可以互相校验。两边结果不同,先不要急着怀疑公式,先回去检查是不是漏掉循环回边,或者把普通节点当成判定节点。
相关题目解析
下面这些题目和本专题的判断方法关联较强,适合读完概念后回到具体题干里校验理解。
- 已知判定节点数时环路复杂度怎么算?环路复杂度 / McCabe
- 已知边数和节点数时 McCabe 复杂度怎么算?McCabe / 环路复杂度