Какой тип данных в языке pascal предназначен для хранения логических значений

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

vedro-compota's picture

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Или в виде картинки:

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

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

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

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

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

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

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

Или в виде картинки:

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

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

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

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

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

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

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

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

Или:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • $=$ (проверка на равенство)
    Например:
  • $\lt>$ — "не равно" (проверка на неравенство)
    Например:
  • $>$ ("больше")
    Например:
  • $>=$ ("больше либо равно")
    Например:
  • $\lt $ ("меньше")
    Например:
  • $\lt= $ ("меньше либо равное")
    Например:

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

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

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

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

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

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

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

Разбор задач

Пример №1

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

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

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

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

Пример №2

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

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

Пример №3

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

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

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

Пример №4

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

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

Пример №5

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

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

Pascal. Типы данных

Понятие данных является одним из ключевых в программировании, да и вообще в компьютерных науках. Грубо говоря, данные в информатике это информация, находящиеся в состоянии хранении, обработки или передачи, в какой-то отрезок времени. В машинах Тьюринга информация имеет тип, а он в свою очередь, зависит от рода информации.

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

По способу представления и обработки типы данных бывают:

  • простые
  • структурированные
  • указатели
  • объекты
  • процедуры

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

Целочисленный тип

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

Тип Диапазон Размер в байтах
shortint -128…127 1
integer -32 768…32 767 2
longint -2 147 483 648…2 147 483 647 4
byte 0…255 1
word 0…65 535 2

Объявить целочисленную переменную можно в разделе Var, например:

Над переменными этой категории можно выполнять все арифметические и логические операции за исключением деления (/), для него нужен вещественный тип. Также могут быть применены некоторые стандартные функции и процедуры.

Вещественный тип

В Паскале бывают следующие вещественные типы данных:

Тип Диапазон Память, байт Количество цифр
Real 2.9e-39 … 1.7e38 6 11-12
Single 1.5e-45 … 3.4e38 4 7-8
Double 5.0e-324 …1.7e308 8 15-16
Extended 3.4e-4932 … 1.1e493 10 19-20
Comp -9.2e63 … (9.2e63)-1 8 19-20

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

ln(x) – натуральный логарифм;

sqrt(x) – квадратный корень;

Логический тип

Переменная, имеющая логический тип данных может принимать всего два значения: true (истина) и false (ложь). Здесь истине соответствует значение 1, а ложь тождественная нулю. Объявить булеву переменную можно так:

Над данными этого типа могут выполняться операции сравнения и логические операции: not , and, or, xor.

Символьный тип

Символьный тип данных – это совокупность символов, используемых в том или ином компьютере. Переменная данного типа принимает значение одного из этих символов, занимает в памяти компьютера 1 байт. Слово Char определяет величину данного типа. Существует несколько способов записать символьную переменную (или константу):

  1. как одиночный символ, заключенный в апострофы: ‘W’, ‘V’, ‘п’;
  2. указав код символа, значение которого должно находиться в диапазоне от 0 до 255.
  3. при помощи конструкции ^K, где K – код управляющего символа. Значение K должно быть на 64 больше кода соответствующего управляющего символа.

К величинам символьного типа данных применимы операции отношения и следующие функции:

Succ(x) — возвращает следующий символ;

Pred(x) — возвращает предыдущий символ;

Ord(x) — возвращает значение кода символа;

Chr(x) — возвращает значение символа по его коду;

UpCase(x) — переводит литеры из интервала ‘a’..’z’ в верхний регистр.

Для плодотворной работы с символьным типом рекомендую пользоваться таблицей ASCII.

Строковый тип

Строка в Паскале представляет собой последовательность символов заключенных в апострофы, и обозначается словом String. Число символов (длина строки) должно не превышать 255. Если длину строки не указывать, то она автоматически определиться в 255 символов. Общий вид объявления строковой переменной выглядит так:

Var <имя_переменной>: string[<длина строки>];

Каждый символ в строке имеет свой индекс (номер). Индекс первого байта – 0, но в нем храниться не первый символ, а длина всей строки, из чего следует, что переменная этого типа будет занимать на 1 байт больше числа переменных в ней. Номер первого символа – 1, например, если мы имеем строку S=‘stroka’, то S[1]=s;. В одном из следующих уроков строковый тип данных будет рассмотрен подробнее.

Перечисляемый тип данных

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

Type Day=(Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);

Переменная A может принимать лишь значения определенные в разделе Type. Также можно объявить переменную перечисляемого типа в разделе Var:

Var A: (Monday, Tuesday);

