Лекция №2

Управляющие структуры Турбо Паскаля.

План

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

2.  Оператор выбора

3.  Операторы повторений

3.1.  Цикл For

3.2.  Цикл While

3.3.  Цикл RepeatUntil

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

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

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

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

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

If, then, else –зарезервированные слова (если, то, иначе);

<условие> - произвольное выражение логического типа;

<оператор1>, <оператор2>- любые операторы языка Турбо Паскаль.

Выполнение условного оператора начинается с вычисления значения логического выражения, записанного в условии. Простые условия записываются в виде равенств или неравенств. Сложные условия составляют из простых с помощью логических операций, при этом каждое условие берется в скобки. Если условие истинно (true), то выполняется <оператор1>, а <оператор2> пропускается. Если условие ложно (false), то <оператор1> пропускается, а выполняется <оператор2>. Если в качестве оператора должна выполниться серия операторов, то они объединяются в операторные скобки begin - end.

Пример 1. Вычислить значение выражения max(x+y+z, xyz) + 3 при заданных x, y и z:

Program ех_1;

Uses crt;

НЕ нашли? Не то? Что вы ищете?

Var x, y, z, m: integer;

Begin

Clrscr;

Writeln(‘Введите x, y и z: ’);

Readln(x, y, z);

If (x + y + z) > x * y * z then

Begin m:= x + y + z + 3; Writeln(m); end

Else writeln(x * y * z + 3);

Readkey;

End.

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

Пример 2. Например, если значение переменной x меньше 0, то заменить x на x2.

Program ех_2;

Uses crt;

Var x: integer;

Begin

Clrscr;

Writeln(‘Введите x: ’);

Readln(x);

If x < 0 then x:=sqr(x);

Writeln(x);

Readkey;

End.

Вложенные операторы условия.

Часто приходится выбирать путь решения задачи не из двух, а из нескольких возможных. В программировании это можно реализовать, используя несколько условных операторов. В этом случае после служебных слов then и else записывается новый условный оператор. Если элементами вложенных условных операторов служат неполные условные операторы, то служебное слово else относится к ближайшему if.

Пример 3. Даны целые числа a, b, c. Если a <= b <= c, то все числа заменить квадратами, если a > b > c, то каждое число заменить наименьшим из них, в противном случае сменить знак каждого числа.

Program ex_3;

Uses crt;

Var a, b, c: integer;

Begin

Clrscr;

Writeln(‘Введите числа: ’);

Readln(a, b, c);

If (a <= b) and (b <= c) then

Begin

a:= sqr(a); b:= sqr(b); c:= sqr(c);

End

Else

If (a > b) and (b > c) then

Begin

a:=c; b:=c;

End

Else

Begin

a:=-a; b:=-b; c:=-c;

End;

Writeln(‘a =’, a,’ b = ‘,b,’ c = ‘,c);

Readkey;

End.

2. Оператор выбора

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

Структура оператора выбора такова:

case <ключ выбора> of

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

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

…………………………………..

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

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

end;

case, of, else, end – зарезервированные слова (случай, из, иначе, конец)

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

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

Пример 4. Составим программу, которая в зависимости от номера месяца печатает количество дней в нем.

Program ех_4;

Uses crt;

Var n: integer;

Begin

Clrscr;

Write(‘Введите номер месяца: ’);

Readln(n);

Case n of

1, 3, 5, 7, 8, 10, 12: writeln(‘В этом месяце 31 день’);

4, 6, 9, 11: writeln(‘В этом месяце 30 дней’);

else writeln(‘В этом месяце 28 дней’);

end;

Readkey;

End.

3. Операторы повторений

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

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

Он имеет такую структуру:

for <параметр> := <нач_знач> to <кон_знач> do <оператор>;

for, to, do – зарезервированные слова (для, до, выполнить)

<параметр> - переменная порядкового типа;

<нач_знач> - начальное значение параметра – выражение того же типа

<кон_знач> - конечное значение параметра - выражение того же типа

<оператор> - произвольный оператор Турбо Паскаля.

При выполнении оператора For вначале вычисляется выражение <нач_знач> и осуществляется присваивание <параметр>:=<нач_знач>. После этого циклически повторяется:

