TURBO PASCAL

Новости       

Программы

Turbo Pascal

Игры

Документация

"Странности"

FAQ

Ссылки

Благодарности 

Гостевая книга

Спонсор

От автора

Глава 4. Типы

 

·        Простые типы

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

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

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

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

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

·        Отрезки типа

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

·        Строковые типы

·        Структурные типы

·        Типы массив

·        Типы запись

·        Множественные типы

·        Файловые типы

·        Ссылочные типы

·        Тип Pointer

·        Раздел описания типов

 

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

Указание идентификатора в левой части описания типа означа­ет, что он определен как идентификатор типа для блока, в котором указано это описание типа. Область действия идентификатора типа не включает его самого, исключение составляют типы "указатель" (которые называют также ссылочными типами).

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

Возврат в начало

 

Простые типы

 

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

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

Примечание: В разделах "Числа" и "Строковые константы" Главы 2 вы можете найти описание того, как обозначать конс­танты целого и вещественного типов.

Возврат в начало

 

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

Порядковые типы представляют собой подмножество простых ти­пов. Все простые типы, отличные от вещественных типов, являются порядковыми и выделяются по следующим четырем характеристикам.

·        Все возможные значения данного порядкового типа представ­ляют собой упорядоченное множество, и каждое возможное значение связано с порядковым номером, который представ­ляет собой целочисленное значение. За исключением значе­ний целочисленного типа, первое значение любого порядко­вого типа имеет порядковый номер 0, следующее значение имеет порядковый номер 1 и так далее для каждого значения в этом порядковом типе. Порядковым номером значения цело­численного типа является само это значение. В любом по­рядковом типе каждому значению, кроме первого, предшест­вует другое значение, и после каждого значения, кроме последнего, следует другое значение в соответствии с упо­рядоченностью типа.

·        К любому значению порядкового типа можно применить стан­дартную функцию Ord, возвращающую порядковый номер этого значения.

·        К любому значению порядкового типа можно применить стан­дартную функцию Pred, возвращающую предшествующее этому значению значение. Если эта функция применяется к первому значению в этом порядковом типе, то выдается сообщение об ошибке.

·        К любому значению порядкового типа можно применить стан­дартную функцию Succ, возвращающую следующее за этим зна­чением значение. Если эта функция применяется к последне­му значению в этом порядковом типе, то выдается сообщение об ошибке.

·        К любому значению порядкового типа и к ссылке на перемен­ную порядкового типа можно применить стандартную функцию Low, возвращающую наименьшее значение в диапазоне данного порядкового типа.

·        К любому значению порядкового типа и к ссылке на перемен­ную порядкового типа можно применить стандартную функцию High, возвращающую наибольшее значение в диапазоне данно­го порядкового типа.

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

Borland Pascal имеет 10 встроенных порядковых типов: Integer (целое), Shortint (короткое целое), Longint (длинное целое), Byte (длиной в байт), Word (длиной в слово), Boolean (булевское), ByteBool (булевское размером в байт), WordBool (булевское разме­ром в слово), LongBool (длинный булевский тип) и Char (символьный тип). Кроме того, имеется два других класса определяемых пользо­вателем порядковых типов: перечислимые типы и отрезки типов (под­диапазоны).

Возврат в начало

 

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

В Borland Pascal имеется пять предопределенных целочисленных типов: Shortint (короткое целое), Integer (целое), Longint (длин­ное целое), Byte (длиной в байт) и Word (длиной в слово). Каждый тип обозначает определенное подмножество целых чисел, как это по­казано в следующей таблице.

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

Тип

Диапазон

Формат

короткое целое

(Shortint)

-128 .. 127

8 бит со знаком

целое

(Integer)

-32768 .. 32767

16 бит со знаком

длинное целое

(Longint)

-2147483648 ..

..2147483647

32 бита со знаком

длиной в байт

(Byte)

0 .. 255

8 бит без знака

длиной в слово

(Word)

0 .. 65535

16 бит без знака

Арифметические действия над операндами целочисленного типа предполагают 8-битовую, 16-битовую и 32-битовую точность в соот­ветствии со следующими правилами:

- Тип целой константы представляет собой встроенный целочис­ленный тип с наименьшим диапазоном, включающим значение этой целой константы.

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

- Выражение справа в операторе присваивания вычисляется не­зависимо от размера или типа переменной слева.

- Любые операнды размером в байт преобразуются к промежуточ­ному операнду размером в слово, который совместим перед выполнением арифметической операции с типами Integer и Word.

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

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

Возврат в начало

 

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

Существует 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.

Возврат в начало

 

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

Множеством значений этого типа являются символы, упорядочен­ные в соответствии с расширенным набором символов кода ASCII. При вызове функции Ord(Ch), где Ch - значение символьного типа, возв­ращается порядковый номер Ch.

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

Возврат в начало

 

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

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

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

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

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

type

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

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

При применении функции Ord к значению перечислимого типа Ord возвращает целое число, которое показывает, какое положение зани­мает это значение в отношении других значений этого перечислимого типа.  Согласно предшествующим описаниям, 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);

Возврат в начало

 

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

