Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторки 1-6 по Delphi.pdf
Скачиваний:
39
Добавлен:
08.04.2015
Размер:
1.09 Mб
Скачать

Языки программирования

...

type TStudent=record

private

//секция частных объявлений

function GetAge: Integer;

//метод записи

public

//секция публичных объявлений

SName,FName:string[15];

//фамилия и имя

BDate:TDate;

//дата рождения

property Age:integer read GetAge; //свойство записи — возраст end;

{ TStudent }

function TStudent.GetAge: integer; //реализация метода begin

{узнаем разницу между текущей датой и датой рождения} Result:=YearsBetween(Now, BDate);

{для работы функции YearsBetween необходимо подключить модуль DateUtils} end;

По сравнению классическим способом описания записи наш пример (см. листинг 2.7) содержит много необычного:

появились секции частных и публичных объявлений;

запись приобрела право обладать методами;

у записи могут быть свойства.

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

Примечание

Начиная с Delphi 2009, при описании типа записи допускается задавать поля с заранее неопределенным (обобщенным) типом данных.

Массивы

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

(рис. 2.2).

20

СКФУ Кафедра компьютерной безопасности

Языки программирования

Указатель на массив

 

 

 

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Память

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

компьютера

 

Ячейки

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

массива

 

...

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N-–11

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 2.2. Представление массива в памяти

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

Внимание!

В составе модуля Generics.Collections.pas объявлен шаблон класса TArray,

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

Объявление массива

Массив, как и переменную, необходимо объявить. Для этого следует указать размер массива и тип хранимых данных:

var <имя>: array [<нижняя граница>..<верхняя граница>]

of <тип_элементов>;

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

Листинг 2.7. Объявление двух однотипных массивов

type TMyArray = Array [0..9] of integer; // массив из 10 элементов var A1, A2 : TMyArray;

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

Листинг 2.8. Объявление массива с постоянными значениями

const DaysInMonth:

array [1..12] of byte = (31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

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

21

СКФУ Кафедра компьютерной безопасности

Языки программирования

Листинг 2.9. Объявление двумерных массивов

var A1 : Array[0..99,0..99] of cardinal;

A2 : Array[0..99] of Array[0..99] of cardinal;

Несмотря на разницу в коде объявления массивов A1 и A2, оба массива идентичны — они представляют собой матрицы размером 100 × 100 ячеек.

Обращение к ячейкам массива

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

Листинг 2.10. Заполнение массива случайными числами

const N=9;

var A:Array[0..N] of integer;

i:cardinal; begin

Randomize;

for i := 0 to N do

A[i]:=Random(100); end.

Мы постарались сделать код максимально универсальным. Размер массива определяется с помощью константы N, в нашем примере это значение 9.

Динамический массив

У всех рассмотренных ранее способов объявления массива есть один существенный недостаток — объявив в коде программы размер массива (сделав его статическим), мы не сможем выйти за его границы. Зачастую, во время программирования разработчику неизвестен объем подлежащих хранению данных. Что делать, если в одном случае приложению потребуется массив из 10 элементов, а в другом из 100? В таких случаях стоит воспользоваться услугами динамических массивов (листинг 2.11). Для этого к нашим услугам две очень полез ные процедуры Delphi. Процедура SetLength() во время выполнения программы распределит память под массив, функция High() возвратит индекс старшего элемента в массиве.

Листинг 2.11. Создание динамического массива

type String866 = type AnsiString(866); const S:String866='Введи размер массива';

var A:Array of integer; // объявление динамического массива

N,i:cardinal; begin

WriteLn(S);

//

запрашиваем размер массива

ReadLn(N);

//

пользователь ввел число элементов

SetLength(A,N); // распределяем память под массив

Randomize;

for i := 0 to High(A) do

A[i]:=Random(100); // заполняем массив случайными значениями end;

22

СКФУ Кафедра компьютерной безопасности