Сортировка методом обмена




Рис. 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. Окно программы Итоги олимпиады



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-08-08 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: