elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Hola alguien me puede explicar la salida del programa
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Hola alguien me puede explicar la salida del programa  (Leído 1,635 veces)
Gatoloco123

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Hola alguien me puede explicar la salida del programa
« en: 13 Febrero 2017, 21:13 pm »

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  :-\
Código
  1. #include <stdio.h>
  2. void main() {
  3.   int i, a[10];
  4.   for (i = 0; i < 10; i++)
  5.   a[i] = 9 - i;
  6.   for (i = 2; i < 7; i++)
  7.   a[i] = a[a[i]]+2;
  8.   for (i = 0; i < 10; i++)
  9.   printf("%d ",a[i]);
  10. }
  11. /*
  12. Salida:
  13. 9 8 4 5 6 8 7 2 1 0
  14. */




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


« Última modificación: 13 Febrero 2017, 23:40 pm por engel lex » En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Hola alguien me puede explicar la salida del programa
« Respuesta #1 en: 13 Febrero 2017, 23:47 pm »

Código
  1. for (i = 0; i < 10; i++)
  2. 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

Código
  1. for (i = 2; i < 7; i++)
  2. 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



En línea

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


Desconectado Desconectado

Mensajes: 3.034



Ver Perfil
Re: Hola alguien me puede explicar la salida del programa
« Respuesta #2 en: 14 Febrero 2017, 15:29 pm »

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:

Código
  1. #include <stdio.h>
  2. void main() {
  3.   int i, a[10];
  4.   for (i = 0; i < 10; i++)
  5.   {
  6.        a[i] = 9 - i;
  7.   }
  8.  
  9.   for (i = 0; i < 10; i++)
  10.   {
  11.        printf("%d ",a[i]);
  12.   }
  13.  
  14.   printf("\n\n");
  15.   for (i = 2; i < 7; i++)
  16.   {
  17.        a[i] = a[a[i]]+2;
  18.   }
  19.   for (i = 0; i < 10; i++)
  20.   {
  21.        printf("%d ",a[i]);
  22.   }
  23. }
  24. /*
  25. Salida primer for (i = 0; i < 10; i++)
  26. 9 8 7 6 5 4 3 2 1 0
  27.  
  28.  
  29. Salida segundo for (i = 2; i < 7; i++)
  30. 9 8 4 5 6 8 7 2 1 0
  31. */
  32.  


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.
En línea


Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
alguien me puede explicar?.. =)
Materiales y equipos
$DexTer$ 4 2,492 Último mensaje 13 Abril 2008, 21:09 pm
por ChimoC
4=3 alguien me puede explicar esto? « 1 2 3 4 5 »
Foro Libre
daryo 48 17,263 Último mensaje 9 Junio 2013, 01:18 am
por $Edu$
¿Alguien me puede explicar este programa en C? (Dec-Binario)
Programación C/C++
jamatbar 2 2,239 Último mensaje 18 Diciembre 2013, 12:18 pm
por jamatbar
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines