2010-04-19 13 views
10
insertion_procedure (int a[], int p [], int N) 
{ 
    int i,j,k; 
    for (i=0; i<=N; i++) p[i] = i; 
    for (i=2; i<=N; i++) 
    { 
     k = p[i]; 
     j = 1; 
     while (a[p[j-1]] > a[k]) {p[j] = p[j-1]; j--} 
     p[j] = k; 
    } 
} 

Je dois trouver la complexité cyclomatique pour ce code et ensuite suggérer quelques cas de test en boîte blanche et des cas de test en boîte noire. Mais j'ai du mal à faire un CFG pour le code.Graphique de flux de contrôle et complexité cyclomatique pour la procédure suivante

J'apprécierais aussi de l'aide sur les cas de test.

+0

Quelle langue est-ce? Il ressemble à C sauf pour le "Int" plutôt que "int" dans la déclaration. Si c'est C, il n'y a pas de boucle for imbriquée, mais ratehr a une boucle while imbriquée dans une boucle for. –

+0

Oh oui il n'y a pas de boucle imbriquée. Son C –

Répondre

26

Commencez par la numérotation des déclarations:

insertion_procedure (int a[], int p [], int N) 
{ 
(1) Int i,j,k; 
(2) for ((2a)i=0; (2b)i<=N; (2c)i++) 
(3)  p[i] = i; 
(4) for ((4a)i=2; (4b)i<=N; (4c)i++) 
     { 
(5)  k=p[i];j=1; 
(6)  while (a[p[j-1]] > a[k]) { 
(7)   p[j] = p[j-1]; 
(8)   j-- 
      } 
(9)   p[j] = k; 
     } 

Maintenant vous pouvez voir clairement quelle déclaration est exécutée en premier et qui dernière etc dessin de sorte que le cfg devient simple.

CFG

Maintenant, pour calculer la complexité cyclomatique vous utilisez une des trois méthodes:

  1. Compter le nombre de régions sur le graphique: 4
  2. Nombre de prédicats (rouge sur le graphique) + 1: 3 + 1 = 4
  3. Nombre d'arêtes - non. de noeuds + 2: 14 - 12 + 2 = 4.
+0

Par curiosité, quel outil avez-vous utilisé pour générer le graphique de flux? –

+1

@James McNellis J'ai utilisé MS Visio pour dessiner le CFG. –

+0

Ah; Je pensais qu'il pourrait avoir été créé par une sorte d'outil d'analyse de code. +1 pour avoir fait l'effort de dessiner une très bonne photo! –

3

La complexité cyclomatique est 4.

1 pour la procédure +1 pour la boucle +1 pour la boucle while +1 pour la condition if de la boucle while.

+0

Mais il y en a deux pour les boucles? –

+0

Oui, mais ils sont au même niveau d'imbrication, donc il y a un seul chemin à travers le code, pas d'ifs. –

+0

Donc, ne devrait-il pas être 5? –

2

Vous pouvez également utiliser McCabe formule M = E-N + 2C
E = bords
N = noeuds
C = composantes
M = complexité cyclomatique

E = 14 
N = 12 
C = 1 

M = 14-12 + 2*1 = 4