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

9. Процедури і функції. Процедурні типи

Для організації передачі процедур і функцій як параметрів при зверненні до інших процедур і функцій введено процедурний тип. Існує два процедурних типи: тип-процедура і тип-функція. Для опису процедурного типу використовується заголовок процедури або функції, в якому опускається ім’я, наприклад:

TYPE Tproc = Procedure (a, b, c: double; var v, w: double );

TFun = Function ( x, y: double): double;

Function Sum( x, y: double): double; far;

Begin

Result:=x+y;

End;

VAR P: Tproc;

F: Tfun;

a, b, c, d, z: double;

BEGIN

writeln (‘Введіть a, b, c, d’);

readln (a, b, c, d);

F:=Sum;

z:=Sum(a, b) – F(c, d);

writeln (‘z=’,z);

END.

Із прикладу видно, що процедурній змінній P можна присвоювати як значення ім’я процедури, а змінній F ім’я функції. Після присвоєння ім’я змінної стає синонімом імені підпрограми і його можна використовувати для звернення до підпрограми.

Процедура або функція, яка присвоюється процедурній змінній, повинна транслюватися з дальнім переходом (з директивою FAR). Крім цього вона не може бути стандартною процедурою або функцією і не може бути локальною, тобто вкладеною.

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

Приклад. Розробити програму обчислення за формулою трапецій таблиці значень інтеграла

,

з точністю =0.00001 для , що змінюється на інтервалі з кроком =1.

Для розв’язання задачі командою File|New Application створимо новий проект. На екрані з’явиться чиста форма з заголовком Form1. Присвоїмо цій формі заголовок Caption = Обчислення інтегралів і програмне ім’я Name = FINT. Командою File|Save All запишемо програмний модуль під іменем ULAB9_1.pas, а проект – LAB9_1.dpr.

Розмістимо на цій формі шість компонентів Edit для введення початкових даних: меж інтегрування – a, b; точності обчислення інтеграла – e; меж і кроку зміни параметра t – . Присвоїмо цим компонентам програмні імена Edit1, Edit2, Edit3, Edit4, Edit5, Edit6, встановлені за замовчуванням (властивість Name) і очистимо їм значення властивості Text.

Для виведення результатів розмістимо на формі компонент Memo (багаторядковий редактор) і встановимо йому такі значення властивостей: Name = Memo1 (програмне ім’я), ScrolBars=ssBoth (горизонтальне і вертикальне прокручування). Двічі клацнувши мишкою у полі значення властивості Lines, ввійдемо в редактор і очистимо значення цієї властивості.

Пояснення до цих компонентів зробимо за допомогою компонента Label (властивість Caption).

Крім цього, розмістимо на формі дві керуючі кнопки (компонент Button) з написами Обчислити та Вихід (властивість Caption) і програмними іменами Button1, Button2 (властивість Name) (Рис. 9.1).

Для написання обробників кнопок Обчислити та Вихід розмістимо функції обчислення підінтегральної функції та обчислення інтеграла в окремому програмному модулі, не пов’язаному з формою, з іменем UINTEG.

Для створення модуля, не пов’язаного з формою, потрібно виконати команду File|New і у вікні діалогу вибрати значок з підписом Unit, на екрані з’явиться заготовка модуля, яку слід запам’ятати під іменем UINTEG.

Рис 9.1. Форма Обчислення інтегралів

Модуль UINTEG має вигляд:

unit UINTEG;

interface

{ Процедурний тип }

TYPE TFun = Function ( x: double; t:integer): double;

Function F1(x: double; t:integer): double;

Function Integral(a, b, e: double; t:integer; F: TFun): double;

implementation

{ Підінтегральна функція }

Function F1(x: double; t:integer): double; FAR;

var i:integer;

begin

Result:=1;

for i:=1 to t do

Result:=Result*x;

end;

{ Функція обчислення інтеграла}

Function Integral(a, b, e: double; t:integer; F: TFun): double;

Const n=10;

Var x, h, d, s2, s2n: double;

i, m: integer;

begin

m:=n;

repeat

h:=(b-a)/m;

s2n:=(F(a, t)+F(b, t))/2;

for i:=1 to m-1 do

begin

x:=a+i*h;

s2n:= s2n+F(x, t);

end;

s2n:= s2n*h;

if m=n then d:=e+1 else d:=abs(s2n-s2);

s2:=s2n; m:=m*2;

until d<e;

result:=s2n;

end;

end.

Тепер можна написати обробники кнопок Обчислити та Вихід. Для цього потрібно вибрати відповідну кнопку, перейти в Інспекторі Об’єктів на сторінку Evants та двічі клацнути лівою клавішею мишки в полі значення події OnClick. У результаті з’явиться шаблон, в який потрібно вписати текст обробника. Тексти обробників містяться у програмному модулі ULAB9_1.

{Обробник кнопки Обчислити}

procedure TFIN1.Button1Click(Sender: TObject);

VAR a, b, e: double;

t, t1, t2, h:integer;

i1: double;

BEGIN

{Введення початкових даних}

a:=StrToFloat(Edit1.Text);

b:=StrToFloat(Edit2.Text);

e:=StrToFloat(Edit3.Text);

t1:=StrToInt(Edit4.Text);

t2:=StrToInt(Edit5.Text);

h:=StrToInt(Edit6.Text);

t:=t1;

while (t<=t2) do

begin

{Обчислення інтеграла}

i1:= Integral(a, b, e, t, F1);

{Виведення результату}

Memo1.Lines.Add('t='+IntToStr(t)+' I='+FloatToStr(i1));

t:=t+h;

end;

end;

{Обробник кнопки Вихід}

procedure TFIN1.Button2Click(Sender: TObject);

begin

Close;

end;

Для завершення розробки проекту потрібно командою Project|Add to Project модуль UINTEG включити в проект і командою File|Use Unit підключити до головного модуля ULAB9_1. Тепер командою Run|Run проект можна запустити на виконання. Результат роботи програми приведений на Рис. 9.1.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]