Работа с массивами в Delphi
Работа с массивами в Delphi— одна из наиболее важных и необходимых тем в программировании. Мы будем достаточно часто использовать массивы. По ходу изложения материала очень часто упоминается, что эта глава очень важна, и это действительно так. Поэтому каждая ее часть является необходимой. Если вы хотите создать простой и удобный в понимании программный код, придется изучать различные приемы и технологии программирования. В главе даются необходимые для их понимания основы.
Итак, приступим к изучению массивов. Что такое массив? Это просто набор каких-то данных, следующих друг за другом. Массив в Delphi обозначается как array. Чтобы объявить переменную типа массив, нужно описать ее в разделе var следующим образом:
var
r: array [длина массива] of тип данных;
Как определяется длина массива? Очень просто, это даже похоже на геометрическое определение. Например, пусть нужен массив из 12 значений. Длина такого
массива может быть [0..11] или [1..12]. В квадратных скобках вы должны поставить начальное и конечное значения массива, а между ними две точки.
Тип данных может быть любой. Например, надо объявить массив из 12 строк; это можно сделать следующим образом:
var
r: array [0..11] of String;
В этом примере мы объявили переменную г типа "массив" из 12 строк.
Чтобы получить доступ к какому-то элементу, нужно написать имя переменной массива и после этого в квадратных скобках написать номер элемента, к которому нужно получить доступ. Например, давайте прочитаем 5-й элемент и запишем 7-й элемент нашего массива:
var
r: array [0..11] of String;
Str:String;
begin
Str:=r[5];
r[7]:='Привет';
end;
He правда все это очень похоже на то, как мы работали с символами в строках. Строки — это те же массивы, только из отдельных символов.
В этом примере в первой строке кода переменной str присваивается значение пятого элемента массива str :=r [5]. В следующей строке седьмому элементу присваивается строка "Привет" — r[7 ] : = ' Привет '.
Давайте напишем небольшой пример для работы с массивами. Допустим, требуется узнать, какой сегодня день недели. Создайте новое приложение. Установите на форму один компонент TEdit (дадим ему имя DayOfweekEdit) и одну кнопку (дадим ей имя GetDayButton и напишем в заголовке: "Узнать день недели"). В результате получилась форма, как на рис:
По нажатии кнопки мы будем узнавать, какой сегодня день недели, и записывать результат в строку TEdit. Напишем для кнопки код, показанный в листинге:
week: array[1..7] of string; begin
week[1] := 'Воскресенье';
week[ 2 ] := 'Понедельник';
week[3] := 1 Вторник';
week[4] := 'Среда';
week[5] := 'Четверг';
week[б] := 'Пятница';
week[7] := 'Суббота';
day:=DayOfWeek(Date); DayOfWeekEdit.Text:=week[day]; end;
Здесь объявлен массив week из семи элементов. После этого мы последовательно всем элементам массива присваиваем названия дней недели.
Для определения дня недели существует функция Dayofweek. Ей нужно передать только один параметр — дату, день недели которой нужно узнать. Мы передаем результат работы функции Date, которая возвращает текущую дату. Получается, что Dayofweek вернет нам день недели текущей даты.
Вроде все нормально, Dayofweek возвращает строку, в которой написано словами, какой сегодня день. Если функция возвращает 0, то это воскресенье, если 1 — понедельник, 2 — вторник, 3 — среда и т. д. Как видите, отсчет идет с воскресенья (по-европейски). Точно так же мы заполняли и массив: 1 — это воскресенье, 2 — понедельник и т. д.
После этого надо превратить число в строку. Это делается очень просто. Надо получить только соответствующий элемент массива — и все. Если функция вернула нам 2, то это должен быть понедельник. В массиве под вторым номером идет "Понедельник", поэтому нам просто нужно получить строку, находящуюся под вторым номером в массиве. Вот именно это и происходит в последней строке week [day].
А что если объявить массив в виде константы? Да, это не запрещается. Но как массиву-константе присвоить значение?
const
week: array[1..7] of string =
('Воскресенье','Понедельник','Вторник','Среда', 'Четверг','Пятница','Суббота');
После описания размерности и типа массива необходимо поставить знак равенства и в круглых скобках перечислить все значения массива. Вот тут нужно быть очень осторожным — количество объявленных значений должно четко соответствовать количеству описанных. Если вы объявите массив из 10 значений, а в круглых скобках будет только 9, то произойдет ошибка. В листинге 10.2 вы можете увидеть пример определения дня недели через массив-константу.
procedure TFormi.ButtonlClick(Sender: TObj ect); const
week: array[1..7] of string = 7 Зак. 618
('Воскресенье','Понедельник','Вторник','Среда', 'Четверг','Пятница','Суббота');
var
day: Integer; begin
day:=DayOfWeek(Date); DayOfWeekEdit.Text:=week[day]; end;
Давайте пойдем дальше и познакомимся с динамическими массивами. Это массивы, которые могут изменять свою длину, поэтому при объявлении не надо ее указывать. Вы просто указываете переменную и ее тип: г: array of integer;
В этом примере объявлена переменная г типа массив целых чисел без указания размера. Чтобы указать размер массива, можно воспользоваться функцией SetLength. У нее два параметра:
- переменная типа динамического массива;
- длина массива. Давайте посмотрим все это на практике.
Создайте новый проект в Delphi и установите на форму две кнопки и один компонент TListBox, как показано на рис:
Для первой кнопки мы напишем код, указанный в листинге:
var
r:array of integer; i:Integer; begin
ListBoxi.Items.Clear; SetLength(r,10) ;
for i:=0 to High(r)-1 do begin r:=i*i;
ListBoxi.Iterns.Add(IntToStr(i)+' в квадрате ='+IntToStr(r)); end; end;
В области объявлений var объявлены две переменные. Первая это г, которая является массивом чисел типа integer. Вторая переменная — i, которую мы будем использовать в качестве счетчика.
Переходим к самой процедуре. Первая строка очищает все строки у ListBox1. Для ЭТОГО вызывается метод ListBoxi. Items.clear. Мы это уже проходили, но вспомним, как это работает. У ListBoxi есть свойство items, где хранятся все строки. У items есть метод clear, который удаляет все находящиеся в нем строки.
Во второй строке вызывается процедура SetLength, которая выделяет память для массива г (первый параметр), размером в 10 элементов (второй параметр). Обращение к элементам будет происходить уже знакомым способом, как r [номер_элемента]. Элементы будут нумероваться от 0 до 9, потому что мы выделили 10 элементов.
Далее идет цикл. Функция High (r) возвращает количество элементов в массиве г. В итоге получается, что цикл будет выполняться от i:=o (от нуля) до количества элементов в массиве г минус 1 (т. е. до 9). Внутри массива выполняются две строки кода.
Следующая строка добавляет новый элемент в ListBoxi. Функция intTostr переводит число в строку.
С первой процедурой мы разобрались, теперь перейдем ко второй кнопке, для которой нужно написать содержимое листинга:
type
TDynArr=array of integer; var r:TDynArr; i:Integer; begin
ListBoxi.Items.Clear; SetLength(r,10) ;
for i:=0 to High(r)-1 do r:=i*i;
SetLength(r,20); for i:=10 to High(r)-1 do r:=i*i;
for i:=0 to High(r) do
ListBoxi.Items.Add(IntToStr(i)+' в квадрате ='+IntToStr(r)); end;
Эта процедура выполняет похожие действия, но с небольшими особенностями. В начале мы объявляем новый тип:
После этого конструкция
будет означать,что r относится к типу TDynArr, а тот относится К array of integer. Это то же самое, что мы писали В первой процедуре r:array of integer, только такая конструкция удобней, если требуется объявить несколько динамических массивов. Вам не приходится сто раз писать громоздкую строку г:array of integer, ВЫ объявляете новый массив как TDynArr.
Далее идет все та же очистка строк и выделение памяти под массив.
Эта конструкция заполняет десять элементов квадратами числа i. После этого мы снова вызываем функцию SetLength (r, 20), в которой говорим, что массив теперь будет состоять из 20 элементов. Таким способом можно как увеличивать количество элементов, так и уменьшать его.
Здесь мы заполняем квадратами числа i элементы, начиная с 10 и по последний. В конце мы заполняем ListBox1 значениями элементов массива.