1
int maxValue = m[0][0];         
for (int i = 0; i < N; i++) 
{               
    for (int j = 0; j < N; j++) 
    {                    
        if ( m[i][j] >maxValue )        
        {                 
            maxValue = m[i][j];     
        }                     
    }                    
}                   
cout<<maxValue<<endl;           

int sum = 0;                
for (int i = 0; i < N; i++)     
{                   
    for (int j = 0; j < N; j++)     
    {                    
        sum = sum + m[i][j];            
    }                    
} 
cout<< sum <<endl;

对于上面的代码,如果我们绘制这样的流程图,流程图基本独立路径将遵循六个
路径 1:1 2 3 10 11 12 13 19
路径 2:1 2 3 10 11 12 13 14 15 18 13 19
路径 3:1 2 3 10 11 12 13 14 15 16 17 15 18 13 19
路径 4:1 2 3 4 5 9 3 10 11 12 13 19
路径 5:1 2 3 4 5 6 8 5 9 3 10 11 12 13 14 15 16 17 15 18 13 19
路径 6: 1 2 3 4 5 6 7 8 5 9 3 10 11 12 13 14 15 16 17 15 18 13 19

所以这里的问题是根据给定的代码路径 2、3、4 无法测试(注意循环中的“N”)。那么没有基本集合中给出的实际执行路径可以吗?...或者根据macabe复杂性指标,我们是否必须更改上面给出的代码。因为我的一位导师说我们必须更改代码,他也说存在非结构化循环,所以我们必须更改代码。(我也没有看到非结构化循环)但我的感觉是,如果我们更改代码,实际输出可能与预期输出不同。所以请有人解释一下

4

1 回答 1

6

1) McCabe 的复杂度可以计算为决策点的数量 + 1。在您的情况下,有 5 个决策点(节点 3、5、6、13 和 15),这意味着代码片段的 McCabe 复杂度为 5+1 = 6. 就 McCabe 复杂性而言,6 绝不是太高:当然,考虑到实现必须提供的功能,人们仍然可以争辩说它太高了。

2) McCabe 的复杂性与方法/过程的可测试性有关,但与特定路径的可测试性无关。路径可以是可行的(= 存在强制执行通过该路径的变量值)或不可行,但 McCabe 的复杂性很高兴地没有意识到这种复杂性。如果您真的想研究路径的可行性,请记住问题通常是无法确定的,但有许多实用的数据流分析算法可用。

3)如果我们更改代码实际输出可能与预期输出不同当然,您不能引入任意更改并希望结果相同。然而,这可能是你的导师想要的,有一种方法可以重组你的代码,这样产生的输出保持不变,并且 McCabe 的复杂性降低了。例如,想想你是否真的需要将计算最大值和总和的任务分开。

于 2012-05-10T09:37:10.303 回答