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; 

对于上面的代码,如果我们得出这样flow graph基本独立的路径的流程图将下列六种
路径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
McCabe的复杂性度量与独立路径

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

回答

6

1)McCabe的复杂性可以计算为决策点的数量+1。在你的情况下,有5个决策点(节点3,5,6,13和15),这意味着McCabe的复杂性的代码片段是5 + 1 = 6。6在McCabe复杂性方面决不会太高:当然,如果实现必须提供的功能,那么当然仍然可以认为它太高。 2)McCabe的复杂性与方法/程序的可测试性有关,但与特定路径的可测试性无关。路径可能是可行的(=存在强制通过该路径执行的变量的值),但是McCabe的复杂性很高兴地不知道这种复杂情况。如果你真的想研究路径的可行性,记住这个问题通常是不可判定的,但是许多实际的数据流分析算法是可用的。

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

+3

McCabe的复杂性没有被定义为决策点数加1,至少不是McCabe。有一个定理证明了他的定义等价于决策点加1,这更易于计算: - } –

+0

对;-)对不起,因为混淆,当然,#decision points + 1只适用于结构化编程。我会更新答案。 –