Обработка двумерного массива
Листинг 5.12. Обработка двумерного массива
procedure TForml.ButtonlClick(Sender: TObject);
var
c,r:integer; // номер колонки и строки таблицы
s:integer; // всего медалей у команды
р:integer; // очков у команды
m:integer; // номер строки с максимальным количеством очков
buf:array[0..5] of string; // буфер для обмена строк
i:integer; // номер строки. Используется во время сортировки
begin
for r:=l to tab1.rowcount do // обработать все строки
begin s:=0;
// вычисляем общее кол-во медалей
for c:=l to 3 do
if tabl.cells[c,r] <>
''
then s:=s+StrToInt(tab1.cells[c,r])
else tabl.cells[c,r]:='0'; // вычисляем количество очков
p:=7*StrToInt(tab1.cells[l,r])+
6*StrToInt(tabl.cells[2, r] )
+ 5*StrToInt(tabl.cells[3,r]};
// вывод результата
tabl.cells[4,r]:=IntToStr(s);
// всего медалей
tabl.cells[5,r]:=IntToStr(p);
// очков
end;
// сортировка таблицы по убыванию в соответствии
// с количеством баллов (по содержимому 5-го столбца)
// сортировка методом выбора
for r:=l to tab1.rowcount-1 do
begin
m:=r; // максимальный элемент — в r-й строке
for i:=r to tabl.rowcount-1 do
if StrToInt(tabl.cells[5,i])>
StrToInt(tabl.cells[5,m])
then m:=i;
if r <>
m then
begin // обменяем г-ю и m-ю строки таблицы
for c:=0 to 5 do begin
buf[с]:=tab1.Cells[c,r];
tab1.Cells[c,r]:=tabl.Cells[c,m];
tab1.Cells[c,m]:=buf[c];
end;
end;
end;
end;
Сначала для каждой страны программа вычисляет общее количество медалей и соответствующее количество очков. Затем, используя метод простого выбора, программа выполняет сортировку таблицы по убыванию количества набранных очков. Во время сортировки для обмена строк таблицы используется строковый массив buf, индекс которого, как и индекс столбца таблицы, меняется от нуля до пяти (см. инструкцию объявления массива в тексте программы). Такой прием позволяет наиболее просто выполнить копирование замещаемой строки в буфер и замещение строки содержимым буфера.
На Рисунок 5.21 приведено диалоговое окно программы после завершения процесса обработки массива.