Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практика_Delphi.doc
Скачиваний:
11
Добавлен:
25.08.2019
Размер:
2.92 Mб
Скачать

Тема 9. Допоміжні алгоритми

Підпрограми

Метод послідовної побудови – деталізація алгоритму – з'явився результатом розвитку всієї системи програмування. Суть методу в розділенні складного завдання на ряд простих. Для кожної підзадачі складається свій алгоритм, званий допоміжним. Основна вимога в ієрархічній структурі, що утворилася, – це забезпечення строгого взаємозв'язку між складовими її частинами.

У структурованих програмах легко простежується|просліджує| логіка основного алгоритму, вони лаконічні по суті і зручні у відладці при виявленні помилок. Крім того, введення|вступ| допоміжних алгоритмів ефективно реалізує багатократне|багаторазове| використання підзадач в одній або навіть декількох програмах.

У коді допоміжні алгоритми організовуються в підпрограми, до яких відносяться процедури і функції. Основним принципом такої організації є функціональна цілісність, самодостатність і, як наслідок, самостійність алгоритмічного блоку, направленого на реалізацію вирішення конкретної мети. При цьому зв'язок з головною програмою здійснюється по мінімально необхідних критеріях (параметрам), аж до вказівки лише одного імені допоміжного алгоритму, у разі достатності такої умови виклику. Вибір робить програміст.

Сучасна теорія алгоритмізації ставить принцип структуризації основоположним. Мови, що підтримують схему деталізації програми, називають процедурно-орієнтованими. До їх числа відноситься Object Pascal.

Процедури і функції

При програмуванні в Delphi робота програміста полягає в основному в розробці процедур (підпрограм) обробки подій.

При виникненні події автоматично запускається процедура обробки події, яку і повинен написати програміст. Завдання задачі виклику процедури обробки, при виникненні відповідної події, бере на себе Delphi.

У мові Object Pascal основною програмною одиницею є підпрограма. Розрізняють два види підпрограм: процедури і функції. Як процедура, так і функція, є послідовністю інструкцій, призначеною для виконання деякої роботи. Щоб виконати інструкції підпрограми, треба викликати цю підпрограму. Відмінність функції від процедури полягає в тому, що з ім'ям функції пов'язано значення, тому ім'я функції можна використовувати у виразах.

Структура процедури

Процедура починається|розпочинає| заголовком, за яким слідують|прямують|:

- розділ оголошення констант;

- розділ оголошення типів;

- розділ оголошення змінних;

- розділ інструкцій.

Оголошення процедури в загальному|спільному| вигляді|виді| виглядає таким чином:

procedure| Ім'я (Список параметрів);

const| // початок розділу оголошення констант

type| // початок розділу оголошення типів

var| // початок розділу оголошення змінних

begin| // початок розділу інструкцій

end|;

Заголовок процедури складається із слова Procedure, за яким слідує ім'я процедури. Якщо у процедури є параметри, то вони указуються після імені процедури в дужках. Завершується заголовок процедури символом "крапка з комою".

Якщо в процедурі використовуються іменовані константи, то вони оголошуються в розділі оголошення констант, який розпочинається словом const.

За розділом констант слідує розділ оголошення типів, що розпочинається словом type.

Після розділу оголошення типів йде розділ оголошення змінних, в якому оголошуються (перераховуються) всі змінні, використовувані в програмі. Розділ оголошення змінних розпочинається словом var.

За розділом оголошення змінних розташований розділ інструкцій. Розділ інструкцій розпочинається словом begin і закінчується словом end, за яким слідує символ "крапка з комою". У розділі інструкцій знаходяться виконувані інструкції процедури.

Нижче, як приклад, приведений фрагмент програми підрахунку вартості покупки — процедура summa.

procedure| Summa|;

var|

cena|: real|; // ціна

kol|: integer|; // кількість

s : real|; // сума

mes|: string|[255]; // повідомлення|сполучення|

begin|

cena| := StrToFloat| (Form1|.Edit1.Text);

kol| := StrToInt|(Form1|.Edit2.Text);

s := cena| * kol|;

if| s > 500 then|

begin|

s := s * 0.9;

mes| := 'Надається знижка 10%' + #13|;

end|;

mes| := mes+| 'Вартість покупки|купівлі|: '+ FloatToStrF|(s,ffFixed,4,2|)+' руб|.';

Form1|.Label3.Caption := mes|;

end|;

Структура функції

Функція починається із заголовка, за яким слідують|прямують| розділи оголошення констант, типів і змінних, а також розділ інструкцій.

Оголошення функції в загальному|спільному| вигляді|виді| виглядає таким чином:

procedure| Ім'я (Список параметрів) : Тип;

const| // початок розділу оголошення констант

type| // початок розділу оголошення типів

var| // початок розділу оголошення змінних

begin| // початок розділу інструкцій

result| := Значення; // пов'язати з ім'ям функції значення

end|;

Заголовок функції розпочинається словом function, за яким слідує ім'я функції. Після імені функції в дужках наводиться список параметрів, за яким через двокрапку указується тип значення, повертаного функцією (тип функції). Завершується заголовок функції символом "крапка з комою".

За заголовком функції слідують розділи оголошення констант, типів і змінних.

У розділі інструкцій окрім змінних, перерахованих в розділі опису змінних, можна використовувати змінну result. Після закінчення виконання інструкцій функції значення цієї змінної стає значенням функції. Тому серед інструкцій функції обов'язково має бути інструкція, що привласнює змінною result значення. Як правило, ця інструкція є останньою виконуваною інструкцією функції.

