Учебный центр "ANIT Texno Inform"
Опубликован: 25.06.2014 | Доступ: свободный | Студентов: 2597 / 852 | Длительность: 24:39:00
Специальности: Программист
Лекция 7:

Логические типы, конструкции и компоненты

< Лекция 6 || Лекция 7: 1234 || Лекция 8 >
Аннотация: В лекции представлен исчерпывающий материал по работе с логическими данными. Существующие логические типы, операции над ними, а также компоненты TCheckBox, TCheckGroup, TRadioButton, TRadioBox. Примеры программ демонстрируют все возможности работы с логическими типами.

Цель лекции

Изучение способов работы с логическими типами данных. Изучение основных компонентов для работы с этими типами.

Логический тип данных

В предыдущих лекциях мы уже встречались с таким типом - некоторые свойства компонентов могли принимать только одно из двух значений: либо 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):

Таблица 7.1. Логические операции
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. Иначе советую вернуться назад, и внимательней изучить всё вышесказанное.

< Лекция 6 || Лекция 7: 1234 || Лекция 8 >
Инга Готфрид
Инга Готфрид
Александр Скрябнев
Александр Скрябнев

Через WMI, или используя утилиту wmic? А может есть еще какие более простые пути...