Лекция №2
Управляющие структуры Турбо Паскаля.
План
1. Условный оператор
2. Оператор выбора
3. Операторы повторений
3.1. Цикл For
3.2. Цикл While
3.3. Цикл Repeat…Until
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 должна быть описана в разделе описаний и она обязательно должна встретиться где-нибудь в теле программы;
ü Метки, описанные в процедуре (функции), локализуются в ней, поэтому передача управления извне процедуры (функции) на метку внутри ее невозможна.