Нижче, як приклад, приведена функція FuntToKg, яка перераховує вагу із фунтів - в кілограми:

// Перерахунок ваги з|із| фунтів|фунт-атомів| в кілограми

function| FuntToKg|(f:real|):real;

const| К=0.4095; // у Росії 1 фунт|фунт-атом| рівний 409,5 гр. коэф|. Перерахунку

begin|

result| := f * K;

end|;

Процедура – частина програми, що має власне ім'я і призначена для виконання послідовності команд допоміжного алгоритму.

Згадка імені процедури в коді називається її викликом. Якщо процедура має параметри виклику, то вони перераховуються в круглих дужках після імені. При виклику виконання поточної черговості дій припиняється, і управління процесом передається процедурі. Коли команди процедури будуть повністю відпрацьовані, управління повертається основній програмі: до оператора, що стоїть безпосередньо після імені процедури.

Опис процедури в програмі проводиться перед операторною частиною Begin..End. Заголовок складається із зарезервованого слова Procedure і ідентифікатора імені. Далі йде виконавчий блок, аналогічний по структурі головній програмі. Завершується процедура крапкою з комою: «;».

У модулі процедури розташовуються в розділі реалізацій – Implementation (2), з обов'язковим попереднім оголошенням свого імені в розділі описів (1).

Приклад|зразок|

unit Unit1;

interface|

uses|

Windows|, Messages|, SysUtils|, Variants|, Classes|, Graphics|, Controls|, Forms|

Dialogs|, StdCtrls|, Buttons|;

type|

TForm1 = class(TForm)

BitBtn1|: TBitBtn|;

procedure BitBtn1Click(Sender: TObject);

private |{ Private| declarations| }

public| { Public| declarations| }

end;

var|

Form1|: TForm1|;

implementation|

{ $R *.dfm}

p rocedure TForm1.BitBtn1Click(Sender: TObject);

begin|

Close|;

end;end.

При описі процедури до ідентифікатора імені можуть додаватися формальні параметри-значення, записані в круглих дужках.

Формальні параметри звернення|звертання| вказуються|вказують| у разі|в разі| використання даних, передаваних процедурі як інформаційні установки для її алгоритму дій, і є оголошенням типу|типа| даних.

Виклик процедури, що має формальні параметри, здійснюється з вказівкою фактичних параметрів, дотримуючи строгу відповідність порядку проходження і заданого типу формальних параметрів, тобто по конкретних значеннях даних, що задаються.

Приклад|зразок|

// процедура малювання годинника:

procedure TForm1.Clock(clhour,clmin,clsec : TColor); {оголошуємо в імені процедури формальні параметри: змінні, «відповідальні» за колір стрілок годинника, перераховуючи їх в круглих дужках з вказівкою типу через двокрапку }

begin|

with Form1.Canvas do

begin| {формальний параметр використовується в коді алгоритму процедури.При виклику процедури Clock замість нього підставлятиметься значення відповідного фактичного параметра}

Pen.Color:=clhour; // задаємо колір олівця перед малюванням годинникової стрілки

MoveTo(cx,cy); // переміщаємося в центр циферблату

Pen.Width:=3; // задаємо товщину ліній

LineTo(cx+Round(hl*sin(ha)), cy-Round(hl*cos(ha))); // креслимо лінію

MoveTo|(cx,cy|);

Pen.Width:=2; // хвилинна стрілка

LineTo|(cx+Round|(ml*sin|(ma|))cy-Round|(ml*cos|(ma|)));

MoveTo|(cx,cy|);

Pen.Color:=clSec; // секундна стрілка

Pen.Width:=1;

LineTo|(cx+Round|(sl*sin|(sa|)), cy-Round|(sl*cos|(sa|)));

end; end;

{блок процедури таймера виконується періодично з|із| частотою властивості Interval| таймера (задаємо 1 раз в секунду)}

procedure TForm1.Timer1Timer(Sender: TObject);

begin // викликаємо|спричиняємо| процедуру Clock| з|із| вказівкою фактичних параметрів:

Clock(clWhite,clWhite,clWhite); // «стираємо» стрілки, малюючи білим

DecodeTime(Time,h,m,s,ms); // визначуваний наступне значення часу

ha:=(h mod 12) /12*(2*Pi)+(m div 12)/60*(2*Pi);

ma:=m/60*(2*Pi);

sa:=s/60*(2*Pi);

Clock(clBlue,clBlue,clSilver); // малюємо нове положення стрілок заданими кольорами

end;

Функція відрізняється від процедури тим, що результат її роботи повертається у вигляді конкретного значення цієї функції (окрім файлового типу), що типізується, яке можна використовувати в операторах виразів разом з іншими операндами. Відповідно при описі функції обов'язково указується її тип.

Формат заголовка: Function <ім'я>(формальні параметри) : <тип результату>;

Формальні параметри можуть бути відсутніми.

Delphi| в своєму складі має багату бібліотеку програмних заготовок - ряд|лава| вбудованих стандартних процедур і функцій, а також середовище|середа| допускає прямий виклик функцій WINAPI|. При їх використанні не потрібний попередній опис, всі необхідні параметри виклику визначені в довідковій літературі.

Індивідуалізовані|індивідуалізуватися| застосування, що включають нестандартні процедури (призначені для користувача підпрограми) програміст розробляє самостійно.