[ Foro de C++ ]

2 condiciones en bucle while crea problema

14-Dec-2021 21:11
Invitado (Jpj)
5 Respuestas

Hola,

Tengo un problema cuando pongo 2 condiciones en un bucle. A ver si alguien me podría ayudar.

- Quiero preguntar 10 veces por números. Si llego a 10 no quiero salir del bucle.
- Si el número introducido es un 0 quiero salir del bucle.


Mi problema es el siguiente. No he sido capaz de meter las dos condiciones en el bucle while, si incluyo las dos en el bucle while no me da el resultado que quiero (si introduzco cero no sale del bucle y me permite escribir más de 10 números) pero me gustaría saber por qué.

   Si pongo solamente la condición while (i < 10) funciona. Sale del bucle al introducir 10 valores.
   Si pongo solamente la condición while (tabla[i] !=0) funciona. Sale del bucle al escribir un 0.

Si pongo las dos juntas con un OR no funciona ninguna de las dos condiciones. No sale fuera del bucle al poner un 0 o introducir más de 10 valores. La verdad es que no sé por qué. Una solución que he encontrado es un poner un if dentro del bucle para ver si el valor de tabla[i] == 0, pero me gustaría tener las dos condiciones dentro del bucle, o si no se puede saber por qué no se puede.

Un saludo.


int main() { 
int i=0, tabla[10];

while (i < 10 || tabla[i] !=0){
    printf("numero: ");
    scanf("%d",&tabla[i]);
    i++;
}

printf("fuera del bucle");

return 0;

}


 


17-Dec-2021 00:09
Nacho Cabanes (+84)

Debes cambiar ese "o" (||) por un "y" (&&), para que se repite sólo mientras todo sea correcto, y salga en cuanto una de las dos condiciones no se cumpla.


18-Dec-2021 10:19
Invitado (jpj)

Hola,

gracias por la resouesta. Ahora que lo dices tiene sentido que sea && pero de todas formas cambio || por && y sigue sin funcionar correctamente. Si pongo un 0 no sale fuera del bucle y no sale del bucle necesariamente después de introducir 10 valores.

¿Alguna idea más?


18-Dec-2021 12:19
Invitado (jpj)

Hola,

Creo que he dado con el problema. Como los valores de tabla no están inicializados una vez se incrementa "i" el bucle comprueba las condiciones y como aun no se ha hecho el scan no se puede saber que valor tiene, si 0 u otro, por lo tanto no funciona como espero.

He inicializado los 10 valores en 1 y entonces sí funciona bien.

¿Hay alguna solución mejor a inicializar los 10 valores en 1?

int i=0, tabla[10] {1,1,1,1,1,1,1,1,1,1};


20-Dec-2021 11:49
Nacho Cabanes (+84)

Efectivamente, no debes comprobar el valor de tabla[i] antes de asignarle un valor, porque no tienes garantizado lo que contendrá.

Yo convertiría el bucle en un do-while, por eso de que debes leer al menos un valor. Y usaría una variable temporal, en vez de guardar directamente en el array, porque si el usuario introduce un 0, no quiere decir que le interese ese dato, sino que desea terminar.

Es decir, en vez de tu propuesta


#include <stdio.h>

int main() {
    int i=0, tabla[10];
    
    while (i < 10 && tabla[i] !=0){
       printf("numero: ");
       scanf("%d",&tabla[i]);
       i++;
    }
    
    printf("fuera del bucle");
    
    return 0;

}



yo haría algo como


#include <stdio.h>

int main() 
{
    int cantidad = 0;
    int dato;
    int tabla[10];
    
    do
    {
        printf("numero: ");
        scanf("%d",&dato);
        if (dato != 0)
        {
            tabla[cantidad] = dato;
            cantidad++;
        }
    }
    while (cantidad < 10 && dato !=0);
    
    printf("fuera del bucle");
    return 0;
}


 


21-Dec-2021 17:52
Invitado (jpj)

Muchas gracias por la ayuda!
Quería dejar el bucle con las dos condiciones porque me parecía más limpio visualmente, pero al final se ha complicado más de lo que pensaba y ahora me parece más sencillo poner simplemente una condición dentro del bucle para salir si el dato del scan es 0.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)