#6 Boolean Логический тип данных. Логические выражения. Операции AND и OR. Таблицы истинности. Приоритет операция. Паскаль
Primary tabs
В этом уроке мы поговорим о логическом типе данных.
boolean -- Что это за тип
Логический тип данных (boolean) служит для хранения значений, которые обладают одним из двух возможных состояний:
- или истина
- или ложь
Логический тип данных нужен, чтобы программировать различные альтернативные действия, развивать сценарий программы различными путями, тем самым имитируя настоящую жизнь.
Переменные типа boolean
Объявление переменных логического типа
В коде программы переменные логического объявляются, по той же схеме, что и integer, но для указания типа используется ключевое слово boolean, например:
myVar: boolean; // объявляем одну переменную логического типа
или:
var a, b, myVar: boolean; // объявляем три переменные логического типа списком.
Литералы логического типа (логические литеры) и присваивание значений переменным
Литеры логического типа -- это два специальных слова, зарезервированных в рамках синтаксиса языка Паскаль.
Для обозначения истины используется литерал:
true
а для обозначение лжи литерал:
false
Оба этих значения могу быть присвоены переменным логического типа, например:
var a,b: boolean; begin a := true; b := false;
-- как всегда, после операции присваивания, ставятся точка с запятой.
Значение переменных логического типа после объявления
Сразу после объявления переменные логического типа имеют значение false.
Логические операции. Таблицы истинности
Подобно арифметическим значениям для логических тоже можно строить выражения, но вместо арифметических операций для логических значений используются логические операции.
В этом уроке мы рассмотри три логические операции:
- OR -- т.н. логическое ИЛИ (или "логическая сумма" или "дизъюнкция").
- AND -- т.н. логическое И (или "логическое умножение" или "конъюнкция").
- Not -- отрицание ("инверсия")
Операция OR (логическое ИЛИ) -- логическая сумма
Операция OR принимает два операнда логического (boolean) типа (один слева другой справа) и возвращает результат, опять же, логического типа.
Правила работы операции, описываются т.н. таблицей истинности -- то есть таблицей, которая показывает при каких значениях операндов какой именно результат мы получим.
Итак, построим таблицу истинности для операции OR, она будет выглядеть так:
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
Или:
Или ещё более красочная иллюстрация, объясняющая работу данной операции:
Логические выражения и порядок выполнения операций в них
Логические выражения -- это выражения, результат которых имеет тип 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 } c: boolean; // для результата сравнения begin a := 5; b := 2.3; c := a>b; // сравниваем значения переменных и записываем результат в с writeln(c); // выводим значение переменной на экран readln(); 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); // ситуация, когда A < B < C b2 := (B > C) and (B < A); // ситуация, когда C < B < A { Надо учитывать оба варианта } writeln('Число B находится между числами A и C - ', b1 or b2); {при выводе ответа в предыдущей строке мы также в качестве второго аргумента использовали выражение с операцией логической суммы, которая возвращает истину если истинен хотя бы один из операндов} readln(); // считываем оставшийся символ переносастроки после read readln(); end.
-- также можно посмотреть видео-комментарий по особенности работы read и readln().
Видео-пояснения
Для этого урока имеются следующие видео (см. в таком порядке):
- Boolean, логический тип, выражения, TRUE, FALSE
- Операции Сравнения чисел (boolean), разбор примеров
- Логический тип данных Boolean, разбор для детей -- Часть 1
- Логические выражения с операциями OR и AND, приорите и порядок их выполнения, разбор для детей -- Часть 2
Самостоятельная работа -- вопросы и задачи
Теоретические вопросы:
- Чтобы такое логический тип данных? Для чего он нужен?
- Какие литералы логического типа вы знаете? Сколько их?
- Какие выражения могут возвращать логический тип данных?
Какой тип возвращает выражение:5 + 2*6;
? А какой тип у выражения:
5 > 2.7
? Объясните почему.
- Как работает операция AND? Сколько операндов она использует для получения результата?
Какая у нее таблица истинности? - Как работает операция Not? Сколько операндов она использует для получения результата?
Какая у нее таблица истинности? - Как работает операция OR? Сколько операндов она использует для получения результата?
Какая у нее таблица истинности? - Вычислите в тетради значения выражений (по шагам как в примерах урока выше):
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
- Вычислите в тетради значения выражений (по шагам как в примерах урока выше):
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))
- Сравните число 8 и число 9.55, выведите результат сравнения на экран.
- Пользователь вводит два значения, одно целое, а другое вещественное, проверьте больше ли первое число второго, выведя на экран надпись (как это делается в примерах выше).
- Даны два целых числа: $A$ и $B$. Проверить истинность высказывания: «Сумма чисел $A$ и число $B$ больше 12».
- Даны три целых числа: $A$, $B$, $C$. Проверить истинность высказывания: «Число $A$ находится между числами $B$ и $C$».
- Даны три целых числа: $A$, $B$, $C$. Проверить истинность высказывания: « Число $A$ и число $B$ больше 17, а $C$ > 7».
Подсказка: если не получается решить, или для самопроверки - см. этот разбор решения.
- Пользователь вводит четыре числа, проверьте, что первое больше третьего и при этом одновременно второе меньше четвертого.
Практические задачи:
Следующие задачи решите в виде программы:
Что ещё почитать (полезные материалы)
- Логика в Паскаль. Тип Boolean: http://learnpascal.ru/vvedenie-v-paskal/...
- Иллюстрации были взяты из интересной книги об ЭВМ: Тищенко В. Г., Тищенко Г. В. T47 МикроЭВМ — своими руками: Для ст. шк. возраста.— К.: Рад. шк., 1989.— 208 с.— (Сер. «Когда сделаны уроки»)
- Log in to post comments
- 30100 reads