- •Часть 1. Среда Delphi Тема 1. Объектно-ориентированное программирование
- •Тема 2. Элементы интерфейса
- •Окно проектировщика формы
- •Окно инспектора объектов
- •С оздание и сохранение проекта и файла модуля Как открыть новый проект?
- •Как открыть существующий проект?
- •Тема 3. Характеристика проекта. Состав проекта
- •Файлы формы
- •Файлы модулей
- •Файл ресурсов
- •Параметры проекта
- •Тема 4. Компиляция и выполнение проекта
- •Тема 5. Основные объекты
- •Основные свойства объектов
- •Основные события
- •Часть 2. Язык Object Pascal
- •Тема 1. Основные понятия
- •Словарь языка
- •Структура программы
- •Комментарии
- •Тема 2. Данные Виды данных
- •Типы данных
- •Простые типы данных
- •Структурные типы данных
- •Тема 3. Выражения
- •Арифметические выражения
- •Логические выражения
- •Строковые выражения
- •Тема 4. Простые операторы Оператор присваивания
- •Оператор перехода
- •Тема 5. Работа с графикой
- •Оператор доступа
- •Рисование многоугольников в Delphi
- •Закрашивание произвольной области в Delphi
- •Работа с несколькими формами
- •Объект Shape (Фигура)
- •Тема 6. Работа с датой и временем Объект Timer
- •Свойства компонента Timer
- •Манипулирование датами и временем
- •Тема 7. Встроенные окна диалога.
- •Окно ввода данных
- •InputВох(заголовок, подсказка, значение)
- •Окно вывода сообщений
- •Тема 8. Структурированные операторы
- •Составной оператор
- •Условный оператор
- •Оператор выбора
- •Операторы цикла
- •Тема 9. Подпрограммы
- •Процедуры
- •Функции
- •Параметры и аргументы
- •Тема 10. Работа с элементами выбора
- •1. Флажок (CheckBox)
- •2. ПереключательRadioButton
- •Свойства компонента RadioButton
- •Свойства компонента tRadioGroup
- •3. Простой список ListBox
- •Свойства компонента ListBox
- •4. Комбинированный список ComboBox
- •Свойства компонента СотbоВох
- •Значения для свойства Style
- •Тема 11. Работа с меню
- •Основные свойства пункта меню:
- •Главное меню
- •Конструктор меню
- •Динамическая настройка меню
- •Тема 12. Массивы
- •Объявление массива
- •Операции с массивами
- •Вывод массива
- •Ввод массива
- •Использование компонента StringGrid
- •Использование компонента Memo
- •Поиск минимального (максимального) элемента массива
- •Сортировка массива
Поиск минимального (максимального) элемента массива
Задачу поиска минимального элемента массива рассмотрим на примере массива целых чисел.
Алгоритм поиска минимального (максимального) элемента массива довольно очевиден: сначала делается предположение, что первый элемент массива является минимальным (максимальным), затем остальные элементы массива последовательно сравниваются с этим элементом. Если во время очередной проверки обнаруживается, что проверяемый элемент меньше (больше) принятого за минимальный (максимальный), то этот элемент становится минимальным (максимальным) и продолжается проверка оставшихся элементов.
Диалоговое окно приложения поиска минимального элемента массива содержит соответствующим образом настроенный компонент stringGridl, который применяется для ввода элементов массива, два поля меток (Label1 и Label2), использующиеся для вывода информационного сообщения и результата работы программы, и командную кнопку (Button1), при щелчке на второй выполняется поиск минимального элемента массива. В табл. 5.4 приведены значения свойств компонента stringGridl.
Таблица 5.4. Значения свойств компонента stringGridl
Свойство |
Значение |
ColCount |
005 |
FixedCols |
000 |
RowCount |
001 |
DefaultRowHeight |
024 |
Height |
024 |
DefaultColWidth |
064 |
Width |
328 |
Options.goEditing |
True |
Options.AlwaysShowEditing |
True |
Options.goTabs |
True |
В листинге 5.6 приведена процедура обработки события onclick для командной кнопки Button1, которая вводит массив, выполняет поиск минимального элемента и выводит результат – номер и значение минимального элемента массива.
Листинг 5.6. Поиск минимального элемента массива
procedure TForm1.Button1Click(Sender: TObject);
const
SIZE=5;
var
a:array[1..SIZE]of integer; // массив целых
min:integer; // номер минимального элемента массива
i:integer; // номер элемента, сравниваемого с минимальным
begin
// ввод массива
for i:=l to SIZE do a[i]:=StrToInt(StringGridl.Cells[i-1,0]) ;
// поиск минимального элемента
min:=l; // пусть первый элемент минимальный
for i:=2 to SIZE do
if a[i]< a[min]then min:=i;
// вывод результата
Label2.caption:='Минимальный элемент массива:'+IntToStr(a[min]) +#13+'Номер элемента:'+ IntToStr(min);
На рис. 5.8 приведен вид диалогового окна приложения после щелчка на кнопке Поиск.
Рис. 5.8. Окно приложения Поиск минимального элемента массива
Сортировка массива
Под сортировкой массива подразумевается процесс перестановки элементов массива, целью которого является размещение элементов массива в определенном порядке. Например, если имеется массив целых чисел а, то после выполнения сортировки по возрастанию должно выполняться условие:
a[1] ≤ а [2] ≤...≤ a [SIZE] где size – верхняя граница индекса массива.
Примечание
Задача сортировки распространена в информационных системах и используется как предварительный этап задачи поиска, т. к. поиск в упорядоченном (отсортированном) массиве проводится намного быстрее, чем в неупорядоченном.
Существует много методов (алгоритмов) сортировки массивов. Рассмотрим два из них: метод прямого выбора; метод прямого обмена.
Сортировка методом прямого выбора
Алгоритм сортировки массива по возрастанию методом прямого выбора:
Просматривая массив от первого элемента, найти минимальный элемент и поместить его на место первого элемента, а первый – на место минимального.
Просматривая массив от второго элемента, найти минимальный элемент и поместить его на место второго элемента, а второй – на место минимального.
И так далее до предпоследнего элемента.
Ниже представлена программа сортировки массива целых чисел по возрастанию, диалоговое окно которой изображено на рис. 5.15.
Процедура сортировки, текст которой приведен в листинге 5.9, запускаете»] нажатием кнопки Сортировка (Button1). Значения элементов массива вводятся из ячеек компонента stringGrid1. После выполнения очередной цикла поиска минимального элемента в части массива процедура выводит массив в поле метки (Label2).
Листинг 5.9. Сортировка массива простым выбором
procedure TForm1.Button1Click(Sender: TObject);
const
SIZE=10;
var
a:array[l. .SIZE] of integer;
rain:integer; { номер минимального элемента в части массива от i до верхней границы массива } j:integer; { номер элемента, сравниваемого с минимальным }
buf: integer; { буфер, используемый при обмене элементов массива }
i, к: integer;
begin
// ввод массива
for i:=l to SIZE do a[i]:=StrToInt(StringGridl.Cells[i-1, 0]);
Label2. caption: = ' ' ;
for i:=l to SIZE-1 do begin
{ поиск минимального элемента в части массива от а[1] до a[SIZE]}
min:=i;
for j:=i+l to SIZE do
if a[j] < a[min] then min:=j;
{ поменяем местами a[min] и a[i] }
buf:=a[i];
a [i]:=a [min] ;
a[min]:=buf;
{ вывод массива }
for k:=l to SIZE do
Label2.caption:=label2.caption+' '+IntTostr(a[k]);
Label2.caption:=label2.caption+#13;
end;
Label2.caption:=label2.caption+#13+'Массив отсортирован.';
end;
Сортировка методом обмена («пузырьковая»)
В основе алгоритма лежит обмен соседних элементов массива. Каждый элемент массива, начиная с первого, сравнивается со следующим, и если он больше следующего, то элементы меняются местами. Таким образом, элементы с меньшим значением продвигаются к началу массива (всплывают), а элементы с большим значением – к концу массива (тонут). Поэтому данный метод сортировки обменом иногда называют методом "пузырька". Этот процесс повторяется столько раз, сколько элементов в массиве, минус единица.
На рис. 5.17 цифрой 1 обозначено исходное состояние массива и перестановки на первом проходе, цифрой 2 – состояние после перестановок на первом проходе и перестановки на втором проходе, и т. д.
На рис. 5.18 приведено диалоговое окно программы сортировки массива методом обмена.
Процедура сортировки, текст которой приведен в листинге 5.10, запускается нажатием кнопки Сортировка (Button1). Значения элементов массива вводятся из ячеек компонента stringGrid1. Во время сортировки, после выполнения очередного цикла обменов элементов массива, программа выводит массив в поле метки Label2.
Листинг 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:=l to SIZE do
a[i] := StrToInt(StringGridi.Cells[i-1,0]); Iabei2. caption: =' ' ;
// сортировка массива
repeat
changed:=FALSE; // пусть в текущем цикле нет обменов
for k:=l to SIZE-1 do
if a[k] > a[k+l] then begin
// обменяем k-й и к+1-й элементы
buf := a[k];
a[k] :- a[k+l];
a[k+l] := buf;
changed := TRUE;
end;
// вывод массива
for i:=l to SIZE do
Label2.caption:=label2.caption+' 'UntTostr(a[i]);
Label2.caption:=label2.caption+#13;
until not changed; // если не было обменов, значит массив отсортирован
Label2.caption:=label2.caption+#13+'Массив отсортирован.';
end;
Следует отметить, что максимальное необходимое количество циклов проверки соседних элементов массива равно количеству элементов массива минус один. Вместе с тем возможно, что массив реально будет упорядочен за меньшее число циклов. Например, последовательность чисел 5 12 3 4, если ее рассматривать как представление массива, будет упорядочена за один цикл, и выполнение оставшихся трех циклов не будет иметь смысла.
Поэтому в программу введена логическая переменная changed, которой перед выполнением очередного цикла присваивается значение false. Процесс сортировки (цикл repeat) завершается, если после выполнения очередного цикла проверки соседних элементов массива (цикл for) ни один элемент массива не был обменен с соседним, и, следовательно, массив уже упорядочен.
На рис. 5.19 приведено диалоговое окно программы сортировки массива методом обмена после завершения процесса сортировки.