Условный и безусловный операторы языка паскаль метки. Операторы языка паскаль. Полная форма условного оператора

Составной оператор представляет собой несколько операторов, объединяемых в один для выполнения действий в другом операторе(условном, цикла, выбора и пр.)

if x>0 then y:=x+2 else y:=x-2

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

б) Ветвящаяся структура

Оператор условного перехода

Оператор условного перехода в Турбо Паскаль имеет вид:

if условие then оператор 1 else оператор 2 ;

условие - это логическое выражение, в зависимости от которого выбирается одна из двух альтернативных ветвей алгоритма. Если значение условия истинно (TRUE), то будет выполняться оператор 1 , записанный после ключевого слова then. В противном случае будет выполнен оператор 2 , следующий за словом else, при этом оператор 1 пропускается. После выполнения указанных операторов программа переходит к выполеннию команды, стоящей непосредственно после оператора if.

Необходимо помнить, что перед ключевым словом else точка с запятой никогда не ставится!

else - часть в операторе if может отсутствовать:

if условие then оператор 1 ;

Тогда в случае невыполнения логического условия управление сразу передается оператору, стоящему в программе после конструкции if.

Следует помнить, что синтаксис языка допускает запись только одного оператора после ключевых слов then и else, поэтому группу инструкций обязательно надо объединять в составной оператор (окаймлять операторными скобками begin ... end). В противном случае возникает чаще всего логическая ошибка программы, когда компилятор языка ошибок не выдает, но программа тем не менее работает неправильно.

Примеры .

if x > 0 then modul:= x else modul:= -x;

if k > 0 then WriteLn("k - число положительное");

if min > max then begin

14.Оператор перехода. Метки и операторы перехода

Можно теоретически показать, что рассмотренных операторов вполне достаточно для написания программ любой сложности. В этом отношении наличие в языке операторов перехода кажется излишним. Более того, современная технология структурного программирования основана на принципе «программировать без GOTO»: считается, что злоупотребление операторами перехода затрудняет понимание программы, делает ее запутанной и сложной в отладке.

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

Оператор перехода имеет вид:

GOTO <метка>.

Здесь GOTO - зарезервированное слово (перейти [на метку]); <метка> - метка.

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

Метка располагается непосредственно перед помечаемым оператором и отделяется от него двоеточием. Оператор можно помечать несколькими метками, которые в этом случае отделяются друг от друга двоеточием. Перед тем как появиться в программе, метка должна быть описана. Описание меток состоит из зарезервированного слова LABEL (метка), за которым следует список меток:

Пример

1: WriteLn("Переход к метке 1");

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

Условные операторы предназначены для выбора к исполнению одного из возможных действий (операторов) в зависимости от некоторого условия (при этом одно из действий может отсутствовать). В качестве условий выбора используется значение логического выражения. В Турбо Паскале имеются два ус­ловных оператора: if и case.

Оператор условия if

Оператор условия if может принимать одну из следующих форм:

if <условие> then <оператор1>

else <оператор2>;

if <условие> then <оператор>;

Оператор условия if выполняется следующим образом. Сначала вычисляется выражение, записанное в условии. В результате его вычисления получается значе­ние булевского типа. В первом случае, если значение выражения есть True (истина), выполняется <оператор1>, указанный после слова then. Если результат вычисления выражения в условии есть False (ложь), то выполняется <оператор2>. Во втором случае - если результат выражения Тгuе, выполняется <оператор>, если False - выполняется оператор, следующий сразу за оператором if. По правилам каждая из ветвей может содержать либо один выполняемый оператор, либо несколько, объединенных в составной оператор. Точка с запятой перед E lse не ставится.

Оператор выбора case

Если один оператор if может обеспечить выбор из двух альтернатив, то оператор выбораcase позволяет сделать выбор из произволь­ного числа имеющихся вариантов.

case <выражение-селектор> of

<список1>: <оператор1>;

<список2>: <оператор2>;

<списокN>: <операторN>;

Оператор caseработает следующим образом. Сначала вычисляется значение выражения-селектора, затем обеспечивается реализация того оператора, константа выбора которого равна текущему значению селектора. Если ни одна из констант не равна текущему значению селектора, выполняется оператор, стоящий за словомelse. Если словоelseотсутствует, активизируется оператор, находящийся за словомend, т.е. первый оператор за границейcase.

