Проект «Сортировка массива случайных чисел методом выбора»

На этом занятии мы узнаем, для чего нужны глобальные переменные, а также посмотрим, каким образом лучше выводить массив.

Идея сортировки методом выбора следующая (презентация К.Ю. Полякова «Программирование на языке Паскаль. Часть II. Слайд 30 «Метод Выбора»):

  1. Найти минимальный элемент и поставить на первое место (поменять местами с A[1]).

  2. Из оставшихся найти минимальный элемент и поставить на второе место (поменять местами с A[2]), и т.д.

Порядок выполнения работы

1. Создайте форму с компонентами, как указано ниже на рисунке

В инспекторе объектов измените их начальные значения:

Объект Свойство Значение свойства
форма Form1 Надпись caption Сортировка массива методом выбора
метка Label1 Надпись caption Количество элементов массива
метка Label2 Надпись caption Границы диапазона чисел
метка Label3 Надпись caption от
метка Label4 Надпись caption до
Кнопка Button1 Надпись caption Генерация и вывод массива
Кнопка Button2 Надпись caption Сортировка и вывод массива
Текстовое поле Edit1 text 10
Текстовое поле Edit2 text -100
Текстовое поле Edit3 text 100

2. Перейдем в редактор кода и в разделе описания глобальных переменных опишем переменные

N — количество элементов массива;
S — понадобится для вывода строки с результатом;
A — массив целых чисел;
k1, k2 — границы диапазона значений элементов массива.

unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
StdCtrls, ComCtrls;

type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;

private
{ private declarations }
public
{ public declarations }
end;

var
Form1: TForm1;
S:string;
N,k1,k2:integer;
A:array[1..1000] of integer; {пустой массив из 1000 элементов, с запасом}

implementation
{ TForm1 }
initialization
{$I unit1.lrs}
end.

3. Напишем процедуру генерации и вывода элементов массива

Для этого в инспекторе объектов выберите кнопку Button1 и на закладке события выберите OnClick. Можно поступить проще — выполнить двойной щелчок по кнопке Button1 и мы сразу попадем в заготовку процедуры-обработчика нажатия по этой кнопке (событие OnClick). Итак, ниже текст процедуры:

procedure TForm1.Button1Click(Sender: TObject);
var i:integer; {локальная переменная цикла}
begin
   S:=”;{начальная строка пустая}
   N:=StrToInt(Edit1.Text); {количество элементов массива}
   k1:=StrToInt(Edit2.Text); {начало диапазона}
   k2:=StrToInt(Edit3.Text); {конец диапазона}
   for i:=1 to N do begin
      A[i]:=k1+random(k2-k1); {создаем элемент массива со случайным значением в диапазоне от k1 до k2}
      S:=S+IntToStr(A[i])+’ ‘; {преобразуем численные значения элементов массива в символы и добавляем к строке S}
   end;

   ShowMessage(S); {выводим строку в окне вывода}
end;

4. Отсортируем массив по возрастанию по методу выбора

Обратите внимание, мы переменную массива специально объявляли как глобальную (вне процедуры) для того, чтобы после генерации элементов массива они были доступны для обработки процедурой сортировки. Ниже мы видим текст процедуры:

procedure TForm1.Button2Click(Sender: TObject);
var nMin,i,j,c:integer;{локальные переменные}
begin
   S:=”;{начальная строка пустая}
   for i:= 1 to N-1 do begin {нужно N-1 проходов}
     nMin:= i ;
     for j:= i+1 to N do {поиск минимального от A[i] до A[N]}
       if A[j] < A[nMin] then nMin:=j; {запоминаем номер текущего минимума}
     if nMin <> i then begin {если нужно, переставляем элементы}
       c:=A[i];
       A[i]:=A[nMin];
       A[nMin]:=c;
     end;
   end;

   for i:=1 to N do S:=S+IntToStr(A[i])+’ ‘;{преобразуем численные значения элементов массива в символы и добавляем к строке S}
   ShowMessage(S); {выводим строку в окне вывода}
end;