среда, 1 января 2014 г.

Подсчет слов


$ vim words.c

#include <stdio.h>

#define IN 1    /* внутри слова */
#define OUT 0   /* вне слова */

int main(void)
{
        int c, nl, nw, nc, state;

        state = OUT;
        c = 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\nСлов: %d\nСимволов: %d\n", nl, nw, nc);

        return 0;
}

$ cc -g -O0 -Wall -o a.out words.c
$ ./a.out
Hello, my friend!
How are you?
<Ctrl>+<D>
Строк: 2
Слов: 6
Символов: 31


Строка
nl = nw = nc = 0;
устанавливает все три переменные в нуль. Такая запись не является какой-то особой конструкцией и допустима потому, что присваивание есть выражение со своим собственным значением, а операции присваивания выполняются справа налево. Указанная строка эквивалентна
nl = (nw = (nc = 0));


Оператор || означает ИЛИ, так что строка
if (с == ' ' || с == '\n' || с == '\t')
читается как "если с есть пробел, или с есть новая строка, или с есть табуляция". Существует также оператор &&, означающий И. Его приоритет выше, чем приоритет ||. Выражения, связанные операторами && или ||, вычисляются слева направо; при этом гарантируется, что вычисления сразу прервутся, как только будет установлена истинность или ложность условия. Если c есть пробел, то дальше проверять, является значение с символом новой строки или же табуляции, не нужно.


Слово else указывает на альтернативные действия, выполняемые в случае, когда условие, указанное в if, не является истинным. В общем виде условная инструкция записывается так:
if (выражение)
    инструкция1
else
    инструкция2
В конструкции if-else выполняется одна и только одна из двух инструкций. Если выражение истинно, то выполняется инструкция1, если нет, то инструкция2. Каждая из этих двух инструкций представляет собой либо одну инструкцию, либо несколько, заключенных в фигурные скобки.

Комментариев нет:

Отправить комментарий