Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТЕКСТЫ для лабработы 3 / вариант №24.rtf
Скачиваний:
22
Добавлен:
02.04.2015
Размер:
370.47 Кб
Скачать

Глава 4. Типы

─────────────────────────────────────────────────────────────────

При описании переменной необходимо указать ее тип. Тип пере-

менной описывает набор значений, которые она может принимать, и

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

ределяет идентификатор, который обозначает этот тип.

┌───────────────┐ ┌───┐ ┌─────┐ ┌───┐

описание ──>│ идентификатор ├──>│ = ├──>│ тип ├──>│ ; ├──>

типа └───────────────┘ └───┘ └─────┘ └───┘

Указание идентификатора в левой части описания типа означа-

ет, что он определен как идентификатор типа для блока, в котором

указано это описание типа. Область действия идентификатора типа

не включает его самого, исключение составляют типы "указатель"

(которые называют также ссылочными типами).

┌────────────────────┐

тип ────────┬────>│ простой тип │─────────>

│ └────────────────────┘ ^

│ ┌────────────────────┐ │

├────>│ строковый тип ├────┤

│ └────────────────────┘ │

│ ┌────────────────────┐ │

├────>│ ссылочный тип ├────┤

│ └────────────────────┘ │

│ ┌────────────────────┐ │

├────>│ структурный тип ├────┤

│ └────────────────────┘ │

│ ┌────────────────────┐ │

├────>│ процедурный тип ├────┤

│ └────────────────────┘ │

│ ┌────────────────────┐ │

└────>│ идентификатор типа ├────┘

└────────────────────┘

Имеется пять следующих основных классов типов. Они описыва-

ются в следующем разделе.

B.Pascal 7 & Objects/LR - 35 -

Простые типы

─────────────────────────────────────────────────────────────────

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

┌───────────────────┐

простой тип ─────┬────>│ порядковый тип ├─────────>

│ └───────────────────┘ ^

│ ┌───────────────────┐ │

└────>│ вещественный тип ├─────┘

└───────────────────┘

┌────────────────────┐

вещественный тип ─────>│ идентификатор ├─────>

│ вещественного типа │

└────────────────────┘

Идентификатор вещественного типа относится к числу стандарт-

ных идентификаторов, которые могут быть вещественными, с одинар-

ной точностью, с двойной точностью, с повышенной точностью и

сложными.

Примечание: В разделах "Числа" и "Строковые константы"

Главы 2 вы можете найти описание того, как обозначать конс-

танты целого и вещественного типов.

Порядковые типы

─────────────────────────────────────────────────────────────────

Порядковые типы представляют собой подмножество простых ти-

пов. Все простые типы, отличные от вещественных типов, являются

порядковыми и выделяются по следующим четырем характеристикам.

- Все возможные значения данного порядкового типа представ-

ляют собой упорядоченное множество, и каждое возможное

значение связано с порядковым номером, который представ-

ляет собой целочисленное значение. За исключением значе-

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

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

имеет порядковый номер 1 и так далее для каждого значения

в этом порядковом типе. Порядковым номером значения цело-

численного типа является само это значение. В любом по-

рядковом типе каждому значению, кроме первого, предшест-

вует другое значение, и после каждого значения, кроме

последнего, следует другое значение в соответствии с упо-

рядоченностью типа.

- К любому значению порядкового типа можно применить стан-

дартную функцию Ord, возвращающую порядковый номер этого

значения.

- К любому значению порядкового типа можно применить стан-

дартную функцию Pred, возвращающую предшествующее этому

значению значение. Если эта функция применяется к первому

B.Pascal 7 & Objects/LR - 36 -

значению в этом порядковом типе, то выдается сообщение об

ошибке.

- К любому значению порядкового типа можно применить стан-

дартную функцию Succ, возвращающую следующее за этим зна-

чением значение. Если эта функция применяется к последне-

му значению в этом порядковом типе, то выдается сообщение

об ошибке.

- К любому значению порядкового типа и к ссылке на перемен-

ную порядкового типа можно применить стандартную функцию

Low, возвращающую наименьшее значение в диапазоне данного

порядкового типа.

- К любому значению порядкового типа и к ссылке на перемен-

ную порядкового типа можно применить стандартную функцию

High, возвращающую наибольшее значение в диапазоне данно-

го порядкового типа.

