
- •Глава 1. Основы программирования Программа
- •Этапы разработки программы
- •Спецификация
- •Разработка алгоритма
- •Алгоритм и программа
- •Компиляция
- •Язык программирования Delphi
- •Тип данных
- •Целый тип
- •Вещественный тип
- •Символьный тип
- •Строковый тип
- •Логический тип
- •Переменная
- •Константы
- •Числовые константы
- •Строковые и символьные константы
- •Логические константы
- •Именованная константа
- •Инструкция присваивания
- •Выражение
- •Тип выражения
- •Выполнение инструкции присваивания
- •Стандартные функции
- •Математические функции
- •Функции преобразования
- •Использование функций
- •Ввод данных
- •Ввод из окна ввода
- •Ввод из поля редактирования
- •Вывод результатов
- •Вывод в окно сообщения
- •Процедуры и функции
- •Структура процедуры
- •Структура функции
- •Запись инструкций программы
- •Стиль программирования
- •Глава 2. Управляющие структуры языка Delphi
- •Условие
- •Инструкция if
- •Листинг 2.1. Вычисление стоимости телефонного разговора
- •Листинг 2.2.Контроль веса
- •Инструкция case
- •Листинг 2.3. Пересчет веса из фунтов в килограммы
- •Листинг 2.4. Формирование поясняющего текста
- •Листинг 2.5. Вычисление даты следующего дня (фрагмент)
- •Инструкция for
- •Инструкция while
- •Листинг 2. 6. Вычисление числа я
- •Инструкция repeat
- •Листинг 2.7. Простое число
- •Инструкция goto
- •Листинг 2.8. Простое число (использование инструкции goto)
- •Глава 3. Символы и строки
- •Символы
- •Листинг 3.1. Таблица символов
- •Операции со строками
- •Функция length
- •Процедура delete
- •Функция роs
- •Функция сору
- •Глава 4. Консольное приложение
- •Глава 5. Массивы
- •Объявление массива
- •Операции с массивами
- •Вывод массива
- •Листинг 5.1. Инициализация и вывод массива
- •Ввод массива
- •Использование компонента StringGrid
- •Листинг 5.2. Ввод и обработка массива целых чисел
- •Листинг 5.3. Процедура обработки события OnKeyPress
- •Листинг 5.4. Ввод и обработка массива дробных чисел
- •Использование компонента Memo
- •Листинг 5.5. Ввод массива строк из компонента Memo
- •Поиск минимального (максимального) элемента массива
- •Листинг 5.6. Поиск минимального элемента массива
- •Поиск в массиве заданного элемента
- •Алгоритм простого перебора
- •Листинг 5.7. Поиск в массиве
- •Метод бинарного поиска
- •Листинг 5.8. Бинарный поиск в массиве
- •Сортировка массива
- •Листинг 5.9. Сортировка массива простым выбором
- •Сортировка методом обмена
- •Листинг 5.10. Сортировка массива методом обмена
- •Многомерные массивы
- •Листинг 5.11. Инициализация таблицы
- •Листинг 5.12. Обработка двумерного массива
- •Ошибки при использовании массивов
Листинг 5.8. Бинарный поиск в массиве
unit b_found_;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs, StdCtrls, Grids;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
Label3: TLabel;
CheckBox1: TCheckBox;
StringGrid1: TStringGrid;
Editl: TEdit;
procedure ButtonlClick(Sender: TObject);
procedure StringGridlKeyPress(Sender: TObject; var Key: Char);
procedure EditlKeyPress(Sender: TObject; var Key: Char); private
{Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{ Бинарным поиск в массиве }
procedure TForm1.Button1Click(Sender: TObject);
const
SIZE=10; var
a:array[1..SIZE] of integer; { массив )
obr:integer; { образец для поиска}
verh:integer; { верхняя граница поиска }
niz: integer; { нижняя граница поиска }
sred:integer; { номер среднего элемента )
found:boolean; { TRUE — совпадение образца с элементом массива }
n:integer; / число сравнений с образцом }
i:integer;
begin
// ввод массива и образца
for i:=l to SIZE do
a[i]:=StrToInt(StringGridl.Cells[i-l,0] ) ;
obr := StrToInt(Editl.text);
// поиск verh:=1;
niz:=SIZE; n:=0;
found:=FALSE; labels.caption:='';
if CheckBoxl.State = cbChecked
then Labels.caption: ='verh'+#9+'niz'#9'sred' #13;
// бинарный поиск в массиве repeat
sred:=Trunc ( (niz-verh) /2)+verh; if CheckBox1.Checked
then Labels.caption:=label3.caption +IntToStr(yerh) + #9
+IntToStr(niz) + #9 +IntToStr(sred) + #13; n:=n+1;
if a[sred] = obr then found:=TRUE else
if obr < a[sred]
then niz:=sred-1 else verh:=sred+1;
until (verh > niz) or found;
if found
then labels.caption:=label3.caption
+'Совпадение с элементом номер '
+ IntToStr(sred)+#13 + 'Сравнений '
+ IntToStr(n)
else label3.caption:=label3.caption
+'Образец в массиве не найден.';
end;
// нажатие клавиши в ячейке StringGrid
procedure TForml.StringGridlKeyPress(Sender: TObject; var Key: Char),
begin
if Key = #13 then // нажата клавиша <Enter>
if StringGrid1.Col < StringGridl.ColCount - 1
then // курсор в следующую ячейку таблицы
StringGridl.Col := StringGrid1.Col +1
else // курсор в поле Editl, в поле ввода образца
Editl.SetFocus;
end;
// нажатие клавиши в поле Editl
procedure TForm1.Edit1KeyPress(Sender: TObject;. var Key: Char);
begin
if Key = #13 // нажата клавиша <Enter>
then // сделать активной командную кнопку
Button1.SetFocus;
end;
end.
Ниже приведены примеры диалоговых окон программы Бинарный поиск в массиве после выполнения поиска— с выводом протокола (рис. 5.14, а) и без протокола (рис. 5.14, б).
Здесь следует обратить внимание на то, что элемент массива, находящийся на седьмом месте, программа бинарного поиска находит всего за четыре шага, в то время как программе, реализующей алгоритм простого перебора, потребовалось бы семь шагов.
а
б
Рис. 5.14. Примеры работы программы бинарного поиска в массиве
Сортировка массива
Под сортировкой массива подразумевается процесс перестановки элементов массива, целью которого является размещение элементов массива в определенном порядке. Например, если имеется массив целых чисел а, то после выполнения сортировки по возрастанию должно выполняться условие:
а[1] < а[2] < .. .< a[SIZE]
где SIZE — верхняя граница индекса массива.
Примечание
Задача сортировки распространена в информационных системах и используется как предварительный этап задачи поиска, т. к. поиск в упорядоченном (отсортированном) массиве проводится намного быстрее, чем в неупорядоченном (см. рассмотренный ранее метод бинарного поиска).
Существует много методов (алгоритмов) сортировки массивов.
Рассмотрим два из них: