Título: Duda . Publicado por: Estudiante000000 en 18 Noviembre 2018, 19:58 pm Un programa que lea 10 numeros en un vector y que cuando consiga numeros pares e impares los guarde en un vector aparte por separado , si me corrigen mis fallas lo agradeceria , estoy fallando en pasar los pares e impares a sus vectores destinados.
Código
EL PROGRAMA NO ME MUESTRA ERROR NO SE QUE PASA. Título: Re: Duda . Publicado por: MAFUS en 18 Noviembre 2018, 20:37 pm Mira esto:
Código: for(i=0;i=9;i++) Título: Re: Duda . Publicado por: Estudiante000000 en 18 Noviembre 2018, 21:46 pm Mira esto: Código: for(i=0;i=9;i++) Veo un ciclo que iterara desde la posicion 0 hasta la posicion 9 , desde el 0 de 1 en 1. No entiendo que me quieres decir , me explicas? Título: Re: Duda . Publicado por: K-YreX en 18 Noviembre 2018, 22:04 pm Mira esto: A lo que se refiere es que si haces <i = 9> estás haciendo una asignación, no una comparación. La comparación se hace con dos iguales <i == 9> como en:Código: for(i=0;i=9;i++) Código
De todos modos ese for se ejecuta cuando <i == 9> y dudo que eso sea lo que quieres ya que entonces solo se ejecuta para la última posición del vector. Además donde comparas si es par o impar has puesto la misma condición osea que si es par, hace tal y sino, si es par, hace tal... Osea que el segundo if está mal. Y en el último for para meter los resultados estás poniendo el primer par, 6 saltos de línea y el primer impar, etc; es decir, imposible de leer (además de que repites el título en cada iteración). Más correcto sería: Código
Y lo mismo para los impares. Título: Re: Duda . Publicado por: Estudiante000000 en 18 Noviembre 2018, 22:43 pm A lo que se refiere es que si haces <i = 9> estás haciendo una asignación, no una comparación. La comparación se hace con dos iguales <i == 9> como en: Código
De todos modos ese for se ejecuta cuando <i == 9> y dudo que eso sea lo que quieres ya que entonces solo se ejecuta para la última posición del vector. Además donde comparas si es par o impar has puesto la misma condición osea que si es par, hace tal y sino, si es par, hace tal... Osea que el segundo if está mal. Y en el último for para meter los resultados estás poniendo el primer par, 6 saltos de línea y el primer impar, etc; es decir, imposible de leer (además de que repites el título en cada iteración). Más correcto sería: Código
Y lo mismo para los impares. Ya le hice las modificaciones , pero cuando compilo en la consola no me muestra nada El codigo quedo asi : Código
Título: Re: Duda . Publicado por: K-YreX en 18 Noviembre 2018, 22:45 pm Te ha faltado modificar la siguiente línea:
Código El segundo campo de <i = 9> como te hemos comentado antes no es correcto. Primero: si tu idea era poner como condición que i sea igual a 9, entonces se pone como <i == 9> con dos iguales. Segundo: en tal caso ese bucle empezaría con <i = 0> y se ejecutaría si <i == 9>, es decir, nunca. Tercero: fíjate en como has hecho el <for> para recorrer el vector y mostrarlo más abajo. PD: Si este programa si lo estás haciendo tú te recuerdo lo que te comenté en tus primeros posts. En lugar de "#include <stdlib.h>" utiliza mejor "#include <cstdlib>" aunque el programa va a funcionar igual es más correcto usar las librerías de C++ en vez de las de C. Y en segundo lugar evita usar <system("pause")> como ya te comente es preferible sustituirlo por <cin.get()> a no ser que te obliguen a usar eso en la universidad (si usas <cin.get()> puedes eliminar la librería <cstdlib> ya que en este programa sólo es necesaria para hacer la llamada al sistema <system>. Título: Re: Duda . Publicado por: Estudiante000000 en 18 Noviembre 2018, 23:39 pm Te ha faltado modificar la siguiente línea: Código El segundo campo de <i = 9> como te hemos comentado antes no es correcto. Primero: si tu idea era poner como condición que i sea igual a 9, entonces se pone como <i == 9> con dos iguales. Segundo: en tal caso ese bucle empezaría con <i = 0> y se ejecutaría si <i == 9>, es decir, nunca. Tercero: fíjate en como has hecho el <for> para recorrer el vector y mostrarlo más abajo. PD: Si este programa si lo estás haciendo tú te recuerdo lo que te comenté en tus primeros posts. En lugar de "#include <stdlib.h>" utiliza mejor "#include <cstdlib>" aunque el programa va a funcionar igual es más correcto usar las librerías de C++ en vez de las de C. Y en segundo lugar evita usar <system("pause")> como ya te comente es preferible sustituirlo por <cin.get()> a no ser que te obliguen a usar eso en la universidad (si usas <cin.get()> puedes eliminar la librería <cstdlib> ya que en este programa sólo es necesaria para hacer la llamada al sistema <system>. Listo ya le hice las correciones pero me esta imprimiendo unos numeros extraños antes de darme cada numero par e impar , porque sera eso? Código
Título: Re: Duda . Publicado por: K-YreX en 18 Noviembre 2018, 23:52 pm El problema está en que los vectores <pares> e <impares> no están inicializados a 0. Entonces en el <for> como el primer número es impar se guarda en <impares[0]> pero ¿qué queda en pares[0]? basura, es decir, un número desconocido. Siguiente iteración: el 2 es par entonces se guarda en pares[1]; pero... ¿qué hay en impares[1]? basura. Y así hasta el final.
Para que veas lo que te digo si inicializamos los vectores <pares> e <impares> a 0 de esta manera: Código Veremos como nos sale el resultado esperado pero intercalando un 0. El 0 sale porque ahora en vez de haber basura hemos llenado el vector de 0. Entonces en cada iteración se guarda el número en un vector y en el otro vector habrá un 0. PD: Para mejorar un poco más el código, si para saber si es par hacemos: Código Cuando es impar? Siempre que no sea par. Por lo tanto con poner el else sin otra condición el programa funciona correctamente y nos ahorramos el segundo <if>. Ahora puedes pensar como hacer para no ir guardando un 0 en cada posición que te saltas. Pista: usas el índice i para recorrer todos los vectores, pero los vectores <pares> e <impares> no avanzan al mismo ritmo que <numeros> por lo que tendrás que usar índices distintos. Título: Re: Duda . Publicado por: Estudiante000000 en 19 Noviembre 2018, 01:25 am El problema está en que los vectores <pares> e <impares> no están inicializados a 0. Entonces en el <for> como el primer número es impar se guarda en <impares[0]> pero ¿qué queda en pares[0]? basura, es decir, un número desconocido. Siguiente iteración: el 2 es par entonces se guarda en pares[1]; pero... ¿qué hay en impares[1]? basura. Y así hasta el final. Para que veas lo que te digo si inicializamos los vectores <pares> e <impares> a 0 de esta manera: Código Veremos como nos sale el resultado esperado pero intercalando un 0. El 0 sale porque ahora en vez de haber basura hemos llenado el vector de 0. Entonces en cada iteración se guarda el número en un vector y en el otro vector habrá un 0. PD: Para mejorar un poco más el código, si para saber si es par hacemos: Código Cuando es impar? Siempre que no sea par. Por lo tanto con poner el else sin otra condición el programa funciona correctamente y nos ahorramos el segundo <if>. Ahora puedes pensar como hacer para no ir guardando un 0 en cada posición que te saltas. Pista: usas el índice i para recorrer todos los vectores, pero los vectores <pares> e <impares> no avanzan al mismo ritmo que <numeros> por lo que tendrás que usar índices distintos. Eso que me dices es algo que he tratado de aprender pero aun no lo aprendo pero me gustaria saber como es , debo declarar otra variable que se llame j? Trate de colocarle una condicion para que si lo que encuentra en el vector es 0 no lo imprima pero no se hacerlo bien , ya no me imprime 0 pero me repite infinitamente el 2, queria ponerle esto. Código
Eso dentro del primer for para imprimir los numeros pares pero no se como. Título: Re: Duda . Publicado por: Estudiante000000 en 19 Noviembre 2018, 01:42 am Ya logre que me salgan los numeros impares bien faltan los pares.
Título: Re: Duda . Publicado por: K-YreX en 19 Noviembre 2018, 01:44 am Tienes varias opciones para hacerlo:
- Opción 1: Usar contadores independientes para cada vector. En ese caso te quedaría algo así: Código De esta manera cada vector <pares> e <impares> tendrán los elementos en sus 5 primeras posiciones (si imprimes hasta 10 verás que las 5 últimas ya no tienen nada). Me he evitado todo lo que tienes tú en cada <if>; ya que tú lo que haces es sustituir el elemento de <numeros> por 0 una vez lo guardas en el otro vector, algo que no es necesario para que el programa funcione correctamente, pero que si te lo piden así está bien hecho. - Opción 2: No mostrar los elementos que sean 0. En este caso no puedes usar tu código: Código
Eso dentro del primer for para imprimir los numeros pares pero no se como. Para que esta segunda opción funcione tendrías que hacerlo con un <for> para recorrer el vector como antes y un <if> dentro para no imprimir los valores que sean 0. El código sería de este estilo: Código
La opción más correcta es la primera pero te muestro la segunda para que veas que es posible plantear tu idea. Título: Re: Duda . Publicado por: Estudiante000000 en 19 Noviembre 2018, 01:51 am Tienes varias opciones para hacerlo: - Opción 1: Usar contadores independientes para cada vector. En ese caso te quedaría algo así: Código De esta manera cada vector <pares> e <impares> tendrán los elementos en sus 5 primeras posiciones (si imprimes hasta 10 verás que las 5 últimas ya no tienen nada). Me he evitado todo lo que tienes tú en cada <if>; ya que tú lo que haces es sustituir el elemento de <numeros> por 0 una vez lo guardas en el otro vector, algo que no es necesario para que el programa funcione correctamente, pero que si te lo piden así está bien hecho. - Opción 2: No mostrar los elementos que sean 0. En este caso no puedes usar tu código:En este caso muestras los elementos MIENTRAS un elemento no sea 0, entonces en cuanto encuentra un 0 va a dejar de imprimir. Además el tema de que se repita el 2 continuamente es porque al usar un <while> el incremento <i++> del <for> tienes que hacerlo explícitamente dentro del <while>. Para que esta segunda opción funcione tendrías que hacerlo con un <for> para recorrer el vector como antes y un <if> dentro para no imprimir los valores que sean 0. El código sería de este estilo: Código
La opción más correcta es la primera pero te muestro la segunda para que veas que es posible plantear tu idea. Listo logre hacerlo , muchas gracias por tu ayuda y tus explicaciones estoy aprendiendo mucho gracias a ti de verdad mil gracias , asi me quedo el codigo Código
Título: Re: Duda . Publicado por: K-YreX en 19 Noviembre 2018, 01:56 am Cierto, no me había dado cuenta que podías imprimirlos de dos en dos :xD
Ya para terminar de pulir ese código: - En vez de ir poniendo un <cout> para cada salto de línea puedes poner por ejemplo: Código Y ya tienes ahí dos saltos de línea. - O declarar una constante para el tamaño de los vectores por si más adelante quieres guardar 20 números, sólo tienes que modificarlo en un sitio: Código Y usar la variable <TAM> en el programa donde has usado el <10> directamente. Así consigues programas más genéricos. Título: Re: Duda . Publicado por: Estudiante000000 en 19 Noviembre 2018, 02:03 am Cierto, no me había dado cuenta que podías imprimirlos de dos en dos :xD Ya para terminar de pulir ese código: - En vez de ir poniendo un <cout> para cada salto de línea puedes poner por ejemplo: Código Y ya tienes ahí dos saltos de línea. - O declarar una constante para el tamaño de los vectores por si más adelante quieres guardar 20 números, sólo tienes que modificarlo en un sitio: Código Y usar la variable <TAM> en el programa donde has usado el <10> directamente. Así consigues programas más genéricos. Ahora que lo pienso ahora si , me piden un programa que me pida 10 numeros y yo los ingrese , ahi si deberia utilizar la opcion 1 que me diste ? , porque ya no podria colocar como hice imprimirlos de dos en dos porque ya no estaran ordenados asi como los puse en el vector numeros correcto ? Título: Re: Duda . Publicado por: K-YreX en 19 Noviembre 2018, 02:14 am Exacto, no puedes dar por hecho que van a estar ordenados.
Además para no desperdiciar posiciones del vector, es más correcto introducirlos seguidos que no introducir un valor cada 2 o cada n posiciones. Título: Re: Duda . Publicado por: Estudiante000000 en 19 Noviembre 2018, 02:41 am Exacto, no puedes dar por hecho que van a estar ordenados. Además para no desperdiciar posiciones del vector, es más correcto introducirlos seguidos que no introducir un valor cada 2 o cada n posiciones. - Opción 1: Usar contadores independientes para cada vector. En ese caso te quedaría algo así: Código int contadorPar = 0, contadorImpar = 0; for(i = 0; i < 10; i++) if(numeros % 2 == 0){ pares[contadorPar] = numeros; contadorPar++; } else{ impares[contadorImpar] = numeros; contadorImpar++; } De esta manera cada vector <pares> e <impares> tendrán los elementos en sus 5 primeras posiciones (si imprimes hasta 10 verás que las 5 últimas ya no tienen nada). Me he evitado todo lo que tienes tú en cada <if>; ya que tú lo que haces es sustituir el elemento de <numeros> por 0 una vez lo guardas en el otro vector, algo que no es necesario para que el programa funcione correctamente, pero que si te lo piden así está bien hecho. Utilize esta opcion y me parece mucho mejor , gracias a esto no es necesario usar variables auxiliares ¿Porque? , y Bueno el codigo me quedo asi Código
Me parece bien queda asi , si ingreso 10 numeros ejemplo. Numero 1 = 5 Numero 2 = 7 Numero 3 = 9 Numero 4 = 10 Numero 5 = 3 Numero 6 = 5 Numero 7 = 19 Numero 8 = 20 Numero 9 = 12 Numero 10 = 7 Me saldria en la consola asi : Numeros Pares 10 20 12 0 0 0 0 0 0 0 Numeros Impares 5 7 9 3 5 19 7 0 0 0 ¿Como podria no imprimir esos ceros? Título: Re: Duda . Publicado por: K-YreX en 19 Noviembre 2018, 02:45 am Primero:
Utilize esta opcion y me parece mucho mejor , gracias a esto no es necesario usar variables auxiliares ¿Porque? , y Bueno el codigo me quedo asi Porque lo que hacías antes era intercambiar el valor de la posición <i> de <pares> (o <impares>) por la de <numeros> pero con guardar el valor de <numeros> en <pares> o <impares> es suficiente. Tú al usar una variable auxiliar estabas por decirlo de alguna manera borrando cada elemento una vez que trabajabas con él, pero no era necesario. Segundo: Código Aquí estás repitiendo dos veces el mismo <if>, borra uno de ellos. Y no imprimir 0 te doy una pista: al finalizar el <for> donde clasificas los números en <pares> e <impares>; <contadorPar> vale la cantidad de dígitos pares y <contadorImpar> de la misma manera vale la cantidad de dígitos impares. Úsalos en los últimos bucles <for>. Título: Re: Duda . Publicado por: Estudiante000000 en 19 Noviembre 2018, 03:10 am Primero: Porque lo que hacías antes era intercambiar el valor de la posición <i> de <pares> (o <impares>) por la de <numeros> pero con guardar el valor de <numeros> en <pares> o <impares> es suficiente. Tú al usar una variable auxiliar estabas por decirlo de alguna manera borrando cada elemento una vez que trabajabas con él, pero no era necesario. Segundo: Código Aquí estás repitiendo dos veces el mismo <if>, borra uno de ellos. Y no imprimir 0 te doy una pista: al finalizar el <for> donde clasificas los números en <pares> e <impares>; <contadorPar> vale la cantidad de dígitos pares y <contadorImpar> de la misma manera vale la cantidad de dígitos impares. Úsalos en los últimos bucles <for>. Muchisimas gracias por fin todas las dudas de este programa estan aclaradas , me quedo asi el codigo. Código
Y para finalizar en los for entonces hacer un for de esta manera esta mal cierto Código
Título: Re: Duda . Publicado por: K-YreX en 19 Noviembre 2018, 03:30 am Y para finalizar en los for entonces hacer un for de esta manera esta mal cierto Código
Sí, sería incorrecto, en primer lugar porque el segundo campo del <for> que debería ser una condición, no lo es, es una asignación. El funcionamiento de ese <for> es el siguiente: entras en el <for> y se asigna el valor inicial <i = 0>. Se llega a la condición que como no es una condición sino una asignación se ejecuta entonces ahora <i = 9>. Se ejecuta el interior del bucle. Termina una iteración y se produce el incremento <i = 10>, se llega a la condición de nuevo y... <i = 9>. Se vuelve a ejecutar el bucle. Conclusión: tenemos un bucle infinito en el que i siempre vale 9. Resumen: <a = b> asignas a <a> el valor de <b> <a == b> comparas que el valor de <a> y el de <b> sean iguales Quieres probarlo? Simple, ejecuta esto (no hace falta que modifiques nada) y podrás ver los valores de i por pantalla (no esperes que acabe): Código
En todo caso la otra opción (haciendo correctamente una condición y no una asignación) sería usando dos iguales, tal que así: Código Resultado de este código: NINGUNO. Empieza el bucle <i = 0>, llegamos a la condición... ¿<i == 9>? No, <i = 0>; entonces sale del bucle. Nunca llegará a ejecutarse lo que haya dentro del bucle. Título: Re: Duda . Publicado por: Estudiante000000 en 19 Noviembre 2018, 03:52 am Sí, sería incorrecto, en primer lugar porque el segundo campo del <for> que debería ser una condición, no lo es, es una asignación. El funcionamiento de ese <for> es el siguiente: entras en el <for> y se asigna el valor inicial <i = 0>. Se llega a la condición que como no es una condición sino una asignación se ejecuta entonces ahora <i = 9>. Se ejecuta el interior del bucle. Termina una iteración y se produce el incremento <i = 10>, se llega a la condición de nuevo y... <i = 9>. Se vuelve a ejecutar el bucle. Conclusión: tenemos un bucle infinito en el que i siempre vale 9. Resumen: <a = b> asignas a <a> el valor de <b> <a == b> comparas que el valor de <a> y el de <b> sean iguales Quieres probarlo? Simple, ejecuta esto (no hace falta que modifiques nada) y podrás ver los valores de i por pantalla (no esperes que acabe): Código
En todo caso la otra opción (haciendo correctamente una condición y no una asignación) sería usando dos iguales, tal que así: Código Resultado de este código: NINGUNO. Empieza el bucle <i = 0>, llegamos a la condición... ¿<i == 9>? No, <i = 0>; entonces sale del bucle. Nunca llegará a ejecutarse lo que haya dentro del bucle. Mil gracias entendi perfectamente todo lo que me has explicado estoy aprendiendo mucho gracias a tus explicaciones. :D Título: Re: Duda . Publicado por: dariodr01 en 19 Noviembre 2018, 05:00 am Hola, te deberia quedar algo asi:
Salu2. Código
|