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

Комбинированные типы (записи)

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

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

Структура объявления типа записи такова:

<имя типа> = RECORD <список полей> END

Здесь:

<имя типа> - правильный идентификатор;

RECORD, END - зарезервированные слова (запись, конец);

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

Каждый раздел записи состоит из одного или нескольких идентификаторов полей, отделяемых друг от друга запятыми. За идентификатором (идентификаторами) ставится двоеточие и описание типа поля (полей). Например:

Type

Birthday = record

day, month: byte;

year: word

end;

Var

a, b: Birthday;

.........

В этом примере тип Birthday (день рождения) содержит три поля с именами DAY, MONTH и YEAR (день, месяц, год); переменные A и B содержат записи типа Birthday.

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

· фамилия, имя, отчество (символьные массивы или строки);

· пол (перечислимый тип из двух значений);

· индекс специальности (целое) и т.д.

В этом случае описание комбинированного типа Person (человек) может выглядеть следующим образом:

Type

Person =record

Name, SecondName, SurName: string [20];

Sex: (Male, Female);

Speciality: Word

end;

Имея в программе вышеприведенное описание, можно определить переменные данного типа, например:

Var Sasha, Masha, Natasha: Person;

Примечания

1. В пределах одной записи имена полей должны быть уникальны.

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

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

Пример:

Type

Date = Record

Month: (Jan,Feb,Mar,Apr,May,June,July,Aug, Sept, Oct, Nov, Decem);

Day: 1..31;

Year: 1900..2000

end;

Person = Record

Name, SecondName, SurName: string [20];

Sex: (Male, Female);

Speciality: Word;

Birthday: Date

end;

Доступ к полям из элемента Birthday производится по общим правилам, например:

Sasha. Birthday. Year:= 1970;

Masha. Birthday. Month:= May;

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

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

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

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

Type

<имя типа> = set of <базовый тип>;

Здесь:

<имя типа> - правильный идентификатор языка;

set, of - зарезервированные слова (множество, из);

<базовый тип> - базовый тип элементов множества, в качестве которого может использоваться любой порядковый тип, кроме WORD, INTEGER, LONGINT (т.е. типы BYTE и CHAR, перечислимые типы, а также ограниченные типы, образованные из них).

Пример:

Type

digitChar = set of ‘0’..’9’;

digit = set of 0..9;

elemColor = (Red, Yellow, Blue);

color = set of Color;

Var

s1, s2, s3: digitChar;

s4, s5, s6: digit;

myColor: Color;

Примечания

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

Например, не может быть множества: 1, 2, 2.

2. Порядок “расположения” элементов в множестве не имеет значения.

Множества:

1, 2, 3

3, 2, 1

одинаковы.

Это соответствует принятой в математике трактовке множества как бесповторной неупорядоченной совокупности объектов.

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

Например:

s6:= [1, 2, 3];

s4:= [ 0, 1, 2, 3+4 ];

s5:= [ 0..3, 6 ]; {эквивалентно множеству [0, 1, 2, 3, 6]}

s1:= [ ‘0’..’5’ ];

s2:= []; {пустое множество}

myColor:= [ Red ];

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

Любой файл имеет три характерные особенности. Во-первых, у него есть имя, что дает возможность программе работать одновременно с несколькими файлами. Во-вторых, он содержит компоненты одного типа. Типом компонентов может быть любой тип Object Pascal, кроме файлов. Иными словами, нельзя создать “файл файлов”. В-третьих, длина вновь создаваемого файла никак не оговаривается при его объявлении и ограничивается только емкостью устройств внешней памяти.

Файловый тип можно задать одним из трех способов:

<имя> = File of <тип>;

<имя> = TextFile;

<имя> = File;

Здесь <имя> - имя файлового типа (правильный идентификатор);

File, of - зарезервированные слова (файл, из); TextFile - имя стандартного типа текстовых файлов; <тип> - любой тип Object Pascal, кроме файлов.

Указатели

Object Pascal предоставляет в распоряжение программиста гибкое средство управления динамической памятью - так называемые указатели. Указатель - это переменная, которая в качестве своего значения содержит адрес байта памяти. С помощью указателей можно размещать в динамической памяти любой из известных в Object Pascal типов данных. Лишь некоторые из них (Byte, Char, ShortInt, Boolean) занимают во внутреннем представлении один байт, остальные - несколько смежных. Поэтому на самом деле указатель адресует лишь первый байт данных.

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

