Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ВТИП / Голова / Лекции_Голова.doc
Скачиваний:
28
Добавлен:
16.04.2013
Размер:
178.18 Кб
Скачать

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

Логический тип Boolean имеет два возможных значения - «истина» (True) и «ложь» (False).

Эти значения считаются упорядоченными так что False < True.

Под значение логических переменных (или констант) отводится 1 байт памяти.

При работе с переменными логического типа используются логические операции.

Логическое   отрицание    NOT

Логическое   И                   AND

Логическое   ИЛИ             OR

исключающее ИЛИ          XOR

Рассмотрим таблицу истинности этих операций:

Логическое отрицание NOT A

A          NOT A

FALSE      TRUE

TRUE        FALSE

Значение NOT A истинно (TRUE) тогда и только тогда, когда А - ложно (FALSE)

и NOT имеет значение FALSE (ложь), когда А имеет значение TRUE (истина).

Логическое И A AND B

A

B

A AND B

FALSE

FALSE

FALSE

FALSE

TRUE

FALSE

TRUE

FALSE

FALSE

TRUE

TRUE

TRUE

Значение A AND B принимает значение TRUE (истина) тогда и только тогда, когда истины оба операнда (т.е. и А и В имеют значение TRUE), во всех остальных случаях A AND B принимает значение FALSE (ложь).

Логическое ИЛИ A OR B

A

B

A OR B

FALSE

FALSE

FALSE

FALSE

TRUE

TRUE

TRUE

FALSE

TRUE

TRUE

TRUE

TRUE

Значение A OR B принимает значение FALSE (ложь) тогда и только тогда, когда ложны оба операнда (т.е. и А и В имеют значение FALSE), во всех остальных случаях A OR B принимает значение TRUE (истина).

Исключающее ИЛИ A XOR B

A

B

A OR B

FALSE

FALSE

FALSE

FALSE

TRUE

TRUE

TRUE

FALSE

TRUE

TRUE

TRUE

FALSE

Значение A XOR B принимает значение TRUE (истина) тогда и только тогда, когда его операнды имеют разные значения, и значение FALSE (ложь),тогда когда его операнды имеют одинаковое значение.

Логические операции используются в логических выражениях. Логические операции могут включать в себя переменные логического типа, операции отношения и логические операции. Например (Х>=0) AND (X<=1).

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

Перечислимый или перечисляемый тип данных - это тип данных задаваемый пользователем.

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

       type

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

определяют перечислимый тип week как последовательность идентификаторов - Sunday, Monday, Tuesday и т.д..

Идентификаторы при определении типа задаются о правилам определения идентификаторов, в списке разделяются запятой и не заключаются в апострофы.

Они не являются строковыми или какими-то другими константами, а представляют собой константы соответствующего перечислимого типа.

Порядок констант (значений) перечислимого типа определяется последовательностью, в которой перечисляются идентификаторы при определении типа.

Первая перечисленная константа в списке имеет порядковый номер 0, следующая 1, затем 2 и т.д..

Результатом применения функции ord к значению перечислимого типа (переменной или константе перечислимого типа) является порядковый номер этого значения в списке констант в определении типа.

Например, для перечислимого типа week

ord (sunday) = 0

ord (monday) = 1

..................................

ord (friday) = 5 и т.д.

Два значения одного и того же перечислимого типа можно сравнивать посредством отношений <, >, <=, >=, =, <>.

При сравнении перечислимых значений сравниваются их порядковые номера.

Справедливы, например, такие отношения

sunday < monday < tuesday < wednesday < thurday < friday < saturday

и

sunday<=saturday

Значения, относящиеся к разным перечислимым типам, сравнивать между собой нельзя, т.к. это разные данные и никакое сравнение невозможно.

Компилятор языка Турбо Паскаль при этом выдает сообщение об ошибке

«type nusmatch - несоответствие типов».

Кроме того для перечислимого типа могут быть использованы функции Pred и Suce.

Функция Pred (предыдущий) возвращает значение, предшествующее ее аргументу. Например

Pred ( saturday ) = friday

Pred ( fridey ) = thirsday

Pred ( thirsday ) = wednesday

Pred ( wednesday ) = tuesday

Pred ( tuesday ) = monday

Pred ( monday ) = sunday

Функция Pred для значения sunday не определена так как значение sunday стоит первым в списке определения типа и не имеет предшествующего значения.

Функция Suce (следуюдщий) возращает значение, следующее за её аргументом.

Например:

Suce(Sundey) = monday

Suce(monday) = tuesday

Suce(tuesday) = wednesday

Suce(wednesday) = thirsday

Suce(thirsday) = friday

Suce(friday) = saturday

Значение функции Suce для значения saturday не определено, т.к. значение saturday стоит последним в списке определения типа и не имеет следующего значения.

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

Например

Type

week = (sundey, mondey, tuesday, wednesday, thirsday. Friday, saturday );

Var

d1,d2,d3,d4 : week;

.................................

d1:= tuesday;

d2:= d1;

d3:= pred(d1);

d4:= suce(d2);

Здесь переменные d1 и d2 будут иметь значения tuesday, переменная d3 -значение monday, а d4 - значение ednesday.

Использовать в одном операторе присваивания переменные и/или константы разных перечислимых типов запрещено, т.к. система Турбо Паскаль не знает что делать с несопоставимыми данными.

При этом компилятор Турбо Паскаль выдаст сообщение

type mismatch - несоответствие типов.

Пример запрещенного использования переменных и констант перечислимых типов

type

week =(sunday, monday, tuesday, wednesday, thirsday, friday, saturday);

rainbow =(red, orauge, yellow, green, blue, indigo, violet);

Var

d,d1:week;

c, c1:rainbow;

c:=blue;

d:=succ(c);

d1:=violet;

c1:=pred(friday);

Здесь первый оператор присваивания является верным, т.к. в нем переменной с типа rainbow присваивается константа blue, также типа rainbow.

Во втором операторе присваивания переменной d типа week, присваивается следующее значение для переменной с типа rainbow, что является ошибкой (несоответствие типов).

В третьем операторе присваивания переменной d1 типа week, присваивается следующее значение константы violet типа rainbow, опять ошибка (несоответствие типов).

В четвертом операторе присваивания переменной c1 типа rainbow, присваивается значение предшествующее константе friday перечислимого типа week несоответствие типов.

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

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

Причина такого ограничения заключается в следующем: в памяти компьютера значения перечислимого типа представляются только набором правил, по которым они могут использоваться, и порядковым номером в списке определения типа. А для компилятора системы Турбо Паскаль нет никакой возможности установить соответствие между порядковым номером и рассматриваемой перечислимой константой. Компилятор просто не знает, каким образом задал программист соответствующую константу.

Например, компилятор не знает какая константа в типе week имеет порядковый номер 2

tuesday или wtornik.

Программист мог задавать и так и так при этом выполнение программы никак не изменилось бы.

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

Поэтому в языке (системе) Турбо Паскаль запрещен ввод с клавиатуры и вывод на экран значений перечисляемого типа. Данные перечисляемого типа можно использовать только в операторах присваивания и в различных условиях при определении хода выполняемых программ.

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

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

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

Например, целая переменная N -номер дня недели, может принимать значение от 0 до 7.

Или строковая переменная day - название дня недели, может принимать значения ‘sunday’, ‘monday’, ‘tuesday’, ‘wednesday’, ‘thirsday’, ‘friday’, ‘saturday’, где соответствующие значения уже являются строковыми константами.