2010-04-19 25 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; 
    } 
} 

Tengo que encontrar la complejidad ciclomática para este código y luego sugerir algunos casos de prueba de caja blanca y casos de prueba de caja negra. Pero estoy teniendo problemas para hacer un CFG para el código.Gráfico de flujo de control y complejidad ciclomática para el siguiente procedimiento

Agradecería algo de ayuda en los casos de prueba también.

+0

Qué lenguaje es esto? Se ve como C excepto por "Int" en lugar de "int" en la declaración. Si es C, no hay bucle for anidado, pero ratehr un bucle while anidado en un bucle for. –

+0

Oh sí, no hay ningún bucle anidado. Es C –

Respuesta

26

inicio numerando las declaraciones:

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; 
     } 

ahora se puede ver claramente qué instrucción se ejecuta primero y que el pasado etc por lo que dibujar la CFG se vuelve simple.

CFG

Ahora, para calcular la complejidad ciclomática utiliza uno de tres métodos:

  1. Contar el número de regiones en el gráfico: 4
  2. Nº de predicados (rojo en el gráfico) + 1: 3 + 1 = 4
  3. No de bordes - no. de nodos + 2: 14 - 12 + 2 = 4.
+0

Por curiosidad, ¿qué herramienta usaste para generar el diagrama de flujo? –

+1

@James McNellis Usé MS Visio para dibujar el CFG. –

+0

Ah; Pensé que podría haber sido creado por algún tipo de herramienta de análisis de código. +1 por tomarse el esfuerzo de dibujar una imagen realmente buena! –

3

La complejidad ciclomática es 4.

1 para el procedimiento 1 para el bucle 1 para el bucle, mientras que 1 para la si la condición del bucle while.

+0

Pero hay dos bucles for? –

+0

Sí, pero están en el mismo nivel de anidación, por lo que hay una sola ruta a través del código, no hay nada. –

+0

Entonces, ¿no debería ser 5? –

2

También puede utilizar fórmula McCabe M = E-N + 2C
E = bordes
N = nodos
C = componentes
M = complejidad ciclomática

E = 14 
N = 12 
C = 1 

M = 14-12 + 2*1 = 4

Cuestiones relacionadas