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只適用於結構化編程。我會更新答案。 –