Многомерные массивы в Delphi

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

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

 

1.vaz2106: array [1..12of integer;
2.vaz2107: array [1..12of integer;
3.vaz2108: array [1..12of integer;
4.vaz2109: array [1..12of integer;
5.vaz211Q: array [1..12of integer;
6.vaz2111: array [1..12of integer;

 

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

Возможно и такое представление таблицы:

1.jan: array [1..6of integer;
2.feb: array [1-.6of integer;
3.mar: array [1..6of integer;
4.dec: array [1..6of integer;

 

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

В общем виде инструкция объявления двумерного массива выглядит так:

 

Имя: array [Нижняя_граница1.. Верхняя_граница1],
Нижняя_Граница2..Верхняя_граница2of Тип

 

где:

  • Имя — имя массива;
  • array — слово языка Delphi, указывающее, что объявляемый элемент данных является массивом;
  • Нижняя_Граница1, Верхняя_Граница1, Нижняя_Граница2, Верхняя_Граница2 — целые константы, определяющие диапазон изменения индексов и, следовательно, число элементов массива
  • тип — тип элементов массива.

Табл. 5.7 может быть представлена в виде двумерного массива следующим образом:

 

itog: array [1..121..6of integer

 

Количество элементов двумерного массива можно вычислить по формуле:

 

(ВГ1-НГ1+1) х (ВГ2-НГ2+1)
:

 

где:

  •  вп и ВГ2 — верхняя граница первого и второго индексов;
  •  нп и НГ2 — нижняя граница первого и второго индексов.

Таким образом, массив itog состоит из 60 элементов типа integer.

Для того чтобы использовать элемент массива, нужно указать имя массива и индексы элемента. Первый индекс обычно соответствует номеру строки таблицы, второй — номеру колонки. Так, элемент itog[2,3] содержит число проданных в марте (третий месяц) автомобилей марки ВАЗ 2107 (данные о продаже ВАЗ 2107 находятся во второй строке таблицы). При работе с таблицами (массивами) удобно использовать инструкцию for. Например, фрагмент программы, вычисляющий количество проданных за год автомобилей одного наименования, выглядит так:

1.s := 0;
2.for j := 1 to 12 do
3.s := s + itog[2,j];

 

Следующий фрагмент программы вычисляет сумму элементов массива (общее количество автомобилей, проданных за год). 

1.а:=0;
2.for i := 1 to 6 do // шесть моделей автомобилей
3.for j := 1 to 12 do // 12 месяцев
4.s := s + itog[i,j];

 

В приведенном фрагменте программы каждый раз, когда внутренний цикл (цикл по j) завершается, во внешнем цикле значение i увеличивается на единицу и внутренний цикл выполняется вновь. Таким образом, к текущему значению переменной s последовательно прибавляются значения элементов массива itog: itog[l, I ] , itog[l, 21, ..., i t o g f l , 12], itog [2,1], itog[2,2], ..., itog [2,12) и т. д.

В качестве примера рассмотрим программу, которая обрабатывает результаты спортивных соревнований летней олимпиады в Сиднее, 2000 г. Исходные данные представлены в табл. 5.8.

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

Вид диалогового окна программы приведен на рис. 5.20.

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

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

Листинг 5.11. Инициализация таблицы 

01.procedure TForml.FormActivate{Sender: TQbject);
02.begin
03.tabl.Cells[0,0]:='Страна';
04.tabl.Cells[1,0]:='Золотых';
05.tabl.Cells[2,0]:='Серебряных';
06.tabl.Cells[3,0]:='Бронзовых';
07.tabl.Cells[4,0]:='Всего';
08.tabl.Cells[5,0]:='Баллов';
09.tabl.Cells[0,1]:='Австралия';
10.tabl.Cells[0,2]:='Белоруссия';
11.tabl.Cells[0,3]:='Великобритания';
12.tabl.Cells[0,4]:='Германия';
13.tabl.Cells[0,5]:='Италия';
14.tabl.Cells[0,6]:='Китай';
15.tabl.Cells[0,7]:='Корея';
16.tabl.Cells[0,8]:='Куба';
17.tabl.Cells[0,9]:='Нидерланды';
18.tabl.Cells[0,10]:='Россия';
19.tabl.Cells[0,11]:='США';
20.tabl.Cells[0,12]:='Франция';
21.tabl.Cells[0,12]:='Япония';
22.end;

 

Программа обработки исходной таблицы (листинг 5.12) запускается щелчком мыши на командной кнопке Итога (Button1).

 

Листинг 5.12. Обработка двумерного массива

01.procedure TFontu.ButtonlClicM Sender: TObjectl;
02.с, г: integer// номер колонки и строки таблицы
03.s: integer// всего медалей у команда
04.р: integer// очков у команды
05.m: integer// номер строки с максимальным количеством очков
06.buf:array[0..5of string// буфер для обмена строк
07.i;integer// номер строки. Используется во время сортировки
08.begin
09.for r:=l to tabl.rowcount do // обработать все строки
10.begin
11.s:=0;
12.// вычисляем общее кол-во медалей
13.for c:=l to 3 do
14.if tabl.cells[с,г] о "
15.then s:=s+StrTolnt(tabl.cells[с, г])
16.else tabl.cells[c,r]:='0';
17.// вычисляем количество очков
18.p:=7'StrToInt(tabl.cells[l,r]]+
19.6*StrToInt(tabl.cells[2,r])+
20.5-StrToInt(tabl.cells[3,r]);
21.// вьшод результата
22.tabl.cells[4,rj:=IntToStr(sl; // всего медалей
23.tabl.cells[5,r]:=IntToStr(p); // очков
24.end;
25.// сортировка таблицы по убыванию в соответствии
26.// с количеством баллов (по содержимому 5-го столбца)
27.// сортировка методом выбора
28.foe r:=l to tabl.rowcount-1 do
29.begin
30.m:=r; // максимальный элемент — в r-й строке
31.for i;=r to tabl.rowcount-1 do
32.if StrToInt(tabl.cells[5,iJ)>StrToInt(tabl.cellsi5,ml)
33.then m:=i;
34.if r  m then
35.begin // обменяем г-ю и m-ю строки таблицы
36.foir c:=0 to 5 do
37.begin
38.buf[cj:=tabl.Cells[c,r];
39.tabl.Cells[с,rj:=tabl.Cells[c,m];
40.tabl. Cells [c,in] :=buf [c];
41.end;
42.end;
43.end;
44.end;

 

Сначала для каждой страны программа вычисляет общее количество медалей и соответствующее количество очков. Затем, используя метод простого выбора, программа выполняет сортировку таблицы по убыванию количества набранных очков. Во время сортировки для обмена строк таблицы используется строковый массив buf, индекс которого, как и индекс столбца таблицы, меняется от нуля до пяти (см. инструкцию объявления массива в тексте программы). Такой прием позволяет наиболее просто выполнить копирование замещаемой строки в буфер и замещение строки содержимым буфера. 

На рис. 5.21 приведено диалоговое окно программы после завершения процесса обработки массива.

dle

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