Programa C++ Tengo una duda con respecto a este programa.

Iniciado por Estudiante000000, 16 Noviembre 2018, 01:21 AM

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

Estudiante000000

Cita de: YreX-DwX en 22 Noviembre 2018, 00:54 AM
Todo el análisis que no aparece en la cita es correcto, está bastante bien. Pero a partir de aquí es donde tienes un error así que vamos a ello.
Voy a ponerte un ejemplo para que veas a donde quiero llegar:
Código (cpp) [Seleccionar]

iterar:
cout << "Se repite la iteracion" << endl;
for (j = 1; j <= 100; j = j + 1){
    if (valores[i] == numeros[j]){
        solucion[z] = valores[i];
        z = z + 1;
    }
}
if (i <= 100){
    i = i + 1;
    goto iterar;
}


Si pruebas a ejecutar esto en lugar del código original (solo he añadido una línea después de la etiqueta iterar) verás el porqué del error y el porqué de que no se recomiende usar etiquetas y <goto> para los saltos. El sentido de añadir esa frase antes del <for> es que cada vez que se ejecute <goto etiqueta> se va a repetir esa frase en pantalla... Por qué? :huh: Vamos a analizarlo de nuevo sin la instrucción que he añadido que es meramente demostrativa:
El comienzo que has hecho es correcto, antes de llegar al <for> tienes <i = 1>, entonces (importante) ENTRAS en el <for> por lo tanto <j = 1>. Comparamos:
valores[i = 1] = 2
numeros[j = 1] = 3
Son distintos, entonces otra iteración del <for> ahora con <j = 2>. Entonces vamos a comparar cada posición de <numeros> con <valores[1]>. Nunca va a ser cierto ya que <numeros> sigue creciendo y <valores[1]> es menor que todos. Llegamos al final del <for> con <j = 100> ahora ya no se va a repetir, entonces salimos del <for> y miramos el <if> de fuera: ¿i <= 100? Sí, entonces <i = 2> y <goto iterar>. Volvemos ANTES del <for> entonces se ejecuta la inicialización otra vez, <i = 1> y se repite el proceso comparamos cada valor de <numeros> con <valores[2]> lo que nunca va a ser cierto.

Creo que ahora ya vas viendo lo que va a hacer: ¿Cuándo va a entrar al <if> que hay dentro del <for>? Cuando un valor esté en <valores> y en <numeros>. Y como en <valores> tenemos los múltiplos de 2 y en <numeros> tenemos los múltiplos de 3... Que va a haber en <soluciones>? :silbar: Exacto, los múltiplos de 2 y 3 al mismo tiempo, es decir, los múltiplos de 6.

Ahora ya podemos responder a la pregunta, te la dejo a ti que seguro que te hace más ilusión dar con la respuesta correcta en vez de decírtelo yo. ;-) ;-)