Выражение-селектор - это простая переменная целого, символьного, перечисляемого или логического типов, в зависимости от значения которой принимается решение;

Список констант выбора состоит из произвольного количества значений, или диапазонов, отделенных друг от друга запятыми. Тип констант должен совпадать cтипом селектора;

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

Ветвь Else не обязательна, и в отличие от оператора if, перед ней можно ставить точку с запятой.

Операторы повтора

Если в программе возникает необходимость неоднократно выполнить некоторые операторы, то используются операторы повтора (цикла). В языке Паскаль раз­личают три вида операторов цикла: while, repeat, for.

Оператор while

Оператор while (пока) называют оператором цикла с Предусловием за то, что проверка условия выполнения тела цикла производится в самом начале оператора.

while <условие продолжения повторений> do

<тело цикла>;

Условие – логическое выражение. Тело цикла – простой или составной оператор. Составной оператор используется в тех случаях, когда тело цикла состоит из 2-х и более операторов.

Перед каждым выполнением тела цикла вычисляется значение выражения условия. Если результат равен True, тело цикла выполняется и снова вычисляется выражение условия. Если результат равен False, происходит выход из цикла и пере­ход к первому оператору, стоящему сразу за телом цикла.

Оператор повтора repeat

Оператор repeatреализует цикл спостусловием . Цикл с постусловием всегда будет выполнен хотя бы один раз.

<оператор1>;

<оператор2>;

<оператор N >;

until <условие окончания цикла>;

Операторы, заключенные между словами repeat и until, являются телом цикла. Вначале выполняется тело цикла, затем проверяется условие выхода из цикла. Если результат логического выражения равен False, то тело цикла активизируется еще раз; если результат True, происходит выход из цикла.

Оператор повтора for

Это оператор с известным числом повторений. Часто этот оператор повтора называют оператором цикла с параметром, так как число повторений задается переменной, называемой параметром цикла , илиуправляющей переменной .

Оператор повтора for может быть представлен в двух форматах:

for <параметр цикла> := to do <тело цикла>;

for <параметр цикла> := downto do <тело цикла>;

где <параметр цикла> - это переменная целого, символьного, логического или перечисляемого типов;

SI и S2 - выражения, определяющие соответственно начальное и конечное значения параметра цикла;

for ... do - заголовок цикла;

Тело цикла может быть простым илисоставным оператором. Оператор for обеспечивает выполнение тела цикла до тех пор, пока не будут перебраны все зна­чения параметра цикла от начального до конечного.

Действие команды. Параметру цикла присваивается значение выражения S1. Если оно меньше или равно, чем значение выраженияS2, то выполняется тело цикла. После этого значение параметра автоматически увеличивается на единицу и оно снова сравнивается со значением выраженияS2 и т.д. Когда значение параметра станет больше, чем значение выраженияS2, то выполняется следующий после цикла оператор.

Шаг изменения параметра цикла для оператора for…to…doравен +1, а для оператораfor…downto…doравен -1.

Вопросы для самопроверки:

    Формат оператора присваивания. Допустимо ли использование величин разных типов в арифметическом выражении?

    В чем заключается отличие оператора ввода Read от оператора Readln?

    Укажите форматы вывода данных.

    Какие виды ветвлений реализованы в Turbo Pascal?

    Для чего используются ветвления? Приведите примеры.

    Две формы записи условного оператора If.

    Формат записи вложенного оператора If.

    Формат записи оператора выбора Case?

    В каких случаях используется составной оператор Begin…end?

    Как в блок-схемах изображаются разветвленные алгоритмы?

    Что такое цикл?

    Какие виды циклов реализованы в Turbo Pascal?

    Что такое тело цикла?

    В каком случае тело цикла заключается в операторные скобки begin…end?

    В чем отличия операторов повтора while и repeat?

    В каких случаях предпочтительнее использовать для организации циклов оператор повтора for? Что записывается в заголовке этого оператора?

    Каким образом в операторе цикла for описывается направление изменения значения параметра цикла?

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

Переход осуществляется при помощи так называемых меток.
Метка - это идентификатор или целое число без знака в диапазоне от 0 до 9999, которое находится перед каким-либо оператором программы и отделен от него двоеточием. Все используемые в программе метки должны быть предварительно объявлены в разделе объявления меток, начинающимся СЛОВОМ label.

