Проект «Сортировка массива случайных чисел методом выбора»
На этом занятии мы узнаем, для чего нужны глобальные переменные, а также посмотрим, каким образом лучше выводить массив.
Идея сортировки методом выбора следующая (презентация К.Ю. Полякова «Программирование на языке Паскаль. Часть II. Слайд 30 «Метод Выбора»):
-
Найти минимальный элемент и поставить на первое место (поменять местами с A[1]).
-
Из оставшихся найти минимальный элемент и поставить на второе место (поменять местами с 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;