4.Объединение операторов
Доступность операции - еще не показатель того, что ее надо делать.
Из законов Мэрфи
Формат записи оператора IF позволяет поместить внутрь его лишь один оператор, выполняющийся, когда условие истинно, и один – когда оно ложно. Часто же нужно выполнить не один, а много операторов. Например, при решении квадратного уравнения после проверки неотрицательности дискриминанта нужно вычислить действительные корни уравнения, что требует как минимум двух операторов присваивания. Следующая запись неверна и вызовет ошибку при компиляции:
d:=SQR(b)-4*a*c;
IF d>=0 THEN
x1:=-b+SQRT(d)/(2*a);
x2:=-b-SQRT(d)/(2*a)
ELSE
Label1.Caption:='Корни комплексные';
Как же быть? Очень просто – нужно превратить несколько операторов в один. Для этого их объединяют при помощи уже известных нам операторных скобок BEGIN и END. Запись вида
BEGIN
оператор 1;
оператор 2;
…
оператор n
END;
рассматривается как один оператор. Не путайте BEGIN и END, являющимися операторными скобками, с BEGIN и END, отмечающими начало и конец всей программы. Таким образом, правильная запись такова:
d:=SQR(b)-4*a*c;
IF d>=0 THEN
BEGIN
x1:=-b+SQRT(d)/(2*a);
x2:=-b-SQRT(d)/(2*a)
END
ELSE
Label1.Caption:='Корни комплексные';
Обратите внимание, что оператор Label1.Caption:='Корни комплексные' в операторные скобки не заключен. Причина очевидна: это один-единственный оператор, его не с чем объединять. Запись вида
IF a>b THEN
BEGIN
c:=a+10
END;
хотя и не вызовет ошибки, но является избыточной и свидетельствует о низкой квалификации программиста. Скобки BEGIN … END здесь совершенно лишние.
5.Сложные условия
Сложность программы растет до тех пор, пока не превысит способности программиста.
Из законов Мэрфи
Во многих случаях нужно одновременно проверять несколько условий. Например, перед расчетом площади треугольника по длинам сторон все три длины стороны a,b,c обязаны быть положительными числами, т.е. должно выполняться условие "a>0 и b>0 и c>0". Для записи сложных условий в Delphi предусмотрен набор логических операций над условиями (Табл. 2). Обязательное требование – сами условия при этом записываются в скобках!
Поясним действие логических операций. Операция AND ("и") возвращает значение "истина" только в том случае, если оба условия, которые она соединяет, истинны. Если хотя бы одно из условий не выполняется, AND вернет "ложь". Операция OR ("или") не столь строга – она возвращает значение истина, если либо одно, либо другое, либо оба разу соединяемых условия истинны. Родственная операция XOR (исключающее "или") очень похожа на OR с той разницей, что она исключает случай, когда оба условия выполняются (или одно, или другое6 но не оба сразу). Наконец, операция NOT (отрицание) применяется не к двум, а к одному условию и просто "переворачивает" его: (a=b) есть то же самое, что NOT(a<>b).
Табл. 2
Операция |
a |
b |
Результат |
Операция |
a |
b |
Результат |
(a) AND (b) |
TRUE |
TRUE |
TRUE |
NOT(a) |
TRUE |
- |
FALSE |
TRUE |
FALSE |
FALSE |
FALSE |
- |
TRUE |
||
FALSE |
TRUE |
FALSE |
- |
- |
|
||
FALSE |
FALSE |
FALSE |
- |
- |
|
||
(a) OR (b)
|
TRUE |
TRUE |
TRUE |
(a) XOR (b) |
TRUE |
TRUE |
FALSE |
TRUE |
FALSE |
TRUE |
TRUE |
FALSE |
TRUE |
||
FALSE |
TRUE |
TRUE |
FALSE |
TRUE |
TRUE |
||
FALSE |
FALSE |
FALSE |
FALSE |
FALSE |
FALSE |
Вот как может выглядеть запись проверки всех трех введенных сторон треугольника на положительность:
IF (a>0) AND (b>0) AND (c>0) THEN
BEGIN
… вычисления
END
ELSE
Label1.Caption:='Стороны должны быть больше нуля';
Тот же пример можно записать и по-другому:
IF (a<=0) OR (b<=0) OR (c<=0) THEN
BEGIN
Label1.Caption:='Стороны должны быть больше нуля';
Exit // выход из процедуры
END;
… вычисления
END; // конец процедуры