К данному типу применимы операции отношения, при этом заранее определенно, что Monday<Tuesday<Wednesday т. д. Также можно применять функции succ, pred, ord, процедуры inc и dec, и использовать операцию присваивания: A:=Tuesday;

Интервальный тип данных

Когда необходимо задать какой то диапазон значений, то в таких ситуациях применяется интервальный тип данных. Для объявления используется конструкция m..n, где m – минимальное (начальное) значение, а n – максимально (конечное); здесь m и n являются константами, которые могут быть целого, символьного, перечисляемого или логического типа. Описываться величины интервального типа могут как в разделе типов, так и в разделе описания переменных.

Pascal: Занятие № 9. Типы данных пользователя Паскаль Type

К простым типам относятся стандартные, перечисляемые и ограниченные.

К сложным типам – массивы, множества, записи, файлы. Элементами сложных типов могут быть простые и сложные типы. Мы познакомимся со сложными типами данных позже.

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

Новые (пользовательские) типы данных нужны в первую очередь для наглядности и удобства:

const n = 10; m = 50; type matr = array [1..n, 1..m] of integer; var a : matr;

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

Например, при описании процедур с параметрами считается неверным писать:

procedure p(a: array[1..10] of Integer);

Зато следует создать тип данных и записать так:

type vector = array[1..10] of integer; var procedure p(a: vector);

Примеры описания массивов при помощи новых типов

type vector = array[1..10] of integer; matritsa = array[1..8] of vector; var .

Три варианта описаний матрицы эквивалентны:

type vector = array[1..10] of integer; matritsa = array[1..8] of vector;

type matritsa = array[1..8] of array[1..10] of integer;

type matritsa = array[1..8,1..10] of integer;

В следующем примере переменные c и d описаны одинаково:

type vector = array[1..10] of integer; matritsa = array[1..8] of vector; var a,b: vector; c:matritsa; d:array[1..8] of vector;

Пример результата:

Перечисляемый тип и интервальный тип в Паскаль

Перечисляемый тип

В программе можно использовать переменные такого типа, который не совпадает ни с одним из стандартных типов.

Эти значения не могут являться строками, их нельзя вывести на печать и нельзя ввести в компьютер при помощи операторов Read и Write .

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

type pt=(word1,word2, . wordN); var w: pt;

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

Рассмотрим пример объявления интервального типа:

Совместное использование перечисляемого и интервального типов

Переменную интервального типа можно задать с основой на базовый перечисляемый тип. Рассмотрим пример:

type color=(red,yellow,green,blue); var b:red..green; begin b:=red; writeln(b); b:=yellow; writeln(b); b:=green; writeln(b); readln end.

В данном примере тип color &#8212; является базовым. Переменная b интервального типа определена при помощи базового перечисляемого типа.

Один из вариантов решения данной задачи выглядит так:

const dni: array[1..12] of byte = (31,28,31,30,31,30,31,31,30,31,30,31); var s,i: integer; begin s:=0; for i:=6 to 8 do s:=s+dni[i]; <летние месяцы — 6, 7, 8>writeln(s) end.

Код данного решения обладает не самой лучшей наглядностью, к тому же приходится самому вычислять номера месяцев начала и конца лета (6 и 8).
Удобство и наглядность таких программ можно повысить следующим образом:

TYPE mes = (january, february, march, april, may, june, july, august, september, october, november, december); CONST dni:array[january..december] of Byte = (31,28,31,30,31,30,31,31,30,31,30,31); VAR s:Integer; i:mes; <переменная счетчика цикла i задана типом mes, а не Integer>BEGIN s:=0; for i:=june to august do s:=s+dni[i]; WriteLn(s) END.

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

Следующий пример продемонстрирует неправильное решение данной задачи:

var otpravlenie,pribitie:byte; begin otpravlenie:=22; pribitie:=otpravlenie+10; writeln(pribitie) end.

программа вместо ответа &#171;8&#187; напечатает ответ &#171;32&#187;.
Введение ограниченного диапазонного типа позволит избежать неправильного результата, однако компилятор все равно выдаст ошибку:

var otpravlenie,pribitie:0..24; begin otpravlenie:=22; pribitie:=otpravlenie+10; writeln(pribitie) end.

Зная об ошибке, теперь можно ее исправить.

type znak=(oven,lev,strelets,vesi,vodoley, bliznetsi,rak,skorpion,ribi,kozerog,telets,deva); var a:znak; begin a:=lev; if a<=strelets then writeln(‘огонь’); if (a>=vesi) and (a<=bliznetsi) then writeln (‘воздух’); if (a>=rak) and (a<=ribi) then writeln (‘вода’); if (a>=kozerog) and (a<=deva) then writeln (‘земля’); end.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *