[ Foro de C ]

Bucle infinito no deseado

04-Oct-2020 05:38
Invitado (Ken_v12)
0 Respuestas

Buenas, soy nuevo en C y estoy aprendiendo en un curso universitario.
Tengo problemas con un código, el problema es que entra en un bucle infinito cuando el usuario digita una letra en lugar de un número en las opciones de las funciones. El programa debería imprimir en pantalla que la entrada no es válida y que lo intente nuevamente. Adjunto el código

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <unistd.h>

#define USER "USER"

#define LEN 20 // Tamaño del arreglo para las palabras mágicas
#define MAX_INTENTOS 3 // Número máximo de intentos para la palabra mágica
#define WAIT 3 // Tiempo de espera inicial
#define SIZE 5 // Tamaño de circulo_t

enum control_e {
   salir = 0,
   continuar,
   siguiente,
};

typedef struct {
 float radio; // Radio del circulo
 float x;     // Coordenada X
 float y;     // Coordenada Y
 char nombre[10];
} circulo_t;

// Círculos para el cálculo de intersecciones
circulo_t circulos[] = {
 {.radio = 100.00, .x = 100, .y = 0, "Alfa"},
 {.radio = 200.00, .x = 100, .y = -200, "Beta"},
 {.radio = 50.00, .x = 300, .y = 100, "Gamma"},
 {.radio = 55.00, .x = 200, .y = 200, "Delta"},
 {.radio = 150.00, .x = -300, .y = -100, "Epsilon"},
};

