3.8. Оператор CONTINUE
Оператор CONTINUE родственен оператору BRеак, но исполь-
зуется реже; он приводит к началу следующей итерации охваты-
вающего цикла (FOR, WHILE, DO ). В циклах WHILE и DO это оз-
начает непосредственный переход к выполнению проверочной
части; в цикле FOR управление передается на шаг реинициали-
зации. (Оператор CONTINUE применяется только в циклах, но не
в переключателях. Оператор CONTINUE внутри переключателя
внутри цикла вызывает выполнение следующей итерации цикла).
В качестве примера приведем фрагмент, который обрабаты-
вает только положительные элементы массива а; отрицательные
значения пропускаются.
FOR (I = 0; I < N; I++) {
IF (A[I] < 0) /* SKIP NEGATIVE ELEMENTS */
CONTINUE;
... /* DO POSITIVE ELEMENTS */
}
Оператор CONTINUE часто используется, когда последующая
часть цикла оказывается слишком сложной, так что рассмотре-
ние условия, обратного проверяемому, приводит к слишком глу-
бокому уровню вложенности программы.
Упражнение 3-6.
Напишите программу копирования ввода на вывод, с тем ис-
ключением, что из каждой группы последовательных одинаковых
строк выводится только одна. (Это простой вариант утилиты
UNIQ систем UNIX).
3.9. Оператор GOTO и метки
В языке “C” предусмотрен и оператор GOTO, которым беско-
нечно злоупотребляют, и метки для ветвления. С формальной
точки зрения оператор GOTO никогда не является необходимым,
и на практике почти всегда можно обойтись без него. Мы не
использовали GOTO в этой книге.
Тем не менее, мы укажем несколько ситуаций, где оператор
GOTO может найти свое место. Наиболее характерным является
его использование тогда, когда нужно прервать выполнение в
некоторой глубоко вложенной структуре, например, выйти сразу
из двух циклов. Здесь нельзя непосредственно использовать
оператор BRеак, так как он прерывает только самый внутренний
цикл. Поэтому:
· 72 -
FOR ( ... )
FOR ( ... ) {
...
IF (DISASTER)
GOTO ERROR;
}
...
ERROR:
CLEAN UP THE MESS
Если программа обработки ошибок нетривиальна и ошибки могут
возникать в нескольких местах, то такая организация оказыва-
ется удобной. Метка имеет такую же форму, что и имя перемен-
ной, и за ней всегда следует двоеточие. Метка может быть
приписана к любому оператору той же функции, в которой нахо-
дится оператор GOTO.
В качестве другого примера рассмотрим задачу нахождения
первого отрицательного элемента в двумерном массиве. (Много-
мерные массивы рассматриваются в главе 5). Вот одна из воз-
можностей:
FOR (I = 0; I < N; I++)
FOR (J = 0; J < M; J++)
IF (V[I][J] < 0)
GOTO FOUND;
/* DIDN'T FIND */
...
FOUND:
/* FOUND ONE AT POSITION I, J */
...
Программа, использующая оператор GOTO, всегда может быть
написана без него, хотя, возможно, за счет повторения неко-
торых проверок и введения дополнительных переменных. Напри-
мер, программа поиска в массиве примет вид:
FOUND = 0;
FOR (I = 0; I < N && !FOUND; I++)
FOR (J = 0; J < M && !FOUND; J++)
FOUND = V[I][J] < 0;
IF (FOUND)
/* IT WAS AT I-1, J-1 */
...
ELSE
/* NOT FOUND */
...
Хотя мы не являемся в этом вопросе догматиками, нам все
же кажется, что если и нужно использовать оператор GOTO, то
весьма умеренно.
· 73 -
4. Функции и структура программ.
Функции разбивают большие вычислительные задачи на ма-
ленькие подзадачи и позволяют использовать в работе то, что
уже сделано другими, а не начинать каждый раз с пустого мес-
та. Соответствующие функции часто могут скрывать в себе де-
тали проводимых в разных частях программы операций, знать
которые нет необходимости, проясняя тем самым всю программу,
как целое, и облегчая мучения при внесении изменений.
Язык “C” разрабатывался со стремлением сделать функции
эффективными и удобными для использования; “C”-программы
обычно состоят из большого числа маленьких функций, а не из
нескольких больших. Программа может размещаться в одном или
нескольких исходных файлах любым удобным образом; исходные
файлы могут компилироваться отдельно и загружаться вместе
наряду со скомпилированными ранее функциями из библиотек. Мы
здесь не будем вдаваться в детали этого процесса, поскольку
они зависят от используемой системы.
Большинство программистов хорошо знакомы с “библиотечны-
ми” функциями для ввода и вывода /GETCHAR , PUTCHAR/ и для
численных расчетов /SIN, COS, SQRT/. В этой главе мы сообщим
больше о написании новых функций.
... основаниям. При этом философская абстракция языка оказывается неразрывно связана с основными темами и движениями философии в целом. Более конкретно, на ранние стадии традиционно рассматриваемого в рамках АФ анализа обыденного языка глубокое влияние оказала философия Дж. Э. Мура, особенно его учение о здравом смысле, согласно которому такие понятия, как «человек», «мир», «я», «внешний мир», « ...
... и других странах СНГ, а также облегчение доступа к русской и мировой культуре и науке. Таким образом, судя по данным наших исследований, востребованность русского языка осталась в республике достаточно высокой. Многие представители современной молдавской молодежи продолжают, как их отцы и деды, тянуться к русской культуре, научным и техническим достижениям России. Русский язык остается языком ...
... рисуночное словесно-слоговое письмо). Памятники среднеэламского периода (14—12 вв. до н.э.) выполнены аккадской клинописью. Памятники новоэламского периода относятся к 8—6 вв. до н.э. Был официальным языком в персидском государстве Ахеменидов в 6—4 вв. предполагается, что он, подвергшись влиянию древнеперсидского, сохранился до раннего средневековья. 7. Бурушаски язык Язык бурушаски ( ...
... /диалект), скифский, согдийский, среднеперсидский, таджикский, таджриши (язык/диалект), талышский, татский, хорезмийский, хотаносакский, шугнано-рушанская группа языков, ягнобский, язгулямский и др. Они относятся к индоиранской ветви индоевропейских языков. Области распространения: Иран, Афганистан, Таджикистан, некоторые районы Ирака, Турции, Пакистана, Индии, Грузии, Российской Федерации. Общее ...
0 комментариев