Давайте напишем программу подсчета числа появлений каж-дой цифры, символов пустых промежутков/пробел, табуляции,новая строка/ и всех остальных символов. Конечно, такая за-дача несколько искусственна, но она позволит нам проиллюст-рировать в одной программе сразу несколько аспектов языка"C". Мы разбили вводимые символы на двенадцать категорий, инам удобнее использовать массив для хранения числа появленийкаждой цифры, а не десять отдельных переменных. Вот один извариантов программы:MAIN() /* COUNT DIGITS, WHITE SPACE, OTHERS */{ INT C, I, NWHITE, NOTHER; INT NDIGIT[10]; NWHITE = NOTHER = 0; FOR (I = 0; I < 10; ++I) NDIGIT[I] = 0; WHILE ((C = GETCHAR()) != EOF) IF (C >= '0' && C <= '9') ++NDIGIT[C-'0']; ELSE IF(C== ' ' \!\! C== '\N' \!\! C== '\T') ++NWHITE; ELSE ++NOTHER; PRINTF("DIGITS ="); FOR (I = 0; I < 10; ++I) PRINTF(" %D", NDIGIT[I]); PRINTF("\NWHITE SPACE = %D, OTHER = %D\N", NWHITE, NOTHER);} Описание INT NDIGIT[10]; объявляет, что NDIGIT является массивом из десяти целых. вязыке "C" индексы массива всегда начинаются с нуля /а не с1, как в фортране или PL/1/, так что элементами массива яв-ляются NDIGIT[0], NDIGIT[1],..., NDIGIT[9]. эта особенностьотражена в циклах FOR , которые инициализируют и печатаютмассив. Индекс может быть любым целым выражением, которое, ко-нечно, может включать целые переменные, такие как I , и це-лые константы. Эта конкретная программа сильно опирается на свойствасимвольного представления цифр. Так, например, в программепроверка IF( C >= '0' && C <= '9')... определяет, является ли символ в 'C' цифрой, и если это так,то численное значение этой цифры определяется по формуле / C- '0'/. Такой способ работает только в том случае, если зна-чения символьных констант '0', '1' и т.д. Положительны, рас-положены в порядке возрастания и нет ничего, кроме цифр,между константами '0' и '9'. К счастью, это верно для всехобщепринятых наборов символов. По определению перед проведением арифметических опера-ций, вовлекающих переменные типа CHAR и INT, все они преоб-разуются к типу INT, TAK что в арифметических выражениях пе-ременные типа CHAR по существу идентичны переменным типаINT. Это вполне естественно и удобно; например, C -'0'- этоцелое выражение со значением между 0 и 9 в соответствии стем, какой символ от '0' до '9' хранится в 'C', и, следова-тельно, оно является подходящим индексом для массива NDIGIT. Выяснение вопроса, является ли данный символ цифрой,символом пустого промежутка или чем-либо еще, осуществляетсяпоследовательностью операторов IF (C >= '0' && C <= '9') ++NDIGIT[C-'0']; ELSE IF(C == ' ' \!\! C == '\N' \!\! C == '\T') ++NWHITE; ELSE ++NOTHER; Конструкция IF (условие) оператор ELSE IF (условие) оператор ELSE оператор часто встречаются в программах как средство выражения ситуа-ций, в которых осуществляется выбор одного из несколькихвозможных решений. Программа просто движется сверху вниз до тех пор, покане удовлетворится какое-нибудь условие; тогда выполняетсясоответствующий 'оператор', и вся конструкция завершается./Конечно, 'оператор' может состоять из нескольких операто-ров, заключенных в фигурные скобки/. Если ни одно из условийне удовлетворяется, то выполняется 'оператор', стоящий послезаключительного ELSE, если оно присутствует. Если последнеEELSE и соответствующий 'оператор' опущены (как в программеподсчета слов), то никаких действий не производится. Междуначальным IF и конечным ELSE может помещаться произвольноеколичество групп ELSE IF (условие) оператор С точки зрения стиля целесообразно записывать эту конст-рукцию так, как мы показали, с тем чтобы длинные выраженияне залезали за правый край страницы. Оператор SWITCH (переключатель), который рассматриваетсяв главе 3, представляет другую возможность для записи раз-ветвления на несколько вариантов. этот оператор особенноудобен, когда проверяемое выражение является либо просто не-которым целым, либо символьным выражением, совпадающим с од-ной из некоторого набора констант. Версия этой программы,использующая оператор SWITCH, будет для сравнения приведенав главе 3. Упражнение 1-12 ---------------- Напишите программу, печатающую гистограмму длин слов изфайла ввода. Самое легкое - начертить гистограмму горизон-тально; вертикальная ориентация требует больших усилий.