Во многих случаях нужно одновременно проверять несколько условий. Например, перед расчетом площади треугольника по длинам сторон все три длины стороны 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; // конец процедуры
В качестве примера использования инструкции if рассмотрим программу вычисления стоимости телефонного разговора. Как известно, стоимость разговора по телефону в воскресные дни ниже, чем в обычные дни. Следующая программа запрашивает длительность разговора и день недели, затем вычисляет стоимость разговора. Если день недели суббота или воскресенье, то стоимость уменьшается на величину скидки. Цена минуты разговора и величина скидки задаются в тексте программы как константы.
На рис. приведен вид диалогового окна программы.
Для ввода исходных значений (длительность разговора, номер дня недели) используются поля редактирования, для вывода результата и пояснительного текста — поля меток. Ниже перечислены компоненты и приведены значения их свойств.
Edit1 – ввода длительности разговора в минутах
|
|
Edit2 – ввода номера дня недели
Label1, Label2 – вывода пояснительного текста о назначении полей ввода.
Label3 – вывода результата вычисления стоимости разговора
Button 1 – Активизации процедуры вычисления
Здесь и далее при описании формы приложения приводятся значения только тех свойств компонентов, которые используются в программе. Значения остальных свойств могут быть оставлены без изменения или изменены произвольным образом, естественно, в разумных пределах (очевидно, что размер командной кнопки может быть выбран произвольно).
Программа производит вычисления при щелчке на командной кнопке Вычислить. В этом случае возникает событие Ondick, процедура обработки которого приведена ниже.
procedure TForm1.Button1Click(Sender: TObject);
const
PAY=0.15; {цена одной минуты разговора 0.15 рубля}
DISCOUNT=20; {скидка 20 процентов}
var
Time: real; { длительность разговора }
Day: integer; { день недели }
Summa:real; { стоимость разговора }
begin {получить исходные данные}
Time:=StrToFloat(Edit1.Text);
Day:=StrToInt(Edit2.Text); {Вычислить стоимость разговора }
Summa:= PAY*Time;
{ Если день суббота или воскресенье, то уменьшить стоимость на величину скидки }
if (Day = 6) OR (Day = 7)
then Summa:=Summa* (100-DISCOUNT)/100;
{вывод результата вычисления}
label3.Caption:='К оплате ' + FloatToStrf(Summa,ffgeneral,4,2)+' руб.';
end;
Часто в программе необходимо реализовать выбор более чем из двух вариантов. Например, известно, что для каждого человека существует оптимальное значение веса, которое может быть вычислено по формуле: рост(см) – 100. Очевидно, что реальный вес может отличаться от оптимального: вес может быть меньше оптимального, равняться ему или превышать оптимальное значение.
Следующая программа (ее алгоритм приведен ниже на рис.) запрашивает вес и рост, вычисляет оптимальное значение, сравнивает его с реальным и выводит соответствующее сообщение.
Как и в предыдущей программе, вычисления выполняются при щелчке на кнопке Вычислить (ее имя Button1). Ниже приведена процедура обработки события OnClick для этой командной кнопки.
procedure TForm1.Button1Click(Sender: TObject);
var
w: real; { вес }
h: real; { рост }
opt: real; { оптимальный вес }
d: real; {отклонение от оптимального веса }
begin
w:=StrToFloat(Edit1.text).;
h:=StrToFloat(Edit2.Text);
opt:=h-100;
if w=opt then Label3.caption:='Ваш вес оптимален!' else if w<opt then
begin
d:=opt-w;
Label3.caption:='Вам надо поправиться, на ' + FloatToStr(d)+ ' кг.';
end else begin
d:=w-opt;
Label3.caption:='Надо немного похудеть, на ' + FloatTostr(d)+ ' кг.';
end;
end;
В приведенном примере множественный выбор реализован при помощи двух инструкций if, одна из которых "вложена" в другую. Обратите внимание, что после инструкций, расположенных перед else, символ "точка с запятой" не поставлены.
Дополнительное самостоятельное задание:
В программе определения оптимального веса для ввода значений используйте 2 компонента TrackBar из страницы палитры Win32. Для веса установите максимальное значение 150 – минимальное – 50; для роста – Max – 210, Min – 70. Данные считываются из свойства компонента Position (w:=TrackBar1.Position). Для динамического отображения данных сгенерировать процедуры и вписать в них код, предварительно добавив на форму метки Label4 и Label5.
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
Label4.Caption:=TrackBar1.Position;
end;
procedure TForm1.TrackBar2Change(Sender: TObject);
begin
Label5.Caption:=TrackBar2.Position;
end;