Обработка ошибочного ввода данных - C (СИ)

Узнай цену своей работы

Формулировка задачи:

при вводе неверных цифр работает как положено но при вводе других символов (букв, например) выводит error error error error error error error error error error .... зацикливается. хотя подразумевается что выведет error и считает следующие данные подскажите почему, пожалуйста?
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
  char *zodiak_sign[]={"capricorn", "aquarius", "pisces", "aries", "taurus", 
  "gemini","cancer", "leo", "virgo", "libra", "scorpio", "sagittarius", "capricorn"};
  int division[]={22,21,20,21,21,22,22,24,24,24,24,23,22};
  int month, day;
  int i=1;
  
  printf("  Zodiak sign\n\n");
  printf("Enter the date of birth\n\n");
  printf("Example\n");
  printf("01 12 (day month)\n\n");
  
  while (i)
  {
      scanf("%d %d", &day, &month);
      if((day<=31) && (month<=12) && (day>0) && (month>0))
      {
          (day > division[month])? puts(zodiak_sign[month]): puts(zodiak_sign[month-1]);
          printf("\n");
      }
      else
      {
          printf("error\n\n");
      }
  }    
  system("PAUSE");  
  return 0;
}

Решение задачи: «Обработка ошибочного ввода данных»

textual
Листинг программы
  while (1)
  {
      scanf("%d %d", &day, &month);
      if((day<=31) && (month<=12) && (day>0) && (month>0))
      {
          (day > division[month])? puts(zodiak_sign[month]): puts(zodiak_sign[month-1]);
          printf("\n");
      }
      else
      {
          printf("error\n\n");
      }
      day = 0;
      month = 0;
      fflush(stdin);
  }

Объяснение кода листинга программы

  1. while (1) — это бесконечный цикл, который будет выполняться до тех пор, пока пользователь не прервет его выполнение
  2. scanf(%d %d, &day, &month) — это операция ввода двух чисел (дня и месяца) с помощью функции scanf
  3. if((day<=31) && (month<=12) && (day>0) && (month>0)) — это проверка на корректность введенных данных. Дни должны быть меньше или равны 31, месяцы меньше или равны 12, дни и месяцы не могут быть равны нулю
  4. (day > division[month])? puts(zodiak_sign[month]): puts(zodiak_sign[month-1]) — это условная операция, которая выводит знак зодиака в зависимости от введенного месяца. Если день больше значения division[month], то выводится знак зодиака для текущего месяца, иначе выводится знак зодиака для предыдущего месяца
  5. printf(\n) — это операция вывода символа новой строки
  6. printf(error\n\n) — это операция вывода сообщения об ошибке в случае некорректного ввода данных
  7. day = 0; и month = 0; — это очистка переменных после каждой итерации цикла
  8. fflush(stdin) — это очистка буфера ввода, которая может быть вызвана ошибкой ввода данных
  9. division и zodiak_sign — это массивы, которые содержат данные о знаках зодиака и днях в месяце соответственно. Их размер не указан в коде
  10. Ввод данных осуществляется с клавиатуры, а вывод данных происходит в консоль

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.3 из 5
Похожие ответы