Язык С



         

Подсчет слов


Четвертая программа из нашей серии полезных программ подсчитывает количество строк, слов и символов, используя при этом весьма широкое определение, что словом является лю- бая последовательность символов, не содержащая пробелов, та- буляций или новых строк. /Это - упрощенная версия утилиты 'WC' системы 'UNIX'/

#DEFINE YES 1 #DEFINE NO 0

MAIN() /* COUNT LINES, WORDS, CHARS IN INPUT */ { INT C, NL, NW, INWORD;

INWORD = NO; NL = NW = NC = 0; WHILE((C = GETCHAR()) != EOF) { ++NC; IF (C == '\N') ++NL; IF (C==' ' \!\! C=='\N' \!\! C=='\T') INWORD = NO; ELSE IF (INWORD == NO) { INWORD = YES; ++NW; } } PRINTF("%D %D %D\N", NL, NW, NC); }

Каждый раз, когда программа встречает первый символ слова, она увеличивает счетчик числа слов на единицу. Пере- менная INWORD следит за тем, находится ли программа в насто- ящий момент внутри слова или нет; сначала этой переменной присваивается " не в слове", чему соответствует значение NO. Мы предпочитаем символические константы YES и NO литерным значениям 1 и 0, потому что они делают программу более удоб- ной для чтения. Конечно, в такой крошечной программе, как эта, это не приводит к заметной разнице, но в больших прог- раммах увеличение ясности вполне стоит тех скромных дополни- тельных усилий, которых требует следование этому принципу с самого начала. Вы также обнаружите, что существенные измене- ния гораздо легче вносить в те программы, где числа фигури- руют только в качестве символьных констант. Строка

NL = NW = NC = 0;

полагает все три переменные равными нулю. Это не особый случай, а следствие того обстоятельства, что операто- ру присваивания соответствует некоторое значение и присваи- вания проводятся последовательно справа налево. Таким обра- зом, дело обстоит так, как если бы мы написали

NC = (NL = (NW = 0));

операция \!\! Означает OR , так что строка

IF( C==' ' \!\! C=='\N' \!\! C=='\T')

говорит "если с - пробел, или с - символ новой строки, или с -табуляция ..."./условная последовательность \T является изображением символа табуляции/.




Содержание  Назад  Вперед