Можно теоретически показать, что рассмотренных операторов вполне достаточно для написания программ любой сложности. В этом отношении наличие в языке операторов перехода кажется излишним. Более того, современная технология структурного программирования основана на принципе “программировать без GOTO”: считается, что злоупотребление операторами перехода затрудняет понимание программы, делает ее запутанной и сложной в отладке. Тем не менее в некоторых случаях использование операторов перехода может упростить программу.

Оператор перехода имеет вид:

Здесь goto — зарезервированное слово (перейти [на метку]); — метка.

Label 1; // Объявляем метку с именем 1 var
a: Integer; begin
a: = 10;
Goto 1; // Переход на метку 1
а:= sqrt(a); // Этот оператор не будет выполняться никогда! 1: а:= а + а; // Оператор, помеченный меткой 1 end;

Операторы условного перехода

Оператор условия предназначен для выполнения или невыполнения каких-либо действий, зависящих от результата условия типа Boolean. Этот оператор применяют для разветвления выполнения программы,
т. е. если данное условие истинно (и только в этом случае!), то выполняется некоторая последовательность операторов, в противном случае выполняются другие операторы. Вид оператора условия таков:

if условие then оператор1 else оператор2;

Оператор условия может быть записан и в упрощенной форме:

if условие then оператор;

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

if а > 0 then b: = sqrt (a) else b: = a * 2; // Оператор условия
if a = 10 then b: = b + 1; // Упрощенная форма

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

В отличие от других языков программирования в Object Pascal приоритет операций отношения меньше, чем у логических» операции, по этому отдельные составные части сложного логического выражения заключаются в скобки. Например, такая запись предыдущего оператора будет неверной:
if a>b and b 0 then …// Ошибка так как фактически (с учетом приоритета операции) компилятор будет транслировать такую строку:
if a> (b and b)0 then…

Структурированными операторами называются такие операторы, которые включают в себя другие операторы и управляют последовательностью их выполнения. К ним относятся:

  • составной оператор;
  • условный оператор If ;
  • условный оператор Case ;
  • оператор цикла Repeat ;
  • оператор цикла While ;
  • оператор цикла For .

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

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

Формат оператора:

оператор №1;

оператор №2;

оператор №3;

оператор № n-1;

оператор № n; End;

Слово Begin играет роль открывающей скобки, слово End – роль закрывающей скобки.

Составной оператор воспринимается как единый оператор. Его можно вставлять в любое место программы, где допускается только один оператор.

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

В последующих разделах смысл и назначение составного оператора будут проиллюстрированы на многочисленных примерах.

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

Оператор If реализует алгоритмическую конструкцию «Решение» и позволяет изменить порядок выполнения операторов в зависимости от истинности или ложности некоторого условия. Формат оператора может быть записан в двух формах: полной и неполной форме.

Формат оператора в полной форме:

If<условие> Then<оператор 1> Else<оператор 2>

Формат оператора в неполной форме:

If<условие>Then<оператор 1>

If (если), Then (тогда), Else (иначе) – зарезервированные слова.

Блок-схемы оператора if представлены ниже:

Условный оператор работает следующим образом. Сначала вычисляется условное выражение < условие >. Если результат есть True (истина), то выполняется < оператор 1 > (после слова Then), а < оператор 2 > пропускается. Если результат есть False (ложь), то < оператор 1 > пропускается, а выполняется < оператор 2 > (после слова Else). Перед Else никогда не ставится точка с запятой, поскольку это еще не конец оператора If .

Часть Else <оператор 2> условного оператора If может быть опущена. Если < условие > оператора If принимает значение True , то выполняется <оператор 1> , в противном случае этот оператор пропускается. В этом случае формат условного оператора имеет неполную форму:

Сравним две конструкции:

If <условие>Then<оператор 1>;

If <условие>Then<оператор 1>; <оператор 2>;

В первой строке <оператор 1> или выполняется, или не выполняется в зависимости от выполнения <условия> . Во второй строке <оператор 2> выполняется всегда, поскольку после <оператора 1> стоит разделитель «;» и все что стоит поле разделителя считается другим оператором. Поэтому в соответствии с форматом оператора If после зарезервированных слов Then и Else может стоять всего лишь один оператор.

Пример:

If a > 0 Then b:=1;

