2015-12-10 2 views
2

Я делаю эту программу с помощью операторов switch, которые будут назначать оценки букв на основе того, будет ли пользователь вводить числа 0 - 10. Если пользователь вводит номер, который не равен 0-10, программа выводит сообщение об ошибке и имеет пользователя повторный ввод. Однако, если пользователь вводит символ, программа будет зацикливаться на случай по умолчанию. Я хочу, чтобы он выводил сообщение об ошибке из случая по умолчанию один раз и заново вводил их, если они вводят символ. Я не уверен, почему он зацикливает случай по умолчанию, когда вводится символ.Почему моя программа не маркирует символы?

#include <stdio.h> 

int main() 
{ 
    int grade; 
    int r; 
    while((r = scanf("%i", &grade)) != EOF) 
    { 
     switch(grade) 
      { 
       case 10: 
       case 9: 
        printf("Your grade is an A\n"); 
        break; 
       case 8: 
        printf("Your grade is a B\n"); 
        break; 
       case 7: 
        printf("Your grade is a C\n"); 
        break; 
       case 6: 
        printf("Your grade is a D\n"); 
        break; 
       case 5: 
       case 4: 
       case 3: 
       case 2: 
       case 1: 
       case 0: 
        printf("Your grade is an F\n"); 
        break; 
       default: 
        printf("Invalid score, please re-enter\n"); 
      } 
    } 

    return 0; 
} 
+1

Подсказка: что возвращает 'scanf', если вы введете что-то недействительное? (Вы можете найти это, прочитав документацию) – immibis

+0

Вы сохраняете возвращаемое значение 'scanf' в' r' (это хорошо), но тогда вы проверяете его только на 'EOF'. Если пользователь вводит то, что не может быть преобразовано в число, 'r' будет равно нулю, в противном случае. –

+0

Тест должен быть '== 1', а не'! = EOF' –

ответ

2

Попробуйте что-то вроде:

#include <stdio.h> 

int main() 
{ 
    int grade; 
    int r=0; 
    while(r != 1) 
    { 
    scanf("%i", &grade); 
     switch(grade) 
      { 
       case 10: 
       case 9: 
        printf("Your grade is an A\n"); 
        r=1 
        break; 
       case 8: 
        printf("Your grade is a B\n"); 
        r=1 
        break; 
       case 7: 
        printf("Your grade is a C\n"); 
        r=1 
        break; 
       case 6: 
        printf("Your grade is a D\n"); 
        r=1 
        break; 
       case 5: 
       case 4: 
       case 3: 
       case 2: 
       case 1: 
       case 0: 
        printf("Your grade is an F\n"); 
        r=1 
        break; 
       default: 
        printf("Invalid score, please re-enter\n"); 
        break; 
      } 
    } 

    return 0; 
} 
+0

О, спасибо, что указали на это o-o – ivan

+0

sigh я продолжаю пропустить что-то плохое редактирование. – ivan

+0

, но мое время ломается всякий раз, когда r = 1, поэтому itll будет бесконечным циклом, пока пользователь не войдет в действительный счет – ivan

0

Причина ваш код всегда петель, потому что нет никакого способа, чтобы выйти из вашего while, кроме как убить программу. Помните, что break вырывается из самого внутреннего switch или цикла.

Самый чистый способ выйти из нескольких уровней - использовать флаг. Один из способов сделать то, что вы хотите, как это:

bool valid_grade = false; 
while(!valid_grade && (r = scanf("%i", &grade)) != EOF) 
{ 
    valid_grade = true; 
    switch(grade) 
     { 
      case 10: 

      // unchanged from your code 

      default: 
       valid_grade = false; 
       printf("Invalid score, please re-enter\n"); 
     } 
} 
+0

Это работает, но он выйдет из программы после обнаружения неверных данных. Я в основном смущен тем, как я получил бы его, чтобы правильно очистить данные, и продолжайте спрашивать пользователя о вводе до тех пор, пока EOF – retrohelix94

+0

@ retrohelix94 не будет продолжать спрашивать, есть ли недопустимый вход, а затем выйти, как только он получит правильный ввод. Разве это не то, что вы хотите? – Adam

1

Это очистит входной буфер на недопустимом ввод и позволяет повторить попытку.

#include <stdio.h> 

int main() 
{ 
    int grade; 
    int r; 
    while((r = scanf("%i", &grade)) != EOF) 
    { 
     if (r != 1) {//r == 1 is successful input of integer 
      grade = -1;//reset grade on invalid input 
     } 
     switch(grade) 
     { 
      case 10: 
      case 9: 
       printf("Your grade is an A\n"); 
       break; 
      case 8: 
       printf("Your grade is a B\n"); 
       break; 
      case 7: 
       printf("Your grade is a C\n"); 
       break; 
      case 6: 
       printf("Your grade is a D\n"); 
       break; 
      case 5: 
      case 4: 
      case 3: 
      case 2: 
      case 1: 
      case 0: 
       printf("Your grade is an F\n"); 
       break; 
      default: 
       printf("Invalid score, please re-enter\n"); 
       while (getchar() != '\n');//clear input buffer 
     } 
    } 
    return 0; 
} 
Смежные вопросы