Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Error usando FOR y Do-While anidados

Estas en el tema de Error usando FOR y Do-While anidados en el foro de C/C++ en Foros del Web. Código: int main() { //Declaración de variables int liContador, laiNumeros[20]; //Procesamiento for (liContador = 0; liContador < 20; liContador++) { do { //Entrada de datos ...
  #1 (permalink)  
Antiguo 05/03/2015, 17:46
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 16 años
Puntos: 5
Error usando FOR y Do-While anidados

Código:
int main()
{
    //Declaración de variables
    int liContador, laiNumeros[20];

    //Procesamiento
    for (liContador = 0; liContador < 20; liContador++)
    {
        do
        {
            //Entrada de datos
            printf("Ingrese #%d: ", liContador + 1);
            scanf("%d", &laiNumeros[liContador]);

            if (laiNumeros[liContador] > 10 || laiNumeros[liContador] < 1)
                printf("\n\tError!, debe ingresar un valor entre 1 y 10.\n");
        } while (laiNumeros[liContador] > 10 && laiNumeros[liContador] < 1);
    }

    //Salida de datos

    return 0;
}
Hola, quiero un programa que lea 20 números entre el 1 y el 10.
La unica forma que se me ocurre para validar que el valor que se ingresa no es menor que 1 y no es mayor que 11 es usando el DO WHILE para que vuelva a preguntarle al usuario el dato pero, hay un problema!.

El programa sigue ejecutandose aún saliendo el error.

Screenshot del problema:
  #2 (permalink)  
Antiguo 05/03/2015, 21:54
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 12 años, 4 meses
Puntos: 22
Respuesta: Error usando FOR y Do-While anidados

Hola RGT.

Intenta de este modo:
Código C:
Ver original
  1. ...
  2. {
  3.   int con=0, num[20];
  4.   int inOneTen;
  5.  
  6.   do {
  7.     do {
  8.         printf("Ingrese #%d: ", con+1 );
  9.         scanf("%d", &num[con]);
  10.         inOneTen = num[con] >= 1 && num[con] <= 10;
  11.         if (!inOneTen) printf("\n\tError!, debe ingresar un valor entre 1 y 10.\n\n");
  12.     } while (!inOneTen);
  13.     con++;
  14.   } while (con < 20);
  15.  
  16.   ...
  17. }

Saludos.
  #3 (permalink)  
Antiguo 06/03/2015, 00:53
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Error usando FOR y Do-While anidados

Código C++:
Ver original
  1. } while (laiNumeros[liContador] > 10 && laiNumeros[liContador] < 1)

fíjate que ese while se repetirá mientras el valor introducido sea mayor que 10 y menor que 1, algo que, obviamente, nunca va a suceder.

Tienes que cambiar ese and '&&' por un '||' para dejar la comparación exactamente igual a la que usas para sacar el mensaje de error.

Una forma de evitar este tipo de problemas es almacenar el resultado de la comparación en una variable. Así puedes reutilizar dicho resultado de forma sencilla:

Código C++:
Ver original
  1. int main()
  2. {
  3.     //Declaración de variables
  4.     int liContador, laiNumeros[20];
  5.  
  6.     //Procesamiento
  7.     for (liContador = 0; liContador < 20; liContador++)
  8.     {
  9.         int hayError = 0;
  10.         do
  11.         {
  12.             //Entrada de datos
  13.             printf("Ingrese #%d: ", liContador + 1);
  14.             scanf("%d", &laiNumeros[liContador]);
  15.  
  16.             hayError = (laiNumeros[liContador] > 10 || laiNumeros[liContador] < 1);
  17.             if ( hayError )
  18.                 printf("\n\tError!, debe ingresar un valor entre 1 y 10.\n");
  19.         } while ( hayError);
  20.     }
  21.  
  22.     //Salida de datos
  23.  
  24.     return 0;
  25. }

Un saludo
  #4 (permalink)  
Antiguo 07/03/2015, 20:54
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 16 años
Puntos: 5
Pregunta Respuesta: Error usando FOR y Do-While anidados

Cita:
Iniciado por eferion Ver Mensaje
Código C++:
Ver original
  1. } while (laiNumeros[liContador] > 10 && laiNumeros[liContador] < 1)

fíjate que ese while se repetirá mientras el valor introducido sea mayor que 10 y menor que 1, algo que, obviamente, nunca va a suceder.

Tienes que cambiar ese and '&&' por un '||' para dejar la comparación exactamente igual a la que usas para sacar el mensaje de error.

Una forma de evitar este tipo de problemas es almacenar el resultado de la comparación en una variable. Así puedes reutilizar dicho resultado de forma sencilla:

Código C++:
Ver original
  1. int main()
  2. {
  3.     //Declaración de variables
  4.     int liContador, laiNumeros[20];
  5.  
  6.     //Procesamiento
  7.     for (liContador = 0; liContador < 20; liContador++)
  8.     {
  9.         int hayError = 0;
  10.         do
  11.         {
  12.             //Entrada de datos
  13.             printf("Ingrese #%d: ", liContador + 1);
  14.             scanf("%d", &laiNumeros[liContador]);
  15.  
  16.             hayError = (laiNumeros[liContador] > 10 || laiNumeros[liContador] < 1);
  17.             if ( hayError )
  18.                 printf("\n\tError!, debe ingresar un valor entre 1 y 10.\n");
  19.         } while ( hayError);
  20.     }
  21.  
  22.     //Salida de datos
  23.  
  24.     return 0;
  25. }

Un saludo
Hola, gracias por la ayuda amigo.
Otra cosa, sabes o alguien sabe como puedo hacer para saber qué número ha aparecido más veces?, no se me ocurre nada!.
  #5 (permalink)  
Antiguo 08/03/2015, 15:02
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 8 meses
Puntos: 3
Respuesta: Error usando FOR y Do-While anidados

si son 10 valores creare un array int entradas[10]=(0); //en vez de parentesis son corchetes. Luego, cada vez que introduzcas un valor y salgas del do while que has solucionado ya, usas un for que recorrerá los 10 miembros comparando dicho valor, y si lo encuentras o el valor es 0 sales del for. Con eso impides duplicados ya que con comprobar en el for si se encuentra y si es asi modificas una variable, al salir del for, dependiendo del valor de la variable ya sabrás que pasó.
  #6 (permalink)  
Antiguo 08/03/2015, 22:53
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 12 años, 4 meses
Puntos: 22
Respuesta: Error usando FOR y Do-While anidados

Hola.

Código C:
Ver original
  1. ...
  2. #define ELEMENTS 20
  3.  
  4. int main()
  5. {
  6.   int num[ELEMENTS], can[ELEMENTS] = {0};
  7.   int i, maximo=0, inOneTen;
  8.  
  9.   for(i=0; i < ELEMENTS; i++) {
  10.     do {
  11.         printf("Ingrese #%d: ", i+1 );
  12.         scanf("%d", &num[i]);
  13.         inOneTen = num[i] >= 1 && num[i] <= 10;
  14.         if (!inOneTen) printf("\n\tError!, debe ingresar un valor entre 1 y 10.\n\n");
  15.     } while (!inOneTen);
  16.     can[num[i]]++;
  17.   }
  18.  
  19.   for(i=0; i<ELEMENTS; i++) if (can[i] > maximo) maximo = i;
  20.  
  21.   printf("\nEl numero mas ingresado es %d con %d apariciones\n", maximo, can[maximo]);
  22.   ...
  23. }

Saludos.
  #7 (permalink)  
Antiguo 09/03/2015, 10:43
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 16 años
Puntos: 5
Respuesta: Error usando FOR y Do-While anidados

Cita:
Iniciado por ecfisa Ver Mensaje
Hola.

Código C:
Ver original
  1. ...
  2. #define ELEMENTS 20
  3.  
  4. int main()
  5. {
  6.   int num[ELEMENTS], can[ELEMENTS] = {0};
  7.   int i, maximo=0, inOneTen;
  8.  
  9.   for(i=0; i < ELEMENTS; i++) {
  10.     do {
  11.         printf("Ingrese #%d: ", i+1 );
  12.         scanf("%d", &num[i]);
  13.         inOneTen = num[i] >= 1 && num[i] <= 10;
  14.         if (!inOneTen) printf("\n\tError!, debe ingresar un valor entre 1 y 10.\n\n");
  15.     } while (!inOneTen);
  16.     can[num[i]]++;
  17.   }
  18.  
  19.   for(i=0; i<ELEMENTS; i++) if (can[i] > maximo) maximo = i;
  20.  
  21.   printf("\nEl numero mas ingresado es %d con %d apariciones\n", maximo, can[maximo]);
  22.   ...
  23. }

Saludos.
Hola hermano, gracias por ayudarme.
pero, podrías explicarme como lo hiciste?, trato de entender y aprender a hacerlo por mí mismo.
  #8 (permalink)  
Antiguo 09/03/2015, 10:50
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Error usando FOR y Do-While anidados

Código C:
Ver original
  1. can[num[i]]++;

La variable "can" tiene 10 elementos, uno por cada cifra. Inicialmente se inicializan todas sus posiciones a 0. Cada vez que introduces un número incrementas el índice de "can" correspondiente ( el 0 si se introduce un 0, el 1 si se introduce un 1, ...). Tras estas iteraciones, en can[0] tendrás un valor equivalente al número de 0s, en can[1] el número total de 1s y así. Finalmente, recorres "can" y te quedas con el índice que tiene el valor más alto y listo.

Por cierto, así a bote pronto:

Código C:
Ver original
  1. for(i=0; i<ELEMENTS; i++) if (can[i] > maximo) maximo = i;

si máximo almacena el índice... el chequeo "can[i]>maximo" no es correcto porque estás comparando un índice con un valor... tendría que ser "can[i] > can[maximo]". No?

Etiquetas: anidados, int, numero, programa, usando
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:31.