ü  Проверка условия <параметр> <= <кон_знач>; если условие не выполнено, оператор for завершает свою работу; (если условие не выполняется в самом начале работы оператора For, исполняемый оператор не будет выполнен ни разу)

ü  Выполнение оператора <оператор>;

ü  Наращивание переменной <параметр> на единицу.

Пример 5. Составить программу, подсчитывающую сумму всех натуральных чисел от 1 до N.

Program ex_5;

Uses crt;

Var I, n, S: integer;

Begin

Clrscr;

Write(‘ Введите натуральное число n’); read (n);

S:=0; { начальное значение суммы}

For I:=1 to n do {цикл подсчета суммы}

S:=S+I;

Writeln (‘Сумма =’ , S); {вывод результата}

Readkey;

End.

Существует другая форма оператора For:

for <параметр> := <нач_знач> downto <кон_знач> do <оператор>;

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

Модифицированный фрагмент программы из примера 5.

……..

For I:=n downto 1 do {цикл подсчета суммы}

S:=s+I;

……..

3.2. Оператор цикла While с предпроверкой условия:

While <условие> do <оператор>;

While, do –зарезервированные слова (пока [выполняется условие], делать);

<условие> - выражение логического типа;

<оператор> - произвольный оператор Турбо Паскаля;

Если выражение <условие> имеет значение true (истина), то выполняется <оператор>, после чего вычисление выражения <условия> и его проверка повторяются. Если <условие> имеет значение false (ложь), оператор While прекращает свою работу.

Пример 6. Составить программу, подсчитывающую сумму всех натуральных чисел от 1 до N.

Program ex_6;

Uses crt;

Var I, n, S: integer;

Begin

Clrscr;

Write(‘ Введите натуральное число n’); read (n);

S:=0; I:=1; { начальное значение суммы}

While I<=n do {цикл подсчета суммы}

begin

S:=S+I;

I:=I+1;

End;

Writeln (‘Сумма =’ , S); {вывод результата}

Readkey;

End.

3.3. Оператор цикла Repeat …Until с постпроверкой условия:

Repeat <тело цикла> until <условие>;

Repeat, Until - зарезервированные слова (повторять до тех пор, пока не будет выполнено условие);

<Тело цикла> произвольная последовательность операторов Турбо Паскаля;

<условие>- выражение логического типа;

Операторы <тело цикла> выполняются хотя бы один раз, после чего вычисляется выражение <условие>: если его значение есть false (ложь), операторы <тело цикла> повторяются, в противном случае оператор Repeat … Until завершает свою работу

Пример 7. Составить программу, подсчитывающую сумму всех натуральных чисел от 1 до N.

Program ex_7;

Uses crt;

Var I, n, S: integer;

Begin

Clrscr;

Write(‘ Введите натуральное число n’); read (n);

S:=0; I:=1; { начальное значение суммы}

Repeat {цикл подсчета суммы}

S:=S+I;

I:=I+1;

Until i>n;

Writeln (‘Сумма =’ , S); {вывод результата}

Readkey;

End.

Для гибкого управления циклическими операторами For, While, Repeat в состав Турбо Паскаля включены две процедуры:

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

CONTINUE – обеспечивает досрочное завершение очередного прохода цикла; эквивалент передачи управления в самый конец циклического оператора;

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

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

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

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

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

Goto <метка>;

Goto – зарезервированное слово (перейти [на метку]);

<метка> - метка;

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

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

Пример 8. Если значение переменной x меньше 0, то вывести на экран x2, иначе вывести на экран –х.

Program ex_8;

Uses crt;

Label lb1,lb2, end1;

Var

Begin

Clrscr;

Writeln(‘Введите x: ’);

Readln(x);

If x < 0 then goto lb1 else goto lb2;

Lb1: Writeln(x*x);

Goto end1;

Lb2: Writeln(-x);

End1: Readkey;

End.

Действие оператора Goto состоит в передаче управления соответствующему меченому оператору.

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

ü  Метка на которую ссылается оператор Goto должна быть описана в разделе описаний и она обязательно должна встретиться где-нибудь в теле программы;

ü  Метки, описанные в процедуре (функции), локализуются в ней, поэтому передача управления извне процедуры (функции) на метку внутри ее невозможна.