// Se inicia el main
int main(void) {

   printf("Bienvenido %s\n", getenv(USER));

   char magic[LEN];
   memset(magic, 0, sizeof(magic));

   char keywords[][LEN] = {"hola"}; // Palabra mágica

   int control = salir; // Se define control = salir = 0

   int error_count = 0; // Para determinar el número de veces que se intenta la palabra mágica

   int valor1 = 0, valor2 = 0; // Se definen las variables para las funciones de enteros

   float val1 = 0; // Valor flotante para las funciones de temperatura

   float radio1 = 0, coordx = 0, coordy = 0; // Valores flotantes para la función de círculos que se intersecan


   do {
       printf("Introduzca la palabra mágica: ");
       scanf("%19[^\n]%*c", magic); // Se limita a 19 caracteres la entrada de una palabra mágica
       printf("Palabra utilizada: %s\n", magic);

       // En caso de acertar la palabra se pasa a la selección de funciones
       if ( strcmp(magic, keywords[0]) == 0 ) {
           printf("Felicidades la palabra %s es la ganadora\n\n", magic);
           control = siguiente; // Para pasar a la selección de funciones
       }else { // Para el caso de no acertar la palabra el usuario lo vuelve a intentar
           int wait_counter = WAIT;
           printf("Mala suerte la palabra %s era la ganadora. Intento %d\n, espere %d segundos\n", keywords[0], ++error_count, wait_counter+error_count);
           while (wait_counter+error_count > 0) { // Sumador de un segundo en el tiempo de espera de 3 segundos por cada intento fallido
               sleep(1);
               printf("Vuelva a intentarlo.\nEsperando... %d segundos\n", --wait_counter+error_count);
           }
           control = continuar;

           if (error_count >= MAX_INTENTOS) // Después de 3 intentos no lo puede volver a intentar
       {
           printf("Máximo de intentos alcanzados (%d), buena suerte para la próxima.\n", error_count);
           return 0; // Se detiene el programa
       }

       }
   } while (control == continuar);

   // Menú de funciones del Laboratorio 5
   do {

       int funcion = 0; // Para escoger las funciones que se desean

       printf("Defina qué desea hacer:\n 1. Suma    2. Resta    3. Multiplicación    4. División    5. Residuo    6. Conversión grados Fahrenheit-Celsius\n ");
       printf("7. Conversión grados Celsius-Fahrenheit    8. Cálculo de intersección de círculos    9. Salir\n");
       scanf("%d", &funcion);
       printf("Función escogida: %d\n", funcion);

       if (funcion == 1) // Al escoger 1 se inicia la suma
       {
           printf("Introduzca los valores que desea sumar separados por un espacio:\n");
           scanf("%d %d", &valor1, &valor2);

           int suma, a, b; // Función suma
           a=valor1;
           b=valor2;
           suma=a+b;

           printf("El resultado de %d + %d es %d:\n\n", valor1, valor2, suma);
           control = siguiente; // Para volver al menú
           continue;

       }else if (funcion == 2) // Al escoger 2 se inicia la resta
       {
           printf("Introduzca los valores que desea restar separados por un espacio:\n");
           scanf("%d %d", &valor1, &valor2);

           int resta, a, b; // Función resta
           a=valor1;
           b=valor2;
           resta=a-b;

           printf("El resultado de %d - %d es %d:\n\n", valor1, valor2, resta);
           control = siguiente; // Para volver al menú
           continue;

       }else if (funcion == 3) // Al escoger 3 se inicia la multiplicación
       {
           printf("Introduzca los valores que desea multiplicar separados por un espacio:\n");
           scanf("%d %d", &valor1, &valor2);

           int mult, a, b; // Función de multiplicación
           a=valor1;
           b=valor2;
           mult=a*b;

           printf("El resultado de %d x %d es %d:\n\n", valor1, valor2, mult);
           control = siguiente; // Para volver al menú
           continue;

       }else if (funcion == 4) // Al escoger 4 se inicia la división
       {
           printf("Introduzca los valores que desea dividir separados por un espacio:\n");
           scanf("%d %d", &valor1, &valor2);

           int div, a, b; // Función de división
           a=valor1;
           b=valor2;
           div=a/b;

           printf("El resultado de %d / %d es %d:\n\n", valor1, valor2, div);
           control = siguiente; // Para volver al menú
           continue;

       }else if (funcion == 5) // Al escoger 5 se inicia el cálculo del residuo
       {
           printf("Introduzca los valores que desea dividir y calcular el residuo separados por un espacio:\n");
           scanf("%d %d", &valor1, &valor2);

           int res, a, b; // Función del residuo
           a=valor1;
           b=valor2;
           res=a%b;

           printf("El residuo de %d / %d es: %d\n\n", valor1, valor2, res);
           control = siguiente; // Para volver al menú
           continue;

       }else if (funcion == 6) // Al escoger 6 se inicia la conversión de °F a °C
       {
           printf("Introduzca el valor de grados Fahrenheit que desea convertir a grados Celsius:\n");
           scanf("%f", &val1);

           float converFC, a; // Función de la conversión
           a=val1;
           converFC=(a-32)/1.8;

           printf("La conversión de %.4f °F es: %.4f °C\n\n", val1, converFC); // Se imprime en pantalla el resultado con 4 decimales
           control = siguiente; // Para volver al menú
           continue;

       }else if (funcion == 7) // Al escoger 7 se inicia la conversión de °C a °F
       {
           printf("Introduzca el valor de grados Celsius que desea convertir a grados Fahrenheit:\n");
           scanf("%f", &val1);

           float converCF, a; // Función de conversión
           a=val1;
           converCF=(a*1.8)+32;

           printf("La conversión de %.4f °C es: %.4f °F\n\n", val1, converCF); // Resultado con 4 decimales
           control = siguiente; // Para volver al menú
           continue;

       }else if (funcion == 8) // Al escoger 8 se inicia el cálculo de intersecciones entre círculos
       {
           printf("Escriba el radio del círculo: "); // Se pide al usuario el valor del radio
           scanf("%f", &radio1); // Se guarda el valor del radio
           printf("Escriba la coordenada x: "); // Se solicita la coordenada x
           scanf("%f", &coordx); // Se guarda la coordenada x
           printf("Escriba la coordenada y: "); // Se pide la coordenada y
           scanf("%f", &coordy); // Se guarda la coordenada y

           for(int i = 0; i < SIZE; i++) { // Función que permite el cálculo de las intersecciones

               // Distancia entre los centros de los círculos
               float dist, a, b;
               a=coordx;
               b=coordy;
               dist=sqrt((a-circulos[i].x)*(a-circulos[i].x)+(b-circulos[i].y)*(b-circulos[i].y));

               // Suma de los radios de los círculos
               float dist2, r1, r2;
               r1=radio1;
               r2=circulos[i].radio;
               dist2=r1+r2;

               // Condición en la que los círculos intersecan
               // Se imprime en pantalla los círculos con los que interseca
               if (dist<dist2) {
               printf("\nEl círculo dado por el usuario interseca con el círculo %s\n\n", circulos[i].nombre);
               }
               else // Si no interseca se imprime en pantalla con cuales no lo hace
               {
               printf("El círculo definido dado por el usuario NO interseca con el círculo %s\n\n", circulos[i].nombre);

               }
               control = siguiente; // Para volver al menú
               continue;

             }

       }else if (funcion == 9) // si escoge 9 (salir) sale a la terminal
       {
           printf("Hasta pronto %s\n\n", getenv(USER)); // Se despide del usuario al escoger 0 (salir)
           return 0;
           continue;
       }else // En caso de digitar mal una de las opciones se le indica al usuario que debe hacerlo nuevamente
       {
           printf("Opción incorrecta, reinténtelo nuevamente.\n\n");
           control = siguiente; // Para volver al menú
           continue;
       }

   } while (control == siguiente);

}


Pd. La primera parte del programa es que el usuario adivine una palabra mágica, para pasar al problema al que me refiero hay que escribir dicha palabra mágica, la palabra es "hola".




(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.)