Компонентный Паскаль/Введение в условия

Определение условия править

Условием называется любой выбор, который влияет на ход дальнейших действий. Для человека каждую долю секунды приходится делать выбор: повернуть направо, посмотреть на светофор, передвинуть ногу чуть левее мимо лужи, переместить палец над нужной клавишей и т. д. Условий в повседневной деятельности столько, что было бы странно, если бы условий не было в языках программирования. И на самом деле, не будет гибкости у программ, если их логика будет прямой как палка.

Как работают условия в программировании править

Общий принцип работы условий одинаков во всех языках программирования, даже независимо от архитектуры компьютера. При принятии решения в условиях используются всего два значения типа BOOLEAN -- FALSE ("ложь") и TRUE ("истина"). Этих двух значений оказывается достаточно, чтобы описать любые формы условий.

Ключевое слово IF править

Поскольку IF является ключевым словом, точно также, как и другие ключевые слова оно набирается заглавными буквами. Но здесь есть некоторые особенности. Когда языки программирования только оформлялись, никто не мог сказать точно, каким же образом описывать такие конструкции. Позже в языках Си и python были применены более короткие варианты ключевого слова IF, но если в python это сделано лаконично (и очень похоже на КП), то в Си это сделано просто короче, да ещё и с потерей наглядности (вплоть до полной нечитаемости). Поэтому, с учётом направленности КП на надёжность, его форму представления условий можно назвать компромиссом между лаконичностью и понимаемостью с небольшим уклоном в сторону понимаемости.

Ниже представлен простейший пример условия:

IF p1=p2 THEN p1:=p1+1 END;

В этом примере проверяется равенство значений двух переменных, и если они равны, первая переменная увеличивает своё значение на 1. В конце указано ключевое слово END -- оно обязательно для ограничения условия. После сравнения впервые использовано ключевое слово THEN ("тогда"), что если переписать на русском языке будет выглядеть примерно так:

ЕСЛИ p1=p2 ТОГДА p1:=p1+1 КОНЕЦ;

Не правда ли, очень похоже на обыкновенную человеческую речь? Обратите внимание, что когда используется сравнение, то стоит простой знак "равно", что является математически верной записью. Если обратиться к содержанию предыдущих глав, то там есть упоминание, что в языке Си при использовании знака "равно" в условиях часто бывают ошибки? Это как раз именно потому, что присваивание и сравнение в Си -- слабо различимо. В этом отношении, python поступает более мудро: в условиях используется знак "==", что не является математически правильной записью, но похоже на две половинки моста, которые пытаются свести вместе. Этот подход пригоден при начальному обучении программированию в школе, но не с точки зрения учёного.

Эту же конструкцию можно записать и в другом виде, но точно также правильном, с точки зрения компилятора КП:

IF p1 = p2 THEN
	p1 := p1 + 1
END;

В отличии от текста модулей и процедур здесь не нужно писать ключевое слово BEGIN. Его роль, если хотите, выполняет ключевое слово THEN (оно завершает список условий). Точно также не нужно после последней инструкции в блоке ставить точку с запятой, так как далее следует "END;"

Что будет если вдруг окажется, что р1 и р2 не равны? А ничего не будет. Действие после THEN будет проигнорировано, и программа продолжит своё выполнение после "END;".

Ключевое слово ELSE править

ELSE означает на английском "ИНАЧЕ". Это ключевое слово часто бывает нужно, если у условия есть альтернативное действие. Ниже приведён фрагмент, в котором реализовано условие с альтернативой только через IF и через ELSE:

IF p1 = p2 THEN
	p1 := p1 + 1
END;
IF p1 # p2 THEN
	p1 := p1 - 1
END;
..............<scip>..............
IF p1 = p2 THEN
	p1 := p1 + 1
ELSE
	p1 := p1 - 1
END;

В первом фрагменте при использовании только IF пришлось записать два условия:

  • когда р1 равно р2
  • когда р1 не равно р2 (для этого использован оператор "#" -- "решётка", "не равно")

Если не использовать второе условие, то невозможно избежать после первого IF инструкции p1:=p1-1, и тогда, в конечном итоге, это будет всё-равно, что и p1:=p1, а в такой инструкции смысла нет никакого.

При условии, в котором использован ELSE не пришлось повторно записывать условие IF, так как не может быть, чтобы два числа были одновременно и равны друг другу, и не равны друг другу. Запись стала проще и понятней.

Ещё раз обратите внимание на знак "не равно" -- "#". В языке программирования Си используется знак "!=". В каком-то смысле похоже на ладонь, которая что-то останавливает. В python сейчас приятно использовать такое же обозначение "не равно", но и до сих пор употребляется знак "<>". Ни первое, ни второе обозначение не является удачным. Какое отношение имеет ладонь останавливающая часть моста(кулака) к понятию математического неравенства? (да и можно ли ладонью остановить кулак?) Какое отношение к неравенству имеет сомнительный знак одновременно -- и больше и меньше? Гораздо ближе к правде подходит решётка, как одна половинка моста, не совмещённая со второй половинкой моста (под углом 90 градусов). Это не математическая запись, но более хорошо понимаемая, с точки зрения графического символа. Это всё элементы промышленной надёжности в Компонентном Паскале.

Ключевое слово ELSIF править

Это ключевое слово частенько бывает необходимо, когда по условию, нужно выяснить, что например, переменная попадает в какой-то числовой или литеральный диапазон или равно чему-то конкретно более двух раз (при двух разах хватило бы одного ELSE). Причём именно такая форма записи довольно эффективно обрабатывается компьютером, и если выполнена хотя бы одна ветка таких условий -- остальные игнорируются. Пример такой конструкции дан ниже:

IF p1 = p2 THEN
	p1 := p1 + 1
ELSIF p1 > p2 THEN
	p1 := p1 - 1
ELSIF p1 > (p2 - 2) THEN
	p1 := p1 - 2
ELSIF p1 > (p2 - 3) THEN
	p1 := p1 - 3
ELSE
	p1 := p1 - 10
END;

После последней ветки есть необязательная конструкция ELSE. Она будет выполнена только тогда, когда не выполнена ни одна из предыдущих веток. Также здесь впервые применён знак "больше" -- ">". Также в условиях можно использовать знак "меньше" -- "<". Знак сравнения всегда относится к той переменной, которая стоит слева от знака сравнения, т. е.:

  • "р1 равно р2" -- "p1 = p2";
  • "р1 меньше р2" -- "p1 < p2";
  • "р1 больше р2" -- "p2 > p2" и т.д.

Составные условия править

Условие является составным, если в сравнении участвует более двух переменных, пример такого условия:

IF (p1 > p2) & (p1 > 10) THEN
	p1 := p1 + 1
ELSIF (p1 > p2) AND (p2 < 0) THEN
	p1 := p1 - 1
ELSE
	p1 := p1 - 10
END;

В первом условии использовано "ЛОГИЧЕСКОЕ И" -- "&" ("амперсанд"). Оно соответствует логическому умножению. В сумме первое условие читается так: если переменная р1 больше переменной р2 И переменная р1 больше 10 ТО.... и далее действия, которые определены в этой ветке. Во второй ветке условие читается так: если р1 больше р2 И р2 меньше нуля ТО... и далее действия, которые определены именно для этой ветки.

Существует несколько видов связок для составных условий:

  • & -- логическое И
  • ~ -- логическое отрицание
  • OR -- логическое ИЛИ

Все эти операции можно комбинировать любым доступным способом, помня о том, что в Компонентном Паскале поддерживаются правильные математические приоритеты.

Простые условия править

Простые условия, это такие условия, в которых упоминается только одна булева переменная. И это правильно, если вспомнить, что условие начинает выполняться тогда, когда оно истинно. Поэтому ничто не мешает записывать условия в такой форме:

VAR
    b1, b2: BOOLEAN;

b1:= (p1 > p2) & (p1 > 10);
b2:= (p1 > p2) AND (p2 < 0);

IF b1 THEN
	p1 := p1 + 1
ELSIF b2 THEN
	p1 := p1 - 1
ELSE
	p1 := p1 - 10
END;

Здесь происходит предварительное вычисление выражений для булевых переменных b1 и b2. И в зависимости от полученных результатов (TRUE или FALSE) -- дальше будет выполняться (или не выполняться) ветка условия. Такой приём может быть удобен, если результаты таких логических вычислений будут использоваться более одного раза -- это ускорит выполнение программы, и главное -- упростит её понимание.

Заключение править

По большому счёту, имея эти знания по условиям можно перекрыть 95% потребностей в логике программы. Есть и более сложные условия, с которыми можно столкнуться в реальной жизни, но пока остановимся на том, что изложено.