Синтаксис порядкового типа имеет следующий вид:

┌────────────────────┐

порядковый ─────┬────>│ отрезок типа ├─────────>

тип │ └────────────────────┘ ^

│ ┌────────────────────┐ │

├────>│ перечислимый тип ├─────┤

│ └────────────────────┘ │

│ ┌────────────────────┐ │

└────>│ идентификатор ├─────┘

│ порядкового типа │

└────────────────────┘

Borland Pascal имеет 10 встроенных порядковых типов: Integer

(целое), Shortint (короткое целое), Longint (длинное целое), Byte

(длиной в байт), Word (длиной в слово), Boolean (булевское),

ByteBool (булевское размером в байт), WordBool (булевское разме-

ром в слово), LongBool (длинный булевский тип) и Char (символьный

тип). Кроме того, имеется два других класса определяемых пользо-

вателем порядковых типов: перечислимые типы и отрезки типов (под-

диапазоны).

B.Pascal 7 & Objects/LR - 37 -

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

─────────────────────────────────────────────────────────────────

В Borland Pascal имеется пять предопределенных целочисленных

типов: Shortint (короткое целое), Integer (целое), Longint (длин-

ное целое), Byte (длиной в байт) и Word (длиной в слово). Каждый

тип обозначает определенное подмножество целых чисел, как это по-

казано в следующей таблице.

Предопределенные целочисленные типы Таблица 4.1

┌────────────────────┬────────────────────┬─────────────────────┐

│ Тип │ Диапазон │ Формат │

├────────────────────┼────────────────────┼─────────────────────┤

│ короткое целое │ -128 .. 127 │ 8 бит со знаком │

│ (Shortint) │ │ │

├────────────────────┼────────────────────┼─────────────────────┤

│ целое │ -32768 .. 32767 │ 16 бит со знаком │

│ (Integer) │ │ │

├────────────────────┼────────────────────┼─────────────────────┤

│ длинное целое │ -2147483648 .. │ 32 бита со знаком │

│ (Longint) │ ..2147483647 │ │

├────────────────────┼────────────────────┼─────────────────────┤

│ длиной в байт │ 0 .. 255 │ 8 бит без знака │

│ (Byte) │ │ │

├────────────────────┼────────────────────┼─────────────────────┤

│ длиной в слово │ 0 .. 65535 │ 16 бит без знака │

│ (Word) │ │ │

└────────────────────┴────────────────────┴─────────────────────┘

Арифметические действия над операндами целочисленного типа

предполагают 8-битовую, 16-битовую и 32-битовую точность в соот-

ветствии со следующими правилами:

- Тип целой константы представляет собой встроенный целочис-

ленный тип с наименьшим диапазоном, включающим значение

этой целой константы.

- В случае бинарной операции (операции, использующей два

операнда), оба операнда преобразуются к их общему типу пе-

ред тем, как над ними совершается действие. Общим типом

является встроенный целочисленный тип с наименьшим диапа-

зоном, включающим все возможные значения обоих типов. Нап-

ример, общим типом для целого и целого длиной в байт явля-

ется целое, а общим типом для целого и целого длиной в

слово является длинное целое. Действие выполняется в соот-

ветствии с точностью общего типа и типом результата явля-

ется общий тип.

- Выражение справа в операторе присваивания вычисляется не-

зависимо от размера или типа переменной слева.

- Любые операнды размером в байт преобразуются к промежуточ-

ному операнду размером в слово, который совместим перед

B.Pascal 7 & Objects/LR - 38 -

выполнением арифметической операции с типами Integer и

Word.

Значение одного целочисленного типа может быть явным образом

преобразовано к другому целочисленному типу с помощью приведения

типов.

Примечание: Приведение типов описывается в Главах 5 и 6.

B.Pascal 7 & Objects/LR - 39 -

Булевские типы

─────────────────────────────────────────────────────────────────

Существует 4 предопределенных булевских типа: Boolean,

ByteBool, WordBool и LongBool. Значения булевского типа обознача-

ются встроенными идентификаторами констант False и True. Посколь-

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

имеют место следующие отношения:

- False < True

- Ord(False) = 0

- Ord(True) = 1

- Succ(False) = True

- Pred(True) = False

Переменные типа Boolean и ByteBool занимают 1 байт, пере-

менная WordBool занимает два байта (слово), а переменная LongBool