If a > 0 Then b:=1; a:=b; {оператор a:=b; выполняется всегда}

Если же необходимо выполнить после Then и Else не один, а несколько операторов, то следует поставить операторные скобки, т.е. использовать составной оператор.

В этом случае оператор If будет иметь следующий вид:

If<условие>Then

оператор 11;

оператор 1n;

оператор 21;

оператор 2n;

Пример .

If a>0 Then begin b:=1; a:=b; end;

ЗАДАЧА 1. Вычислить значение функции, заданной неравенствами

y=x+1 при x<0; y=2∙x при x>0. program a5; var x,y:real; begin write(‘Введите значение x: ’); readln(x); if x writeln(‘Значение у равно: ’, y:6:2) end.

Результаты работы программы:

Введите значения x:0.5

Значение у равно: 1.00

ЗАДАЧА 2. Написать программу решения квадратного уравнения. Если дискриминант меньше нуля, то выводить соответствующее сообщение.

Program a6; var a,b,c:real; {коэффициенты уравнения} x1,x2:real; {корни уравнения} d:real; {дискриминант} begin Writeln(‘Решение квадратного уравнения’:50); Write(‘Введите значения коэффициентов a,b,c:’); Readln(a,b,c); {ввод коэффициентов} d:=b*b-4*a*c; if (d<0) then Writeln(‘Уравнение не имеет корней.’) else begin {операторные скобки} x1:=(-b+sqrt(d))/(2*a); x2:=(-b-sqrt(d))/(2*a); WriteLn(‘Корни уравнения: ’, x1:8:2,x2:8:2); end; end.

Результаты работы программы:

Решение квадратного уравнения

Введите значения коэффициентов a,b,c:3 1 6

Уравнение не имеет корней.

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

Пример.

if условие then
begin Операторные скобки
оператор; вложенный
оператор IF ,
неполная форма
if условие then опеатор
else оператор;
end
else
begin Операторные скобки
оператор; вложенный
оператор IF ,
неполная форма
if условие
then оператор;
end;

При работе с вложенными операторами if следует учитывать следующие правила:

  • перед зарезервированным словом else символ «;» никогда не ставится;
  • зарезервированное слово else всегда связывается с ближайшим перед ним стоящим зарезервированным словом then .

ЗАДАЧА 3. Усовершенствуем программу решения квадратного уравнения (ЗАДАЧА 2). При значении коэффициента a=0 уравнение вырождается. В программе этот факт не учитывался, что вызовет фатальную ошибку при исполнении программы (деление на нуль). Для того чтобы исключить деление на нуль, выполним проверку значения коэффициента а после его ввода оператором Readln(a,b,c) .

Поскольку переменная a объявлена в программе как переменная вещественного типа, ее численное значение в машине представлено не точно, с некоторой погрешностью. Поэтому запись типа

Возможны несколько вариантов проведения корректного сравнения значений вещественной переменной с нулем:

ЗАДАЧА 4. Усовершенствованная программа решения квадратного уравнения.

Program a7;Var a,b,c:real; {коэффициенты уравнения} x1,x2:real; {корни уравнения} d:real; {дискриминант} begin Writeln(‘Решение квадратного уравнения’:50); Write(‘Введите значения коэффициентов a,b,c: ’); Readln(a,b,c); {ввод коэффициентов} if round(a)<>0 then begin d:=b*b-4*a*c; if d<0 then Writeln(‘Уравнение не имеет корней.’) else begin{операторные скобки} x1:=(-b+sqrt(d))/(2*a); x2:=(-b-sqrt(d))/(2*a); WriteLN(‘Корни уравнения: ’, x1:8:2,x2:8:2); end; end else Writeln(‘Деление на нуль.’); end.

Результаты работы программы:

Решение квадратного уравнения Введите значения коэффициентов a,b,c:0 1 6 Деление на нуль.

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

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

В качестве ключа выбора используется выражение, которое располагается между зарезервированными словами Case и of. Выражение может быть целого, логического и символьного типов. Выражение не может иметь тип Real, String.

Формат оператора:

Case of "<ключ выбора>" константа1:оператор 1; константа2:оператор 2; константа3:оператор 3; ... константаN-1:оператор N-1; константаN:оператор Nn; Else оператор End;

Здесь Сase (в случае), of (из), Else (иначе), End (конец) являются зарезервированными словами.

