9792

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

Реферат

Информатика, кибернетика и программирование

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

Русский

2013-03-17

72 KB

10 чел.

PAGE  1

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

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

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

Пример:

begin {обмен значений переменных X и Y}

Z:=X;

X:=Y;

Y:=Z;

end;

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

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

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

Примеры условных операторов:

1)    if X <  Y then

Max   :=  Y

else

Max   := X

2)   if All_Correct then

Transpose(A,B,N)

3)    if Color = Red then

begin

X   :=  cos(Y);

Y := alpha+beta;

Color := Yellow

end

else begin

X := Sin(Y);

Color := Red

end;

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

if Expr1  then  if Expr2  then  Stmt1  else  Stmt2

В приведенном операторе часть else Stmt2 может трактоваться как принадлежащая или "внешнему" оператору if Expr1 . . ., или вложенному оператору if Expr2 then. . .. Эта двусмысленность разрешается путем следующей интерпретации данной конструкции:

if  Expr1  then

begin

if  Expr2   then

Stmt1

else

Stmt2

end

Иными словами, служебное слово else всегда ассоциируется с ближайшим по тексту служебным словом if, которое еще не связано со служебным словом else.

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

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

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

сазе  Color  of

Red :    X    :=   Y+2;

Yellow :   X   :=  Y-2;

Green   :   X   := Y

end

В предположении, что Color является переменной перечислимого типа, данный оператор будет выполняться следующим образом.

Сначала вычисляется текущее значение переменной Color. Затем это значение сопоставляется (сравнивается) с константами, записанными перед операторами. При совпадении значения переменной с одной констант будет выполнен оператор, "помеченный" данной константой. На этом выполнение оператора варианта будет завершено. Если значение переменной Color не совпадает ни с одной константой, то данный оператор не выполняет никаких действий. Для того, чтобы задать некоторые действия для случая такого несовпадения, можно использовать альтернативу else, например:

сазе (K+l)*2 of

 2   :   Add(А,В);

 4   :   Multiply(А,В);

 0   :  Substract(А,В)

else

Writeln('Ошибка!')

end

Оператор, следующий за служебным словом else, будет выполнен в том случае, если значение выражения (К+1) *2 не совпадет ни с одной из констант 2,4,0.

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

case Switch of

1. .2   :   Prod;

3,4,10..20   :   Proc2;

5,   б   :   РгосЗ

else

Proc4

end

В последнем примере оператор процедуры Ргос2 будет выполнен в том случае, когда переменная Switch будет иметь одно из следующих значений: 3,4,10,11,12, . . ., 19,20.

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

1. Значение выражения–"переключателя", записанного после служебного слова сазе, должны принадлежать дискретному типу; для целого типа они должны лежать в диапазоне -32768. .32768.

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

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

В заключение приведем синтаксическую диаграмму для оператора варианта.

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

Альтернатива

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

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

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

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

служит критерием повторения: если это выражение имеет значение true, то выполняется очередная итерация; в противном случае (значение выражения есть false) выполнение оператора цикла заканчивается. Если выражение с самого начала имеет значение false, то цикл не выполнится ни разу.

Примерами оператора цикла с предусловием могут служить:

В последнем примере задан "бесконечный" цикл, так как выражение после служебного слова while тождественно равно true. Прекращение этого цикла может произойти, например, в результате перехода по метке вовне оператора цикла.

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

Этот оператор аналогичен предыдущему оператору (циклу с предусловием) и отличается от него, во-первых, тем, что условие проверяется ПОСЛЕ выполнения очередной итерации (таким образом, гарантируется хотя бы однократное выполнение цикла), а, во-вторых, тем, что критерием прекращения цикла является равенство выражения константе true; если выражение есть false, то цикл повторяется.

Например, цикл вида

repeat

Procl(X,Y+i);

i    :=   i-1

until i =0;

будет выполняться ДО ТЕХ ПОР, ПОКА i не станет равно нулю.

Ниже приведена синтаксическая диаграмма для цикла с постусловием.

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

Обратите внимание, что синтаксис while-цикла допускает в теле цикла только один оператор, в то время как repeat-цикл может содержать последовательность операторов.

Приведем еще два примера repeat-циклов.

repeat

К   := I mod J;

I    :=  J;

J   :=  К;

until J = 0;

repeat

Write('Введите целое число;   ') ;

Readln(i);

Process(i)

until (i  <  0)   and   (i  >  9);

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

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

а) диапазон изменения значений управляющей переменной и, одновременно, число повторений оператора, содержащегося в теле цикла;

б) направление изменения значения переменной (возрастание или убывание);

в) собственно действия, выполняемые на каждой итерации (оператор тела цикла).

Следующий простой пример иллюстрирует использование цикла с параметром.

for i:=1 to 10 do M[i]:=i*2

В данном примере задано десятикратное повторение оператора присваивания, причем управляющая переменная i последовательно принимает значения 1, 2, . . ., 9,10.

Диапазон значений управляющей переменной может задаваться выражениями, которые вычисляются ОДИН РАЗ перед выполнением цикла:

for j:=X+2 downto X-2 do

begin

M[j*2-1]:=Func(A,B);

Proc(M,j)

end

В этом примере значение переменной j последовательно уменьшается от начального значения Х+2 до конечного значения х-2.

Далее показана синтаксическая диаграмма для цикла с параметром.

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

Диапазон

На использование управляющей переменной налагаются следующие ограничения:

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

2. Управляющая переменная должна иметь дискретный тип.

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

4. В теле цикла запрещается явное изменение значения управляющей переменной (например, оператором присваивания).

5. После завершения оператора значение управляющей переменной становится неопределенным, если только выполнение оператора цикла не было прервано оператором перехода. (Однако практика работы с системой Turbo Pascal показывает, что на самом деле последнее использованное значение управляющей переменной сохраняется и при нормальном выходе из цикла).

Оператор, который содержится в теле оператора for, выполняется один раз для каждого значения в диапазоне между начальным и конечным значением. Управляющая переменная всегда инициализируется начальным значением. В случае использования служебного слова to значение управляющей переменной увеличивается при каждом повторении на единицу. Если начальное значение превышает конечное значение, то содержащийся в теле оператора for оператор не выполнятся. Когда в операторе цикла используется служебное слово downto, значение управляющей переменной уменьшается при каждом повторении на единицу. Если начальное значение в таком операторе меньше, чем конечное значение, то содержащийся в теле оператора цикла оператор не выполнится ни разу.

С учетом всего сказанного можно представить семантику данного оператора цикла следующим образом. Оператор

for V   := Expr1  to Expr2  do Body;

эквивалентен оператору:

begin

Temp1   := Expr1;

Temp2   := Expr2;

if Temp1  <= Temp2  then

begin

V   := Temp1;

Body ;

while V <> Temp2  do

begin

V   := Succ(V);

Body;

end;

end;

end;

Аналогично, оператор цикла for V   := Expr1  downto Exp2  do Body; эквивалентен оператору:

begin

Temp1 := Expr1;

Temp2 := Expr2,

if Temp1 >= Temp2 then

begin

V := Temp1;

Body ;

while V <> Temp2 dо

begin

V := Pred(V);

Body;

end;

end;

end;

где Temp1 и Temp2 - вспомогательные переменные, тип которых совпадает с основным типом переменной V и которые не встречаются в другом месте программы.

Приведем примеры оператора цикла с параметром:

1)   for  I   := 2 to  63  do

if Data[I] > Max then Max :- Data[I]

2) for I := 1 to 10 do

for J := 1 to 10 do begin

X := 0;

for К := 1 to 10 do

X   :- X + Mat1[I,K]*Mat2[K,J];

Mat[I,J]    :=  X;

end;

3)   for Day   := Monday to Friday do

Calculate_Profit(Day);

Пустой оператор

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

begin

goto Out;

Out:

end

Рассмотрим еще один практически полезный случай использования понятия пустого оператора. Синтаксис языка Pascal определяет символ ';' (точка с запятой) как разделитель операторов. Таким образом, последний оператор, например, в составном операторе не должен завершаться этим символом, так как после него не следует оператор, а идет служебное слово end:

begin

S1; S2; ...; SN

end

Однако если предположить, что между последним оператором SN и служебным словом end расположен пустой оператор, то становится допустимой такая форма записи:

begin

S1;   S2;    ...;   SN;

end

что в ряде случаев более предпочтительно.

Пустой оператор удобно использовать и в тех случаях, когда по той или иной причине необходимо организовать

некоторый составной оператор, не содержащий в себе ни одного оператора, например:

repeat until KeyPressed;

Здесь тело цикла не содержит ни одного оператора, чего синтаксис языка не позволяет. В этом случае считается, что цикл содержит один пустой оператор. Приведенный пример удобно использовать для организации задержки выполнения программы в ожидании нажатия любой клавиши (функция KeyPressed -стандартная функция языка Turbo Pascal - возвращает значение true при нажатии произвольной клавиши и false в противном случае).

В заключение заметим, что введение понятия пустого оператора делает допустимыми весьма экзотические конструкции вида:

1)   begin   S1;;;;;S2;   end

2)   if Cond then begin end

else while true do;

3)   if  Cond then ;

где S1, S2 - операторы, Cond - некоторое выражение булевского типа.


 

А также другие работы, которые могут Вас заинтересовать