занимает четыре байта (два слова). Boolean - это наиболее предпо-

чтительный тип, использующей меньше памяти; типа ByteBool,

WordBool и LongBool обеспечивают совместимость с другими языками

и средой Windows.

Предполагается, что переменная типа Boolean имеет порядковые

значения 0 и 1, но переменные типа ByteBool, WordBool и LongBool

могут иметь другие порядковые значения. Когда выражение типа

ByteBool, WordBool или LongBool равна 1, то подразумевается, что

она имеет значение True, а если оно равно 0 - то False. Когда

значение типа ByteBool, WordBool или LongBool используется в кон-

тексте, где ожидается значение Boolean, компилятор будет автома-

тически генерировать код, преобразующий любое ненулевое значение

в значение True.

B.Pascal 7 & Objects/LR - 40 -

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

─────────────────────────────────────────────────────────────────

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

ные в соответствии с расширенным набором символов кода ASCII. При

вызове функции Ord(Ch), где Ch - значение символьного типа, возв-

ращается порядковый номер Ch.

Строковая константа с длиной 1 может обозначать значение

константы символьного типа. Любое значение символьного типа может

быть получено с помощью стандартной функции Chr.

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

─────────────────────────────────────────────────────────────────

Перечислимые типы определяют упорядоченные множества значе-

ний через перечисление идентификаторов, которые обозначают эти

значения. Упорядочение множеств выполняется в соответствии с пос-

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

┌───┐ ┌───────────────┐ ┌───┐

перечислимый ──>│ ( ├───>│ список ├───>│ ) ├───>

тип └───┘ │идентификаторов│ └───┘

└───────────────┘

список ┌─────────────┐

идентификаторов ────────>│идентификатор├───┬────>

^ └─────────────┘ │

│ ┌───┐ │

└──────┤ , │<───────────┘

└───┘

При указании идентификатора в списке идентификаторов пере-

числимого типа он описывается как константа для блока, в котором

указано описание перечислимого типа. Типом этой константы являет-

ся описанный перечислимый тип.

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

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

котором описывается константа, становится ее типом. Первая пере-

числимая константа в списке имеет порядковый номер 0.

Приведем пример перечислимого типа:

type

suit = (club, diamond, heart, spade);

Согласно этим описаниям diamond является константой типа

suit.

При применении функции Ord к значению перечислимого типа Ord

возвращает целое число, которое показывает, какое положение зани-

мает это значение в отношении других значений этого перечислимого

B.Pascal 7 & Objects/LR - 41 -

типа. Согласно предшествующим описаниям, Ord(club) возвращает 0,

Ord(diamond) возвращает 1 и так далее.

Отрезки типа

─────────────────────────────────────────────────────────────────

Отрезок типа представляет собой диапазон значений из поряд-

кового типа, называемого главным типом. Определение отрезка типа

включает наименьшее и наибольшее значение в поддиапазоне. Оно

имеет следующий синтаксис:

отрезок ┌───────────┐ ┌────┐ ┌───────────┐

типа ───────────>│ константа ├───>│ .. ├───>│ константа ├───>

└───────────┘ └────┘ └───────────┘

Обе константы должны иметь один и тот же порядковый тип. От-

резки типов, имеющие вид a..b, предполагают, что a меньше или

равно b.

Приведем примеры отрезков типов:

0..99

-128..127

club..heart

Переменная отрезка типа имеет все свойства переменных глав-

ного типа, однако ее значение на этапе выполнения должно принад-

лежать указанному интервалу.

Разрешение использования выражений-констант там, где стан-

дартный Паскаль допускает только простые константы, приводит к

некоторой синтаксической неоднозначности. Рассмотрим следующие

описания:

const

X = 50;

Y = 10;

type

Color = (Red, Green, Blue);

Scale = (X - Y) * 2..(X + Y) * 2;

Согласно синтаксису стандартного Паскаля, если определение

типа начинается с круглой скобки, то это перечислимый тип (такой

как Color в данном примере). Однако Scale предназначен для опре-

деления отрезка типа. Решение состоит в том, чтобы переупорядо-

чить первое выражение поддиапазона или задать другую константу,

равную значению данного выражения, и использовать эту константу в

определении типа:

type

Scale = 2 * (X - Y)..(X + Y);

30

Соседние файлы в папке ТЕКСТЫ для лабработы 3