Подсчет входного потока - 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; } }
Объяснение кода листинга программы
- Объявлены переменные c, nwhite, nother, ndigit, которые будут использоваться в коде.
- Инициализированы переменные nwhite, nother, ndigit равными нулю.
- Запускается цикл while, который будет выполняться до тех пор, пока символ c не станет равным EOF (End Of File).
- Внутри цикла проверяется значение символа c.
- Если символ c больше или равен '0' и меньше или равно '9', то увеличивается значение переменной ndigit на единицу.
- Если символ c равен ' ' или '\t', то увеличивается значение переменной nwhite на единицу.
- Если символ c равен '\n', то увеличивается значение переменной nwhite на единицу.
- Выводится значение переменной ndigit.
- Выводится значение переменной nwhite.
- Выводится значение переменной nother.
- Значение переменной nwhite сбрасывается в ноль.
- Значение переменной nother сбрасывается в ноль.
- Значение переменной ndigit сбрасывается в ноль.
- Если символ c не равен ' ', '\t' или '\n', то увеличивается значение переменной nother на единицу.
- Цикл while продолжается до тех пор, пока не будет выполнено условие окончания цикла.
- Значение переменной nother сбрасывается в ноль.
- Значение переменной ndigit сбрасывается в ноль.
- Значение переменной nwhite сбрасывается в ноль.
- Значение переменной nother сбрасывается в ноль.
- Значение переменной ndigit сбрасывается в ноль.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д