#6 Boolean Логический тип данных. Логические выражения. Операции AND и OR. Таблицы истинности. Приоритет операция. Паскаль

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

boolean -- Что это за тип

Логический тип данных (boolean) служит для хранения значений, которые обладают одним из двух возможных состояний:

  • или истина
  • или ложь

Логический тип данных нужен, чтобы программировать различные альтернативные действия, развивать сценарий программы различными путями, тем самым имитируя настоящую жизнь.

Переменные типа boolean

Объявление переменных логического типа

В коде программы переменные логического объявляются, по той же схеме, что и integer, но для указания типа используется ключевое слово boolean, например:

myVar: boolean; // объявляем одну переменную логического типа

или:

var 
   a, b, myVar: boolean; // объявляем три переменные логического типа списком.

Литералы логического типа (логические литеры) и присваивание значений переменным

Литеры логического типа -- это два специальных слова, зарезервированных в рамках синтаксиса языка Паскаль.
Для обозначения истины используется литерал:

true

а для обозначение лжи литерал:

false

Оба этих значения могу быть присвоены переменным логического типа, например:

var a,b: boolean;
begin
  a := true;
  b := false;

-- как всегда, после операции присваивания, ставятся точка с запятой.

Значение переменных логического типа после объявления

Сразу после объявления переменные логического типа имеют значение false.

Логические операции. Таблицы истинности

Подобно арифметическим значениям для логических тоже можно строить выражения, но вместо арифметических операций для логических значений используются логические операции.

В этом уроке мы рассмотри три логические операции:

  1. OR -- т.н. логическое ИЛИ (или "логическая сумма" или конъюнкция).
  2. AND -- т.н. логическое И (или "логическое умножение").
  3. Not -- отрицание ("инверсия")

Операция OR (логическое ИЛИ) -- логическая сумма

Операция OR принимает два операнда логического (boolean) типа (один слева другой справа) и возвращает результат, опять же, логического типа.

Правила работы операции, описываются т.н. таблицей истинности -- то есть таблицей, которая показывает при каких значениях операндов какой именно результат мы получим.
Итак, построим таблицу истинности для операции AND, она будет выглядеть так:

a           b         a OR b

false   false       false     
true    false       true  
false   true        true
true    true        true

Если условно считать, что $true$ это $1$, а $false$ это $0$, то таблицу истинности логическое операции OR можно переписать так:

a    b     a OR b

0    0        0     
1    0        1  
0    1        1
1    1        1

-- обычно её записывают в математике именно с нулями и единицами.

Или в виде картинки:
логическая сумма паскаль таблица истинности ИЛИ пример

Посмотрим на любую из двух таблиц -- можно видеть, что:

Операция $OR$ возвращает $true$, если хотя бы один аргумент истинен, а в остальных случаях $false$.

Проиллюстрируем это ещё одной картинкой:
логическое ИЛИ Паскаль таблица истинности как работает схема

Операция AND (логическое И) -- логическое умножение

Операция AND, как и OR, принимает два операнда логического (boolean) типа (один слева другой справа) и возвращает результат, опять же, логического типа.

Её таблица истинности:

a    b     a AND b

0    0        0     
1    0        0  
0    1        0
1    1        1

Или в виде картинки:
логическое произведение Паскаль операция И пример

То есть:

Операция $AND$ возвращает $true$, только если оба аргумента истинны, а в остальных случаях $false$.

Если использовать более длинную форму записи, то получим:

a           b         a AND b

false   false       false     
true    false       false  
false   true        false
true    true        true

Ещё одна иллюстрация работы AND (логическое И):
логическое сложение И Паскаль таблица истинности

Операция Not -- отрицание (логическое отрицание)

В отличие от предыдущих двух операций, которые использовали два аргумента (их называют "бинарными") операция отрицания использует только один (правый) аргумент (т.н. "унарные", то есть использующие один аргумент).

