Основные приемы программирования в Delphi

Работа с массивами в 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 и напишем в заголовке: "Узнать день недели"). В результате получилась фор­ма, как на рис:Работа с массивами Delphi

По нажатии кнопки мы будем узнавать, какой сегодня день недели, и записывать ре­зультат в строку TEdit. Напишем для кнопки код, показанный в листинге:

procedure TForml.GetDayButtonclick(Sender: TObj ect); var day:Integer;

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, как показано на рис:

Основные приемы программирования в Delphi

Для первой кнопки мы напишем код, указанный в листинге:

 

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). Внутри массива выполняются две строки кода.

r:=i*i; //Здесь i элементу массива присваивается i*i.

Следующая строка добавляет новый элемент в ListBoxi. Функция intTostr пе­реводит число в строку.

ListBox1.Items.Add(IntToStr(i)+' в квадрате ='+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;

Эта процедура выполняет похожие действия, но с небольшими особенностями. В начале мы объявляем новый тип:

TDynArr=array of integer.

После этого конструкция

r:TDynArr

будет означать,что r относится к типу TDynArr, а тот относится К array of integer. Это то же самое, что мы писали В первой процедуре r:array of integer, только такая конструкция удобней, если требуется объявить несколько динамических массивов. Вам не приходится сто раз писать громоздкую строку г:array of integer, ВЫ объявляете новый массив как TDynArr.

Далее идет все та же очистка строк и выделение памяти под массив.

for i:=0 to High(r)-1 do r:=i*i;

Эта конструкция заполняет десять элементов квадратами числа i. После этого мы снова вызываем функцию SetLength (r, 20), в которой говорим, что массив те­перь будет состоять из 20 элементов. Таким способом можно как увеличивать ко­личество элементов, так и уменьшать его.

for i:=10 to High(г)-1 do r:= i * i;

Здесь мы заполняем квадратами числа i элементы, начиная с 10 и по последний. В конце мы заполняем ListBox1 значениями элементов массива.

 

 


dle

Помоги проекту! Расскажи друзьям об этом сайте: