2

コードの循環的複雑度を計算するために、V (G) = E - N + 2 を計算するのに役立つノードとエッジで構成される制御フローチャートを作成しました。私の場合、E = 15 および N = 11 です。複雑さ6。

私の答えを確認するために、コードブローの線形に独立したパスを見つけるための助けが必要です:

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;  

これは、私の V (G) の結果と等しくなるはずです。そうでなければ、私の計算は間違っています。ご協力ありがとうございました。

4

2 に答える 2

2

McCabe の循環的複雑度は上限を与えます。次の点を考慮してください。

void func (const bool do_special) {
    if (do_special) {
        do_something_special_at_the_start();
    }

    always_do_this_stuff_in_the_middle();

    if (do_special) {
        do_something_special_at_the_end();
}

グラフ理論の観点から、これは 3 の循環的複雑度を持ちます。ただし、do_specialは一定であるため、コード内の独立したパスは 2 つしかありません。グラフ理論モデルは、いくつかのパスが不可能であることを知りません。グラフを通る可能なパスの数は、循環的複雑度よりも少ない場合があります。

于 2012-04-28T18:56:32.740 に答える
0

ハメン、この測定基準が上限を与えることを述べるための非常に良い例。しかし、どういうわけか、この例を3つとして示しているのに、この例の複雑さについてのポイントを見逃している可能性があります。do_something _...()を示したので、これらは関数呼び出しです。したがって、この場合、P = 3であるため、循環的複雑度はV(G)= E --N-2 * Pで与えられます。また、EとNには、呼び出された関数のエッジとノードも含める必要があります。代わりに、例は次のように書くことができると思います。

void func (const bool do_special) {

   if (do_special) {
      /* do something at start */
   }
   :
   /* do something at middle */
   :
   if (do_speical) {
      /* do something at end */
   }
}

あなたが同意することを願っています!

于 2012-05-23T06:28:20.487 に答える