Рис. 5.18. Диалоговое окно программы Сортировка методом обмена
.
Листинг 5.10. Сортировка массива методом обмена
procedure TForm1.Button1Click(Sender: TObject);
Const
SIZE=5;
Var
a: array [1..SIZE] of integer;
k:integer; // текущий элемент массива
i:integer; // индекс для ввода и вывода массива
changed:boolean; // TRUE, если в текущем цикле были обмены
buf:integer; // буфер для обмена элементами массива
Begin
// ввод массива
for i:=1 to SIZE do
a[i]:= StrToInt(StringGrid1.Cells[i-1, 0]);
label2.caption:='';
// сортировка массива
repeat
Changed:=FALSE; // пусть в текущем цикле нет обменов
for k:=1 to SIZE-1 do
if a[k] > a[k+l] then
begin // обменяем k-й и k+1-й элементы
buf:= a[k]; a[k]:= a[k+1]; a[k+1]:= buf;
changed:= TRUE;
end;
// вывод массива
for i:=l to SIZE do
Label2.caption:=label2.caption+' '+IntToStr(a[i]);
Label2.caption:=label2.caption+#13;
until not changed; // если не было обменов, значит
// массив отсортирован
Label2.caption:=label2.caption+#13+'Maccив отсортирован.';
end;
Рис. 5.19. Пример работы программы сортировки массива методом обмена
Многомерные массивы
Страна | Золотых | Серебряных | Бронзовых | ||
Австралия | |||||
Беларусь | |||||
Великобритания | |||||
Германия | |||||
Италия | |||||
Китай | |||||
Корея | |||||
Куба | |||||
Нидерланды | |||||
Россия | |||||
Румыния | |||||
США | |||||
Франция | |||||
Япония | |||||
Программа должна вычислить общее количество медалей, завоеванных представителями каждой страны, и соответствующее количество очков (баллов), которое вычисляется по следующему правилу: за каждую золотую медаль команда получает семь очков, за серебряную — шесть очков, за бронзовую — пять очков.
Вид диалогового окна программы приведен на рис. 5.20.
Рис. 5.20. Диалоговое окно программы Итоги олимпиады
Для ввода исходных данных и отображения результата используется компонент StringGrid, свойства которого приведены в табл. 5.9.
Таблица 5.9. Значения свойства компонента StringGrid1
Свойство | Значение | ||
Name | Tabl | ||
ColCount | |||
RowCount | |||
FixedCols | |||
FixedRows | |||
Options. goEditing | TRUE | ||
DefaultColWidth | |||
DefaultRowHeight | |||
GridLineWidth | |||
Листинг 5.11. Инициализация таблицы
procedure TForm1.FormActivate(Sender: TObject);
Begin
tabl.Cells[0,0] ='Страна';
tabl.Cells[1,0] ='Золотых';
tabl.Cells[2,0] ='Серебряных';
tabl.Cells[3,0] ='Бронзовых';
tabl.Cells[4,0] ='Bcero';
tabl.Cells[5,0] ='Баллов';
tabl.Cells[0,1] ='Австралия';
tabl.Cells[0,2] ='Белоруссия';
tabl.Cells[0,3] ='Великобритания';
tabl.Cells[0,4] ='Германия';
tabl.Cells[0,5] ='Италия';
tabl.Cells[0,6] ='Китай';
tabl.Cells[0,7] ='Корея';
tabl.Cells[0,8] ='Куба';
tabl.Cells[0,9] ='Нидерланды';
tabl.Cells[0,10]— 'Россия';
tabl.Cells[0,ll]:='США';
tabl,Cells[0,12]:='Франция';
tabl.Cells[0,13]:='Япония'; end;
Программа обработки исходной таблицы (листинг 5.12) запускается щелчком мыши на командной кнопке Итоги (Button1).
Листинг 5.12. Обработка двумерного массива
procedure TForm1.Button1Click(Sender: TObject);
Var
c,r:integer; // номер колонки и строки таблицы
s:integer; // всего медалей у команды
р:integer; // очков у команды
m:integer; // номер строки с максимальным количеством очков
buf: array [0..5] of string; // буфер для обмена строк
i:integer; // номер строки. Используется во время сортировки
Begin
for r:=1 to tabl.rowcount do // обработать все строки
begin s:=0;
// вычисляем общее кол-во медалей
for c:=1 to 3 do
if tabl.cells[c,r] <>''
then s:=s+StrToInt(tabl.cells[c,r])
else tabl.cells[c,r]:='0'; // вычисляем количество очков
p:=7*StrToInt(tabl.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:=1 to tabl.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 // обменяем r-ю и m-ю строки таблицы
for c:=0 to 5 do begin
buf[с]:=tab1.Cells[c,r];
tabl.Cells[c,r]:=tabl.Cells[c,m];
tabl.Cells[c,m]:=buf[c];
end;
end; end;
end;
Рис. 5.21. Окно программы Итоги олимпиады