Условный оператор и условная операция (PascalABC.NET)

Материал из Информационная безопасностя
Версия от 19:12, 9 мая 2023; Безуглов Сергей (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигации Перейти к поиску

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

Условный оператор реализует выбор одной возможности из двух на основе анализа некоторого условия. Схематически он реализуется так:

ЕСЛИ УсловиеВыполняется ТО
 СделатьДействие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;

Условная операция

Достаточно часто встречаются случаи, когда некоторое значение вычисляется в зависимости от выполнения определенного условия.

Пусть дана формула, определяющая функцию, заданную кусочно:

Fx.png

Запишем программу с использованием условного оператора

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);

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