C/Visual C - ciclo while infinito

 
Vista:
sin imagen de perfil
Val: 17
Ha aumentado su posición en 5 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

ciclo while infinito

Publicado por josue (6 intervenciones) el 17/08/2020 04:14:45
Saludos, he intentado hacer un programa con opciones con switch y while, las opciones son numéricas y todo bien mientras sea un numero, pero si introduzco cualquier otra letra se mete en un ciclo infinito, algún[consejo por favor. El programa debe ir sumando puntos de acuerdo a la opción seleccionada y al final mostrar el total de puntos, si se introduce una opción incorrecta debe mandar un mensaje y repetir la pregunta y como comente antes si se introduce un numero cualquiera funciona bien el while pero si se trata de otro carácter en vez de un numero es cuando se queda en el bucle, decidí hacerlo con opciones numéricas porque hay preguntas con mas de dos respuestas y creí mas sencillo elegir números en lugar de letras. Espero me puedan ayudar, por favor, todas las preguntas ya están elaboradas como la que les muestro en mi código y todas tienen ese bucle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<stdio.h>
#include<stdlib.h>
 
 
int main() {
    int sexo=0,	edad=0, peso=0, diabetes=0, hipertension=0,	fuma=0, epoc=0, cardiovascular=0, inmuno=0, suma=0, total=0;
    char temp;
 
    do {
        printf("Ingrese el numero de la opcion correspondiente \n");
        printf("Cual es su sexo? \n");
        printf("1)Masculino \n");
        printf("2)Femenino \n \n");
        scanf("%d", &temp);
 
        switch(temp){
            case 1:
                sexo =sexo+50;
            break;
            case 2:
                sexo =sexo+30;
            break;
            default:
                printf("No pulsaste una opcion valida \n");
            break;
        }
    }		while(temp <1 || temp>2);
 
    system("cls");
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 265
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

ciclo while infinito

Publicado por dario (82 intervenciones) el 17/08/2020 05:07:30
Hola, tienes algunos errores:

En la linea 7 estas declarando la variable temp como caracter

1
char temp;

Luego en la linea 14 estas leyendo la variable temp en modo int, el %d significa que lo que lees a continuacion es un entero.

1
scanf("%d", &temp);

Ahora las opciones de los case deben ser caracteres, encerrados entre comillas simples: Ejm: case '1'

Espero que te haya ayudado un poco.
Salu2.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 17
Ha aumentado su posición en 5 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

ciclo while infinito

Publicado por josue (6 intervenciones) el 18/08/2020 23:07:09
Ya lo cambie a letras, pero no se como hacer para que el ciclo while solo se repita si la opcion es diferente, porque se repite aun si presiono a o b ¿Me podrias ayudar?...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<stdio.h>
#include<stdlib.h>
 
 
int main() {
    int sexo=0,	edad=0, peso=0, diabetes=0, hipertension=0, fuma=0, epoc=0, cardiovascular=0, inmuno=0, suma=0, total=0;
    char temp;
 
    do {
        printf("Ingrese el numero de la opcion correspondiente \n");
        printf("Cual es su sexo? \n");
        printf("a)Masculino \n");
        printf("b)Femenino \n \n");
        scanf("%s", &temp);
 
        switch(temp[0]){
            case 'A':
            case 'a':
                sexo =sexo+50;
            break;
            case 'B':
            case 'b':
                sexo =sexo+30;
            break;
            default:
                printf("No pulsaste una opcion valida \n");
            break;
        }
    }		while(temp !='a' || temp != 'b');
 
    system("cls");
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 21
Ha aumentado su posición en 3 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

ciclo while infinito

Publicado por Kabuto (5 intervenciones) el 19/08/2020 01:24:21
1
while(temp !='a' || temp != 'b');

Ahí le dices que se repita si temp es distinto de a o de b.

Cuando usas || , es decir OR, basta con que se cumpla una sola de esas condiciones para que todo sea considerado TRUE

Entonces, si pulsas b, ¿b es distinto de a? SI, cierto, TRUE, por lo tanto la condición del while se cumple y se repite.
El programa ni siquiera va a preguntar si además es b es distinto de b, no lo requiere. Puesto que se cumple una de las condiciones, no necesita saber si se cumple la otra para considerar TRUE toda la expresión

Si quieres que solo se considere TRUE cuando se cumplan las dos condiciones, has de usar AND --> &&

1
while(temp !='a' && temp != 'b');

Si ahora pulsas b. ¿b es distinto de a?
Sí, cierto, TRUE... pero como es un AND ahora sí va a evaluar la otra condición.
¿b es distinto de b? No, FALSE.
Como no se han cumplido las dos condiciones, toda la expresión es falsa, y entonces el while no se repetirá.

Recuerda...
TRUE o FALSE = TRUE

TRUE y FALSE = FALSE
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar