CFA LogoCFA Logo Computer
Новости Статьи Магазин Драйвера Контакты
Новости
RSS канал новостей
В конце марта компания ASRock анонсировала фирменную линейку графических ускорителей Phantom Gaming. ...
Компания Huawei продолжает заниматься расширением фирменной линейки смартфонов Y Series. Очередное ...
Компания Antec в своем очередном пресс-релизе анонсировала поставки фирменной серии блоков питания ...
Компания Thermalright отчиталась о готовности нового высокопроизводительного процессорного кулера ...
Компания Biostar сообщает в официальном пресс-релизе о готовности флагманской материнской платы ...
Самое интересное
Программаторы 25 SPI FLASH Адаптеры Optibay HDD Caddy Драйвера nVidia GeForce Драйвера AMD Radeon HD Игры на DVD Сравнение видеокарт Сравнение процессоров

АРХИВ СТАТЕЙ ЖУРНАЛА «МОЙ КОМПЬЮТЕР» ЗА 2002 ГОД

Мысли о Паскале

Владислав ДЕМЬЯНИШИН nitromanit@mail.ru

(Продолжение, начало см. МК № 46, 51—52, 4, 6—7, 10, 12—13, 16—18 (165, 170—171, 175, 177—178, 181, 183—184, 187—189))

Оператор перехода

В этот раз я продолжу рассмотрение темы «Операторы».

Операторы (безусловного) перехода предназначены для передачи управления оператору, помеченному меткой (которому предшествует метка).

Авторская версия языка предполагает оформление метки в виде целого десятичного числа в диапазоне 1..9999. В качестве меток Turbo Pascal допускает использование идентификаторов. При использовании операторов перехода необходимо соблюдать следующие правила:

Все метки, находящиеся в блоке, должны быть описаны. При этом каждая метка может быть описана не более одного раза. Т. е. в пределах блока не может быть двух меток с одним и тем же именем.

Метка, указанная в операторе перехода, должна указывать на оператор (помечать его), находящийся в том же блоке, где находится сам оператор перехода. Т. е. переходы вовне процедур (функций) или внутрь них не допускаются.

Попытка перехода (передачи управления) внутрь структурного оператора может вызвать непредсказуемые эффекты, хотя в данном случае компилятор может не выдать сообщения об ошибке.

Применение безусловного перехода в программе считается теоретически избыточным, так как может внести путаницу в цепочку логически скомпонованных операций программы, что может повлечь большие сложности при отладке и модификации такой программы. Применять операторы перехода рекомендуется, соблюдая следующие правила:

• если представляется невозможным обойтись без операторов перехода, нужно стараться применять их для передачи управления только вниз по тексту программы (вперед); при возникновении необходимости передачи управления «назад» лучше использовать операторы цикла (см. далее);

• для наглядности, расстояние между меткой и оператором перехода на нее не должно превышать одной страницы текста (или высоты экрана дисплея), иначе смысл такого безусловного перехода будет трудно уловить.

Метки определяются посредством описаний, которые начинаются со служебного слова label и содержат последовательность имен меток через запятую. Для передачи управления оператору, помеченному меткой, предусмотрен оператор безусловного перехода goto. Метка отделяется от следующего за ней оператора символом : (двоеточие). Пример:

Составной оператор

Простейшим структурным оператором является составной оператор. Он задает последовательность выполнения содержащихся в нем операторов. Составной оператор оформляется в виде списка операторов, отделенных друг от друга символом ; (точка с запятой) и заключенных между служебными словами begin и end.

Необходимость в составном операторе может возникать в тех случаях, когда синтаксис языка Pascal допускает использование только одного оператора в том месте программы, где необходим целый ряд действий (операторов, см. примеры далее). Приведу простой пример составного оператора:

Условный оператор

Смысл условного оператора состоит в том, чтобы провести анализ некоторого логического условия, и в соответствии с тем, выполняется это условие или нет, передать управление соответствующему оператору. В качестве условия может быть выражение, возвращающее логическое значение булевского типа. Результатом анализа условия может быть значение true, т. е. условие выполняется, и false, т. е. условие не выполняется.

Условный оператор работает следующим образом. Предварительно вычисляется выражение, указанное после служебного слова IF. Если условие выполняется, то управление передается оператору, указанному после служебного слова then, если нет, то выполняется оператор, следующий за else. При этом часть условного оператора, начиная со слова else, может отсутствовать. Вот примеры условных операторов:

Последний пример — это как раз тот случай, когда необходимо, чтобы по условию выполнялся ряд операторов; но так как за служебным словом then или else может следовать только один оператор, есть возможность урегулировать ситуацию, используя составной оператор.

При составлении вложенных условных операторов следует учитывать, что ветвь else всегда принадлежит предшествующему ветвлению IF, у которого еще нет ветви else. Т. е. следующую конструкцию:

для ясности можно трактовать так:

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

Оператор варианта