var

p1: ^Integer;

р2: ^Real;

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

Тип STRING (строка) в Паскале широко используется для обработки текстов. Он во многом похож на одномерный массив символов ARRAY [0..N] OF CHAR, однако, в отличие от последнего, количество символов в строке-переменной может меняться от 0 до N, где N - максимальное количество символов в строке. Значение N определяется объявлением типа STRING[N] и может быть любой константой порядкового типа, но не больше 255.

Паскаль разрешает не указывать N, в этом случае длина строки принимается максимально возможной, а именно N=255.

Строка в Паскале трактуется как цепочка символов. К любому символу в строке можно обратиться так же, как к элементу одномерного массива ARRAY [0..N] OF CHAR, например:

Var

st: string;

.........

if st [5] = ‘A’ then.....

Самый первый байт в строке имеет индекс 0 и содержит текущую длину строки. Первый значащий символ строки занимает второй байт и имеет индекс 1. Над длиной строки можно осуществлять необходимые действия и таким образом изменять длину.

Значение текущей длины строки можно не только извлекать из первого байта самой строки, но и получать с помощью функции LENGTH (st).

Например:

Var

st: string;

.........

write (‘Введите строку: ’);

readln (st);

writeln (‘Текущая длина строки - ’,Length(st));

........

Данный фрагмент программы распечатает текущую длину введенной строки.

К строкам можно применять операцию “+” - сцепление, например:

st:= ‘a’ + ‘b’;

st:= st + ‘c’; {st содержит “abc”}

Если длина сцепленной строки превысит максимально допустимую длину N, то “лишние” символы отбрасываются.

Операции отношения =, <>, >, <, >=, <= выполняются над двумя строками посимвольно, слева направо с учетом внутренней кодировки символов. Если одна строка меньше другой по длине, недостающие символы короткой строки заменяются значением CHR(0).

Следующие операции отношения дадут значение TRUE:

‘A’ > ‘1’

‘Turbo’ < ‘Turbo Pascal’

‘Паскаль’ >‘Turbo Pascal’

Все остальные действия над строками и символами реализуются с помощью встроенных процедур и функций.

Процедурные типы

Основное назначение процедурных типов - дать программисту гибкие средства передачи функций и процедур в качестве фактических параметров обращения к другим процедурам и функциям.

Для объявления процедурного типа используется заголовок процедуры (функции), в котором опускается ее имя, например:

type

Proc1 = Procedure (a, b, с: Real; var d: Real); Proc2 = Procedure (var a, b);

РгосЗ = Procedure;

Func1 = Function: String;

Func2 = Function (var s: String): Real;

Как видно из приведенных примеров, существует два процедурных типа: тип-процедура и тип-функция.

Объекты

Тип данных Object является базовым в Visual Basic.NET. Это означает, что все типы данных и типы объектов являются производными от него либо непосредственно, либо косвенно. Это означает также, что любой другой тип данных, простейший или составной, может быть преобразован в Object. Если параметр Option Strict выключен, тип Object может быть использован в качестве универсального типа данных.

Классы

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

Пример:

type

TMyClass = class(TObject) Field: Integer;

end;

var

MyClass: TMyClass;


Варианты

Вариант (в Delphi 1 он отсутствует) - это тип variant, разработанный специально для тех случаев, когда на этапе компиляции программист не может сказать, какого типа данные будут использоваться в выражении или как параметры вызова подпрограмм. Переменная-вариант занимает в памяти дополнительные 2 байта, в которые помещается информация о действительном типе переменной. Эта информация позволяет компилятору создать код, который будет осуществлять необходимое преобразование типов на этапе прогона программы.

В переменную-вариант можно поместить:

· целое или вещественное число;

· логическое значение;

· строку;

· время и/или дату;

· OLE-объект;

· массив произвольной размерности и длины, содержащий элементы одного из перечисленных выше типов.

Варианты могут участвовать в целочисленных, вещественных, логических и время-дата выражениях при условии корректности соответствующих преобразований. Например, если варианту v присвоена строка '1.0', то выражение 1+v будет правильным вещественным значением 2,0. Однако если v:= 'текст', выражение 1+v вызовет исключение EVariantError.

Поделиться:





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



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