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

Для розроблення добре структурованих програм використовуються підпрограми. Підпрограма це іменована, спеціально оформлена, логічно завершена група операторів, призначених для виконання певних дій. Підпрограму можна викликати за іменем з будь-якої точки програми будь-яку кількість разів. Концепція підпрограм у Object Pascal реалізована за допомогою процедур і функцій.

Структура процедур і функцій. Процедури і функції мають таку структуру:

 

Procedure <ім’я процедури > [(<формальні параметри >)]; [<директива >];

Опис локальних міток, констант, типів і змінних

Опис внутрішніх процедур і функцій

Оператори

Function <ім’я функції > [(<формальні параметри >)]: <тип результату>; [<директива >];

Опис локальних міток, констант, типів і змінних

Опис внутрішніх процедур і функцій

Оператори

 

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

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

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

За заголовком підпрограми може йти одна із стандартних директив:

ASSEMBLER – тіло підпрограми із команд вбудованого асемблера.

EXTERNAL – зовнішня підпрограма.

FAR – код підпрограми, розрахований на модель далекого (міжсегментного) виклику. За замовчуванням використовується модель близького виклику (в межах одного сегмента) – NEAR.

FORWARD – опис підпрограми з випередженням. Описується заголовок, а опис підпрограми розміщується після тексту програми (підпрограми), в якій є звернення до цієї програми.

INLINE – тіло підпрограми із вбудованих машинних команд.

INTERRUPT – процедура обробки переривань.

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

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

Function Func (v,w: integer; x,y,z: double): double;

Передача цих параметрів здійснюється за значенням. При зверненні до підпрограми

Func (5, t, 2+sin (a), sqr (b), -17.2);

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

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

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

Нетипізовані параметри.Це параметри, які описуютьсяза допомогою ключових слів Var або Const, за яким йде список параметрів, а тип даних не вказується. У підпрограмі тип таких параметрів невідомий, тому програміст повинен сам турбуватися про правильну інтерпретацію даних, що передаються. Звичайно це параметри, що передаються за посиланням.

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

Function Func (Mas: array of integer): real;

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

Func ([5, 6, 9, -7, 14]);

Параметри за замовчуванням.Параметри за замовчуванням мають вигляд <ім’я>:<тип>=<значення> і розміщуються в кінці списку формальних параметрів.

Procedure Proc (mas: array of integer; k: integer=1; s: string=’’; a: real=0);

При зверненні до підпрограми параметри за замовчуванням можуть не задаватися. Встановлене за замовчуванням значення параметра можна змінити. Якщо змінюється значення деякого параметра за замовчуванням, то при зверненні до підпрограми потрібно також задавати всі параметри, що йому передують Proc (a, 1, ’Рядок’); тобто при зміні параметра s також задається значення параметра k.

Типом будь-якого параметра в списку формальних параметрів може бути тільки стандартний або раніше описаний тип. Тому при передачі у підпрограму структурованих типів даних – масивів, множин, записів, коротких символьних рядків потрібно описувати їх тип. Наприклад:

 

TYPE Ta=array[1..10] of integer;

Ts=string[15];

Tf= string[30];

Procedure Ks (var a: Ta);

Function St ( s:Ts): Tf;

 

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

Значення поліномів будемо обчислювати за схемою Горнера

.

 

Для розв’язку задачі командою File|New Application створимо новий проект. Присвоїмо формі заголовок Обчислення поліномів (властивість Caption). Командою File|Save All запишемо програмний модуль у файл з іменем ULAB8_1.pas, а проект – PLAB8_1.dpr.

Розробимо форму для введення початкових даних і виведення результату Рис.8.1.

Для введення початкових даних і виведення результату розмістимо на формі чотири компоненти Edit та два компоненти StringGrid для введення матриці і виведення таблиці результатів.

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

Обробники кнопок Введення n, Обчислення містяться у програмному модулі ULAB8_1.

 

 

Рис. 8.1 Форма Обчислення поліномів

 

Unit ULAB8_1;

............. .

implementation

 

{$R *.DFM}

 

var n:integer;

 

{Обробник кнопки Введення n}

procedure TForm1.Button1Click(Sender: TObject);

begin

if edit1.Text=''then ShowMessage('Введіть n')

else begin n:=strtoint(Edit1.Text);

if (n<0)or(n>15)then ShowMessage('Недопустиме n')

else begin

StringGrid1.RowCount:=n;

StringGrid1.ColCount:=n;

StringGrid2.Cells[0,0]:=' x';

StringGrid2.Cells[1,0]:=' Bn-1(x)';

StringGrid2.Cells[2,0]:=' Cn-1(x)';

StringGrid2.RowCount:=20;

end;

end;

end;

 

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

procedure TForm1.Button2Click(Sender: TObject);

{Ідентифікатори типу для опису формальних}

{ параметрів у процедурі і функції}

 

TYPE Ta=array[0..15,0..15] of real;

Tbc=array[0..15] of real;

VAR a: Ta;

b, c: Tbc;

x: real;

i, j: integer;

v1, v2, h: real;

{Процедура обчислення коефіцієнтів поліномів}

Procedure Kf (n: integer; m: Ta; var kb, kc: Tbc);

var i, j:integer;

begin

for i:=0 to n-1 do

begin kb[i]:=m[i,0]; kc[i]:=m[i,0];

for j:=0 to n-1 do

begin

if kb[i] > m[i, j] then kb[i]:=m[i,j];

if kc[i] < m[i, j] then kc[i]:=m[i,j];

end;

end;

end;

{Функція обчислення значень полінома}

Function Pol ( n:integer; x: real; kf: Tbc): real;

var i: integer;

p: real;

begin

p:=kf[0];

for i:=1 to n-1 do

p:=p*x+kf[i];

Pol:=p;

end;

begin

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

v1:=StrToFloat(Edit2.Text);

v2:=StrToFloat(Edit3.Text);

h:=StrToFloat(Edit4.Text);

for i:=0 to n-1 do

for j:=0 to n-1 do

a[i,j]:=StrToInt(StringGrid1.Cells[j,i]);

{Обчислення коефіцієнтів поліномів}

Kf (n, a, b, c);

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

i:=1;x:=v1;

while x<=v2 do

begin

StringGrid2.Cells[0,i]:=FloatToStr(x);

StringGrid2.Cells[1,i]:=FloatTostr(Pol( n, x, b));

StringGrid2.Cells[2,i]:=FloatTostr(Pol( n, x, c));

i:=i+1;

x:=x+h;

end;

end;

еще рефераты
Еще работы по информатике