Довольно часто возникает ситуация, когда цепочка условных операторов разрастается до огромных масштабов. Например, следующий пример иллюстрирует скромное по своим размерам ветвление, смысловая структура которого, тем не менее, довольно тяжела для восприятия:

Последняя ветвь else не имеет оператора If, так как в случае невыполнения всех трех условий логично было бы, чтобы в действие вступал оператор, соответствующий четвертому и последнему варианту возможных значений типа TWay.

В данном случае нам еще повезло, что тип TWay имеет только четыре варианта принимаемых значений. Составление таких ветвлений было бы рутинной и утомительной работой, если бы вариантов было десять и более. А ведь в представленном ветвлении просматривается простая закономерность. Можно ли его как-то упростить и сделать более эффективным и читабельным? Можно — для этого в языке предусмотрен оператор варианта, конструкция которого может содержать произвольное число альтернатив для определенного выражения. Тогда последний пример можно переписать на новый лад:

Ну вот, совсем другое дело. Теперь рассмотрим порядок выполнения данного оператора. Предварительно вычисляется значение выражения, следующего за служебным словом case, но так как в данном случае стоит имя переменной Way, то производится чтение значения этой переменной. Полученное значение сравнивается поочередно с каждой альтернативой (константной, непосредственным значением), указанной после служебного слова of. В случае равенства значения выражения очередной константе, выполняется оператор-альтернатива, следующий за этой константой и отделенный от нее двоеточием. После завершения выполнения альтернативного оператора действие переходит к оператору, следующему за оператором варианта. При несовпадении значения Way ни с одной константой данный оператор варианта не производит никаких действий.

А как же быть, если необходимо предусмотреть некоторую ветвь операторов, которая выполнялась бы в случае несовпадения значения выражения ни с одной константой? Для этого можно использовать альтернативу else, например:

Следовательно, конструкция, построенная с помощью оператора case, полностью эквивалентна конструкции, построенной ранее с помощью оператора IF. К тому же она нагляднее, и нет риска запутаться в многочисленных else.

Я еще раз хочу обратить ваше внимание на то, что константами в операторе варианта могут быть как непосредственные целые числа, так и имена нетипизированных констант, описанных ранее. Использование типизированных констант в альтернативах оператора варианта не допускается. При чем в каждом варианте можно указать целый список констант через запятую или диапазон значений, например:

или

В последней конструкции оператор writeln(‘единицы’) выполнится, если переменная X будет иметь одно из значений:

Как вы могли заметить, строки с константами я выровнял по двоеточиям, так как мне кажется, что такой вид нагляднее, хотя это дело вкуса (как известно, на вкус и цвет товарища нет :-)).

Применять оператор варианта следует в соответствии со следующими правилами:

• Допустимые значение выражения-«переключателя», записанного после служебного слова case, должны удовлетворять дискретному типу: для целого типа они должны лежать в диапазоне –32768..32767.

• Все указанные константы альтернатив должны иметь тип, совместимый с типом выражения.

• Константы в альтернативах не должны повторяться в пределах оператора варианта, а диапазоны не должны пересекаться и не должны содержать констант, указанных в данной или других альтернативах.

И еще одно. Конструкция case предусматривает один оператор для каждой альтернативы. Если возникает необходимость выполнения нескольких операторов, следует сгруппировать их в составной оператор begin..end. Есть возможность указать пустой оператор для альтернативы, поставив символ ; (точка с запятой) сразу после двоеточия, который ничего не будет выполнять. А синтаксис ветви else предусматривает указание последовательности операторов, разделенных символом ; (точка с запятой).

Оператор цикла с предусловием

Данный оператор обеспечивает циклическое (повторяющееся) выполнение указанного в нем одного оператора. Перед началом выполнения цикла и перед каждым очередным повторением тела цикла производится проверка значения булевского выражения, управляющего циклом (выражение указывается за служебным словом while). Если выражение возвращает значение true, то происходит очередное выполнение тела цикла (происходит итерация цикла), если же выражение возвращает false, то выполнение цикла прекращается и управление передается оператору, следующему за оператором цикла. Таким образом, если перед выполнением цикла выражение имеет значение false, то цикл не выполняется. Добавлю, что тело цикла может состоять только из одного оператора, и для преодоления этого ограничения следует использовать составной оператор begin..end. Тело цикла размещается после служебного слова do. Вот примеры оператора цикла с предусловием:

Оператор цикла с постусловием

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

Тело цикла размещается после служебного слова repeat и может состоять из нескольких операторов. Завершается тело цикла служебным словом until, после которого указывается управляющее выражение. Вот примеры repeat-цикла:

или

Пока все. Присылайте свои замечания и пожелания.

(Продолжение следует)

Рекомендуем ещё прочитать:






Данную страницу никто не комментировал. Вы можете стать первым.

Ваше имя:
Ваша почта:

RSS
Комментарий:
Введите символы или вычислите пример: *
captcha
Обновить





Хостинг на серверах в Украине, США и Германии. © sector.biz.ua 2006-2015 design by Vadim Popov