4795

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

Лекция

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

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

Русский

2012-11-27

89.5 KB

24 чел.

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

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

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

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

Составной оператор предусматривает выполнение входящих в него операторов - компонент в порядке их написания. Служебные слова 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

Условие

;


 

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

25203. Філософія неогегельянства 28.5 KB
  Центральний пункт гегелівської діалектики вчення про протилежності оцінюється як хибне МакТаггарт. Абсолютний дух розглядається як сукупність індивідуальних свідомостей МакТаггарт як вища форма індивідуальності Бозанкет.
25204. І.Кант Пролегомени до всякої майбутньої метафізики 29.5 KB
  Сутність метафізики: розум займається виключно самим собою і знайомство з обєктами які набуваються безпосередньо від роздумів над своїми власними поняттями не потребуючи для цього досвіду взагалі; таке пізнання не виводиться з досвіду. Кожний окремий досвід є тільки частина всієї сфери досвіду але саме абсолютне ціле всього досвіду не є досвід і тим не менш складає проблему для розуму. Поняття ж розуму мають повноту тобто збираючу єдність усього можливого досвіду і стають трансцендентними. Таким чином як розсудок потребує для досвіду...
25205. Постсруктуралізм як самокритика структуралізму 28 KB
  критика авторасубєкта і літературного твору в якості його продукту. Якщо для структуралізму структура це самодостатнє ціле яке не потребує ні адресата ні комунікативної ситуації ні автора автор лише простий виконавець структурних приписів то з позиції П. проголошує війну на два фронти і проти структури і проти автора які пригнічують будьяку різноманітність і різнобарвя дійсності. протиставив принцип багатозначного прочитання твору; а структуралістському розчиненню автора в мові його розєднанню на множину дискурсивних...
25206. Жак Дерріда: людина і світ як текст 28.5 KB
  Жак Дерріда: людина і світ як текст Дерріда ключова фігура постструктуралізму і деконструктивізму. Класична філософія вичерпала себе метод її подолання деконструкція яка націлена на знищення метафізичних смислів що містяться в тексті. Мета звільнення від метафізики присутності задля можливості розуміти текст як феномен який сам себе породжує.Відкриття того що говорить текст 2.
25207. Cубстанційна концепція моральних добра і зла 35 KB
  Добро і зло в цих системах мають субстанційну природу це два самостоятельних рівноправних початка світу. Боротьба цих двох початків визначає розвиток світу. Добро і зло в данному випадку онтологізуються це надлюдські сили які складають дуальну основу світу. Абсолютне Благо верховний принцип існування нерухомого світу ідей і матерія як косное неструктурированное начало составляют вместе рамки проявления добра и зла их онтологічна основа.
25208. Християнське обґрунтування моралі. Євангельська моральна доктрина 44 KB
  Підставою всього ранньохристиянського світогляду була абсолютна орієнтованість на Бога як джерела й ціль будьяких чел. Шлях до Бога є шлях порятунку через народження понад і фізичну смерть. є подоба Бога. образа Бога.
25209. Сучасний дискурс справедливості 25 KB
  Сучасний дискурс справедливості. Одною з найяскравіших робіт що зможе розкрити це питання є робота Роулза Теорія справедливості. По суті теорія справедливості означає розрив з традицією. Головною засадою за Роулзом є інтуїтивне почуття справедливості.
25210. Життєвий світ в феноменологічній філософії 28.5 KB
  Життєвий світ в феноменологічній філософії Гуссерль Криза європейських наук та трансцендентальна феноменологія Життєвий світ як безпосередньо актуально існуюча сфера первинних засад знання як дійсних форм досвідного споглядання серед яких ми самі живемо відповідно до тілесного способу існування особистості. Життєвий світ як необхідна передумова будьякого досвіду трансцендентальна умова. Виходячи із перспективи життєвого світу Гуссерль критикує ідеалізацію обєктивізму наук про природу які піддають забуттю життєвий світ...
25211. Основи метафізики звичаїв (моральності) 26.5 KB
  Основи метафізики звичаїв моральності Основи метафізики звичаїв 1785 входить до циклу праць в яких Кант висвітлює основні положення своєї практичної філософії. Головна мета роботи встановлення вищого принципу моральності. Шлях реалізації мети потрійний перехід: від повсякденного моральнісного пізнання до філософського від популярної моральної філософії до метафізики моральності і від метафізики моральності до критики чистого практичного розуму. Обґрунтовання поняття метафізики моральності.