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

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda .
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] 3 Ir Abajo Respuesta Imprimir
Autor Tema: Duda .  (Leído 4,933 veces)
K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Duda .
« Respuesta #10 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
  1. int contadorPar = 0, contadorImpar = 0;
  2. for(i = 0; i < 10; i++)
  3.    if(numeros[i] % 2 == 0){
  4.        pares[contadorPar] = numeros[i];
  5.        contadorPar++;
  6.    }
  7.    else{
  8.        impares[contadorImpar] = numeros[i];
  9.        contadorImpar++;
  10.    }
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
  1. while(pares[i]!=0){
  2. cout<<pares[i]<<" ";
  3. }

Eso dentro del primer for para imprimir los numeros pares pero no se como.
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
  1. for(i = 0; i < 10; i++)
  2.    if(pares[i] != 0)
  3.        cout << pares[i] << "  ";

La opción más correcta es la primera pero te muestro la segunda para que veas que es posible plantear tu idea.


En línea

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

Desconectado Desconectado

Mensajes: 38


Ver Perfil
Re: Duda .
« Respuesta #11 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
  1. int contadorPar = 0, contadorImpar = 0;
  2. for(i = 0; i < 10; i++)
  3.    if(numeros[i] % 2 == 0){
  4.        pares[contadorPar] = numeros[i];
  5.        contadorPar++;
  6.    }
  7.    else{
  8.        impares[contadorImpar] = numeros[i];
  9.        contadorImpar++;
  10.    }
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
  1. for(i = 0; i < 10; i++)
  2.    if(pares[i] != 0)
  3.        cout << pares[i] << "  ";

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
  1. #include<iostream>
  2. #include<cstdlib>
  3.  
  4. using namespace std;
  5.  
  6. int main(){
  7.  
  8. int numeros[10] = {1,2,3,4,5,6,7,8,9,10};
  9. int pares[10]={0};
  10. int impares[10]={0};
  11. int i,j,aux1,aux2;
  12.  
  13. for(i=0;i<10;i++){
  14. if(numeros[i]%2==0){
  15. aux1=numeros[i];
  16.    numeros[i]=pares[i];
  17.    pares[i]=aux1;
  18. }
  19. else {
  20. aux2=numeros[i];
  21. numeros[i]=impares[i];
  22. impares[i]=aux2;
  23. }
  24. }
  25.  
  26.      cout<<"Numeros Pares ";
  27.      cout<<"\n";
  28.      cout<<"\n";
  29.      for(i=1;i<10;i=i+2){
  30.       cout<<pares[i]<<" ";
  31.      }
  32.  
  33.  
  34.  
  35.      cout<<"\n";
  36.      cout<<"\n";
  37.      cout<<"Numeros Impares ";
  38.      cout<<"\n";
  39.      cout<<"\n";
  40.      for(i=0;i<10;i=i+2){
  41.       cout<<impares[i]<<" ";
  42.      }
  43.  
  44.  
  45. cin.get();
  46. return 0;
  47. }
  48.  
  49.  
  50.  
  51.  


En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Duda .
« Respuesta #12 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
  1. cout << "Numeros Impares " << endl << endl;
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
  1. const int TAM = 10;
Y usar la variable <TAM> en el programa donde has usado el <10> directamente. Así consigues programas más genéricos.
En línea

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

Desconectado Desconectado

Mensajes: 38


Ver Perfil
Re: Duda .
« Respuesta #13 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
  1. cout << "Numeros Impares " << endl << endl;
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
  1. const int TAM = 10;
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 ?
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Duda .
« Respuesta #14 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.
En línea

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

Desconectado Desconectado

Mensajes: 38


Ver Perfil
Re: Duda .
« Respuesta #15 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
  1. #include<iostream>
  2. #include<cstdlib>
  3.  
  4. using namespace std;
  5.  
  6. int main(){
  7.  
  8.  
  9. int numeros[10];
  10. int pares[10]={0};
  11. int impares[10]={0};
  12. int i;
  13. int contadorPar=0 , contadorImpar=0;
  14.  
  15.  
  16.    for(i=0;i<10;i++){
  17.     cout<<i+1<<"-Digite un numero = ";
  18.     cin>>numeros[i];
  19.    }
  20.  
  21.  
  22.  
  23. for(i=0;i<10;i++){
  24. if(numeros[i]%2==0){
  25.  if(numeros[i] % 2 == 0){
  26.              pares[contadorPar] = numeros[i];
  27.              contadorPar++;
  28.    }
  29.  
  30. }
  31. else {
  32. impares[contadorImpar] = numeros[i];
  33.            contadorImpar++;
  34. }
  35. }
  36.  
  37.      cout<<"Numeros Pares ";
  38.      cout<<"\n";
  39.      cout<<"\n";
  40.  
  41.      for(i=0;i<10;i=i++){
  42.       cout<<pares[i]<<" ";
  43.      }
  44.  
  45.  
  46.  
  47.      cout<<"\n";
  48.      cout<<"\n";
  49.      cout<<"Numeros Impares ";
  50.      cout<<"\n";
  51.      cout<<"\n";
  52.      for(i=0;i<10;i=i+2){
  53.       cout<<impares[i]<<" ";
  54.      }
  55.  
  56.  
  57. cin.get();
  58. return 0;
  59. }
  60.  

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?



