Подсчет входного потока - 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 сбрасывается в ноль.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д