Упражнение на линейную сортировку массива

Упражнение. Создайте приложение, которое предлагает пользователю ввести размер массива и создать массив случайных целых чисел, а затем, используя переключатели, указать порядок сортировки (по неубыванию, по невозрастанию), выполнить сортировку и просмотреть отсортированный массив.

Создайте форму, для свойства Caption задайте значение «Линейная сортировка массива». На форме разместите компоненты Editl, Edit2 и Edit3, кнопку Buttonl, для свойства Caption которой задайте значение «Создать массив». Удалите текст Editl, Edit2, Edit3 из соответствующих компонентов. Разместите на форме компоненты Labell, Label2 и задайте для их свойств Caption значения «Число элементов» и «Исходный массив» соответственно.

Ниже объекта Edit3 на форме разместите панель RadioGroupl, для свойства Caption которой задайте значение «Порядок сортировки». Для выбора порядка сортировки задайте два переключателя в панели RadioGroupl и подписи к ним. Выбрав в Инспекторе объектов компонент RadioGroupl, на странице свойств выберите свойство Items, затем в окне String List Editor введите список элементов: По невозрастанию, По неубыванию и нажмите ОК. Справа от панели RadioGroupl разместите кнопку Button2, для свойства Caption которой задайте значение «Отсортировать».

В нижней части формы разместите Edit3 для вывода отсортированного массива. Над объектом Edit3 разместите объект Label3, для свойства Caption которого задайте значение «Отсортированный массив». Выровняйте компоненты на форме. Зафиксируйте положение компонентов на форме, выбрав в меню Delphi команду Edit – Lock Controls.

Сохраните файл проекта и программного модуля. Аналогично предыдущему примеру, прежде чем создавать обработчики событий щелчка мышью по кнопкам Buttonl и Button2, опишите глобальные переменные целого типа N и I, где N – размер массива, а I – порядковый номер элемента массива, а также М – динамический массив целых чисел.

var
Forml: TForml;
N, I : integer;
M : array of integer; {описание динамического массива целых чисел}

Для предупреждения ошибки ввода в окно Editl нечислового значения введите обработку события нажатия клавиши в окне Editl, чтобы запретить ввод любых символов, кроме цифр от 0 до 9. Для создания процедуры обработчика события нажатия клавиши в окне Editl выберите в окне Инспектора объектов компонент Editl и на странице Events (События) дважды щелкните левой кнопкой мыши на пустом поле списка в событии OnKeyPress. После этого в текст процедуры обработчика события добавьте следующий оператор: if not (Key in [‘0’..’9′]) then Key:=#O;. Полный текст процедуры обработчика события будет выглядеть следующим образом:

procedure EditlKeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in [‘0’..’9′]) then Key:=#0;
end;

Создание массива целых чисел опишите в процедуре обработчика события щелчка мышью на кнопке Buttonl. Для создания процедуры обработчика события выберите в окне Инспектора объектов объект Buttonl, затем на странице События произведите двойной щелчок на пустом поле списка в событии OnClick. После этого в окне Редактора кода в заготовку процедуры обработчика события введите следующий текст:

procedure TForml.ButtonlClick(Sender: TObject);
begin
Randomize;
N:=StrToInt(Editl.Text); {число элементов массива}
SetLength(M, N); {задать динамическому массиву М длину N}
Edit2.Text: = ‘ ‘;
for I:= 0 to N-l do {заполнить массив случайными значениями целых чисел}
begin
M[I]:= Round(Sin(Random(100))*100);
{присвоить элементу массива случайное значение}
Edit2.Text:=Edit2.Text+’ ‘+Intostr(M[I]);
{вывести элементы массива}
end;
end;

Обработка события нажатия кнопки Button2 «Вычислить» начинается с сортировки массива, которую можно записать с помощью оператора цикла for.

Для хранения номера элемента массива, сравниваемого с текущим (имеющим номер I) введем переменную целого типа J. Для запоминания элемента массива при обмене в процессе сортировки введем переменную Т.

Линейная сортировка массива выполняется путем перестановки элементов в массиве при соблюдении следующих условий: если в неотсортированной части массива найден элемент с номером J, больший, чем элемент с номером I (для сортировки по невозрастанию), или меньший, чем элемент с номером I (для сортировки по неубыванию). Поэтому можно записать следующий оператор if then else с составным условием:

if (RadioGroupl.ItemIndex=O) and (M[I]<M[J]) or (RadioGroupl.Itemlndex=l) and (M[I]>M[J]) then

Перестановка элементов массива осуществляется с использованием третьей переменной:

Т := М[1]; {запомнить на время значение М[1]}
M[I] := M[J];
M[J] := Tmp;

Вывод отсортированного массива в окне Edit3 можно записать оператором:

for I:=0 to N-l do
Edi t3.Text:=Edi t3.Text+’ ‘+IntToStr(M[I]);

В целом текст процедуры сортировки и вывода отсортированного массива будет выглядеть следующим образом:

procedure TForml.Button2Cli ck(Sender: TObject);
var
J,T : integer;
begin
Edit3.Text: = ‘ ‘;
for I:= 0 to N — 2 do {изменять размер неотсортированной части массива}
for J:=1+1 to N-l do {сравниваем поочередно 1-й элемент неотсортированной части массива со всеми от I+1-го до конца}
begin {выбор операции в зависимости от значения свойства RadioGroupl.Itemlndex}
if (RadioGroupl.ItemIndex=O) and (M[I]<M[J]) or (RadioGroupl.Itemlndex=l) and (M[I]>M[J]) then
{если в неотсортированной части массива нашли J-й элемент, больший чем 1-й (для сортировки по невозрастанию) или меньший чем 1-й (для сортировки по неубыванию)}
begin {обменять местами элементы массива}
Т := М[1]; {запомнить на время значение М[1]}
М[1] := M[J];
M[J] := T;
end;
end;
for I:=0 to N-l do {вывести отсортированный массив}
Edit3.Text:=Edit3.Text+’ ‘+IntToStr(M[I]);
end;

Сохраните файлы проекта и программного модуля, откомпилируйте и запустите программу на выполнение. Задавая различные значения числа элементов массива и щелкая мышью на кнопке Создать массив, создавайте линейный массив целых чисел. Выбирая при помощи переключателей в панели RadioGroupl вариант сортировки и щелкая мышью на кнопке.

После окончания проверки работы приложения закройте его окно.

Добавить комментарий