Hola alguien me puede explicar la salida del programa

Iniciado por Gatoloco123, 13 Febrero 2017, 21:13 PM

0 Miembros y 1 Visitante están viendo este tema.

Gatoloco123

Es que tuve un examen y me salio este problema y pues me salio mal  :xD  alguien me puede explicar por que sale 9 8 4 5 6 8 7 2 1 0  :-\

#include <stdio.h>
void main() {
  int i, a[10];
  for (i = 0; i < 10; i++)
  a[i] = 9 - i;
  for (i = 2; i < 7; i++)
  a[i] = a[a[i]]+2;
  for (i = 0; i < 10; i++)
  printf("%d ",a[i]);
}
/*
Salida:
9 8 4 5 6 8 7 2 1 0
*/





· Los códigos deben ir en etiquetas GeSHi
>aquí las reglas del foro
-Engel Lex

engel lex

for (i = 0; i < 10; i++)
a[i] = 9 - i;

un ciclo con i epezando en 0 y terminando en 9, a en cada posición valdrá 9 menos i, es decir cuando i sea 0, a en esa posición valdrá 9, para 9 será 0

for (i = 2; i < 7; i++)
a[i] = a[a[i]]+2;


un ciclo con i epezando en 2 y terminando en 6, a en cada posición valdrá lo que había en a en la posición i y se le sumará 2, por ejemplo, cuando i sea 2, ssuponiendo que en a en posición 2 contenia 7, se buscará que tenía a en posición 7 y a eso se le sumará 2

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

dato000

Ahhhh recuerdo muy bien estas pruebas de escritorio en mis clases de la universidad a principios...je era bastante molesto todo eso.

Hoy en día es mi pan de cada día como dicen por ahí.

Voy a intentar dejar el esquema claro:


#include <stdio.h>
void main() {
  int i, a[10];
  for (i = 0; i < 10; i++)
  {
       a[i] = 9 - i;
  }

  for (i = 0; i < 10; i++)
  {
       printf("%d ",a[i]);
  }

  printf("\n\n");
  for (i = 2; i < 7; i++)
  {
       a[i] = a[a[i]]+2;
  }
  for (i = 0; i < 10; i++)
  {
       printf("%d ",a[i]);
  }
}
/*
Salida primer for (i = 0; i < 10; i++)
9 8 7 6 5 4 3 2 1 0


Salida segundo for (i = 2; i < 7; i++)
9 8 4 5 6 8 7 2 1 0
*/



Ahora examinemos el paso a paso:

Citar
Salida primer for (i = 0; i < 10; i++)

Tenemos lo siguiente:

a[0] = 9 - 0 = 9
a[1] = 9 - 1 = 8
a[2] = 9 - 2 = 7
a[3] = 9 - 3 = 6
a[4] = 9 - 4 = 5
a[5] = 9 - 5 = 4
a[6] = 9 - 6 = 3
a[7] = 9 - 7 = 2
a[8] = 9 - 8 = 1
a[9] = 9 - 9 = 0



Creo que ahi va todo en orden, facil de entender.

Ahora sigue lo interesante, el segundo for

Citar
Salida primer for (i = 2; i < 7; i++)

Tenemos lo siguiente:

a[0] = 9  //No cambia
a[1] = 8  //No cambia
a[2] = ?  //cambia
a[3] = ?  //cambia
a[4] = ?  //cambia
a[5] = ?  //cambia
a[6] = ?  //cambia
a[7] =  2  //No cambia
a[8] =  1  //No cambia
a[9] =  0  //No cambia



Para entender el ciclo, es necesario puntualizar que se toma las posiciones del arreglo, que tiene un valor, que a su misma vez, es otra posición de ese mismo arreglo, y que una vez se realiza el cambio, actualiza la posición del arreglo, que luego se utilizara en ese mismo ciclo para los pasos siguientes

Por ejemplo:
Citar
a[2] =  a[ a[2] ] + 2 // a[2] = 7
a[2] =  a[ 7 ] + 2     // a[7] = 2
a[2] =  2 + 2
a[2] =  4

a[0] = 9  //No cambia
a[1] = 8  //No cambia
a[2] = 4  //cambia
a[3] = ?  //cambia
a[4] = ?  //cambia
a[5] = ?  //cambia
a[6] = ?  //cambia
a[7] =  2  //No cambia
a[8] =  1  //No cambia
a[9] =  0  //No cambia



Y ahora seguimos con los otros, hasta que i se menor que 7 (i<7) y así se rompe el ciclo:

Citar
a[3] =  a[ a[3] ] + 2 // a[3] = 6   |    a[4] =  a[ a[4] ] + 2 // a[4] = 5
a[3] =  a[ 6 ] + 2     // a[6] = 3   |    a[4] =  a[ 5 ] + 2 // a[5] = 4
a[3] =  3 + 2                            |    a[4] =  4 + 2
a[3] =  5                                  |    a[4] =  6

a[0] = 9  //No cambia               |    a[0] = 9  //No cambia
a[1] = 8  //No cambia               |    a[1] = 8  //No cambia
a[2] = 4  //cambia                    |    a[2] = 4  //cambia
a[3] = 5  //cambia                    |    a[3] = 5  //cambia
a[4] = ?  //cambia                    |    a[4] = 6  //cambia
a[5] = ?  //cambia                    |    a[5] = ?  //cambia
a[6] = ?  //cambia                    |    a[6] = ?  //cambia    
a[7] =  2  //No cambia              |    a[7] =  2  //No cambia
a[8] =  1  //No cambia              |    a[8] =  1  //No cambia
a[9] =  0  //No cambia              |    a[9] =  0  //No cambia  


Ahora ves que los elementos de los arreglos van cambiando de valor nuevamente?? hay que usar esos nuevos valores para las nuevas sumatorias:
Citar
a[5] =  a[ a[5] ] + 2 // a[5] = 4   |    a[6] =  a[ a[6] ] + 2 // a[6] = 3
a[5] =  a[ 4 ] + 2     // a[4] = 6   |    a[6] =  a[ 3 ] + 2 // a[3] = 5
a[5] =  6 + 2                            |    a[6] =  5 + 2
a[5] =  8                                  |    a[6] =  7

a[0] = 9  //No cambia               |    a[0] = 9  //No cambia
a[1] = 8  //No cambia               |    a[1] = 8  //No cambia
a[2] = 4  //cambia                    |    a[2] = 4  //cambia
a[3] = 5  //cambia                    |    a[3] = 5  //cambia
a[4] = 6  //cambia                    |    a[4] = 6  //cambia
a[5] = 8  //cambia                    |    a[5] = 8  //cambia
a[6] = ?  //cambia                    |    a[6] = 7  //cambia    
a[7] =  2  //No cambia              |    a[7] =  2  //No cambia
a[8] =  1  //No cambia              |    a[8] =  1  //No cambia
a[9] =  0  //No cambia              |    a[9] =  0  //No cambia  


finalmente tenemos el arreglo:
Citar
a[0] = 9
a[1] = 8
a[2] = 4
a[3] = 5
a[4] = 6
a[5] = 8
a[6] = 7
a[7] = 2
a[8] = 1
a[9] = 0


Puede que parezca algo largo, extenso y complicado, pero en realidad es facil de entender si se usa un debug apropiado, yo use para este caso el de codeblocks

http://wiki.codeblocks.org/index.php/Debugging_with_Code::Blocks

Espero que sea de ayuda.