Лекция
Тема: «Организация алгоритмов ветвления и выбора на Turbo Pascal»
План
1. Оператор ветвления
2. Оператор выбора
3. Оператор безусловного перехода
1. Оператор ветвления в языке Паскаль
При написании некоторых программ ход выполнения кода может зависеть от выполнения некоторого условия. Такую структуру программы называют ветвлением.
В Паскале существуют средства, с помощью которых можно организовать ветвление в программе. Одним из таких операторов является оператор If … Then … Else
Общий вид оператора следующий:
If выражение Then
оператор
Else
оператор;
Действие оператора состоит в следующем: вычисляется значение выражения булева типа. Если оно истинно, то выполняется оператор, следующий за словом Then. Если значение ложно, выполняется оператор, следующий за словом Else. Затем управление передается на следующий за If оператор.
Операторные скобки
Если после зарезервированных слов Then или Else нужно выполнить несколько операторов, то их нужно объединить в составной оператор с помощью операторных скобок Begin...End.
If выражение Then
Begin
оператор 1;
оператор 2;
...
оператор N
оператор 1;
оператор 2;
...
оператор N
End;
Условные операторы могут быть вложенными, степень их вложенности Паскалем не ограничена.
If выражение Then оператор
...
Else оператор;
Перед зарезервированным словом Else не ставится точка с запятой. Кроме этого часть Else в конструкции условного оператора можно опускаться. В этом случае, если булево выражение имеет значение False, никакие действия не выполняются, управление в программе передается оператору, следующему за условным оператором.
Пример. Напишем программу, которая определяет и печатает наибольшее из двух чисел
{Подключаем модуль по работе с
экраном}
Uses Crt;
{Описываем переменные}
Var А,В: Integer;
Begin
{Очищаем экран}
ClrScr;
{Вводим исходные данные}
Write ('Введите два числа');
Read (A,B);
{Если число A больше числа B}
If A=B Then
{то печатаем на экран А}
Writeln (‘Максимум=’,A:5:2)
Else
{иначе печатаем на экран В}
Writeln (‘Максимум=’,B:5:2);
{Делаем паузу для просмотра результата}
Readln;
End.
Пример. Найти максимальное из трех чисел
{Подключаем модуль по работе с
экраном}
Uses crt;
{Описываем переменные}
Var a, b, c, max: real;
Begin
{Очищаем экран}
ClrScr;
{Вводим исходные данные}
Write (‘Ввести a, b, c’);
ReadLn (a, b, c);
{Если А больше В}
If a >= b then
{и А больше С}
If a >= c Then
{то А максимальное}
max:=a
Else
{иначе максимальное С}
max:=c
Else
{Если В больше А}
{и В больше С}
If b >= c Then
{то B максимальное}
max:=b
Else
{иначе максимальное С}
max:=c;
{Выводим найденный максимум на экран}
WriteLn (‘Максимум из
трех чисел=’,max:5:2);
{Делаем паузу для просмотра результата}
Readln;
End.
Пример. Составить программу решения квадратного уравнения ax2+bx+с=0
{Подключаем модуль по
работе с экраном}
Uses Crt;
{Описываем переменные}
Var a, b, c, d, x1, x2: Real;
Begin
{очищаем
экран}
ClrScr;
{Вводим
значения коэффициентов уравнения}
Write (‘a, b, c’);
ReadLn (a, b, c);
{Подсчитываем
дискриминант}
d: = Sqr(b) – 4*a*c;
{Если
дискриминант >0 }
If d > 0 Then
Begin
{то корней 2}
X1: = (-b-Sqrt(d))/(2*a);
X2: = (-b+Sqrt(d))/(2*a);
Write (‘X1=’,x1:5:2,’X2=’,x2:5:2)
End
Else If d = 0 Then
Begin
{то корней 1}
X1: = -b/(2*a);
WriteLn (‘X1=X2=’,x1:5:2)
End
Else
{Если
дискриминант <0, то корней нет}
WriteLn (‘Корней нет);
{Делаем паузу для просмотра результата}
Readln;
End.
2. Оператор выбора
Одной из разновидностей условного оператора является оператор варианта CASE. Оператор CASE дает возможность выполнять один из нескольких операторов (или их групп) в зависимости от значения выражения, часто называемого селектором. Другими словами, CASE выполняет роль переключателя в зависимости от значения селектора. Селектор может быть целого или символьного типа.
Оператор имеет следующий вид:
CASE переменная-селектор OF
константа1: оператор1;
константа2: оператор2;
...
константа n: оператор n;
ELSE
оператор по умолчанию
END;
Константы оператора называют метками вариантов. Метки должны иметь тот же тип, что и селектор. После каждой метки (последовательности метки) после знака двоеточия записывается оператор, который может быть группой операторов. В этом случае группа операторов заключается в операторные скобки.
Если одно и то же действие нужно выполнить для нескольких значений меток, то метки задаются через запятую.
Если несколько меток составляют диапазон, то их указывают так:
начальное значение диапазона .. конечное значение диапазона.
Например:
Case K Of
1: C:=A+B;
2..5: C:=A*B;
6,8,9: C:=A/B;
Else
End;
Каждое, отличное от других значение селектора может появиться только в одном элементе CASE-списка.
Действие оператора состоит в следующем: вычисляется значение выражения (селектора). После этого выполняется только тот оператор, который имеет метку варианта, значение которой совпадает со значением селектора. После этого управление передается на следующий за Case оператор.
Желательно, чтобы любое возможное значение селектора было указано среди констант Case-оператора. Если ни одна из констант не равна значению селектора, то выполняется оператор, идущий за словом Else. Этот оператор называется "оператор по умолчанию".
Ветки Else в операторе может не быть. Тогда, если ни одна из меток не равна значению селектора, то управление сразу передается на оператор, идущий за Case.
Если по какой-то константе необходимо выполнить несколько операторов, то эти операторы заключаются в операторные скобки Begin...End.
CASE переменная-селектор OF
константа1: Begin
список операторов
End;
константа2: Begin
список операторов
End;
...
константа n: Begin
список операторов
End;
Else
список операторов по умолчанию
End;
Пример. Составить программу, в которой вычисляется значение функции по приведенным формулам в зависимости от значения параметра К, который является номером режима. При этом, если введен режим 1, то вычисляется сумма двух чисел, если 2 – разность, если 3 – произведение, если 4 – частное.
Программа на Паскале имеет вид
{Подключаем модуль по работе с экраном}
Uses Crt;
{Описываем переменные}
Var K: Integer;
A, B, C: Real;
Begin
{очищаем экран}
ClrScr;
{Вводим исходные данные}
Write ('Введите исходные данные: ');
Readln(A,B);
{Выбираем нужный режим для работы}
Write ('Введите номер режима: ');
Readln (K);
Case K Of
{Если режим 1, то считаем сумму}
1: Begin
C:=A+B;
Writeln ('Сумма = ',c:5:2)
End;
{Если режим 2, то считаем произведение}
2: Begin
C:=A*B;
Writeln ('Произведение = ',c:5:2);
End;
{Если режим 3, то считаем разность}
3: Begin
C:=A-B;
Writeln ('Разность = ',с:5:2);
End;
{Если режим 4, то считаем частность}
4: Begin
C:=A/B;
Writeln ('Частное = ',с:5:2);
End;
Else
{Если введено недопустимое значение режима}
Writeln ('Введен неверный номер режима')
End;
{Делаем паузу для просмотра результата}
Readln;
End.
3. Оператор безусловного перехода
В редких случаях приходится выполнять переход на другую строку программы без всяких условий. Такой подход называется безусловным переходом или безусловной передачей управления.
Использование такого подхода считается плохим стилем программирования, так как делает программу плохо читаемой. Однако иногда использование безусловного перехода является наиболее оптимальным с точки зрения простоты кодирования и количество строк кода.
Для перехода в программе на любую строку используют оператор безусловного перехода, который записывается так:
GOTO метка;
Та строка, на которую осуществляется переход, должна начинаться с метки с двоеточием. Все метки должны быть описаны в блоке описания меток с помощью команды
Label метка1, метка2,…, меткаN;
Продемонстрируем использование оператора безусловного перехода на примере создания программы с меню пользователя.
Пример. Создать программу для подсчета площадей плоских геометрических фигур. При этом на экран выдается меню с перечнем всех доступных фигур. После выполнения расчета программа возвращается в меню и предлагает пользователю выбрать новую фигуру для расчета. Выход из программы выполняется с помощью отдельного пункта в меню.
{Подключение модуля по работе с экраном}
Uses Crt;
{Описание метки m1}
Label m1;
{Описание переменных}
Var a,b,c,s:Real;
k:Integer;
Begin
{Очистка экрана. Строка помечается меткой. На нее будет передаваться управление}
m1: Clrscr;
{Выдача перечня режимов работы программы}
Writeln('1 - прямоугольник');
Writeln('2 - треугольник');
Writeln('3 - трапеция');
Writeln('4 - круг');
Writeln('5 - выход');
{Выбор пользователем режима работы и его запись в переменную к}
Write('Сделайте выбор: '); Readln(k);
Case k Of
{Если выбран режим 1}
1: Begin
{Ввод исходных данных}
Write ('Введите длину и ширину '); Readln (a,b);
{Расчет}
s:=a*b;
{Вывод результат}
Writeln ('Площадь равна ',s:5:2);
{Пауза для просмотра}
Readln;
{Возврат к выдаче меню}
Goto m1;
End;
{Если выбран режим 2}
2: Begin
{Ввод исходных данных}
Write ('Введите основание и высоту '); Readln (a,b);
{Расчет}
s:=1/2*a*b;
{Вывод результат}
Writeln ('Площадь равна ',s:5:2);
{Пауза для просмотра}
Readln;
{Возврат к выдаче меню}
Goto m1;
End;
{Если выбран режим 3}
3: Begin
{Ввод исходных данных}
Write ('Введите два основания и высоту '); Readln (a,b,c);
{Расчет}
s:=(a+b)/2*c;
{Вывод результат}
Writeln ('Площадь равна ',s:5:2);
{Пауза для просмотра}
Readln;
{Возврат к выдаче меню}
Goto m1;
End;
{Если выбран режим 4}
4: Begin
{Ввод исходных данных}
Write ('Введите радиус '); Readln (a);
{Расчет}
s:=Pi*Sqr(a);
{Вывод результат}
Writeln ('Площадь равна ',s:5:2);
{Пауза для просмотра}
Readln;
{Возврат к выдаче меню}
Goto m1;
End;
{Если выбран режим 5, то ничего нет делаем}
5: ;
{Если выбран недопустимый режим}
Else
{Возврат к выдаче меню}
Goto m1
End;
End.
Вопросы для самоконтроля
1. Запись оператора ветвления. Использование операторных скобок;
2. Запись вложенных операторов ветвления;
3. Запись оператора выбора. Принцип его работы;
4. Назначение и описание меток в программах;
5. Запись оператора безусловного перехода.