
- •Розділ 1. Об’єктно-орієнтоване програмування
- •Тема 1.1. Візуальне програмування.
- •Тема 1.2. Приклади та застосування інкапсуляції, успадкування, поліморфізму.
- •Тема 1.3. Бібліотека візуальних компонентів vcl та її базові класи.
- •1. Клас tWinControl.
- •2. Клас tСustomControl.
- •3. Клас tGraphicControl.
- •Тема 1.4. Обробка виняткових ситуацій.
- •1. Використовування виняткових ситуацій.
- •2. Протоколювання виняткових ситуацій.
- •3. Коди помилок у виняткових ситуаціях.
- •4. Виняткова ситуація eAbort. Функція Assert.
- •Розділ 2. Мова програмування Object Pascal.
- •Тема 2.1. Середовище Delphi.
- •Тема 2.2. Елементи мови Object Pascal.
- •1. Коментарі.
- •2. Логічні вирази.
- •Тема 2.3. Типи даних, процедури та функції.
- •1. Вказівники та динамічна пам'ять. Динамічна пам'ять
- •Вказівники
- •Виділення і звільнення динамічної пам'яті
- •Процедури і функції для роботи з динамічною пам'яттю
- •Тема 2.4. Управляючі структури Object Pascal.
- •Розділ 3. Програмування в середовищі Delphi.
- •Тема 3.1. Застосування списків. Способи запису/читання зі списків.
- •Є списком CheckBox елементів.
- •Тема 3.2. Масиви.
- •1. Пошук мінімального (максимального) елементу масиву.
- •2. Пошук в масиві заданого елементу.
- •Тема 3.3. Робота з файлами.
- •Тема 3.4. Типи даних визначені програмістом.
- •1. Показники.
- •2. Динамічні змінні.
- •Тема 3.5. Графічні програми.
- •1. Бітові образи.
- •2. Мультиплікація.
- •Властивості компоненту Timer
- •Тема 3.6. Приклади застосування анімацій у Delphi.
- •Тема 3.7. Рекурсія.
- •1. Крива Гільберта.
- •2. Пошук шляху.|колії|
- •Значення властивостей компоненту stringGrid1
- •3. Пошук найкоротшого шляху.|колії|
- •Тема 3.8. Компоненти для інтернету. Компонента tSocketConnection
- •Розділ 4. Бази даних.
- •Тема 4.1. Види баз даних. Структура та зв’язки між таблицями. Бази даних
- •Класифікація баз даних
- •Структура бази даних
- •Модель бази даних в Delphi
- •Тема 4.2. Модифікація структури таблиці в bde.
- •1. Зміна структури таблиці.
- •2. Встановлення перевірок правильності даних.
- •3. Завдання вторинних індексів.
- •Тема 4.3. Об’єкти відображення даних бази даних Delphi.
- •1. Класифікація компонентів відображення даних.
- •2. Елемент керування тdbGrid.
- •3. Компонент tdbEdit.
- •4. Компонент tdNavigator.
- •Тема 4.4. Обчислювальні поля і поля підстановки в Delphi.
- •1. Створення поля підстановки (поля синхронного перегляду).
- •2. Обчислювальні поля.
- •Тема 4.5. Компонента tdbEdit.
- •Тема 4.6. Переміщення по записам таблиці. Набір методів і властивостей tDataSet. Огляд
- •Клас tDataSet
- •Відкриття і закриття DataSet
- •Тема 4.7. Налаштування фільтрів.|
- •Тема 4.8. Приклади застосування пошуку.
- •Тема 4.9. Поєднання різних видів пошуку.
- •Тема 4.10. Типи даних та пошук в діапазоні.
- •Список літератури
Тема 3.7. Рекурсія.
Крива Гільберта.
Пошук шляху.
Пошук найкоротшого шляху.
1. Крива Гільберта.
Наступна|така| програма викреслює в діалоговому вікні криву Гільберта. На малюнку приведені криві Гільберта першого, другого і третього порядків|ладів|. Якщо придивитися|приглядатися|, то видно|показний|, що крива другого порядку|ладу| виходить шляхом з'єднання|сполучення| прямими лініями чотири кривих першого порядку|ладу|. Аналогічним чином виходить крива третього порядку|ладу|, але|та| при цьому як "цегла" використовуються криві другого порядку|ладу|. Так, щоб намалювати криву третього порядку|ладу|, треба намалювати чотири кривих другого порядку|ладу|. У свою чергу|своєю чергою|, щоб|аби| намалювати криву другого порядку|ладу|, треба намалювати чотири кривих першого порядку|ладу|. Таким чином, алгоритм викреслювання кривої Гільберта є|з'являється| рекурсивним.
Діалогове вікно програми Крива Гільберта, в якому знаходиться|перебуває| крива п'ятого порядку|ладу|, приведено на малюнку, текст програми – в лістингу.
Криві Гільберта першого, другого і третього порядків
Крива Гільберта п'ятого порядку
Лістинг. Крива Гільберта
unit gilbert_;
interface|
uses|
Windows|, Messages|, SysUtils|
Variants|, Classes|, Graphics|
Controls|, Forms|, Dialogs|, StdCtrls|, ComCtrls|;
type|
TForml| = class|(TForm|)
procedure FormPaint(Sender: TObject);
private|
{ Private| declarations| }
public|
{ Public| declarations| }
end|;
var|
Form1|: TForm1|;
implementation| {$R *.dfm}
var|
p: integer| =5; // порядок|лад| кривої
u: integer| =7; // довжина штриха
{ Криву Гільберта можна отримати|одержувати| шляхом|колією|
з'єднання|сполучення| елементів а,b,с| і d.
Кожен елемент будує
відповідна процедура. }
procedure а(i:integer; canvas: TCanvas); forward;
procedure b(i:integer; canvas: TCanvas); forward;
procedure с(i:integer; canvas: TCanvas); forward;
procedure d(i:integer; canvas: TCanvas); forward;
// Елементи кривої
procedure а(i: integer; canvas: TCanvas);
begin|
if| i > 0 then| begin|
d(i-l|, canvas|);
canvas|.LineTo(canvas|.PenPos.X+u,canvas.PenPos.Y);
а(i-l|, canvas|);
canvas|.LineTo(canvas|.PenPos.X,canvas.PenPos.Y+u);
а(i-l|, canvas|);
canvas|.LineTo(canvas|.PenPos.X-u,canvas.PenPos.Y);
с|із| (i-1|, canvas|);
end|;
end|;
procedure b(i: integer; canvas: TCanvas);
begin|
if i > 0 then begin
с|із|(i-l|, canvas|);
canvas|.LineTo(canvas|.PenPos.X-u,canvas.PenPos.Y);
b(i-1|, canvas|);
canvas|.LineTo(canvas|.PenPos.X,canvas.PenPos.Y-u);
b(i-l|, canvas|);
canvas|.LineTo(canvas|.PenPos.X+u, canvas|.PenPos.Y);
d(i-l|, canvas|);
end|;
end|;
procedure з(i: integer; canvas: TCanvas);
begin|
if i > 0 then begin
b(i-1|, canvas|);
canvas|.LineTo(canvas|.PenPos.X,canvas.PenPos.Y-u);
с|із| (i-1|, canvas|);
canvas|.LineTo(canvas|.PenPos.X-u,canvas.PenPos.Y);
с|із|(i-1|, canvas|);
canvas|.LineTo(canvas|.PenPos.X,canvas.PenPos.Y+u);
а(i-1|, canvas|);
end|;
end|;
procedure d(i: integer; canvas: TCanvas);
begin|
if i > 0 then begin
а(i-1|, canvas|);
canvas|.LineTo(canvas|.PenPos.X,canvas.PenPos.Y+u);
d(i-1|, canvas|);
canvas|.LineTo(canvas|.PenPos.X+u,canvas.PenPos. Y) ;
d(i-1|, canvas|);
canvas|.LineTo(canvas|.PenPos.X,canvas.PenPos.Y-u);
b(i-1|, canvas|);
end|;
end|;
procedure TForml.FormPaint(Sender: TObject);
begin|
Form1|.Canvas.MoveTo(u, u) ;
а(5,Form1.Canvas); // викреслити криву Гільберта
end|;
end|.
Слід звернути увагу на наступну|таку| особливість реалізації програми. Процедура, яка викреслює елемент а, окрім самої себе (для викреслювання елементу а кривій нижчого порядку|ладу|) викликає|спричиняє| процедури d і ь, опис (текст) яких в тексті програми знаходиться|перебуває| після|потім| процедури а. Щоб|аби| компілятор не вивів повідомлення|сполучення| про помилку, в текст програми поміщено оголошення процедури з|із| ключовим|джерельним| словом forward|, що означає, що це тільки|лише| оголошення, а опис (реалізація) знаходиться|перебуває| далі. Таким чином, вже в процесі компіляції процедури а, компілятор "знає", що імена ь і d означають процедури.