
- •Розділ 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. Пошук найкоротшого шляху.|колії|
Зазвичай|звично| завдання|задача| пошуку шляху|колії| на графі формулюється таким чином: знайти якнайкращий|щонайкращий| маршрут. Під якнайкращим|щонайкращим| маршрутом, як правило, розуміють найкоротший. Знайти найкоротший маршрут можна вибором зі|із| всіх знайдених. Проте|однак| зовсім не обов'язково шукати всі маршрути.
Можна поступити|вчинити| інакше: під час вибору чергової крапки|точки| перевірити, чи не перевищить довжина формованого маршруту довжину вже знайденого шляху|колії|, якщо ця крапка|точка| буде включена в маршрут; якщо перевищить, то цю крапку|точку| слід пропустити і вибрати іншу.
Таким чином, після того, як буде знайдений перший маршрут, програма вестиме пошук тільки|лише| по тих гілках графа, які можуть поліпшити знайдене рішення|розв'язання|, відсікаючи|відсікати| шляхи|колії|, що роблять|чинять| формований маршрут довше вже знайденого.
У лістингу нижче приведена процедура, яка використовує процедуру step|, що виконує вибір чергової точки маршруту таким чином, що забезпечується пошук шляху|колії| мінімальної довжини.
Лістинг. Пошук найкоротшого шляху|колії|
procedure TForm1.Button1Click(Sender: TObject);
const|
N=10;{ к-ть вершин графа}
var
map:array|[1..N,1..N]of| integer|;
// Карта.map[i,j|] не 0, якщо|
// точки i і j сполучені|з'єднані|
road:array|[1..N]of| integer|;
// Дорога|люба| – номери точок карти
incl:array|[1..N]of| boolean|; // incl|[1]рівний TRUE, якщо крапка|точка|
// з|із| номером i включена в road|
start|, finish:integer|;
// Початкова і кінцева|скінченна| точки
found:boolean|; len:integer|; // довжина знайденого (мінімального)
// маршруту } c_len:integer|; // довжина поточного (формованого)
// маршруту i,j:integer|;
// вибір чергової крапки|точки|
procedure step(s,f,p:integer);
var|
с:integer|; { Номер крапки|точки|, в яку робимо|чинимо| черговий крок }
i:integer; begin
if s=f then begin
len:=c_len|;{ збережемо довжину знайденого маршруту }
{ виведення знайденого маршруту }
for i:=1 to p-1 do
Label1|.caption:=Label1.caption+' '+IntToStr|(road|[i]);
Label1|.caption:=Label1.caption
+', довжина:'+IntToStr(len|)+#13;
end|
else|
{ вибираємо чергову крапку|точку| }
for c:=l to N do { перевіряємо всі вершини }
if(map[s,c]<> 0)and(NOT incite])
and((len=0)or(c_len+map[s,c]< len)) then begin
// крапка|точка| сполучена|з'єднана| з|із| поточною, але|та| не включена в
// маршрут
roadtp|]:=c;{ додамо|добавлятимемо| вершину в шлях|колію| }
incl|[c]:=TRUE;{ помітимо|позначимо| вершину як включену }
c_len:=c_len+map|[s,с|];
step|(с,f,p+l|);
incite|]:=FALSE; roadtp|]:=0;
c_len:=c_len-map|[s,с|];
end|;
end|;
{ кінець процедури step| }
begin|
Labell|.caption:='';
{ ініціалізація масивів }
for i: =1 to N do road [ i ] : =0;
for i:=l to N do incl[i]:=FALSE;
{ введення опису карти з|із| SrtingGrid|.Cells}
for i:=l to N do
for j:=1 to N do
if StringGridl.Cells[i, j] <> "
then mapti,j]:=StrToInt(StringGridl.Cells[i,j])
else mapti,j]:=0;
len:=0|; // довжина знайденого (мінімального) маршруту з|із|
len:=0|, - // довжина поточного (формованого) маршруту
start:=StrToInt|(Edit1|.text);
finish:=StrToInt|(Edit2|.text);
road|[1]:=start;{ внесемо крапку|точку| до маршруту }
incl|[start|]:=TRUE;{ помітимо|позначимо| її як включену }
step|(start,finish,2|);{шукаємо другу точку маршруту }
// перевіримо, чи знайдений хоч би|хоча би| один шлях|колія|
if not found
then Label1.caption:='Вказані крапки не сполучені!';
end|;
Питання для самоконтролю:
Який алгоритм викреслювання кривої Гільберта?
Коли ефективний механізм рекурсії у програмуванні?
Що таке граф?
Як здійснюється пошук найкоротшого шляху?