К вещественному типу относится подмножество вещественных чи­сел, которые могут быть представлены в формате с плавающей точкой с фиксированным числом цифр. Запись значения в формате с плаваю­щей запятой обычно включает три значения - m, b и e - таким обра­зом, что m x b^e=n, где b всегда равен 2, а m и e являются цело­численными значениями в диапазоне вещественного типа. Эти значения m и e далее определяют диапазон представления и точность вещественного типа.

Имеется пять видов вещественных типов: вещественное (Real), с одинарной точностью (Single), с двойной точностью (Double), с повышенной точностью (Extended) и сложное (Comp). Действия над типами с одинарной точностью, с двойной точностью и с повышенной точностью и над сложным типом могут выполняться только при нали­чии числового сопроцессора 8087 (который был описан ранее).

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

                      Диапазон представления

и десятичные цифры для вещественных типов   Таблица 4.2

Тип

Диапазон

Цифры

вещественное

(Real)

2.9x10^-39 .. 1.7x10^38

от 11 до 12

с одинарной точностью

(Single)

1.5x10^-45 .. 3.4x10^38

от 7 до 8

с двойной точностью

(Double)

5.0x10^-324 .. 1.7x10^308

от 15 до 16

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

(Extended)

1.9x10^-4951 .. 1.1x10^4932

от 19 до 20

сложный тип

(Comp)

-2^63 + 1 .. 2^63 - 1

 

Примечание: Сложный тип содержит только целочисленные значения в диапазоне от -2^63+1 до 2^63-1, что приблизи­тельно равно -9.2x10^18 и 9.2x10^18.

Borland Pascal поддерживает две модели генерации кода для выполнения действий над вещественными типами: программную для чи­сел с плавающей точкой и аппаратную для чисел с плавающей точкой. Выбор соответствующей модели осуществляется с помощью директивы компилятора $N.

Возврат в начало

 

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

Значением строкового типа является последовательность симво­лов с динамическим атрибутом длины (в зависимости от действитель­ного числа символов при выполнении программы) и постоянным атри­бутом размера в диапазоне от 1 до 255. Текущее значение атрибута длины можно получить с помощью стандартной функции Length.

 Примечание: Операторы работы со строковыми типами опи­сываются разделах "Строковые операторы" и "Операторы отно­шений" Главы 6.

Отношение между любыми двумя строковыми значениями устанав­ливается согласно отношению порядка между значениями символов в соответствующих позициях. В двух строках разной длины каждый сим­вол более длинной строки без соответствующего символа в более ко­роткой строке принимает значение "больше"; например, 'Xs' больше, чем 'X'. Нулевые строки могут быть равны только другим нулевым строкам, и они являются наименьшими строковыми значениями.

Примечание: Стандартные процедуры и функции для работы со строковыми типами описаны в разделе "Строковые процедуры и функции".

К символам в строках можно обращаться как к элементам масси­ва. См. раздел "Массивы, строки и индексы" в Главе 5.

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

Параметр-переменная, описанная с помощью идентификатора OpenString и ключевого слова string в состоянии $P+, является открытым строковым параметром. Открытые строковые параметры поз­воляют передавать одной и той же процедуре или функции строковые переменные изменяющегося размера.

Возврат в начало

 

Структурные типы

Структурный тип, характеризуемый методом структурирования и типами своих компонентов, имеет более одного значения. Если тип компонента является структурным, то получаемый в результате структурный тип имеет более одного уровня структурирования. Структурный тип может иметь неограниченные уровни структурирова­ния.

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

Возврат в начало

 

Типы массив

Массивы содержат фиксированное число элементов одного типа, так называемого типа элемента. На приводимой ниже синтаксической диаграмме тип элемента следует за словом of.

 

В индексных типах, по одному для каждой размерности массива, указывается число элементов. Допустимыми индексными типами явля­ются все порядковые типы, за исключением длинного целого и подди­апазонов длинного целого. Массив может быть проиндексирован по каждой размерности всеми значениями соответствующего индексного типа; число элементов поэтому равно числу значений в каждом ин­дексном типе. Число размерностей не ограничено.

Приведем пример типа массив:

array[1..100] of Real

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

array[boolean] of array[1..100] of array[Size] of Real

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

array[boolean,1..10,Size] of Real

Кроме того, можно записать выражение:

packed array[1..10] of packed array[1..8] of Boolean

как

packed array[1..10,1..8] of Boolean

Для доступа к элементам массива необходимо указать идентифи­катор массива с одним или несколькими индексами в скобках (см. раздел "Массивы, строки и индексы").

Тип массив, имеющий вид:

packed array[M..N] of Char

где M меньше N,  называется упакованным  строковым  типом  (слово packed  можно  опустить,  поскольку  оно  не оказывает действия в Borland Pascal). Упакованный строковый тип имеет некоторые свойс­тва, не характерные для других типов массив (см. раздел "Тождест­венные и совместимые типы" далее в этой главе).

Массив вида:

array[0..X] of Char

