Підпрограма самостійний фрагмент програми, що реалізує певний алгоритм і допускає багатократне звернення до нього з різних частин програми.
У мовою Турбо-Паскаль існує великий набір стандартних (бібліотечних) процедур і функцій. Процедури та функції містяться в стандартних модулях і підключаються до будь-якої програми або з допомогою пропозиції Uses (наприклад: CRT, GRAPH та ін.) або автоматично (наприклад, System).
Принципи гарного стилю програмування вимагають широке використання власних підпрограм, які утворюються і використовуються також як і бібліотечні.
Застосування підпрограм дозволяє використовувати сучасні технології конструювання програм: структурний, модульне, об'єктне. А також використовувати сучасні методи проектування т.зв. спадний проектування. При цьому складна задача розбивається на ряд підзадач, для кожної з яких складається набір підпрограм, з яких компонується загальна програма.
Мова Турбо-Паскаль містить два типи підпрограм:
- Процедури.
- Далі.
Процедури в Паскале
Структура процедури аналогічна структурі програми і складається із заголовка і блоку (тіла процедури).
PROCEDURE <ім'я>(<сп. форм. пар.>);
<блок>
де
PROCEDURE - зарезервоване слово процедура;
<ім'я> - ім'я процедури, є унікальним, вибирається за загальним пра-
вил, бажано щоб воно відображало сенс процедури;
<сп. форм. пар.> - список формальних параметрів тобто список імен обозначаю-
провідних вихідні дані і результат роботи процедури з вказівкою ві-
їм їх типів;
<блок> - тіло процедури є розділи описів і розділ
операторів, що представляє складовою оператор (сукупність
операторів, укладених в операторні дужки BEGIN END
пРазделы описів процедури містять ті ж розділи що й основна програма, в тому числі описания підпрограм нижчого рівня (вкладених).
Глобальні об'єкти - це об'єкти, описані в розділах описів основною програмою. Областю їх дії є програма і все, що в ній містяться підпрограми.
Локальні об ’ єкти - це об'єкти, описані в розділах описів підпрограми. Областю їх дії є підпрограма і все що містяться в ній підпрограми нижчого рівня.
Локальні описания скасовують глобальні.
Оператор виклику процедури активізує процедуру.
Він має вигляд:
<ім'я>(<сп. факт. пар.>);
де:
<ім'я> - ім'я процедури;
<сп. факт. пар.> - список фактичних параметрів.
Це список конкретних значень, імен і виразів подставляемых замість формальних параметрів і переданих в підпрограму, а так само що повертаються результати обробки.
Список фактичних параметрів може бути відсутніми.
Між формальними і фактичними параметрами існує взаємно - однозначна відповідність за кількістю, порядку проходження і типу.
Види параметрів у Паскале
Розрізняють чотири види параметрів:
параметри - значення;
параметри - змінні;
параметри - процедури;
- параметри - функції.
Параметри - значення - використовуються для передачі вихідних даних в підпрограму. Формальні параметри при цьому записуються через кому із зазначенням їх типів. Вони отримують значення фактичних параметрів, але не можуть передавати свої значення фактичним параметрами.
Параметри - змінні - грають роль як вхідних, вихідних (компенсації) параметрів процедури. У списку формальних параметрів вони перераховуються після слова Var зі вказівкою їх типів.
Параметри - процедури - зазначаються після слова Procedure.
Параметри - функції - . зазначаються після слова Function.
Опції в Паскале
Структура опису та механізм використання функції аналогічний процедури з урахуванням деяких особливостей. Опис складається із заголовка і блоку (тіла функції).
FUNCTION <ім'я>(<сп. форм. пар.>):<тип>;
<блок>;
де: FUNCTION - зарезервоване слово функція;
<ім'я> - ім'я функції, є унікальним, вибирається за загальними правилами, бажано щоб воно відображало зміст функції;
<сп. форм. пар.> - список формальних параметрів тобто список імен позначають вихідні дані функції із зазначенням їх типів;
<тип> - тип результату повертається функцією і що отримується імені
функції;
<блок> - тіло процедури є розділи описів і розділ
операторів, що представляє складовою оператор (сукупність операторів, укладених в операторні дужки BEGIN END).
Розділи описів функції містять ті ж розділи що й основна програма, в тому числі описания підпрограм нижчого рівня (вкладених).
У змістовній частині функції її імені повинен бути присвоєний результат роботи функції.
Виклик функції являє собою операнд (покажчик функції) у відмінності від процедури звернення до якої представляє оператор.
Він має вигляд:
<ім'я>(<сп. факт. пар.>);
де:
<ім'я> - ім'я функції (курсор);
<сп. факт. пар.> - список фактичних параметрів.
це список конкретних значень, імен і виразів подставляемых замість формальних параметрів і передачі у функцію.
Відміну від процедури функції
- Функція на відміну від процедури возвращает Єдине скалярний значення
- Результат обчислення функції присвоюється імені, а процедурі входить в список параметрів.
- Ім'я функції має тип.
- Звернення до функції представляє операнд, а процедури оператор.
Приклад 14.1. У файлі inp.txt розташовані три масиву запакованих чисел
-2.1 3.1-2.4 5.6 5.4-6.7 3.5-3.6
2.3-4.3 2.1 2.5-3.7-5.6 4.6 3.5-7.5
-2.1 4.3-2.3 7.6 4.5-8.9 5.7-4.5 6.8-5.8
Знайти функцію
де Max_a, Max_b, Max_c, Sa, Sb, Sc, ka, kb, kc - максимальний елемент, сума і кількість позитивних елементів відповідних масивів a, b, c.
вивести Результат у файл out.txt і на екран.
Текст програми
Program pp;
Uses CRT;
Const n=10;
Type vec=array[1..n] of real;
Var
a,b,c :vec;
y,sa,sb,sc :real;
ka,kb,kc :byte;
i :integer;
f1,f2 :text;
Procedure Vv(s:char; num:byte;Var z:vec);
Begin
Writeln("Масив ",s);
For i:=1 to num do
Begin
Read(f1,z[i]); Write(z[i]:4:1," ":3);
End;
Readln(f1); Writeln;
End;
Procedure SK1(z:vec;num:byte; Var s:real; Var k:byte);
Begin
s:=0;=k:0;
for i:=1 to num do if z[i]>0 then
Begin
s:=s+z[i]; k:=k+1
End;
End;
Function MAX(z:vec;num:byte):real;
Var m :real;
Begin
m:=z[1];
for i:=1 to num do if z[i]>m then m:=z[i];
MAX:=m
End;
Begin
clrscr;
Assign(f1,"inp.txt"); Reset(f1);
Assign(f2,"out.txt"); Rewrite(f2);
Vv("a",8,a); Vv("b",9,b); Vv("c",n,c);
SK1(a,8,sa,ka); SK1(b,9,sb,kb); SK1(c,n,sc,kc);
y:=(MAX(a,8)+MAX(b,9)+MAX(c,n))+(sa+sb+sc+ka+kb+kc);
Writeln("Підсумок:":20);
Write ("Масив : ");
Writeln("sa=",sa:5:1," ka=",ka);
Write ("Масив b: ");
Writeln("sb=",sb:5:1," kb=",kb);
Write ("Масив c: ");
Writeln("sc=",sc:5:1," kc=",kc);
Writeln(" ":10,"y=",y:10);
Readln;
Writeln(f2," ":10,"y=",y:10);
Close(f1); Close(f2)
End.
Результати роботи програми:
Масив a
-2.1 3.1-2.4 5.6 5.4-6.7 3.5-3.6
Масив b
2.3-4.3 2.1 2.5-3.7-5.6 4.6 3.5-7.5
Масив c
-2.1 4.3-2.3 7.6 4.5-8.9 5.7-4.5 6.8-5.8
Результат:
Масив а : sa= 17.6 ka=4
Масив b: sb= 15.0 kb=5
Масив c: sc= 28.9 kc=5
y= 9.330E+01