4795

Операторы управления языка Паскаль

Лекция

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

Операторы управления ЯП Операторы выбора: типы, синтаксис и семантика. Выбирающие операторы ЯП Паскаль. Техника программирования ветвлений. Операторы повторения: типы, синтаксис и семантика. Техника программирования циклов...

Русский

2012-11-27

89.5 KB

23 чел.

Операторы управления ЯП

  •  Операторы выбора: типы, синтаксис и семантика. Выбирающие операторы ЯП Паскаль.
  •  Техника программирования ветвлений.
  •  Операторы повторения: типы, синтаксис и семантика.
  •  Техника программирования циклов.
  •  Предусловия, постусловия и инварианты циклов.
  •  Представление о доказательном программировании.

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

Несколько операторов, выполняемых последовательно, можно объединять в один составной оператор.

Составной оператор предусматривает выполнение входящих в него операторов - компонент в порядке их написания. Служебные слова Begin и End играют роль операторных скобок - они выделяют тело составного оператора.

Составной оператор определяется диаграммой :

Обратите внимание на то, что раздел операторов программы представлен как один составной оператор.

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

а)   Begin

        Write(‘Введите координаты вектора: ‘);

        Readln(a, b, c);

        Length := sqrt(a*a + b*b+ c*c);

        Write(‘длина (a,b,c) равна ‘, Length)

    End

б)   Begin writeln (‘уравнение корней не имеет’) End

Выбирающие операторы: Условный оператор

Выбирающие операторы предназначены для выделения из составляющих их операторов - компонент одного - единственного, который и выполняется. Таким образом, выбирающие операторы реализуют управляющую структуру “ветвление”.  В качестве выбирающих в языке определены условный оператор и оператор варианта.

Существует две формы условного оператора :


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

IF <условие> then < оператор > else <оператор>

Они соответствуют базовым управляющим структурам короткого и полного ветвления. Условие - это выражение типа Boolean .

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

                                                                     

Условный 

оператор

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

а) If IntFun(i) mod 3 = 0 then write(i)

б) If  (a11*a22 = a12*a21) And

     ((a11*b2 <> a12*b1) Or

(b1*a22 <> b2*a21))

   then Write(‘система решений не имеет’)

   else Write(‘система имеет решения’)

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

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

If<усл 1> then If <усл 2> then <оператор 1> else <оператор 2>

 

1 вариант:  If <усл 1>

 then begin

      If <усл 2> then <оператор 1> else <оператор 2>

        end

2 вариант:   If<усл 1>

then begin

 If <усл 2> then <оператор 1>

end

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

Для устранения двусмысленности в языке избран 1-ый вариант интерпретации в соответствии с правилом: разделителю else соответствует ближайший предыдущий разделитель then.

Выбирающие операторы: оператор варианта

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

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

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

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

Case < выражение {селектор}>  of  <список меток варианта> : < оператор >;

. . . . . . . . . .

< список меток варианта > : < оператор >

[else < оператор > ]

end

На языке синтаксических диаграмм это выглядит так:

                          

Пример:

case Index mod 4 of

 0 : x := y*y + 1;

 1 : x := y*y - 2*y;

 2,3 : x := 0

end;

б) case ch of

 ‘a’,’b’,’c’ : ch := succ(ch);

 ‘y’,’z’ : ch := pred(ch);

 ‘f’,’g’ : {пустой вариант};

else ch := pred(pred(ch)

end;

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

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

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

Для реализации циклических алгоритмов в языке Паскаль используются операторы повторения:

  1.   оператор цикла с параметром;
  2.   оператор цикла с предусловием;
  3.   оператор цикла с постусловием.

В настоящем параграфе изучается оператор цикла с параметром.  Такой оператор предусматривает повторное выполнение некоторого оператора с одновременным изменением значения, присваиваемого управляющей переменной (параметру этого цикла). Он имеет вид:

For <параметр> := <начальное значение> to <конечное значение> do <оператор>

или

For<параметр>:=<начальное значение> downto <конечное значение> do <оператор>

Синтаксическая диаграмма оператора цикла с параметром:

Здесь

Имя - это имя переменной - параметра цикла;

A - начальное значение параметра цикла;

B - конечное значение параметра цикла;

Оператор - тело цикла.

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

Если начальное и конечное значения разделяет служебное слово to, то после выполнения оператора (тела цикла) параметр цикла v принимает значение Succ(v), если же разделителем начального и конечного значений служит слово downto, то параметр цикла v после выполнении тела цикла принимает значение Pred(v). В частности, если параметр v имеет тип Integer, то одновременно с выполнением тела цикла осуществляется либо присваивание v := v + 1 (to), либо   v := v - 1 (downto).  Дополнительно (принудительно) изменять значение параметра в теле цикла не рекомендуется, поскольку контроль за правильностью исполнения такого цикла очень затруднен.  Если в цикле с to начальное значение больше, чем конечное, то цикл не выполняется вообще. Аналогично, если в цикле с downto начальное значение меньше, чем конечное, цикл также не выполняется.

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

1. Следующий пример демонстрирует применение цикла с параметром в таких вычислениях.

Пример. Табулирование функции вещественного переменного.

Рrogram Tabulation;

  const Pi=3.14159262;

  var MinBound, MaxBound, Step: Real;

  x, y : Real;   Coef : Real;

  i, n : Integer;

Begin

 Write(‘Введите пределы табулирования ‘); Readln(MinBound, MaxBound);

 Write(‘Введите шаг табулирования ‘); Readln(Step);

 n := Round((MinBound - MaxBound)/Step);

 x := MinBound;   Coef := 1/Sqrt(Pi);

 for i := 0 to n do  begin

   y := Coef * exp(-Sqr(x)/2);

   writeln(‘ x = ‘,x,’ y = ‘,y);

   x := x + Step

 end;

End.

Программа табулирует функцию y=1/ e-x2/2 в интервале значений [MinBound, MaxBound] с шагом Step. Обратите внимание на то, что перед входом в цикл вычисляется N - верхняя граница параметра цикла, а в теле цикла вычисляется следующее значение х.

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

Применение оператора перехода для досрочного выхода из цикла

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

Оператор имеет вид: Goto < метка >

Метка представляет собой целое число без знака, состоящее не более чем из 4 цифр. В разделе операторов каждая метка может встречаться только перед одним оператором. Каждая метка, встречающаяся в разделе операторов, должна быть описана в разделе меток.

Раздел меток определен следующей диаграммой:

Раздел меток

                     

После метки, отмечающей оператор, следует ставить двоеточие. Например:

1995 : х := х +I; 1 : read(Y);

Внимание! Действие оператора перехода внутрь сложного оператора извне не определено.

Оператор перехода следует использовать в необычайных, исключительных ситуациях, когда приходится нарушать естественную структуру алгоритма. Следует помнить, что любой алгоритм может реализован без применения Goto без утраты эффективности. Этот факт имеет приципиальный характер. Именно поэтому структурный стиль программирования иногда называют “Программирование без Goto”.

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

Пример.

Program Search_in_Array;

  Label 1;

  Const n = 100;

    Var A : Array[1..n] of Real;

         b : Real;

         Flag : Boolean;

             i : Integer;

  Begin

    {Блок чтения массива A и элемента b}

   Flag := true;

   For i := 1 to n do

      If A[i] = b then begin

         Flag := false; goto1

   end; { прерывание цикла }

   1:If Flag

      then Writeln(‘Элемент ‘,b,’в массиве отсутствует’)

      else Writeln(‘элемент ‘,b,’стоит на’,i,’-том месте’);

  End.

Операторы повторения While и Repeat.

В предыдущем параграфе мы изучили оператор повторения с параметром (For).

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

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

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

с предусловием

Оператор (тело цикла) выполняется до тех пор, пока условие истинно. Если при первой проверке условие оказалось ложным, оператор не выполняется ни разу .

Пример: Найти наименьшее натуральное решение неравенства x3 + ax2 + bx + c > 0 с целыми коэффициентами.

Очевидный алгоритм поиска решения заключается в последовательном вычислении значений Y = x3 + ax2 + bx + c для x = 1, 2, 3, ... до тех пор, пока Y 0.

Program UneqvSolution;

  Var a, b, c : Integer;

 X : Integer;  Y : Real;

Begin

   Write(‘ введите коэффициенты a, b, c : ‘); Readln(a, b, c);

    X := 1; Y := a + b + c + 1; { Инициализация цикла }

   While Y <= 0 do begin

     X := Succ(X); { Следующее значение X }

     Y := ((X + a)*X + b)*X + c { Следующее значение Y }

   end;

  Writeln(‘X = ‘, X, ‘ Y = ‘, Y )

End.

Для обоснования этого метода требуется единственное: убедиться в том, что цикл когда-нибудь завершится, т.е. что решение неравенства существует! Заметим, что

lim (x3 + ax2 + bx + c) = +

x -> +

Поэтому при некотором x0 x03 + ax02 + bx0 + c > 0 Положим x = |a| + |b| + |c|. Тогда x3 = (|a| + |b| + |c|)x2 > |a|x2 + |b|x + c Следовательно, x3 + ax2 + bx + c > x3 - (|a|x2 + |b|x + c) > 0 Поэтому количество повторений цикла не превосходит величины |a| + |b| + |c|, что дает возможность не только обосновать завершение, но и оценить сложность программы в худшем случае.

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

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

с постусловием

Тело цикла Repeat выполняется до тех пор, пока условие принимает значение False. Действия, содержащиеся в теле цикла, будут выполнены по крайней мере один раз. Таким образом, условие является условием окончания цикла.

Пример. Найти номер наименьшего числа Фибоначчи, делящегося на 10. Последовательность Фибоначчи { F(n) } определяется рекуррентно:

F(1) = F(2) = 1,  F(n+2) = F(n+1) + F(n)

Как и в предыдущем примере, вычисляем Fn для n = 3, 4, ...  до тех пор, пока не найдем элемент последовательности, делящийся на 10. Проблема обоснования метода остается преждней: существует ли искомый элемент?

Program Fibbonachy;

  Var Fib1, Fib2 : Integer;

          Index : Integer;  Buf : Integer;

Begin

Fib1 := 1; Fib2 := 1; Index := 2; { Инициализация цикла }

Repeat

 Buf := Fib2;

 Fib2 := Fib2 + Fib1;   { Следующее число Фибоначчи }

 Fib1 := Buf;   { Предыдущее число Фибоначчи }

 Index := Succ(Index)   { Номер числа Фибоначчи }

 until Fib2 mod 10 = 0;

Writeln(‘Номер = ‘, Index, ‘ Число = ‘, Fib2)

End.

Циклы While и Repeat называют еще итерационными циклами, поскольку с их помощью легко реализовать различного рода итерационные вычисления (вычисления, в которых каждый следующий результат является уточнением предыдущего). Условие окончания цикла - достижения отклонения реэультата Yn от Yn-1 некоторой допустимой погрешности  :

|Yn - Yn-1| <  

Пример : Вычислить с заданной точностью значение корня уравнения x = cos(x) на отрезке [0 ; 1] методом деления отрезка пополам .

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


Program TransEquation;

   Const a = 0; b = 1;

          Epsilon = 1e-5;

     Var u, v, Root : Real;

          Fu, Fr : Real;

   Begin

    u := a; v := b; { инициализация цикла }

    Fu := Cos(u) - u;

    Repeat

      Root := (u + v)/2 ; { средняя точка отрезка }

      Fr := Cos(Root) - Root;

       if Fu*Fr > 0 { выбор правой или левой половины }

        then begin u := Root; Fu := Fr end

        else v := Root

     until Abs(v - u) < Epsilon;

    writeln (‘ корень= ‘, Root, ‘ с точностью ‘,Epsilon)

   End.

Для того, чтобы найти количество N повторений в цикле, заметим, что на k-том шаге цикла выполнено неравенство | v - u | = (b - a)/2k. Поэтому при наименьшем k таком, что (b - a)/2k <  цикл завершится. Нетрудно вычислить N:

  N = [ log2(b - a)/ ]     (1)

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

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


Begin

Оператор

End

,

составной

оператор

If

Условие

Then

ператор

Else

Оператор

 Case

Селектор

Of

Список меток варианта

Оператор

  1.  :
  2.  
  3.  ;
  4.  

Else

Оператор

 End

Оператор

варианта

 метка варианта

,

Список меток

варианта

B

Do

Оператор

For

:=

Имя

A

to

downto

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

с параметром

Label

Метка

,

While

Условие

do

Оператор

Repeat

Оператор

until

Условие

;


 

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

6171. Налаштування магістральних портів для зєднання комутаторів 99.5 KB
  Виконати спостереження за конфігурацією VLAN комутатора і його роботою. Виконати налаштування статичних VLAN на комутаторі. Перевірити конфігурацію VLAN і її роботу. Виконати налаштування магістралі між комутаторами
6172. Автосервис и фирменное обслуживание 8.35 MB
  Приведены материалы, необходимые при выполнении дипломных проектов по кафедре технологии обслуживания транспортных средств. Тематическая направленность проектов соответствует профессиональной деятельности выпускников на предприятиях автосервиса и фи...
6173. Создание, изменение и удаление таблиц в SQL Oracle 208 KB
  Создание, изменение и удаление таблиц в SQL Oracle Цели лабораторной работы Изучить возможности SQL Oracle по созданию, изменению и удалению таблиц. Приобрести практический опыт по созданию, изменению и удалению таблиц в SQL*Plus. ...
6174. Creation altering and deletion a table in SQL Oracle 206.5 KB
  Creation altering and deletion a table in SQL Oracle Purpose of the lab To study SQL Oracle possibilities in table creation, altering and deletion. To acquire practical skills in table creation, altering and deletion by using SQL*P...
6175. Integrity constraints in SQL Oracle 182 KB
  Integrity constraints in SQL Oracle Purpose of the lab To study SQL Oracle integrity constraints possibilities. To acquire practical skills in describing integrity constraints. Theoretical backgrounds You can define integrity...
6176. Системи захисту програмного забезпечення 72.5 KB
  Системи захисту програмного забезпечення 1. Класифікація систем захисту програмного забезпечення Системи захисту програмного забезпечення (СЗПЗ) широко поширені і знаходяться в постійному розвитку, завдяки розширенню ринку програмного забезпечення і...
6177. Понятие экономических информационных систем, принципы их построения и функционирования 71.05 KB
  Понятие экономических информационных систем, принципы их построения и функционирования. Критерии оценки ЭИС. Классификация ЭИС. Изучение ЭИС можно декомпозировать следующим образом: компоненты ЭИС, как работают ЭИС, динамика развития ЭИС, как управл...
6178. Закупівельна логістика 108 KB
  Закупівельна логістика. Сутність закупівельної логістики. Задачі закупівельної логістики. Служба закупівель на підприємстві. Задача зробити чи купити у закупівельній логістиці. Задача вибору постачаль...
6179. Модели данных: нормализация отношений 80.5 KB
  Модели данных: нормализация отношений. 1НФ. Нормализация отношений Центральная задача проектирования базы данных ЭИС - определение количества отношений и их атрибутного состава. Задача группировки атрибутов в отношения допускает множеств...