где X - положительное целое число, называется массивом с нулевой базой. Массивы с нулевой базой используются для хранения строк с завершающим нулем, и, когда разрешен расширенный синтаксис (с по­мощью директивы компилятора $X+), символьный массив с нулевой базой совместим со значением типа PChar.

Параметр, описанный с помощью синтаксиса array of T, называ­ется открытым строковым параметром.  Открытые строковые параметры позволяют передавать одной и той же процедуре или функции строко­вые переменные изменяющегося размера.

Возврат в начало

 

Типы запись

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

 

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

Приведем пример типа запись:

record

year:  integer;                                  год

month: 1..12;                                  месяц

day:   1..31;                                    число

end

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

 

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

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

Ниже приводятся несколько примеров типов запись:

record

firstName,lastName : string[40];

birthDate : Date;

case citizen : boolean of

True  : (birthPlace: string[40]);

False : (country : string[20]; entryPort : string[20]; entryDate : Date;

exitDate  : Date);

end

record

x,y : real;

case kind : Figure of

rectangle : (height,wigth: real);                                       прямоугольник

triangle : (size1,side2,angle: real);  треугольник

circle : (radius: real);                                                     круг

end

Возврат в начало

 

 

Множественные типы

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

Переменная множественного типа может принимать как все зна­чения множества, так и ни одного.

 

Базовый тип не должен иметь более 256 возможных значений, и порядковые значения верхней и нижней границы базового типа должны не превышать диапазона от 0 до 255. В силу этого базовый тип мно­жества не может быть коротким целым (Shortint), целым (Integer), длинным целым (Longint) или словом (Word).

Примечание: Операции над множественными типами описыва­ются в разделе "Операции над множествами" в Главе 6. В раз­деле "Описатели множеств" показано, как определять значения множества.

Любой множественный тип может принимать значение [], которое называется пустым множеством.

Возврат в начало

 

Файловые типы

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

 

Если слово of и тип компонента опущены, то тип обозначает нетипизированный файл. Нетипизированные файлы представляют собой каналы ввода-вывода нижнего уровня, в основном используемые для прямого доступа к любому файлу на диске, независимо от его внут­реннего формата.

Стандартный файловый тип Text определяет файл, содержащий символы, упорядоченные в строки. Текстовые файлы используют спе­циальные процедуры ввода-вывода, которые описываются в Главе 13 "Ввод и вывод".

Возврат в начало

 

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

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

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

Переменной-указателю можно присвоить значение с помощью про­цедуры New, операции @ или функции Ptr. Процедура New отводит но­вую область памяти в динамически распределяемой области для дина­мических переменных и сохраняет адрес этой области в переменной указателя. Операция @ ориентирует переменную-указатель на область памяти, содержащую существующую переменную, включая и те перемен­ные, которые имеют идентификаторы. Функция Ptr ориентирует пере­менную-указатель на определенный адрес в памяти.

Зарезервированное слово nil обозначает константу со значени­ем указателя, которая ни на что не указывает.

Возврат в начало

 

Тип Pointer

Встроенный тип Pointer обозначает нетипизированный указа­тель, то есть указатель, который не указывает ни на какой опреде­ленный тип. Переменные типа Pointer могут быть разыменованы: ука­зание символа ^ после такой переменной вызывает появление ошибки. Как и значение, обозначаемое словом nil, значения типа Pointer совместимы со всеми другими типами указателей.

Примечание: В разделе "Указатели и динамические пере­менные" в Главе 5 вы можете найти синтаксис ссылки на дина­мические переменные, которые указываются с помощью указате­ля-переменной.

Возврат в начало

 

Раздел описания типов

Программы, процедуры и функции имеют для описания типов спе­циальный раздел описания типов. Например:

type

TRange              =  integer;

TNumber           =  integer;

TColor               =  (red,green,blue);

TTextIndex        =  1..100;

TTestValue        =  -99..99;

TTestList            =  array[TestIndex] of TestValue;

PestList              =  ^TTestList;

TDate                =  object

year: integer;

month: 1..12;

day: 1.. 31;

procedure SetDate(D, M, Y: Integer);

function ShowDate: String;

end;

MeasureData = record

when: Date;

count: TTestIndex;

data: TestListPtr;

end;

TMeasureList     =  array[1..50] of MeasureData;

TName               =  string[80];

TSex                  =  (male,female);

TPersonDate      =  ^TPersonData;

TPersonData      =  record

name,firstName: TName;

age:                                                        integer;

married:                                                 boolean;

father,child,sibling: Person;

case s: Sex of

male:   (bearded: boolean);

female: (pregnant: boolean);

end;

TPersonDate = array[0..SizeOf(TPersonDate)-1] of Byte; TPeople  = file of TPersonData;

В этом примере Range, Number и Integer являются тождествен­ными типами. TTestIndex является просто совместимым и совместимым по присваиванию, но не тождественным, с типами Number, Range и Integer. Обратите внимание на использование в описаниях TCharVal и TPersonBuf выражений-констант.

Возврат в начало

 

На первую страницу

Rambler's Top100 PROext: Top 1000
Rambler's Top100

(с) Все права защищены.

По всем интересующим вопросам прошу писать электронный адрес

Hosted by uCoz