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」に注意してください)。では、基本セットで指定されている実際の実行パスがなくても大丈夫ですか?... または、マカベの複雑さのメトリックに従って、上記のコードを変更する必要があります。私の家庭教師は、コードを変更する必要があると言っていたので、構造化されていないループがあるのでコードを変更する必要があるとも言いました。(構造化されていないループも見当たりません) しかし、コードを変更すると、実際の出力が期待される出力と異なる可能性があると感じています。だから誰か説明してくれ

4

1 に答える 1

6

1) McCabe の複雑さは、決定点の数 + 1 として計算できます。あなたの場合、5 つの決定点 (ノード 3、5、6、13、および 15) があり、コード フラグメントの McCabe の複雑さが 5+1 = であることを意味します。 6. 6 は McCabe の複雑さの点で決して高すぎるというわけではありませ

2) McCabe の複雑さは、メソッド/手順のテスト可能性に関連していますが、特定のパスのテスト可能性には関連していません。パスは実行可能である (= このパスを強制的に実行する変数の値が存在する) 場合とそうでない場合がありますが、McCabe の複雑さはそのような複雑さを喜んで認識していません。パスの実現可能性を本当に調べたい場合は、一般的に問題は決定不可能ですが、多くの実用的なデータフロー分析アルゴリズムが利用可能であることを覚えておいてください。

3)コードを変更すると、実際の出力は期待される出力と異なる場合があります。ただし、これはおそらく先生が意図したことであり、生成される出力が同じままで、McCabe の複雑さが低下するようにコードを再構築する方法があります。たとえば、最大値と合計を計算するタスクを本当に分離する必要があるかどうかを考えてみてください。

于 2012-05-10T09:37:10.303 に答える