Дмитрий Поляков - Программирование в среде Турбо Паскаль стр 16.

Шрифт
Фон

В этом определении слово RECORD открывает набор имен полей таблицы-анкеты и типов значений в этих полях, a END - закрывает его, т.е. пара RECORD...END конструирует тип "запись". Тип PERSON теперь задает таблицу из строки (F_I_O_), двух чисел с дробной частью (Ves, Rost) и одного целого числа. Все они называются полями записи типа Person. Далее мы можем ввести в программе переменную Nekto типа Person, и под именем Nekto будет пониматься анкета-таблица с конкретными значениями. Доступ к полям таблицы производится дописыванием к имени всей таблицы имени нужного поля. Имя переменной-записи (оно же имя таблицы) и имя поля разделяются точкой:

Nekto.F_I_O_ - значение строки с фамилией, именем, отчеством;

Nekto.Ves - значение поля Ves.

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

- 72 -

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

Очередной тип, который мы рассмотрим - это объекты. Объект (object) - это принципиально новый тип, вводимый Турбо Паскалем, начиная с версии 5.5 языка. Но это не только новый тип. Это новый подход к программированию. Что такое объект? Представьте себе, что мы сгруппировали некие данные в запись. Это удобно, ибо разнотипные значения теперь хранятся "под одной крышей". В программе эти данные обрабатываются какими-либо методами. Очень часто бывает, что эти методы годны только для обработки полей нашей записи и не работают с другими данными. Но раз так, то не будет ли рациональнее внести методы в список полей самой записи? Как только мы это проделаем, получим новый тип данных - объект.

В программе объекты описываются почти так же, как записи:

TYPE

DataWithMethods = OBJECT

Поле данных 1: его Тип;

Поле данных 2: его Тип;

...

Метод 1;

Метод 2;

Метод 3;

...

END;

Список полей и методов должен начинаться словом OBJECT и заканчиваться END (все об объектах читайте в гл. 13 "Объектно-ориентированное программирование").

Таким образом, объект - это замкнутый мир данных и средств их обработки. Методы, реализуемые как процедуры и функции, имеют смысл и могут применяться только к полям данных этого же объекта. В то же время объекты привносят новые подходы к построению программ. Вводится такое понятие, как наследование признаков объектов. Это значит, что можно построить ряд все более и более сложных объектов, каждый из которых наследует свойства (данные и методы их обработки) предшественника и является его развитием. А объявив в программе такой ряд объектов, можно будет построить процедуры, которые смогут работать (запускать методы) с любым объектом этого ряда. (Возможность использовать одну процедуру для целого ряда взаимосвязанных через наследование объектов называется полиморфизмом.)

Язык Паскаль традиционно считается хорошим инструментом структурного программирования. Турбо Паскаль дает возможность

- 73 -

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

Последним среди сложных типов Турбо Паскаля является ссылочный тип. В разд. 4.1.6 рассматривался тип Pointer - адресный тип. Его значения - это указатели на какую-либо ячейку рабочей памяти ПЭВМ. Причем не оговаривается, какое значение и какого типа в этой ячейке может содержаться - оно может быть каким угодно. Но известно, что структуры данных, занимающие более одной ячейки памяти, располагаются последовательно: в виде сплошной цепочки значений. Поэтому, чтобы просто адрес можно было назвать адресом какой-либо структуры данных, надо, кроме адреса первой ячейки структуры, знать еще ее тип и размер. Ссылочный тип - это тот же адресный тип, но "знающий" размер и структуру того куска памяти, на который будет организован указатель. Такие "знающие" указатели называются ссылками. Чтобы описать ссылочный тип, мы должны указать имя базового типа, т.е. тип той структуры (а именно он определяет размер и расположение данных), на которую будет указывать ссылка, и поставить перед ним знак "^", например:

| TYPE

| Dim100 = Array[1..100] of Integer; { просто массив }

| Dim100SS = ^Dim100; { ссылка на структуру типа Dim100 }

Значения типа Dim100SS (ссылки на массив) будут содержать адрес начала массива в памяти. А так как ссылка (пусть она имеет имя SS) "знает", на что она указывает, можно через нее обращаться к элементам массива. Для этого снова используется знак "^", но ставится он уже после имени переменной:

SS^ - массив типа Dim100,

SS^[2] - второй элемент массива SS^, но

SS - адрес массива в памяти.

- 74 -

Узнав все это, изучающие Паскаль обычно спрашивают, зачем столько сложностей. Есть ведь обычные массивы, и можно с ними работать, не вводя промежуточные ссылочные типы. Конечно, можно. Но использование ссылочного типа дает нам уникальную возможность располагать данные там, где мы хотим, а не там, где им предпишет компилятор. Турбо Паскаль вводит специальный набор средств для организации структур данных по ходу выполнения программы. Используя его совместно со ссылками, мы можем явно указать, где будет размещена структура данных, можем разместить ее в свободной от программы памяти ПЭВМ и впоследствии удалить оттуда. Все это позволяет очень гибко использовать отнюдь не безграничные ресурсы памяти ПЭВМ.

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

- 75 -

Глава 5. Константы и переменные

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

5.1. Простые константы

Раздел описания констант CONST программы позволяет вводить различного вида константы. Константы - это не более чем средство для сокращения рутинных действии над текстом программы и одновременно улучшения ее читаемости. Пусть описаны типы:

| TYPE

| Diapazon = 14..27; { диапазон }

| Massiv1 = Array [14..27] of Real; { тип массив }

| Massiv2 = Array [15..28] of Integer; { другой массив }

Если в приведенный фрагмент вкралась ошибка и надо срочно сдвинуть диапазоны в типах на четыре значения вниз, то придется исправить только в нем шесть цифр. А во всей программе? Чтобы избавиться от конкретных цифр, можно задать их константами:

| CONST

| Lower = 14;

| Upper = 27;

| TYPE

| Diapason = Lower ..Upper;

| Massiv1 = Array [Lower..Upper] of Real;

| Massiv2 = Array [Lower+1 .. Upper+1] of Integer;

Теперь в той же ситуации достаточно поправить два числа. В этом примере Lower и Upper простые константы (есть и сложные разновидности констант, но они рассматриваются совместно с переменными).

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

- 76 -

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

Константы описываются в блоке CONST (или в блоках, если их несколько). Синтаксис их прост:

CONST

ИмяКонстанть1 = Значение1;

ИмяКонстанты2 = Значение2;

и т.п. или

ИмяКонстанты = ЗначениеВыраженияСтоящегоСправа;

Имя и значение константы разделяются знаком равенства "=" (но не знаком присваивания ":="). После задания константы обязательна точка с запятой. Концом блока констант считается начало любого другого блока или описания процедур и функций.

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

| CONST

| Min = 0; { константа - целое число }

| Мах = 500; { константа - целое число }

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке