Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Ограниченные типы (тип-диапазон)

Реферат

Типы данных в Object Pascal

 

Екатеринбург, 2008


Типы данных в языке Паскаль

 

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

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

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

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

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

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

Несколько особняком стоят объектные типы, или объекты. Являясь, с формальной точки зрения, обобщением комбинированных типов (записей), они позволяют радикально изменить подход к разработке программ, предлагая так называемый объектно-ориентированный стиль программирования.

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

Порядковый тип в свою очередь делится на:

1. целые типы;

2. логический тип или булевский тип;

3. символьный тип;

4. перечисляемые типы;

5. ограниченные типы или тип-диапазон.

На основе стандартных скалярных типов имеется возможность образовывать пользовательские скалярные типы. Есть два способа порождения новых скалярных типов - ограниченные и перечислимые типы.

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

Целые типы

Эта группа типов обозначает множество целых чисел в различных диапазонах. Имеется пять целых типов, различающихся допустимым диапазоном значений и размером занимаемой памяти. Целые типы обозначаются идентификаторами Integer, Byte, ShortInt, Word, LongInt; их характеристики приведены в таблице 1.


Таблица 1

Тип Диапазон значений Размер памяти
ShortInt -128..127 1 байт
Integer -32768..32767 2 байта
LongInt -2147483648..2147483647 4 байта
Byte 0..255 1 байт
Word 0..65535 2 байта

 

Значения целых типов могут изображаться в программе двумя способами: в десятичном виде и в шестнадцатеричном коде. В последнем случае в начале такого кода ставится символ ‘$’.

Примеры:

123

-1

$F1 (десятичное представление 241)

0$B80

Булевский (логический) тип

К логическим относятся типы Boolean, ByteBool, Bool, wordBool и LongBool. В стандартном Паскале определен только тип Boolean, остальные логические типы введены в Object Pascal для совместимости с Windows: типы Boolean и ByteBool занимают по одному байту каждый, Bool и WordBool - по 2 байта, LongBool - 4 байта.

Имеется два значения булевского типа, представляющие логические истинностные значения (истина/ложь). Эти значения обозначаются посредством стандартных идентификаторов:

true (истина)

false (ложь).

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

Значениями символьного типа являются символы из множества ASCII (American Standard Code for Information Interchange - американский стандартный код для обмена информацией). Это множество состоит из 256 различных символов, упорядоченных определенным образом, и содержит символы заглавных и строчных букв, цифр и различных других символов, включая специальные управляющие символы. Допускаются некоторые отклонения от стандарта ASCII, в частности, при наличии соответствующей системной поддержки это множество может содержать буквы русского алфавита.

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

‘*’ ‘a’ ‘X’ ‘:’ ‘’’’

Для представления самого апострофа его изображение удваивается.

Если символ, который нужно изобразить, не имеет графического представления, то можно воспользоваться следующей эквивалентной формой записи, состоящей из символа ‘#’ (решетка, диез) и целочисленного кода символа (от 0 до 255):

#10 #$A

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

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

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

Например: Пусть необходимо разработать программу управления уличным светофором. Ясно, что программа будет моделировать светофор с помощью указания его текущего состояния, т.е. включенного в данный момент света. Таким образом, переменная программы, представляющая светофор, может принимать одно из трех значений, соответствующих красному, желтому и зеленому цветам. Можно было бы ввести для этого переменную целого типа и установить, что, например, значения 1, 2, 3 соответствуют указанным цветам. Однако очевидно, что числа, кодирующие цвета, не имеют прямого отношения к решаемой задаче и, следовательно, усложняют программу и затемняют ее смысл. Поэтому наиболее естественным решением в данном случае будет введение перечислимого типа из трех значений, обозначаемых именами Red, Yellow, Green, и переменной этого типа.

Синтаксис определения перечислимого типа:

(идентификатор 1, идентификатор 2,...,идентификатор N)

Примеры перечислимых типов:

(Red, Yellow, Green)

(Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday)

(On, Off)

(Left, Up, Right, Down)

Перечислимые типы считаются дискретными типами. Над значениями перечислимых типов определены операции сравнения (считается, что значения перечислимого типа указаны в списке в порядке возрастания). Кроме того, допускается образование ограниченных типов из перечислимых по обычным правилам, например:

Monday..Friday

Left..Up

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


Ограниченные типы (тип-диапазон)

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

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

Синтаксис определения такого типа:

минимальное_ значение..максимальное_значение

Например:

1..10

-100..100

‘a’..’z’

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

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

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

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

Эта группа типов обозначает множества вещественных значений в различных диапазонах Паскаль поддерживает четыре различных вещественных типа. Они именуются идентификаторами Real, Single, Double, Extended и Comp и имеют характеристики, представленные в таблице 2.

Таблица 2

Вещественный тип Диапазон значений Число цифр мантиссы Размер памяти
Real 2.9 E-39..1.7E38 11-12 6 байт
Single 1.5E-45..3.4E38 7-8 4 байта
Double 5.0E-324..1.7E308 15-16 8 байт
Extended 3.4E-4932..1.1E493 19-20 10 байт
Comp -2E+63..+2E+63-1   8 байт

 

Примечания

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

2. Все вещественные типы, кроме Real, могут использоваться в программе, вообще говоря, только если сделаны соответствующие опции компилятора. Для корректной компиляции программы, использующей эти типы, можно также применить директиву компилятора {+N}.

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

17.384

0.5

Вещественное число в форме с плавающей точкой записывается как пара вида:

<мантисса>Е<порядок>

Такое обозначение понимается как “мантисса, умноженная на 10 в степени, равной порядку”. Например:

7Е-2 эквивалентно 7· 10-2

12.25 Е+6 или 12.25 Е6 эквивалентно 12.25· 106

Дата / время

Тип дата-время определяется стандартным идентификатором TDateTime и предназначен для одновременного хранения и даты, и времени. Во внутреннем представлении он занимает 8 байт и подобно currency представляет собой вещественное число с фиксированной дробной частью: в целой части числа хранится дата, в дробной - время. Дата определяется как количество суток, прошедших с 30 декабря 1899 года, а время - как часть суток, прошедших с 0 часов, так что значение 36444,837 соответствует дате 11.10.1999 и времени 20:05. Количество суток может быть и отрицательным, однако значения меньшие -693594 (соответствует дате 00.00.0000 от Рождества Христова) игнорируются функциями преобразования даты к строковому типу.

II. Составные типы: структурированные типы, указатели, строки, процедурные, объекты, классы, варианты.

Структурированные типы в свою очередь делятся на:

1. регулярные типы (массивы);

2. комбинированные типы (записи);

3. множественные типы;

4. файловые типы;

Простые типы, описанные выше, определяют различные множества атомарных (неразделимых) значений. Составные, или структурные типы, в отличие от простых, задают множества «сложных» значений; каждое значение из такого множества образует некоторый агрегат (совокупность) нескольких значений другого типа (или других типов). Можно сказать, что составные типы определяют некоторый способ образования новых типов из уже имеющихся, причем отдельные элементы составных значений могут иметь любой, в том числе составной, тип. Таким образом, Паскаль допускает образование структур данных произвольной сложности, позволяя тем самым достичь адекватного представления в программе тех данных, с которыми она оперирует.

Регулярные типы (массивы)

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

Для корректного определения регулярного типа необходимо задать две характеристики: тип элементов массива, а также количество и «способ нумерования» элементов. Последние характеристики задаются посредством указания типа индекса.

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

Type

A = array [T1] of T2;

Здесь:

Array, of – служебные слова;

Т1 – тип индекса массива;

Т2 – тип компонент массива.

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

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

Ниже приведены описания различных массивов:

Type

M1 = array [1..100] of real;

M2 = array [char] of boolean;

Matrix = array [ 1..10 ] of array[1..20] of integer;

Database = array [1..MaxF] of file of Person;

Var

Vector: M1;

Sym_Table: M2;

Arr1, Arr2: Matrix;

S: array [Red, Yellow, Green] of boolean;

Примечания

1. Число элементов в массиве всегда должно быть фиксировано.

2. Для задания количества элементов массива используется тип; число элементов определяется количеством возможных значений указанного типа, что отличает язык Паскаль от многих других языков, в которых размер массива задается либо целым числом (или выражением целого типа), либо диапазоном целых чисел. Это придает Паскалю дополнительную гибкость, позволяя «нумеровать» элементы массива не только целыми числами, но и значениями произвольного целого типа.

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

Var

V2: array[1..10] of array [1..20] of byte;

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

Var

V2: array [ 1..10, 1..20 ] of of byte;

Число индексов в определении (т.е. размерность массива) в языке не ограничивается.

4. Турбо Паскаль допускает единственное возможное действие над массивом в целом: использование его в операторе присваивания, например:

Vect1:=Vect2;

причем типы обоих массивов должны быть эквивалентны.

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

Пример:

V2 [ i, j ]:= V2 [ i, j-1 ] + 1;

Sym_Table [ ‘z’ ]:= Switch and Sym_Table [ ‘a’ ];

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...