76812. Двенадцатиперстная кишка 181.15 KB
  Голотопическая проекция кишки приходится на эпигастральную и околопупочную области. Строение стенки Слизистая оболочка с подслизистой основой образует циркулярные складки во всех отделах кишки. Топография кишки Двенадцатиперстная кишка располагается большей своей частью забрюшинно у задней брюшной стенки на уровне ХII грудного III поясничного позвонков проецируется на эпигастральную и околопупочную области.
76813. Брыжеечная часть тонкой кишки (тощая и подвздошная), строение, стенки, кровоснабжение, иннервация 185.11 KB
  Брыжеечная часть называется по наличию у тощей и подвздошной кишки брыжейки которая представляет собой двойной листок брюшины косо прикрепляющийся к задней брюшной стенке по линии слева направо от второго поясничного позвонка к правому...
76814. Толстая кишка 189.72 KB
  Железы кишки выделяют мало ферментов всасывание ограничивается изза отсутствия кишечных ворсинок. Отличительные анатомические признаки: продольные ленты tenie coli: брыжеечная сальниковая свободная tenie mesocilic tenie omentlis tenie liber сформированные длинными гладкомышечными пучками; гаустры hustre coli поперечные вздутия с поперечными бороздами между ними образованные за счет перераспределения продольных и круговых мышц; сальниковые отростки ppendicis epiploice до 45 см длиной в виде пальцевидных выростов...
76815. Слепая кишка: строение, отношение к брюшине. Топография червеобразного отростка, кровоснабжение, иннервация 184.72 KB
  В ней присутствуют все отличительные признаки толстой кишки: продольные ленты и гаустры сальниковые привески и другие признаки толстой кишки. В просвет кишки с медиальной стороны открывается илеоцекальное отверстие в виде горизонтальной щели ограниченной верхней и нижней полулунными складками слизистой которые по углам сходятся и образуют уздечку. Всё вместе взятое складки уздечка мышца составляют илеоцекальный клапан Баугиниеву заслонку vlv ileoceclis регулирующий порционное продвижение пищевой массы из тонкой кишки в толстую....
76816. Прямая кишка 183.75 KB
  На положение и фиксацию кишки значительное влияние оказывает крестцовокопчиковое искривление нижняя часть которого служит своеобразной опорой. Начало кишки находится на уровне третьего крестцового позвонка и левого подвздошнокрестцового сустава. На положение и размеры кишки особенно влияют сигмовидная кишка и матка мышцы и клетчатка тазового дна и промежности. С прямой кишки брюшина переходит на органы малого таза расположенные перед кишкой образуя у мужчин ректовезикальное углубление excvtio rectovesiclis а у женщин ...
76817. Печень, ее развитие, строение, топография, кровоснабжение и иннервация, региональные лимфатические узлы 186.78 KB
  Печень hepr развивается из первичного эпителия энтодермы эмбриональной первичной кишки. Из переднего возникает печень из заднего желчный пузырь. Развивающаяся печень врастает между листками вентральной брыжейки сохраняя связь с кишкой благодаря растущему холедоху.
76818. Желчный пузырь. Выводные протоки желчного пузыря и печени. Кровоснабжение и иннервация желчного пузыр 184.91 KB
  Выводные протоки желчного пузыря и печени. Желчный пузырь vesic felle biliris seu cholecystis прирастает к висцеральной поверхности правой доли печени в одноименной ямке что лежит в передней половине правой сагиттальной борозды. Дно fundus vesic felle есть слепо расширенный конец выступающий из под нижнего края печени на уровне сращения VIIIIХ реберных хрящей справа. Тело corpus vesic felle сужается по направлению к воротам печени и плавно сливается с шейкой над которой нередко нависает в виде своеобразного кармана прилежащая...
76819. Поджелудочная железа, развитие, топография, строение, выводные протоки, внутрисекреторная часть, кровоснабжение, иннервация, региональные лимфатические узлы 185.67 KB
  Внутрисекреторная эндокринная часть железы создаёт инсулин глюкагон соматостатин липокаин и другие гормоны для обменных процессов и роста во всем организме. Развитие железы осуществляется из переднего и заднего выростов эпителия первичной кишки в месте образования дуоденум. Аномалия развития добавочные дольки железы. Масса органа 80 г длина 1418 см ширина 9 см толщина 23 см внутрисекреторная часть составляет 12 от массы железы.
76820. Верхний этаж брюшной полости 180.02 KB
  Брюшина верхнего этажа с диафрагмы переходит на выпуклую диафрагмальную поверхность печени образуя серповидную венечную и треугольные связки которые отграничивают внебрюшинное поле печени прирастающее к диафрагме. В последней в направлении справа налево располагается холедох воротная вена собственная артерия печени. Желудок брюшина покрывает интраперитонеально переходя на него с печени по малому сальнику. Париетальная брюшина в верхнем этаже образует три сумки: печеночную для правой и квадратной долей печени преджелудочную для...