Условный оператор позволяет проверить некоторое условие и в зависимости от результата выполнить тот или иной оператор или группу операторов.
С помощью условных операторов программируются алгоритмы разветвляющейся структуры. Язык Паскаль допускает использование двух условных операторов: if и case.
Условный оператор if
Формат:
if<условие>then< оператор1>else< оператор2>;
где if, then, else – зарезервированные слова (обозначают если, то, иначе соответственно);
<условие> - произвольное выражение логического типа;
<оператор1>, <оператор2> - любые операторы языка Паскаль.
Условный оператор работает по следующему алгоритму: вначале вычисляется выражение <условие>. Если результат - true (истина), то выполняется <оператор1>, а <оператор2> пропускается. Если результат - false (ложь), наоборот <оператор1> пропускается, а выполняется <оператор2>. На рисунке 3.1 приведена блок-схема условного оператора.
Рис. 3.1
Например, для нахождения наибольшего из двух чисел условный оператор запишется следующим образом:
If a>b then max:= a else max:= b;
Если требуется выполнить после then или else несколько операторов, они обрамляются операторными скобками begin и end, образуя тем самым составной оператор.
Например,
If a>=0 then begin а:=sqrt(a); Write(‘а=’,a:4:2); end
else Write(‘Нет решения’);
Часть оператора, стоящая после служебного слова else, может отсутствовать. Тогда при значении true условного выражения выполняется <оператор1>, в противном случае этот оператор пропускается.
Формат:
If< условие >then< оператор>;
Один оператор if может входить в состав другого оператора if. В этом случае говорят о вложенности операторов. Рассмотрим следующие возможные варианты.
If А <20 then if А>=15 then write(‘А в диапазоне 15 - 20’)
else write(‘А вне диапазона 15 - 20’);
В условном операторе логические выражения могут содержать несколько отношений и/или логических переменных, связанных операциями and, or, not. Каждое простое условие в логическом выражении обязательно заключается в скобки.
Например,
if (a+b>c) and (a+c>b) and (b+c>a)
then write('Треугольник с такими сторонами существует')
else write('Треугольник с такими сторонами не существует');
Следует знать:
· в условных операторах точка с запятой не ставится после then и перед else;
· при вложенности операторов каждое else соответствует тому then, которое непосредственно ему предшествует;
· конструкций со степенью вложенности более 2—3 необходимо избегать из-за сложности их анализа при отладке программы;
· в условных операторах часто используют составной оператор begin … end.
Пример. Составить алгоритм нахождения корней квадратного уравнения ax2+bx+c=0 в зависимости от коэффициентов а, b и с.
Данный пример рассмотрен в Главе 1. Он реализован с помощью разветвляющейся структуры. Рядом с блок-схемой приводится текст программы.
В разделе описания переменных описаны переменные a, b, c (исходные данные), D (промежуточная величина), x1, x2 (результат) вещественного типа. Если условие D³0 выполняется, необходимо выполнить несколько операторов, поэтому они заключены в операторные скобки, если условие не выполняется, выводится сообщение об отсутствии корней.
Program Prim1;
uses crt;
Var a, b, c, D, x1, x2 :real;
BEGIN
СlrScr;
Write('Введите числа a, b, c');
Readln(a, b, c);
D:= sqr(b)-4*a*c;
If D>=0
then
begin
x1:=(-b+sqrt(D))/(2*a);
x2:=(-b-sqrt(D))/(2*a);
Write('x1=', x1:5:2, 'x2=',
x2:5:2,);
end
else Write('Корней нет');
END.
Пример.Даны три числа. Найти наибольшее из них.
Данный пример реализован с помощью двух разветвляющихся структур, поэтому используем два условных оператора, следующих друг за другом.
Три вводимых числа обозначены переменными a, b и c, переменная max служит для хранения максимального значения этих чисел. После выполнения первого условного оператора переменная max принимает одно из двух значений – значение переменной а или b, в зависимости от выполнения условия a>b.
Не следует записывать a:=max или b:=max, т.к. в данном случае переменные а или b получат значения равные нулю (по умолчанию переменная max =0).
Так как необходимо найти максимальное значение из трех чисел, используется второй условный оператор.
Program Prim2;
uses crt;
Var a, b, c, max : integer;
BEGIN
СlrScr;
Write('Введите числа а, b и с');
Readln(a, b, с);
If a>b then max:=a else max:=b;
If c>max then max:=c;
Write('Наибольшее число', max);
END.
Пример.Пусть значение y зависит от значения х.
Рассчитать
В программе каждому логическому блоку соответствует условный оператор.
Program Prim3;
uses crt;
Var x, y : real;
BEGIN
СlrScr;
Write('Введите число x');
Readln(x);
If x<0 then y:=sqr(x)
else
If x>0 then y:=sqrt(x) else y:=0 ;
Write('Значение y=', y:3:1);
END.
Оператор выбора Case
Обычно при написании программы не рекомендуется использовать многократно вложенные друг в друга условные операторы if — программа становится громоздкой и ее трудно понимать (число уровней вложения не должно превышать двух-трех).
Оператор выбора case позволяет сделать выбор из произвольного числа имеющихся вариантов. Он состоит из выражения, называемого селектором (selection – выбор альтернативы), и списка параметров, каждому из которых предшествует список констант выбора (список может состоять и из одной константы).
Формат:
Case<выражение-селектор>of
<список1>: <оператор1>;
<список2>: <оператор2>;
…
<списокN>: <операторN>
else<оператор>
end;
где case, of, else – зарезервированные слова (обозначают случай, из, иначе соответственно);
<выражение-селектор> - выражение порядкового типа (кроме типов Real и String);
<список1>, < список2> - константы того же типа, что и <выражение-селектор>;
<оператор1>, <оператор2> - любые операторы языка Паскаль.
Выполнение оператора case начинается с вычисления выражения-селектора. Операторы между begin и end выполняются в том случае, если значение выражения после слова case совпадает с константой из соответствующего списка. Если это не так, то выполняется оператор, идущий после else. Если else отсутствует, выполняется оператор программы, следующий за case.
· выражение-селектор должно иметь порядковый тип: чаще всего — integer, реже — char, boolean или один из пользовательских типов;
· список констант выбора может состоять из произвольного количества значений, отделенных друг от друга запятыми, или диапазонов, границы которых записываются двумя константами через разграничитель "..";
· диапазоны не должны пересекаться и не должны содержать констант, указанных в данной или других альтернативах;
· константы выбора внутри одного оператора выбора должны быть различны, в противном случае выполняется первая "подходящая" ветвь (одинаковые константы выбора разрешается использовать в разных операторах выбора);
· после последнего элемента списка выбора (перед else) точка с запятой не ставится.
Пример. По введенному номеру месяца вывести название времени года.
Program God;
uses crt;
var m : integer;
begin Write(‘Введите номер месяца ‘); Readln(m);
case m of
12, 1, 2 : Writeln(‘Зима ‘);
3..5 : Writeln(‘Весна ‘);
6..8 : Writeln(‘Лето‘);
9..11 :Writeln(‘Осень ‘)
else Writeln(‘Введите номер месяца ‘)
end;
end.
Сообщение о названии времени года будет выведено на экран лишь в том случае, если пользователем введен номер месяца, входящий в список констант. В противном случае, запрашивается ввод нового значения месяца.