Подсчет входного потока - C (СИ)

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

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

Здравствуйте. Начал ознакомление с легендарным языком и сразу же столкнулся с, казалось бы, маленькими нюансами, которые вызывают огромные вопросы. Искренне надеюсь на вашу помощь. 1. На первом изображении программа выполняет подсчет вводимых с клавиатуры символов. При этом, счетчик прибавляет +1 каждый раз, когда введенное значение не имеет признака конца файла. Казалось бы все ясно, но возникает вопрос: полученная форма вывода - это результат того, что последнее значение счетчика запоминается в памяти, а компилятор перебирает последовательно каждый отдельный символ в слове? https://i.yapx.ru/BOrD.png 2. Следующее изображение - подсчет строк. Каждый раз, как компилятор встречает перенос, происходит прибавление в счетчике на единицу. Тут вопрос аналогичный, но лишь с привязкой к строкам. https://i.yapx.ru/BOrE.png 3. Последнее изображение касается программы, выполняющей подсчет строк, слов, и символов. Слово в данном случае определяется тем, присутствует ли признак окончания ввода слова (пробел, табуляция или перенос). Консоль опять же выводит такой "накопительный" результат. https://i.yapx.ru/BOrF.png В связи с этим резюмирующий вопрос: каким образом в данном случае все-таки работает компилятор, и почему, когда происходит явное указание признака конца файла после ввода символа (Прим: First^z) то компилятор не прекращает работу команды, а считает и последний символ тоже? Спасибо.

Решение задачи: «Подсчет входного потока»

textual
Листинг программы
   
    int c, nwhite, nother, ndigit;
    ndigit = nwhite = nother = 0;
 
    while ((c = getchar()) != EOF)
    {
        if (c >= '0' && c <= '9' )
        {
            ++ndigit;
        }
        
        else if (c == ' ' || c == '\t') // тут знак табуляции вам точно нужен?
        {
            ++nwhite;
        }
        else if (c == '\n' )
        {
            ++nwhite;
            printf ("Digits = %d\n", ndigit);
            printf ("BreakChars = %d\n", nwhite);
            printf ("Other = %d\n", nother);
            nwhite = 0;
            nother = 0;
            ndigit = 0;
        }
        else 
        {
            ++nother;
        }
    }

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

  1. Объявлены переменные c, nwhite, nother, ndigit, которые будут использоваться в коде.
  2. Инициализированы переменные nwhite, nother, ndigit равными нулю.
  3. Запускается цикл while, который будет выполняться до тех пор, пока символ c не станет равным EOF (End Of File).
  4. Внутри цикла проверяется значение символа c.
  5. Если символ c больше или равен '0' и меньше или равно '9', то увеличивается значение переменной ndigit на единицу.
  6. Если символ c равен ' ' или '\t', то увеличивается значение переменной nwhite на единицу.
  7. Если символ c равен '\n', то увеличивается значение переменной nwhite на единицу.
  8. Выводится значение переменной ndigit.
  9. Выводится значение переменной nwhite.
  10. Выводится значение переменной nother.
  11. Значение переменной nwhite сбрасывается в ноль.
  12. Значение переменной nother сбрасывается в ноль.
  13. Значение переменной ndigit сбрасывается в ноль.
  14. Если символ c не равен ' ', '\t' или '\n', то увеличивается значение переменной nother на единицу.
  15. Цикл while продолжается до тех пор, пока не будет выполнено условие окончания цикла.
  16. Значение переменной nother сбрасывается в ноль.
  17. Значение переменной ndigit сбрасывается в ноль.
  18. Значение переменной nwhite сбрасывается в ноль.
  19. Значение переменной nother сбрасывается в ноль.
  20. Значение переменной ndigit сбрасывается в ноль.

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


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

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

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