TransWikia.com

¿Cómo aceptar únicamente un rango de letras y cancelar la entrada de números en C?

Stack Overflow en español Asked on January 4, 2022

Me gustaría que mi código acepte únicamente las opciones disponibles que le doy al usuario por pregunta, por ejemplo, en la primera pregunta que solo sea capaz el usuario de ingresar las letras "a" y "b" y no otras letras. En alguna otra segunda pregunta lo mismo pero con las opciones "a", "b’, "c", "d" y "e".

Agradecería mucho su ayuda y lo siento por tanta pregunta, gracias. ):

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main()
{
    char sexo;
    int suma;

    printf("Indica tu sexo.nna) Masculinonb) Femeninonn");
    scanf(" %c", &sexo);

    switch (sexo){
    case 'a': suma = 50;break;
    case 'A': suma = 50;break;
    case 'b': suma = 30;break;
    case 'B': suma = 30;break;
    }

    system("pause");
    return 0;
}

3 Answers

He realizado el siguiente código que creo puede resolver lo que pretendes:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define MAX_QUESTIONS 2

char *Preguntas[MAX_QUESTIONS] = 
{ 
  "Indica tu sexo.nna) Masculinonb) Femeninonn",
  "Indica tu edad.nna) Menos de 20 añosnb) Entre 20 y 30 añosnnc) Más de 30 añosnn" 
};
                 
char *Respuestas[MAX_QUESTIONS]= 
{
  "abAB",
  "abcABC"  
};

/* Valida si la respuesta es permitida */ 
int IsValidAnswer(char charAnswer, int numQuestion);

int main()
{
    char charAnswer;

    int numQuestion = 0;

    /* Este WHILE nos permite recorrer el cuestionario */
    while (numQuestion != MAX_QUESTIONS)
    {
        int nextQuestion = 0;
        /* Este WHILE formula la pregunta y nos fuerza a dar una respuesta permitida */
        while (!nextQuestion)
        {
            printf("%s", Preguntas[numQuestion]);
            scanf(" %c", &charAnswer);
        
            nextQuestion = IsValidAnswer(charAnswer, numQuestion);
        }
    
        numQuestion++;
    }

    return 0;
}

int IsValidAnswer(char charAnswer, int numQuestion)
{
    for(int i=0; i < sizeof(Respuestas[numQuestion]); i++)
    {
        if (Respuestas[numQuestion][i] == charAnswer) return 1;
    }

    return 0;
}

He creado dos arreglos, uno con las preguntas y otro con las posibles respuestas. Luego ha sido necesario crear una función que determina si la respuesta dada está entre las posibles respuestas, lo que nos simplifica enormemente el código si queremos extender el cuestionario.

El código permite ampliar el cuestionario así como las respuestas posibles para cada pregunta. Se me ocurre que podría crearse otro arreglo que guarde las respuestas dadas por el usuario para evaluarlas.

Espero te ayude en lo que pretendías.

Answered by Antonio S.F. on January 4, 2022

Lo puedes anidar en un for y en el caso de los cases si a y A se comportan igual puedes juntarlos

char sexo;
int suma;
scanf(" %c", &sexo);
int flag = 0;
for (; flag == 1;)
{
    switch(sexo)
    {
        case 'a':
        case 'A':
            suma = 50;
            flag=1;
            break;
        case 'b':
        case 'B':
            suma = 30;
            flag=1;
            break;
        default:
            printf("Indica tu sexo.nna) Masculinonb) Femeninonn");
            scanf(" %c", &sexo);
    }
} 

Answered by Iankos on January 4, 2022

No se si hay alguna forma de poner solo las letras que pones pero puedes poner un do while para que si no poner la opción correcta se repita el ciclo. Tomando tu ejemplo seria algo así.

 #include <stdio.h>
 #include <stdlib.h>
 #include <ctype.h>
            
 int main(){
    char sexo;
    int suma;

printf("Indica tu sexo.nna) Masculinonb) Femeninonn");
    
  do{

  scanf(" %c", &sexo);

  if(sexo!='a'&&'A'&& sexo!='b'&&'B'){
     printf("Opción incorrectaa"); //la a es para que suene un aviso
    }

}while(sexo!='a'&&'A'&& sexo!='b'&&'B');
    
 switch (sexo){
 case 'a': suma = 50;break;
 case 'A': suma = 50;break;
 case 'b': suma = 30;break;
 case 'B': suma = 30;break;
}
    
 system("pause");
 return 0;
}

En el segundo caso en el do while pones un rango de letras en vez de poner letra por letra. Algo asi

do{
//El codigo que quieras
}while(sexo<'a'&&sexo>'e');

Answered by user184475 on January 4, 2022

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP