Организация ветвлений
Нельзя заранее правильно определить, какую сторону бутерброда мазать маслом.
Из законов Мэрфи.
Имея условие или переменную логического типа, можно заставить программу выполнять разные последовательности операторов в зависимости от результата вычисления условия. Например, напишем программу, которая запрашивает с клавиатуры два числа и сообщает, какое из них больше – первое или второе.
Ветвление в программе организуется двумя операторами: IF (как говорится в программистском фольклоре, узник замка Иф был программистом ) и CASE. Сначала рассмотрим главный оператор ветвления – IF. Его общий вид таков:
Полная форма |
Сокращенная форма |
IF условие THEN оператор1 ELSE оператор2; |
IF условие THEN оператор1;
|
Если (а IF по-английски и означает "если") условие истинно, то выполняется оператор1. Если же оно ложно, то либо выполняется оператор2, либо, при сокращенной форме – оператор, следующий за IF.
Наша программа будет выглядеть так (для краткости опустим оператор TRY..EXCEPT):
VAR a,b:REAL;
BEGIN
ClrScr;
a:=FloatToStr(LabeledEdit1.Text);
b:=FloatToStr(LabeledEdit1.Text);
IF a>b THEN
Label1.Caption:='Первое число больше второго'
ELSE Label1.Caption:='Второе число больше первого'
END;
Обратите внимание на запись с отступами: операторы, стоящие внутри IF, смещаются вправо. Delphi этого не требует, ему все равно, а вот человеку разбираться в записи с отступами гораздо легче. Еще один важный момент – точка с запятой ставится только после второго оператора. Ни перед, ни после ELSE точки с запятой быть не может!
При использовании сокращенной формы записи нельзя забывать, что оператор, следующий за IF, про условие ничего не знает и никак с IF не связан. Скажем, следующий вариант программы ошибочен:
IF a>b THEN
Label1.Caption:='Первое число больше второго';
Label1.Caption:='Второе число больше первого'
Второй оператор присваивания := никак не связан с IF и будет выполняться всегда. В итоге в любом случае программа будет выводить текст 'Второе число больше первого'. Сокращенную форму используют тогда, когда при невыполнении условия ничего делать не надо.
Объединение операторов
Доступность операции - еще не показатель того, что ее надо делать.
Из законов Мэрфи
Формат записи оператора 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 здесь совершенно лишние.