Не правда -- это ложь, а не ложь -- это истина

-- на этом высказывании и основа таблица истинности для операции not:

a           Not a

false      true     
true       false  

Или:
логическое отрицание NOT Паскаль пример таблица истинности

Или ещё более красочная иллюстрация, объясняющая работу данной операции:
Паскаль операция НЕ логические операции отрицание схема

Логические выражения и порядок выполнения операций в них

Логические выражения -- это выражения, результат которых имеет тип boolean.

Если в логическом выражении более одной операции, то они выполняются в некотором порядке, как именно мы посмотрим ниже.

Если есть скобки

Если есть в выражении сразу есть скобки, то подвыражения вычисляются также как в математике -- то есть сначала вычисляются подвыражения, которые окружает наибольшее число скобок, например, рассмотрим вычисление выражения:

((true AND (false OR true)) AND false) =
((true AND       true     ) AND false) =
(          true             AND false) = 
               false

Если в выражении только AND или только OR и нет скобок

Если используется одна и та же операция и нет скобок, то вычисление происходит слева направо, например (запишем, упрощая выражение):

true OR false OR true
= (true OR false) OR true  // то же самое со скобками
=      true       OR true  // после вычисления левого подвыражения
= true // значение выражения (true OR false OR true)

-- в последнем выражении мы указали по шагам как вычисляется выражение (скобками отметили первый шаг), сначала вычисляется самое левое подвыражение, и его результат используется как операнд для правого выражения.

Посчитаем значения для тех же самых операндов, но заменив OR на AND:

true AND false AND true
= (true AND false) AND true  // то же самое со скобками
=     false        AND true  // после вычисления левого подвыражения
= false // значение выражения (true AND false AND true)

Если есть и OR и AND и без скобок. Приоритет операций

У операции AND более высокий приоритет, чем у OR, это значит, что в случае когда нет скобок, все подвыражения с AND вычисляются раньше, чем подвыражения с OR.

Поясним порядок вычисления выражения, скажем:

true AND false OR true AND true

-- это выражение эквивалентно выражению со скобками (в силу приоритета AND над OR -- точно так же как арифметическое умножение выполняется раньше сложения в ситуации, когда нет скобок):

(true AND false) OR (true AND true)

Вычислим его:

(true AND false) OR (true AND true)
      false      OR       true
	            true

Логические выражения с литералами и переменными

Как и для целых чисел, для логического типа в выражениях могут участвовать и переменные и литералы.

Возьмём какое-нибудь выражение из уже рассмотренные выше, например:

(true AND false) AND true  // = false

Мы можем вынести какое-нибудь из значений в этом выражении в переменную и результат присвоить какой-то другой переменной, например:

a := true;
b = (a AND false) AND true; // = false

Можно и вообще все значения хранить в переменных (значение $b$ от этого не изменится):

a := true;
c := false;
d := true;
b = (a AND c) AND d;  // = false

Вывод данных логического типа на экран

Данные логического типа могут быть аргументами для стандартных процедур вывода данных, а это значит, что можно выводить на экран значения переменных, например, самих по себе:

b := true;
writeln(b);

или вменсте с аргументами другого типа:

b := true;
writeln(5+2, ' ', b);

Конечно, можно выводить значения и нескольких переменных сразу:

b := true;
с := false;
writeln(c, 5+2, ' ', b);
writeln(c, b);

Значения типа boolean как результат сравнения данных других типов

Помимо выражений с участием логических операндов и логических операций (которые мы рассмотрели выше), логическим типом (boolean) также обладают операции сравнения:

  • $=$ (проверка на равенство)
    Например:
     a := (5 = 2); //  = false (т.к. 5 не равно 2)
  • $\lt>$ -- "не равно" (проверка на неравенство)
    Например:
     a := (5 <> 2); //  = true (т.к. 5 не равно 2)
  • $>$ ("больше")
    Например:
     a := 5 > 2.3; // = true
  • $>=$ ("больше либо равно")
    Например:
     a := 2.0 > 2.3; // = false
  • $\lt $ ("меньше")
    Например:
     a := 8.7 < 2; // = false
  • $\lt= $ ("меньше либо равное")
    Например:
     a := 8.7 <= 9; // =  true

ВЫВОД: результат сравнения данных всегда обладает логическим типом.

Смешанные выражения

Допустимы и смешанные выражения, лишь бы операнды логических операций были логического типа, например рассмотрим выражение:

var b: boolean;
begin
 b :=  false;
 c := ((5 - 2) >= 3) OR b OR true; // чему равно c?

Вычислим это выражение по шагам:
-- скобки имеют приоритет, потому сначала вычисляем арифметическое выражение с наиболее высоким приоритетом -- его результат типа integer и =3, а именно:

((5 - 2) >= 3) OR b OR true = (3 >= 3)  OR b OR true 

Далее сравниваются два целых числа, результат же сравнения имеет уже тип boolean:

(3 >= 3)  OR b OR true =  true OR b OR true  

-- true, т.к. $3$ действительно больше либо равно $3$. Далее просто считаем слева направо:

 true OR b OR true =  true OR false OR true   // т.к. b = false
=   (true OR false) OR true = true OR true = true

а значит:

 c := ((5 - 2) >= 3) OR b OR true; // = true

Этим вычислением мы просто показали как работает Паскаль, на практике, конечно, программа вычислит значение сама, но нам нужно понимать её логику, чтобы правильно описывать желаемое поведение кода.

Разбор задач

Пример №1

Сравните число $5$ и число $2.3$ результат сравнения выведите на экран.

Самое простое решение:

begin
   writeln(5>2.3);
end.

Если же требуется сравнивать значения переменных, то:

var  a: integer; // используем целый тип, так как 5 целое
 b: real; // 2.3 -- вещественное число, а потому объявляем её тип как real
begin
   a := 5;
   b := 2.3;
   writeln(a>b);
end;

Ну и наконец если требуется записать результат сравнения в переменную, то:

var  a: integer; // используем целый тип, так как 5 целое
 b: real; { мы  будем записывать сюда  2.3 -- вещественное число,
                      а потому объявляем её  тип как real }
 с: boolean; // для результата сравнения
begin
   a := 5;
   b := 2.3;
   с := a>b; // сравниваем значения переменных и записываем результат в с 
   writeln(с); // выводим значение переменной на экран
end;

Пример №2

Дано целое число A. Проверить истинность высказывания: «Число A является положительным».

Решение (будем читать значение из консоли)

program B2;
var
  a: integer;
begin
  write('Введите число A: ');
  readln(a);
  writeln('Число A является положительным - ', a > 0); {Простое высказывание.}
end.

-- в этом решении при выводе ответа, мы в качестве второго аргумента процедуры вывода передали выражение возвращающее логический результат.

Пример №3

Задача:

Дано целое число A. Проверить истинность высказывания: «Число A является нечетным».

Для того чтобы узнать, является ли данное число нечетным в Паскале предусмотрена специальная функция Odd, которая возвращает true, если число нечетное и false, если число четное.

program B3;

var
  a: integer;
  b : boolean;

begin
  write('Введите число A: ');
  readln(a);
  b := Odd(a); // получаем логическое значение как результат проверки
  writeln('Число A является нечетным - ', b); { Можно обойтись и без b, 
если в качестве второго аргумента сразу подставить  Odd(a)  }
end.

Запустите код и проверьте как работает программа.

Пример №4

Задача:

Дано целое число A. Проверить истинность высказывания: «Число A является четным».

Для того чтобы узнать является ли число нечетным, используем уже известную нам функцию, затем инвертируем результат (используя логическую операцию Not - см. правила её работы выше):

program B4;

var
  a: integer;
  b : boolean;

