1.5.3. Подсчет символов.
Следующая программа подсчитывает число символов; она
представляет собой небольшое развитие программы копирования.
MAIN() /* COUNT CHARACTERS IN INPUT */
{
LONG NC;
NC = 0;
WHILE (GETCHAR() != EOF )
++NC;
PRINTF(“%1D\N”, NC);
}
Оператор
++NC;
демонстрирует новую операцию, ++, которая означает увеличе-
ние на единицу. Вы могли бы написать NC = NC + 1 , но ++NC
более кратко и зачастую более эффективно. Имеется соответст-
вующая операция—уменьшение на единицу. Операции ++ и—
могут быть либо префиксными (++NC), либо постфиксными
(NC++); эти две формы, как будет показано в главе 2, имеют в
выражениях различные значения, но как ++NC, так и NC++ уве-
личивают NC. Пока мы будем придерживаться префиксных опера-
ций.
· 23 -
Программа подсчета символов накапливает их количество в
переменной типа LONG, а не INT . На PDP-11 максимальное зна-
чение равно 32767, и если описать счетчик как INT , то он
будет переполняться даже при сравнительно малом файле ввода;
на языке “C” для HONEYWELL и IBM типы LONG и INT являются
синонимами и имеют значительно больший размер. Спецификация
преобразования %1D указывает PRINTF , что соответствующий
аргумент является целым типа LONG .
Чтобы справиться с еще большими числами, вы можете ис-
пользовать тип DOUBLE / FLOAT двойной длины/. мы также ис-
пользуем оператор FOR вместо WHILE с тем, чтобы проиллюстри-
ровать другой способ записи цикла.
MAIN() /* COUNT CHARACTERS IN INPUT */
{
DOUBLE NC;
FOR (NC = 0; GETCHAR() != EOF; ++NC)
;
PRINTF(“%.0F\N”, NC);
}
Функция PRINTF использует спецификацию %F как для FLOAT
, так и для DOUBLE ; спецификация %.0F подавляет печать не-
существующей дробной части.
Тело оператора цикла FOR здесь пусто, так как вся рабо-
та выполняется в проверочной и реинициализационной частях.
Но грамматические правила языка “C” требуют, чтобы оператор
FOR имел тело. Изолированная точка с запятой, соответствую-
шая пустому оператору, появляется здесь, чтобы удовлетворить
этому требованию. Мы выделили ее на отдельную строку, чтобы
сделать ее более заметной.
Прежде чем мы распростимся с программой подсчета симво-
лов, отметим, что если файл ввода не содержит никаких симво-
лов, то условие в WHILE или FOR не выполнится при самом пер-
вом обращении к GETCHAR , и, следовательно , программа вы-
даст нуль, т.е. Правильный ответ. это важное замечание. од-
ним из приятных свойств операторов WHILE и FOR является то,
что они проверяют условие в начале цикла, т.е. До выполнения
тела. Если делать ничего не надо, то ничего не будет сдела-
но, даже если это означает, что тело цикла никогда не будет
выполняться. программы должны действовать разумно, когда они
обращаются с файлами типа “никаких символов”. Операторы
WHILE и FOR помогают обеспечить правильное поведение прог-
рамм при граничных значениях проверяемых условий.
1.5.4. Подсчет строк.
Следующая программа подсчитывает количество строк в
файле ввода. Предполагается, что строки ввода заканчиваются
символом новой строки \N, скрупулезно добавленным к каждой
выписанной строке.
· 24 -
MAIN() /* COUNT LINES IN INPUT */
{
INT C,NL;
NL = 0;
WHILE ((C = GETCHAR()) != EOF)
IF (C =='\N')
++NL;
PRINTF(“%D\N”, NL);
}
Тело WHILE теперь содержит оператор IF , который в свою
очередь управляет оператором увеличения ++NL. Оператор IF
проверяет заключенное в круглые скобки условие и, если оно
истинно, выполняет следующий за ним оператор /или группу
операторов, заключенных в фигурные скобки/. Мы опять исполь-
зовали сдвиг вправо, чтобы показать, что чем управляет.
Удвоенный знак равенства == является обозначением в
языке “C” для “равно” /аналогично .EQ. В фортране/. Этот
символ введен для того, чтобы отличать проверку на равенство
от одиночного =, используемого при присваивании. Поскольку в
типичных “C” - программах знак присваивания встречается при-
мерно в два раза чаще, чем проверка на равенство, то естест-
венно, чтобы знак оператора был вполовину короче.
Любой отдельный символ может быть записан внутри оди-
ночных кавычек, и при этом ему соответствует значение, рав-
ное численному значению этого символа в машинном наборе сим-
волов; это называется символьной константой. Так, например,
'A' - символьная константа; ее значение в наборе символов
ASCII /американский стандартный код для обмена информацией/
равно 65, внутреннему представлению символа а. Конечно, 'A'
предпочтительнее, чем 65: его смысл очевиден и он не зависит
от конкретного машинного набора символов.
Условные последовательности, используемые в символьных
строках, также занимают законное место среди символьных кон-
стант. Так в проверках и арифметических выражениях '\N'
представляет значение символа новой строки. Вы должны твердо
уяснить, что '\N' - отдельный символ, который в выражениях
эквивалентен одиночному целому; с другой стороны “\N” - это
символьная строка, которая содержит только один символ. Воп-
рос о сопоставлении строк и символов обсуждается в главе 2.
Упражнение 1-6.
Напишите программу для подсчета пробелов, табуляций и
новых строк.
Упражнение 1-7.
Напишите программу, которая копирует ввод на вывод, за-
меняя при этом каждую последовательность из одного или более
пробелов на один пробел.
... основаниям. При этом философская абстракция языка оказывается неразрывно связана с основными темами и движениями философии в целом. Более конкретно, на ранние стадии традиционно рассматриваемого в рамках АФ анализа обыденного языка глубокое влияние оказала философия Дж. Э. Мура, особенно его учение о здравом смысле, согласно которому такие понятия, как «человек», «мир», «я», «внешний мир», « ...
... и других странах СНГ, а также облегчение доступа к русской и мировой культуре и науке. Таким образом, судя по данным наших исследований, востребованность русского языка осталась в республике достаточно высокой. Многие представители современной молдавской молодежи продолжают, как их отцы и деды, тянуться к русской культуре, научным и техническим достижениям России. Русский язык остается языком ...
... рисуночное словесно-слоговое письмо). Памятники среднеэламского периода (14—12 вв. до н.э.) выполнены аккадской клинописью. Памятники новоэламского периода относятся к 8—6 вв. до н.э. Был официальным языком в персидском государстве Ахеменидов в 6—4 вв. предполагается, что он, подвергшись влиянию древнеперсидского, сохранился до раннего средневековья. 7. Бурушаски язык Язык бурушаски ( ...
... /диалект), скифский, согдийский, среднеперсидский, таджикский, таджриши (язык/диалект), талышский, татский, хорезмийский, хотаносакский, шугнано-рушанская группа языков, ягнобский, язгулямский и др. Они относятся к индоиранской ветви индоевропейских языков. Области распространения: Иран, Афганистан, Таджикистан, некоторые районы Ирака, Турции, Пакистана, Индии, Грузии, Российской Федерации. Общее ...
0 комментариев