En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Duda .
« Respuesta #16 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
  1. for(i=0;i<10;i++){
  2. if(numeros[i]%2==0){
  3.  if(numeros[i] % 2 == 0)
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>.
« Última modificación: 19 Noviembre 2018, 02:49 am por YreX-DwX » En línea

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

Desconectado Desconectado

Mensajes: 38


Ver Perfil
Re: Duda .
« Respuesta #17 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
  1. for(i=0;i<10;i++){
  2. if(numeros[i]%2==0){
  3.  if(numeros[i] % 2 == 0)
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
  1. #include<iostream>
  2. #include<cstdlib>
  3.  
  4. using namespace std;
  5.  
  6. int main(){
  7.  
  8.    const int TAM =10;
  9. int numeros[TAM];
  10. int pares[TAM]={0};
  11. int impares[TAM]={0};
  12. int i;
  13. int contadorPar=0 , contadorImpar=0;
  14.  
  15.  
  16.    for(i=0;i<TAM;i++){
  17.     cout<<i+1<<"-Digite un numero = ";
  18.     cin>>numeros[i];
  19.    }
  20.  
  21.  
  22.  
  23. for(i=0;i<TAM;i++){
  24. if(numeros[i]%2==0){
  25.              pares[contadorPar] = numeros[i];
  26.              contadorPar++;
  27.    }
  28.  
  29. else {
  30. impares[contadorImpar] = numeros[i];
  31.            contadorImpar++;
  32. }
  33. }
  34.      cout<<"\n";
  35.      cout<<"Numeros Pares ";
  36.      cout<<"\n";
  37.      cout<<"\n";
  38.  
  39.      for(i=0;i<contadorPar;i=i++){
  40.       cout<<pares[i]<<" ";
  41.      }
  42.  
  43.  
  44.  
  45.      cout<<"\n";
  46.      cout<<"\n";
  47.      cout<<"Numeros Impares ";
  48.      cout<<"\n";
  49.      cout<<"\n";
  50.      for(i=0;i<contadorImpar;i=i++){
  51.       cout<<impares[i]<<" ";
  52.      }
  53.  
  54.  
  55. cin.get();
  56. return 0;
  57. }
  58.  


Y para finalizar en los for entonces hacer un for de esta manera esta mal cierto

Código
  1. for(i=0;i=9;i++){
  2. }

En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Duda .
« Respuesta #18 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
  1. for(i=0;i=9;i++){
  2. }

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
  1. #include <iostream>
  2. using namespace std;
  3. int main(){
  4. for(int i = 0; i = 9; i++)
  5. cout << i << endl;
  6. }

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
  1. #include <iostream>
  2. using namespace std;
  3. int main(){
  4. for(int i = 0; i == 9; i++)
  5. cout << "El bucle se ha ejecutado" << endl;
  6. }
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.
En línea

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

Desconectado Desconectado

Mensajes: 38


Ver Perfil
Re: Duda .
« Respuesta #19 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
  1. #include <iostream>
  2. using namespace std;
  3. int main(){
  4. for(int i = 0; i = 9; i++)
  5. cout << i << endl;
  6. }

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
  1. #include <iostream>
  2. using namespace std;
  3. int main(){
  4. for(int i = 0; i == 9; i++)
  5. cout << "El bucle se ha ejecutado" << endl;
  6. }
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
En línea

Páginas: 1 [2] 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Pequeña duda con un comando batch (NUEVA DUDA RELACIONADA)
Scripting
revenge1252 9 9,707 Último mensaje 13 Febrero 2008, 21:41 pm
por revenge1252
Duda duda y duda de Metasploit
Bugs y Exploits
huber_nomas 4 5,739 Último mensaje 17 Febrero 2012, 14:00 pm
por MauroMasciar
Duda facil, [VIDEO QUE EXPLICA MI DUDA]
Diseño Gráfico
Ngeooz 6 8,803 Último mensaje 2 Diciembre 2013, 19:33 pm
por Ngeooz
[DUDA] Cambiar letra de unidad a archivo con un Batch [DUDA] « 1 2 »
Windows
MrMaticool 10 11,164 Último mensaje 12 Febrero 2014, 17:55 pm
por MrMaticool
[DUDA] Crear servidor telnet o ssh (Windows y Linux) y otra duda
Redes
MDd2 4 3,937 Último mensaje 13 Abril 2017, 18:29 pm
por Randomize
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines