Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> В чем отличие подсчета символов во входном потоке 
V
    Опции темы
n199a
  Дата 17.4.2013, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



Не могу понять, чем отличаются эти 2 кода:

Код

/* подсчет строк, слов и символов во ВХОДНОМ потоке */
#include <stdio.h>

#define IN  1    
#define OUT 0 
main()
{
      int c, nl, nw, nc, state;
      
      state = OUT;
      nl = nw = nc = 0;
      while ((c = getchar()) != EOF) {
            ++nc;
            if (c == '\n')
               ++nl;
            if (c == ' ' || c == '\n' || c == '\t')
               state = OUT;
            else if (state == OUT) {
                 state = IN;
                 ++nw;
                 }
            }
            printf("%d %d %d\n", nl, nw, nc);
}


Где именно осуществляется подсчет? Как посмотреть, сколько "он" насчитал?

Код

/* подсчет символов во входном потоке */
main()
{
      long nc;
      
      nc = 0;
      while (getchar() != EOF)
            ++nc;
      printf("%ld\n", nc);
}


Первый код сохраняю как name1.c и компилирую, второй сохраняю как name2.c и компилирую.
Запускаю cmd, ввожу name1 (Enter), печатаю сколько угодно символов и жму Enter, появляется новая строчка и опять можно печатать, и так до бесконечности. Во втором случае с name2 все аналогично. Так чем они отличаются?
PM MAIL   Вверх
Arantir
Дата 17.4.2013, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: нет
Всего: 55



Цитата(n199a @  17.4.2013,  15:27 Найти цитируемый пост)
и так до бесконечности

"Конец файла", он же EOF, на который вы проверяете вводимый символ, в Windows вводится по нажатию Ctrl+Z. Если вам надо завершать цикл по Enter (новая строка), то следует использовать EOL.

Оба варианта кода бесконечно (до нажатия Ctrl+Z) читают вводимые символы. Первый код, судя по всему, помимо общего количества символов, считает еще строки (по количеству переносов строк) и слова (по количеству пробелов/переносов/табуляций).

Добавлено @ 18:00
Цитата(n199a @  17.4.2013,  15:27 Найти цитируемый пост)
Где именно осуществляется подсчет?

Инкремент сразу после ввода символа. Функция getchar() читает один символ из входного потока.

Это сообщение отредактировал(а) Arantir - 17.4.2013, 18:00


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
n199a
  Дата 17.4.2013, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



[quote]
Цитата(n199a @  17.4.2013,  15:27 )
и так до бесконечности

"Конец файла", он же EOF, на который вы проверяете вводимый символ, в Windows вводится по нажатию Ctrl+Z. Если вам надо завершать цикл по Enter (новая строка), то следует использовать EOL.

Оба варианта кода бесконечно (до нажатия Ctrl+Z) читают вводимые символы. Первый код, судя по всему, помимо общего количества символов, считает еще строки (по количеству переносов строк) и слова (по количеству пробелов/переносов/табуляций).

Добавлено @ 18:00
Цитата(n199a @  17.4.2013,  15:27 )
Где именно осуществляется подсчет?

Инкремент сразу после ввода символа. Функция getchar() читает один символ из входного потока.
[quote]
Вот, то, что надо. Вместо EOF надо использовать EOL.  smile 
Кстати, от безысходности я начал тыкать все клавиши, чтобы хоть какая-нибудь табличка вылезла и она вылезла, когда я нажал F6 (аналог Ctrl+Z).


Это сообщение отредактировал(а) n199a - 17.4.2013, 19:18
PM MAIL   Вверх
n199a
Дата 17.4.2013, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



А почему тут когда я ставлю EOL, то не компилируется?
Код

      while (getchar() != EOF)

Код

/* подсчет символов во входном потоке */
#include <stdio.h>

main()
{
      long nc;
      
      nc = 0;
      while (getchar() != EOF)
            ++nc;
      printf("%ld\n", nc);
}


Вылазит ошибка:
Код

`EOL' undeclared (first use in this function)   (Each undeclared identifier is reported only once for each function it appears in.) 

PM MAIL   Вверх
Crafty
Дата 17.4.2013, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

Репутация: 12
Всего: 14



Цитата(n199a @  17.4.2013,  19:23 Найти цитируемый пост)
А почему тут когда я ставлю EOL, то не компилируется?

Что такое EOL?
Если end of line, то в С '\n' является концом строки.

Это сообщение отредактировал(а) Crafty - 17.4.2013, 19:46
PM MAIL   Вверх
n199a
  Дата 17.4.2013, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



Цитата(Crafty @  17.4.2013,  19:44 Найти цитируемый пост)
Что такое EOL?
Если end of line, то в С '\n' является концом строки.

Когда стоит EOF - то надо писать '\n' (перенос на новую строку) и окончание цикла while закончится по нажатию Ctrl+Z (Enter).
Если писать EOL - то не надо использовать '\n' (перенос на новую строку) и окончание цикла while закончится по нажатию Enter.
Я правильно понял?

Нет, не так.
Как будет выглядеть рабочий вариант с использованием EOL?

Код работает так:
1) Запускаю через cmd
2) Ввожу любые символы/знаки
3) Enter
4) Опять ввожу символы/знаки
.... 
И так продолжается, пока не нажмешь Ctrl+Z (потом Enter).

А как сделать так, чтобы вместо Ctrl+Z надо нажимать Enter, чтобы программа завершалась?

Это сообщение отредактировал(а) n199a - 17.4.2013, 20:01
PM MAIL   Вверх
Arantir
Дата 17.4.2013, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: нет
Всего: 55



n199a, EOF и EOL — это только аббревиатуры ("end of file", "end of line").
Нет символа "конец файла", поэтому для этого есть константа EOF. В то же время "конец строки" — это символ '\n'. 
Цикл закончится по нажатию enter, если вы напишите '\n' вместо EOF.

Добавлено через 1 минуту и 16 секунд
Для конца строки так же есть константа std::endl


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
n199a
  Дата 17.4.2013, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



Цитата(Arantir @  17.4.2013,  19:59 Найти цитируемый пост)
n199a, EOF и EOL — это только аббревиатуры ("end of file", "end of line").
Нет символа "конец файла", поэтому для этого есть константа EOF. В то же время "конец строки" — это символ '\n'. 
Цикл закончится по нажатию enter, если вы напишите '\n' вместо EOF.

Вот, то, что надо  smile 

PM MAIL   Вверх
Arantir
Дата 17.4.2013, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: нет
Всего: 55



Цитата(Arantir @  17.4.2013,  18:59 Найти цитируемый пост)
Для конца строки так же есть константа std::endl 

Упс, сори, это не константа, а функция (не бить, я специализируюсь не на c++ =))


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
Crafty
Дата 17.4.2013, 20:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

Репутация: 12
Всего: 14



Я думаю стоит почитать учебник какой-нибудь.
PM MAIL   Вверх
n199a
  Дата 18.4.2013, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



Цитата(Crafty @  17.4.2013,  20:07 Найти цитируемый пост)
Я думаю стоит почитать учебник какой-нибудь. 

Я читаю и по ходу дела возникают вопросы, которые я задаю сюда.
 smile 
Кстати, какой учебник посоветуете для начала? (Керниган,Ритчи - Программирование на C.2 издание.2009)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1053 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.