Логические типы, конструкции и компоненты
Цель лекции
Изучение способов работы с логическими типами данных. Изучение основных компонентов для работы с этими типами.
Логический тип данных
В предыдущих лекциях мы уже встречались с таким типом - некоторые свойства компонентов могли принимать только одно из двух значений: либо True (Истина), либо False (Ложь). Это и есть логический тип данных. В Паскале это тип Boolean, который занимает один байт оперативной памяти. В Lazarus, кроме того, есть типы ByteBool (тоже 1 байт), WordBool (2 байта) и LongBool (4 байта). Все эти типы могут принимать лишь одно из двух значений: true или false. На практике, правда, такое многообразие не применяется, программисты вполне обходятся только одним стандартным типом boolean. Вы можете создать переменную такого типа и присвоить ей true или false. Кроме того, нередко встречаются выражения, которые в результате тоже дают либо Истину, либо Ложь, они также считаются логическими. Например, если вы присвоите логической переменной выражение 3>2, то в переменную попадет True, так как три действительно, больше двух.
Итак, что же можно делать с логическими данными, помимо присваивания им значений True или False? Их можно сравнивать между собой, используя для этого операторы сравнения:
= (Равно) |
<> (Не равно) |
> (Больше) - Здесь следует иметь в виду, что компилятор, на самом деле, вместо False записывает двоичное значение 0, а вместо True - 1. Таким образом, True всегда будет больше, чем False. |
< (Меньше) |
>= (Больше или равно) |
<= (Меньше или равно) |
Операции сравнения можно усложнить, применив следующие дополнительные логические операторы:
- NOT (Логическое НЕ)
- AND (Логическое И)
- OR (Логическое ИЛИ)
- XOR (Логическое исключающее ИЛИ).
Эти операторы сравнивают между собой два логических значения (операнда) и в зависимости от этих значений возвращают в качестве результата true или false. Следующая таблица демонстрирует результат этих операций (сравниваются логические переменные a и b):
A | B | not A | A and B | A or B | A xor B |
---|---|---|---|---|---|
true | true | false | true | true | false |
false | true | true | false | true | true |
true | false | false | false | true | true |
false | false | true | false | false | false |
Давайте разберем действия этих операций подробней.
Операция NOT (НЕ), в отличие от других логических операций, работает только с одним операндом. Это - операция-перевертыш: если операнд содержит True, то возвращаемый результат будет False, и наоборот. Эту операцию очень часто применяют для того, чтобы поменять значение логической переменной (или свойства) на противоположное, например,
A:= not A;
Операция AND (И) возвращает True только в том случае, если оба сравниваемых операнда содержат True. Если первый операнд содержит False, дальнейшая проверка уже не проводится (смысла нет), и AND возвращает False. Если первый операнд содержит True, то AND делает проверку второго операнда - если он также содержит True, то и возвращаемый результат будет True, иначе возвращается False.
Операция OR (ИЛИ) действует похожим образом, но возвращает True в том случае, если хоть один из операндов содержит True. OR проверяет первый операнд. Если он True, дальнейшая проверка уже не производится, и OR возвращает True. Иначе OR проверяет второй операнд - если он True, то и возвращается True, в противном случае возвращается False.
Операция XOR (Исключающее ИЛИ) всегда проверяет оба операнда, и возвращает True только тогда, когда один из операндов True, а другой обязательно False. Правда, на практике XOR обычно не используют, поскольку всегда проще выполнить проверку A <> B, которая возвращает такой же точно результат.
Итак, примеры работы с логическими данными (в Lazarus их выполнять не нужно):
var A, B, C: Boolean; begin A:= True; //результат - True B:= not A; //результат - False C:= A and B; //результат - False C:= A or B; //результат - True C:= A <> B; //результат - True C:= 3 > 5; //результат - False …
Управляющая конструкция IF
От логического типа данных было бы мало пользы, если бы мы не могли применять различные действия в зависимости от результатов проверки - если в переменной находится Истина, тогда выполнить один код, иначе выполнить другой код. Именно такую возможность предоставляет управляющая конструкция IF.
Простейший синтаксис этой конструкции такой:
if Условие then Действие;
Английское IF переводится как ЕСЛИ, а THEN - ТОГДА. Тут все довольно понятно: если какое-то условное выражение (логическая переменная или логическое свойство компонента) имеет значение True, тогда выполняется указанное действие. Теперь мы можем изучать примеры на практике. Загрузите Lazarus с новым проектом. Посреди окна установите кнопку TButton. Сохраните проект в папку 07-01 под именем MyBool; не забудьте главную форму назвать fMain, а сохраняемый модуль - Main. Затем сгенерируйте событие нажатия на кнопку, которое оформите следующим образом:
procedure TfMain.Button1Click(Sender: TObject); var b: boolean; begin b:= True; if b then ShowMessage('Истина'); end;
Здесь все предельно просто: объявляем логическую переменную b, затем присваиваем ей значение True (Истина). В строке
if b then ShowMessage('Истина');
мы проверяем: если b имеет значение True (то есть, если b истинна), тогда мы выводим сообщение "Истина". Сохраните и запустите проект. Нажатие на кнопку вызовет вывод сообщения. Можете для примера присвоить b значение False - в этом случае нажатие на кнопку не вызовет никакого сообщения.
Кстати, в данном случае в качестве условия мы указали просто имя переменной b. Ведь она уже содержит значение True! Так что строка
if b then ShowMessage('Истина');
будет полностью аналогична строке с полным условием
if b = True then ShowMessage('Истина');
Если мы будем расширять условие с помощью условных операций, то все операнды следует заключить в скобки. Исключение составляет операция NOT, которая работает только с одним операндом. Изменим код:
procedure TfMain.Button1Click(Sender: TObject); var a,b: boolean; begin a:= False; b:= True; if (a = b) or b then ShowMessage('Истина'); end;
Здесь мы проверяем уже два условия. И если первое (a = b) вернет нам False, то второе b вернет True. И так как мы используем операцию OR, нам достаточно, чтобы хоть один из операндов был True. Значит, сообщение будет выполнено. Если бы во втором операнде мы сравнивали b еще с чем-то, то его тоже следовало бы поместить в скобки. Например,
if (a = b) or (b > a) then ShowMessage('Истина');
В этом примере сообщение "Истина" будет выведено, так как во втором операнде b действительно больше, чем a. Если вы забудете про скобки, компилятор не станет указывать вам на ошибку, и программа будет запущена. Однако результат может оказаться неверным. Например, если мы уберем скобки в первом примере:
if a = b or b then ShowMessage('Истина');
То сообщение "Истина" не будет выполнено. Ведь оператор IF делает только одну проверку, значит, он проверит только a = b. Часть условия с OR будет пропущена, потому что мы не заключили операнды в скобки. Так что если вы в условии применяете операции AND, OR или XOR, не забывайте заключать операнды в скобки. Скобки можно не использовать, если в качестве операндов вы указываете по одной условной переменной или свойству, например, код:
if a or b then ShowMessage('Истина');
выведет сообщение "Истина", так как в b содержится True.
Управляющий оператор IF не зря называют конструкцией, его синтаксис может состоять из нескольких частей:
if Условие then Действие1 else Действие2;
Английское ELSE переводится как ИНАЧЕ. Здесь, ЕСЛИ какое-то условие вернет True, то будет выполнено Действие1, ИНАЧЕ будет выполнено Действие2. Обратите внимание, что перед ELSE точку с запятой НЕ СТАВЯТ! Изменим код:
procedure TfMain.Button1Click(Sender: TObject); var b: boolean; begin b:= True; if b then ShowMessage('Истина') else ShowMessage('Ложь'); end;
Нажатие на кнопку вызовет сообщение "Истина", однако если затем вы исправите код, и в переменную b вместо True поместите False, то выйдет сообщение "Ложь" - проверьте это сами.
Однако конструкция IF может быть и сложней. Что, если нам нужно проверить не одно, а два условия? Или больше? Полный синтаксис этой конструкции такой:
if Условие1 then Действие1 else if Условие2 then Действие2 … else if УсловиеN then ДействиеN else ДействиеИНАЧЕ;
Давайте разбираться. В этой конструкции, если Условие1 вернет True, то будет выполнено Дествие1, и на этом конструкция закончится. Если же оно вернет False, проверка будет продолжена. Если следующее Условие2 вернет True, то будет выполнено Дествие2, и так далее, подобных проверок может быть сколько угодно. Если же все проверки условий вернут False, то будет выполнено ДействиеИНАЧЕ. Изменим код:
procedure TfMain.Button1Click(Sender: TObject); var a,b: boolean; begin a:= False; b:= True; if a then ShowMessage('Действие №1') else if b then ShowMessage('Действие №2') else if a or b then ShowMessage('Действие №3') else ShowMessage('Действие №4'); end;
Как вы думаете, какое сообщение выйдет в данном случае? И сколько сообщений выйдет? Если вы сказали, что выйдет только одно сообщение "Действие №2", то вы усвоили конструкцию IF. Иначе советую вернуться назад, и внимательней изучить всё вышесказанное.