begin
  write('Введите число A: ');  { если введём 8 }
  read(a);
  b := Odd(a); { то тут получим False }
  writeln('Число A является четным - ', not b); {а тут True }
end.

Пример №5

Даны три целых числа: $A$, $B$, $C$. Проверить истинность высказывания: «Число $B$ находится между числами $A$ и $C$».

В решении этой задачи нам потребуется операция логического умножения, таблица истинности которой требует одновременности выполнения условий:

program B5;

var
  a, b, c: integer; // числа
  b1, b2: boolean; // для хранения результатов проверок

begin
  write('Введите число A, B, C: ');
  read(a, b, c); // читаем переменные списком
 // в следующих двух строках проверим две пары условий
  b1 := (B > A) and (B < C);   
  b2 := (B > C) and (B < A);  { Надо учитывать оба варианта }
  writeln('Число B находится между числами A и C - ', b1 or b2);

  {при выводе ответа в предыдущей строке мы также в качестве 
 второго аргумента использовали выражение с операцией 
логической суммы, которая возвращает истину если истинен
 хотя бы один из операндов}
end.

Самостоятельная работа -- вопросы и задачи

Теоретические вопросы:

  1. Чтобы такое логический тип данных? Для чего он нужен?
  2. Какие литералы логического типа вы знаете? Сколько их?
  3. Какие выражения могут возвращать логический тип данных?
    Какой тип возвращает выражение:
    5 + 2*6;

    ? А какой тип у выражения:

     5 > 2.7

    ? Объясните почему.

  4. Как работает операция AND? Сколько аргументов она использует для получения результата?
  5. Как работает операция Not? Сколько аргументов она использует для получения результата?
  6. Как работает операция OR? Сколько аргументов она использует для получения результата?
  7. Практические задачи:

  8. Вычислите в тетради значения выражений (по шагам как в примерах урока выше):
    true AND true
    false AND false
    true AND (true AND true)
    true OR false
    true OR true
    true OR true AND false
    false OR true AND true
    false OR (true AND true)
    true OR (true AND true)
    true OR (false AND true) OR true
    true OR (false AND true) OR true AND false
  9. Вычислите в тетради значения выражений (по шагам как в примерах урока выше):
    true AND true  OR (5>8)
    false AND false OR  (8>=8)
    true AND ((5<7) AND true)
    true OR   (8=9) OR false
    true OR ((77+5)>99)
    true OR  (55 + 2 <= 57) AND false
    (2=2) OR true AND true
    false OR (true AND true AND (22 > 4))
    
  10. Следующие задачи решите в виде программы:

  11. Сравните число 8 и число 9.55, выведите результат сравнения на экран.
  12. Пользователь вводит два значения, одно целое, а другое вещественное, проверьте больше ли первое число второго, выведя на экран надпись (как это делается в примерах выше).
  13. Даны два целых числа: $A$ и $B$. Проверить истинность высказывания: «Сумма чисел Число $A$ и число $B$ больше 12».
  14. Даны три целых числа: $A$, $B$, $C$. Проверить истинность высказывания: «Число $A$ находится между числами $B$ и $C$».
  15. Даны три целых числа: $A$, $B$, $C$. Проверить истинность высказывания: « Число $A$ и число $B$ больше 17, а $C$ > 7».
  16. Пользователь вводит четыре числа, проверьте, что первое больше третьего и при этом (одновременно второе меньше четвертого).

Что ещё почитать (полезные материалы)

  1. Логика в Паскаль. Тип Boolean: http://learnpascal.ru/vvedenie-v-paskal/...
  2. Иллюстрации были взяты из интересной книги об ЭВМ: Тищенко В. Г., Тищенко Г. В. T47 МикроЭВМ — своими руками: Для ст. шк. возраста.— К.: Рад. шк., 1989.— 208 с.— (Сер. «Когда сделаны уроки»)