Условный оператор и условная операция (PascalABC.NET)
Условный оператор
Условный оператор реализует выбор одной возможности из двух на основе анализа некоторого условия. Схематически он реализуется так:
ЕСЛИ УсловиеВыполняется ТО СделатьДействие1 ИНАЧЕ СделатьДействие2
В языке Паскаль вместо русских слова пишутся английские:
1 if P then
2 A
3 else
4 B;
Здесь P – это логическое выражение, значение которого проверяется. Если оно истинно (True), выполняется оператор А, если ложно (False) – оператор В. На месте оператора можно указать любой оператор языка, в том числе, другой условный оператор или блок. Чтобы было легче читать (и понимать) логику программы, в записи условного оператора применяются отступы.
Пусть даны натуральные числа a и b. Если их сумма четная, то вычислить произведение a×b, иначе вычислить утроенный остаток от целочисленного деления a на b.
1 ##
2 var (a, b) := ReadInteger2('Введите два числа:');
3 if (a + b) mod 2 = 0 then // можно (a + b).IsEven
4 Print(a * b)
5 else
6 Print(3 * (a mod b))
Вернемся еще раз к схематической записи условного оператора
1 if P then
2 A
3 else
4 B;
Если для P = False выполнять ничего не нужно, условный оператор можно сократить до записи вида
1 if P then
2 A;
Если ничего не нужно выполнять для P = True, можно инвертировать P:
1 if not P then
2 B;
Условная операция
Достаточно часто встречаются случаи, когда некоторое значение вычисляется в зависимости от выполнения определенного условия.
Пусть дана формула, определяющая функцию, заданную кусочно:
Запишем программу с использованием условного оператора
1 ##
2 var x := ReadInteger('x = ');
3 var y: integer;
4 if (x >= -5) and (x <= 8) then
5 y := 3 * x * x – 11 * x + 6
6 else
7 y := 4 * x + 7;
8 Write('y = ', y);
Что в этой программе не очень хорошо? Первое – объявляется переменная y и на это уходит целая строка. Надо заранее решить, какой тип будет иметь эта переменная. И второе, более неприятное – исходная формула распалась на два оператора. Улучшить ситуацию поможет использование условной операции. Она пришла в PascalABC.NET из языков семейства С, где называлась тернарным выражением. Условная операция по логике вычисления очень похожа на условный оператор и имеет формат
P ? A : B
Здесь P – некоторое логическое выражение, А и В – выражения (не операторы!), вычисление которых зависит от значения P. Если P = True, вычисляется значение выражения А, если P = False, вычисляется значение выражения В. Вычисленное значение становится значением условной операции.
Условная операция может быть также записана и в более привычном для языка Паскаль виде:
if P then A else B;
Условная операция может существенно сократить запись алгоритма. Приведенную выше программу с использованием условной операции можно записать следующим образом
1 ##
2 var x := ReadInteger('x = ');
3 var y := (x >= -5) and (x <= 8) ? 3 * x * x – 11 * x + 6 : 4 * x + 7;
4 Print('y = ', y);
Если переменная y нужна только для вычисления и вывода результата, можно сэкономить еще одну строку программы и одну переменную.
1 ##
2 var x := ReadInteger('x = ');
3 Write('y = ', (x >= -5) and (x <= 8) ? 3 * x * x – 11 * x + 6 : 4 * x + 7);
Условная операция может внутри себя (в выражениях) содержать другие условные операции и это позволяет реализовывать достаточно сложные вычисления. Кроме того, она сама может быть частью выражения.