Casi entiendo lo que me quieres decir , pero si nunca entra al if como me mostrara los multiplos de 6? aun no lo veo :(

K-YreX

Citar
Creo que ahora ya vas viendo lo que va a hacer: ¿Cuándo va a entrar al <if> que hay dentro del <for>? Cuando un valor esté en <valores> y en <numeros>. Y como en <valores> tenemos los múltiplos de 2 y en <numeros> tenemos los múltiplos de 3... Que va a haber en <soluciones>? :silbar: Exacto, los múltiplos de 2 y 3 al mismo tiempo, es decir, los múltiplos de 6.

Aquí lo tienes, es decir, sí que va a entrar en el <if>. Simplemente que el proceso explicado brevemente sería:
<i = 1> <j = 1> No entra.
Se repite el <for> hasta el último valor de j (no va a entrar en ninguna repetición).
<i = 1> <j = 99> No entra.

Sale del <for>, se incrementa i y con <goto iterar> vuelves a empezar el <for> pero ahora con <i = 2>
<i = 2> <j = 1> No entra.
Se repite el <for> hasta el último valor de j (no va a entrar en ninguna repetición).
<i = 2> <j = 99> No entra.

Sale del <for>, se incrementa i y con <goto iterar> vuelves a empezar el <for> pero ahora con <i = 3>
<i = 3> <j = 1> No entra.
EXCEPCIÓN: <i = 3> <j = 2> ENTRA. Entonces <z = 1> solucion[1] = valores[3] = 6
Se repite el <for> hasta el último valor de j (ya no entra más veces).
<i = 3> <j = 99> No entra.

Sale del <for>, se incrementa i y con <goto iterar> vuelves a empezar el <for> pero ahora con <i = 4>. Entonces valores[4] = 8 (no va a entrar)
Sale del <for>, se incrementa i y con <goto iterar> vuelves a empezar el <for> pero ahora con <i = 5>. Entonces valores[5] = 10 (no va a entrar)

Sale del <for>, se incrementa i y con <goto iterar> vuelves a empezar el <for> pero ahora con <i = 6>. Entonces valores[6] = 12
Ahora si va a entrar cuando j sea 4 ya que numeros[4] = 12.

Es decir el programa coge la posición <i> de <valores> y la compara con todas las posiciones de <números>, si coincide alguno lo mete en <solucion> y cuando lleg al final de <numeros> incrementa <i>; entonces ahora compara la siguiente posición de <valores> con todas las posiciones de <numeros> y si coincide alguno lo mete en <solucion>.
Es decir, que el programa compara todos los elementos de <numeros> con cada elemento de <valores>. Al final lo que hace es comparar los dos vectores enteros.

PD: Cuando digo que vuelve a entrar en el <for>, por lo que he explicado antes, j vuelve a empezar desde 1.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

Estudiante000000

Cita de: YreX-DwX en 22 Noviembre 2018, 01:48 AM
Aquí lo tienes, es decir, sí que va a entrar en el <if>. Simplemente que el proceso explicado brevemente sería:
<i = 1> <j = 1> No entra.
Se repite el <for> hasta el último valor de j (no va a entrar en ninguna repetición).
<i = 1> <j = 99> No entra.

Sale del <for>, se incrementa i y con <goto iterar> vuelves a empezar el <for> pero ahora con <i = 2>
<i = 2> <j = 1> No entra.
Se repite el <for> hasta el último valor de j (no va a entrar en ninguna repetición).
<i = 2> <j = 99> No entra.

Sale del <for>, se incrementa i y con <goto iterar> vuelves a empezar el <for> pero ahora con <i = 3>
<i = 3> <j = 1> No entra.
EXCEPCIÓN: <i = 3> <j = 2> ENTRA. Entonces <z = 1> solucion[1] = valores[3] = 6
Se repite el <for> hasta el último valor de j (ya no entra más veces).
<i = 3> <j = 99> No entra.

Sale del <for>, se incrementa i y con <goto iterar> vuelves a empezar el <for> pero ahora con <i = 4>. Entonces valores[4] = 8 (no va a entrar)
Sale del <for>, se incrementa i y con <goto iterar> vuelves a empezar el <for> pero ahora con <i = 5>. Entonces valores[5] = 10 (no va a entrar)

Sale del <for>, se incrementa i y con <goto iterar> vuelves a empezar el <for> pero ahora con <i = 6>. Entonces valores[6] = 12
Ahora si va a entrar cuando j sea 4 ya que numeros[4] = 12.

Es decir el programa coge la posición <i> de <valores> y la compara con todas las posiciones de <números>, si coincide alguno lo mete en <solucion> y cuando lleg al final de <numeros> incrementa <i>; entonces ahora compara la siguiente posición de <valores> con todas las posiciones de <numeros> y si coincide alguno lo mete en <solucion>.
Es decir, que el programa compara todos los elementos de <numeros> con cada elemento de <valores>. Al final lo que hace es comparar los dos vectores enteros.

PD: Cuando digo que vuelve a entrar en el <for>, por lo que he explicado antes, j vuelve a empezar desde 1.

Vale osea que entra en todos los multiplos de 6? y por eso estan  guardados en solucion?

K-YreX

Claro porque lo que hace es guardar los elementos que están tanto en <valores> como en <numeros> y en <valores> tienes los múltiplos de 2 y en <numeros> los múltiplos de 3. Y los números que están en ambos son entonces múltiplos de 2 y de 3 y eso por definición son los múltiplos de 6.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

Estudiante000000

Cita de: YreX-DwX en 22 Noviembre 2018, 02:48 AM
Claro porque lo que hace es guardar los elementos que están tanto en <valores> como en <numeros> y en <valores> tienes los múltiplos de 2 y en <numeros> los múltiplos de 3. Y los números que están en ambos son entonces múltiplos de 2 y de 3 y eso por definición son los múltiplos de 6.

Muchisimas gracias siempre es buena contar con tus explicaciones precisas , por cierto no sabes de alguna pagina  que pueda encontrar programas asi , que esten escritos y pidan determinar para que sirve el programa , corriendolo en frio o te pidan determinar algun valor en especifico como este que me pedia hallar solucion[3]?

K-YreX

Lo siento pero no, más que nada porque nunca me he parado a buscar códigos ajenos ya que no es algo que me guste mucho si no es para ayudar a otra persona. Pero si no encuentras nada siempre puedes coger cualquier código de internet y hacerte tú mismo la pregunta o intentar comprender su funcionamiento sin ejecutarlo y después lo ejecutas para ver si estabas en lo correcto.

En este mismo foro en otros posts he visto que hay algunos códigos que trabajan con temas matemáticos que al fin y al cabo creo que son los mejores para hacer lo que quieres hacer ya que la dificultad no está en las instrucciones que se usan sino en ver por qué se están usando.

PD: Yo mismo he escrito algunos trozos de código para resolver algunos de estos posts que te comento. Si te interesa el programa entero o que te mande alguno de los programas que tengo yo puedes decírmelo por un mensaje privado y te lo puedo mandar si te sirve de ayuda.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

Estudiante000000

Cita de: YreX-DwX en 22 Noviembre 2018, 03:21 AM
Lo siento pero no, más que nada porque nunca me he parado a buscar códigos ajenos ya que no es algo que me guste mucho si no es para ayudar a otra persona. Pero si no encuentras nada siempre puedes coger cualquier código de internet y hacerte tú mismo la pregunta o intentar comprender su funcionamiento sin ejecutarlo y después lo ejecutas para ver si estabas en lo correcto.

En este mismo foro en otros posts he visto que hay algunos códigos que trabajan con temas matemáticos que al fin y al cabo creo que son los mejores para hacer lo que quieres hacer ya que la dificultad no está en las instrucciones que se usan sino en ver por qué se están usando.

PD: Yo mismo he escrito algunos trozos de código para resolver algunos de estos posts que te comento. Si te interesa el programa entero o que te mande alguno de los programas que tengo yo puedes decírmelo por un mensaje privado y te lo puedo mandar si te sirve de ayuda.

Vale muchas gracias te mande un mensaje privado