0 / 0 / 0
Регистрация: 01.08.2015
Сообщений: 10
1

Подсчет входного потока

07.06.2016, 15:26. Показов 1484. Ответов 5
Метки нет (Все метки)

Здравствуйте.
Начал ознакомление с легендарным языком и сразу же столкнулся с, казалось бы, маленькими нюансами, которые вызывают огромные вопросы. Искренне надеюсь на вашу помощь.

1. На первом изображении программа выполняет подсчет вводимых с клавиатуры символов. При этом, счетчик прибавляет +1 каждый раз, когда введенное значение не имеет признака конца файла. Казалось бы все ясно, но возникает вопрос: полученная форма вывода - это результат того, что последнее значение счетчика запоминается в памяти, а компилятор перебирает последовательно каждый отдельный символ в слове?

https://i.yapx.ru/BOrD.png

2. Следующее изображение - подсчет строк. Каждый раз, как компилятор встречает перенос, происходит прибавление в счетчике на единицу. Тут вопрос аналогичный, но лишь с привязкой к строкам.

https://i.yapx.ru/BOrE.png

3. Последнее изображение касается программы, выполняющей подсчет строк, слов, и символов. Слово в данном случае определяется тем, присутствует ли признак окончания ввода слова (пробел, табуляция или перенос). Консоль опять же выводит такой "накопительный" результат.

https://i.yapx.ru/BOrF.png

В связи с этим резюмирующий вопрос: каким образом в данном случае все-таки работает компилятор, и почему, когда происходит явное указание признака конца файла после ввода символа (Прим: First^z) то компилятор не прекращает работу команды, а считает и последний символ тоже?

Спасибо.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.06.2016, 15:26
Ответы с готовыми решениями:

Подсчет строк входного потока - Ошибка С2065
Компилятор показывает ошибку С2065. Пишу в Microsoft VS 2015. Помогите пожалуйста. #include...

Копирование входного потока в выходной
Нужна помощь по этому вопросу. Непонимаю как именно это все происходит. Т.к. с отладчиком пока не...

Посимвольное копирование входного потока в выходной
В книге Денниса Ритчи есть пример, который посимвольно копирует входной поток в выходной. И похоже...

Копирование входного потока в выходной с условием
Доброго времени суток. Возник затуп. Нужно написать прогу для копирования входного потока в...

5
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
08.06.2016, 05:15 2
Лучший ответ Сообщение было отмечено Witalianno как решение

Решение

Ну так вы же не обнуляете счетчик.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
    
int nl = 0;
char c;
while ((c = getchar())!=EOF)
{  
    if (c == '\n') {
        printf("%d\n", nl);
        nl=0; 
    } 
    else {
        nl++;
    }
}
И когда вы ctrl+z жмете, он выходит из цикла.
1
0 / 0 / 0
Регистрация: 01.08.2015
Сообщений: 10
08.06.2016, 06:50  [ТС] 3
Спасибо большое. Не подскажешь тогда, как тут обнулить счетчик? Что-то не соображу, как действовать в ситуации с несколькими условиями.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
int main (void)
 
{
    int c, nwhite, nother, ndigit;
    ndigit = nwhite = nother = 0;
 
    while ((c = getchar()) != EOF)
    {
        if (c >= '0' && c <= '9' )
        {
            ++ndigit;
        }
        
        else if (c == ' ' || c == '\n' || c == '\t')
        {
            ++nwhite;
        }
       
        else 
        {
            ++nother;
        }
 
        //printf ("Digits = %d\n", ndigit);
        //printf ("BreakChars = %d\n", nwhite);
        //printf ("Other = %d\n", nother);
        //ndigit = 0;
        //nwhite = 0;
        //nother = 0;
    }
}
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
08.06.2016, 08:01 4
Лучший ответ Сообщение было отмечено Witalianno как решение

Решение

Обнулять ваши nwhite, nother, ndigit нужно когда нажата клавиша Enter это знак перевода строки '\n'.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    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 = 0;
            nother = 0;
            ndigit = 0;
        }
        else 
        {
            ++nother;
        }
    }
1
0 / 0 / 0
Регистрация: 01.08.2015
Сообщений: 10
08.06.2016, 14:51  [ТС] 5
Спасибо, вы мне очень помогли. Только вот один нюанс: как бы еще сделать так, чтобы и enter (переход на новую строку - '\n') тоже учитывался счетчиком? Я поэтому и внес его в конструкцию, как одно из условий, как знак разрыва (BreakChars).
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
08.06.2016, 15:08 6
Лучший ответ Сообщение было отмечено Witalianno как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   
    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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.06.2016, 15:08
Помогаю со студенческими работами здесь

Как удалить из входного потока введенное значение?
Доброго времени суток, уважаемы форумчане! просьба помочь вот с чем: прошу пользователя ввести...

Программа для копирования входного потока в выходной
/*программа печатающая ввод на вывод и вместо нескольких пробелов подряд оставляющая только один...

Удалить символ из входного потока вводимых данных
Напишите программу, которая удаляет символ определяется пользователем, из входного потока вводимых....

Поменять во всех словах входного потока следование символов
Я проболел пол семестра, и не могу написать программу по лабораторной. Помогите, пожалуйста, а то...

Копирование входного потока в выходной с заменой каждой строки
У меня получилось так: #include &lt;stdio.h&gt; int main() { int c; ...

Копирование входного потока в выходной с заменой знаков табуляции на \t
Условия: Напишите программу для копирования входного потока в выходной с заменой знаков табуляции...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru