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

Условие

;


 

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

7413. Відповідальність державних службовців за інші правопорушення, повязані з корупцією 301.5 KB
  Мета даної роботи - розкрити поняття, зміст, основні характеристики та властивості інших правопорушень, пов’язаних з корупцією в галузі державної служби, а також по можливості визначити місце цих понять в системі українського законодавства.
7414. Сумматоры с параллельным переносом 126.5 KB
  Тема: Сумматоры с параллельным переносом Сумматоры с параллельным переносом - сумматоры, в которых сложение выполняется как поразрядная операция. Применяются в устройствах с высоким быстродействием микроопераций сложения. При этом старают...
7415. Методы изготовления и прокладки оптических кабелей 168 KB
  Методы изготовления и прокладки оптических кабелей. Технологический процесс изготовления оптического кабеля базируется на основных принципах кабельной технологии. Однако для практической реализации разнообразных конструкций ОК, обладающих отличитель...
7416. Программируемые логические матрицы 240 KB
  Тема: Программируемые логические матрицы Программируемая логическая матрица (ПЛМ) - это универсальная структура, позволяющая запрограммировать систему булевых функций путем организации связи между вертикальными и горизонтальными шинами. Набор э...
7417. Соединение оптических волокон 645 KB
  Соединение оптических волокон Соединение оптических волокон является наиболее ответственной операцией при монтаже кабеля, предопределяющей качество и дальность связи по ВОЛС. Соединение волокон и монтаж кабелей производятся как в процессе производст...
7418. Микропроцессоры (МП) и их характеристика 83.5 KB
  Тема: Микропроцессоры (МП) Микропроцессорами называются цифровые устройства, осуществляющие вычисления в соответствии с заданным законом функционирования, которые выполнены в виде интегральной схемы. Микропроцессоры (МП) по применимости класси...
7419. Синтез управляющих автоматов. Таблица переходов автомата Мили 82 KB
  Тема: Синтез управляющих автоматов. Таблица переходов автомата Мили. Таблица переходов используется для построения комбинационных частей автомата Мили, в частности - для определения функций возбуждения элементов памяти и определения функций вых...
7420. Основные принципы проектирования и эксплуатационно-технического обслуживания ВОЛС 267 KB
  Основные принципы проектирования и эксплуатационно-технического обслуживания ВОЛС. Требования к ВОЛС. Проектирование систем волоконно-оптической связи следует начинать с определения предъявляемых к системе требоваий, что определит в дальнейшем сам п...
7421. Микропрограммные автоматы с программируемой логикой (МПА с ПЛ) 87 KB
  Тема: Микропрограммные автоматы с программируемой логикой(МПА с ПЛ) МПА с ПЛ используется для построения устройств управления. Они функционируют автоматически автоматам Мили и Мура, которые строятся на жесткой логике. Отличительная способность...