Ключ выбора – это выражение любого типа кроме Real и String .

Константа1 – константа того же типа, что и выражение.

Оператор1 – произвольный оператор.

Оператор выбора действует следующим образом. Вначале вычисляется выражение <ключ выбора> , а затем в последовательности операторов отыскивается такой, которому предшествует константа, равная вычисленному значению <ключ выбора> . Найденный оператор выполняется, после чего оператор выбора завершает свою работу (управление передается на end). Если в списке констант не будет найдена константа, соответствующая вычисленному значению ключа выбора, управление передается оператору, стоящему за словом Else .

Часть Else <оператора> можно опустить, тогда при отсутствии в списке констант нужной константы ничего не происходит, и оператор выбора просто завершает свою работу.

ЗАДАЧА 5. Написать программу простого калькулятора .

Program a8; var x,y:real; z:real; {результат} op:char; {ключ выбора} begin Write(‘Введите операнды x,y: ’); Readln(x,y); Write(‘Введите операцию(+,-,*,/): ’); Readln(op); case op of ‘+’:z:=x+y; ‘-‘:z:=x-y; ‘*‘:z:=x*y; ‘/‘:if y0 then z:=x/y Elsewriteln(‘Деление на нуль’); Else writeln(‘Действие не предусмотрено!’); end; {op} {так можно пометить, «чей» end} writeln(‘Результат равен=’,z:8:2); end.

Результаты работы программы:

Введите операнды x,y:4 2

Введите операцию (+,-,*,/):*

Результат равен= 8.00

В программе ключом выбора является переменная символьного типа. В зависимости от введенного значения символов (+, -, *, /) выполняется одно из арифметических действий: сложение, вычитание, умножение или деление. Если в качестве делителя будет введен нуль, то деление невозможно и выдается сообщение «Деление на нуль». Если будет введен какой-либо другой символ, то результатом будет сообщение «Действие не предусмотрено!». Если введены допустимые операции, то выдается результат.

ЗАДАЧА 6. Написать программу, которая запрашивает у пользователя номер дня недели, затем выводит название дня недели или сообщение об ошибке, если введены неверные данные.

Program a9; Var n: integer; {номер дня недели} Begin write(‘Введите номер дня недели:’); readln(n); case n of 1: writeln(‘Понедельник’); 2: writeln(‘Вторник’); 3: writeln(‘Среда’); 4: writeln(‘Четверг’); 5: writeln(‘Пятница’); 6: writeln(‘Суббота’); 7: writeln(‘Воскресенье’); else write(‘вы ошиблись!’) end; {n} end.

Результаты работы программы:

Введите номер дня недели:1

Понедельник

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

case n of 1,3,5,7,9: writeln(‘Это нечетные цифры’); 2,4,6,8,10: writeln(‘Это четные цифры’); end;

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

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

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

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

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

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

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

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

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

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

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

var j: integer;

{ объявляем две метки }

label Start, Finish;

Start: writeln(‘Начало программы’);

goto Finish;

Finish: writeln(‘Конец программы’);

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

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

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

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

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

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

If Keypressed then writeln(‘Клавиша нажата’);

If A > B then Min:= B

else Min:= A;

if X1 > X2 then begin

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

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

if Условие1 then if Условие2 then Оператор1 else Оператор2;

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

if Условие1 then begin

if Условие2 then Оператор1 else Оператор2;

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

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

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

type TWay = (Up, Right, Down, Left);

var Way: TWay;

MapX, MapY: word;

if Way = Up then MapY:= MapY - 1

else if Way = Right then MapX:= MapX + 1

else if Way = Down then MapY:= MapY + 1

else MapX:= MapX - 1;

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

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

case Way of

Up: MapY:= MapY - 1;

Right: MapX:= MapX + 1;

Down: MapY:= MapY + 1;

Left: MapX:= MapX - 1;

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

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

case Way of

Up: MapY:= MapY - 1;

Right: MapX:= MapX + 1;

Down: MapY:= MapY + 1;

else MapX:= MapX - 1;

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

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

case Way of

Up, Down: writeln(‘Двигаемся по вертикали’);

Right, Left: writeln(‘Двигаемся по горизонтали’);

case X of

10,20,30: writeln(‘десятки’);

1..9: writeln(‘единицы’);

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

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

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

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

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

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

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

Статьи по теме