6. Описание типов
Ранее уже приводились примеры описания переменных, в которых их тип указывался в Var-секции явно или на основе ранее объявленного пользовательского типа.
Описание секции типов начинается словом Type.
В табл. 4 дан пример двух идентичных способов описания переменных t, u, n.
Таблица 4
Явный способ описания переменных | Описание переменных с предварительным описанием их типа |
Var t,u,n:(Mon, Tue,Wed, Thu,Fri,Sat,Sun); | Type DaysOfWeek = (Mon, Tue,Wed, Thu,Fri,Sat,Sun); Var t,u,n: DaysOfWeek; |
В тех случаях, когда явный и типизованный способы описания переменных конкурируют, следует всегда отдавать предпочтение способу описания переменных с предварительным объявлением их типа в секции Type. Такой способ позволяет:
а) конкретизировать тип;
б) четко выделить множество переменных этого типа;
в) повысить уровень структурированности программы;
г) снизить вероятность путаницы в типах, когда переменные фактически того же типа объявлены разными способами;
д) уменьшить объем текста за счет возможности быстрой ссылки на ранее определенный тип, особенно в тех ситуациях, когда этот тип используется для порождения новых типов, переменных, функций и пр. в других секциях или модулях.
В этой связи важно подчеркнуть, что даже при совпадении базовых типов различие в пользовательских типах может привести к непредсказуемому поведению программы. Например, в нижеследующей секции Type два производных типа t1 и t2 имеют одинаковый базовый тип byte. Однако объявленные ниже в Var-секции переменные p1 и p2 будут расценены системой как переменные разных типов. Это обстоятельство может послужить причиной недоразумений в ходе составления и/или выполнения программы.
Type
t1 = byte;
t2 = byte;
Var
p1: t1;
p2: t2;
Корректным можно считать следующий аналог:
Type
t1 = byte;
Var
p1,p2: t1;
7. Структурные типы
Структурные типы представляют собой совокупность значений одного или нескольких различных типов. Их наличие позволяет программисту конструировать производные типы практически любой сложности, что резко расширяет возможности языка.
К числу структурных относятся следующие типы:
множественные типы [Set],
регулярные типы (массивы) [Array],
комбинированные типы (записи) [Record],
файловые типы [File],
классы [Class],
классовые ссылки [Class reference],
интерфейсы [Interface].
Ниже будут подробно описаны первых четыре структурных типа – регулярный, комбинированный, множественный и файловый.
Три последних типа будут описаны отдельно в разделах, посвященных объектно-ориентированному программированию.
7.1. Регулярные типы (массивы)
Массив – это структура языка Object Pascal, представляющая собой упорядоченную совокупность элементов одного типа.
Следует различать два вида массивов: массив-тип и массив-переменную.
Массив-тип. Синтаксис маcсива-типа:
<имя массива> = Array [<тип индекса>, <тип индекса>, …, <тип индекса>]
Of <тип элемента>;
Всякий массив имеет размерность. Размерность определяется количеством типов индексов, которые заключены в квадратные скобки [ .. ].
Массив-тип предназначен для описания:
структуры массива как типа;
размерности массива;
типов индексов массива;
типа каждого элемента массива.
Так, в следующем примере
Type
tA1: array [1 .. 10] of Real;
описана структура одномерного массива вещественных элементов (Real), в котором индекс может изменяться в диапазоне целых значений от 1 до 10. Его элементами являются вещественные типы tA1[1], tA1[2], tA1[3], …, tA1[9], tA1[10].
Другой пример:
Type
Color: (Red, Green); { перечислимый тип }
Z: array [1 .. 3, Color ] of Boolean; { массив }
В нем сначала описан простой перечислимый тип Color. Ниже на его основе описан двумерный массив Z логических (Boolean) элементов. Первый индекс массива имеет целый тип, а второй – тип Color. Таким образом, массив состоит из шести элементов – логических типов:
Z [1, Red], Z [1, Green], Z[2, Red], Z[2, Green], Z[3, Red], Z[3, Green].
Массив-переменная. Синтаксис маcсива-переменной:
<имя массива > : Array [<тип индекса>,<тип индекса>, …, <тип индекса>]
Of <тип элемента>;
Массив-переменная отличается от массива-типа тем, что все его элементы – это отдельные независимые переменные, которые могут содержать различные значения одного типа.
Массив-переменная может быть описан явно или с помощью ранее определенного в секции Type типа.
В следующем примере массивы y, Z описаны идентично, причем y – явно, Z – на основе ранее определенного типа в секции Type, т. е. неявно.
Type
tA1: array [1 .. 10] of Real;
Var
y : array [1 .. 10] of Real; {массив}
Z : tA1; {массив}
Этот пример демонстрирует разные способы описания одинаковых по структуре, но разных по типу массивов. С точки зрения корректного программирования он одновременно является примером того, как не следует описывать идентичные переменные. Причина этого заключается в том, что идентичные структуры во избежание непредсказуемого поведения программы следует описывать одним типом.
В этой связи корректным будет любой из вариантов, приведенных в табл. 5.
Таблица 5
Корректный неявный способ | Корректный явный способ |
Type tA1: array [1 .. 10] of Real; Var Y, Z: tA1; | Var y, Z: array [1 .. 10] of Real; |
Многомерные массивы содержат два и более индексов, например:
Var h: array[1 ..3, boolean, -7 .. 7] of Word;
что эквивалентно
Var h: array[1 ..3] of array[boolean] of array[-7 .. 7] of Word;
Для упакованных массивов
Var packed array[Boolean,1..10,TShoeSize] of Char;
что эквивалентно
Var
packed array[Boolean] of packed array[1..10]
of packed array[TShoeSize] of Char;
Манипуляции с отдельными элементами массивов. Обращение к отдельному элементу массива возможно через его индексы. В следующем примере в секции Var описаны простая переменная i и два одномерных массива A и V как целые переменные типа Integer. Затем в блоке begin … end расположены три вычислительных оператора.
Var
i: Integer;
A, V: array[1..100] of Integer;
…
begin
i:= 5;
V[8]:= i+9;
A[45]:= V[i+3]*2;
end;
При выполнении первого из них переменная i примет значение 5. При выполнении второго – восьмой элемент массива V примет значение 14. В третьем операторе сначала будет вычислен индекс i + 3 = 8, затем значение восьмого элемента массива V (значение 14) будет умножено на 2 и полученный результат – значение 28 – будет присвоено 45-му элементу массива A.
Манипуляции с массивами. Язык допускает с помощью одного оператора присваивания выполнить операцию над массивом в целом. Пусть, например, массивы A, V объявлены как квадратные матрицы. Тогда оператор
V:= A;
выполнит копирование значений всех элементов массива A в массив V, а после выполнения оператора
V:= A * V;
будет выполнено умножение матрицы А на матрицу V и результат будет помещен в матрицу V с предварительным затиранием старых значений.
Упакованные массивы. Элементы упакованного массива хранятся в памяти максимально плотно. При записи он предварительно упаковывается с целью экономии памяти. При чтении, наоборот, распаковывается. Операции упаковки и распаковки требуют дополнительного времени. Поэтому использование упакованных массивов несколько замедляет работу программы. От обычного массива Array описание упакованного массива отличается тем, что перед этим словом добавляется слово Pаcked, например:
Var W: packed array [1..100] of Integer;
... в среде Delphi). Задачи использовались как с данного сайта, так и из других источников – книг и семинарских занятиях по информатике в МГОУ. Курс завершается разработкой игры. Программное обеспечение: свободно распространяемая версия объектно-ориентированной среды программирования Delphi. Методы обучения: метод проектов, лекции, проблемный метод, частично-поисковый метод. Контроль знаний и умений ...
... // ... if(condition1) { j = 4; goto label1; } // ... for(j = 0; j < 10; j++) { // ... label1: // ... if(condition2) { i = 6; goto label2; } } // ... label2: // ... } 2.2 Разработка программы В среде программирования Borland Delphi создадим новое приложение (пункт меню File New Application). ...
... так называемые указатели. Указатель - это переменная, которая в качестве своего значения содержит адрес байта памяти. С помощью указателей можно размещать в динамической памяти любой из известных в Object Pascal типов данных. Лишь некоторые из них (Byte, Char, ShortInt, Boolean) занимают во внутреннем представлении один байт, остальные - несколько смежных. Поэтому на самом деле указатель адресует ...
... групп нулей и единиц. Каждая группа отделяется друг от друга одним или несколькими пробелами. Найти и вывести на экран группы с четным количеством символов. Лабораторная работа №6 Программирование АЛГОРИТМОВ с использованием записей Цель лабораторной работы: создать приложение, в котором используются данные типа запись. 6.1.Пример создания приложения Задание: создать Windows-приложение для ...
0 комментариев