Подпрограмма самостоятельный фрагмент программы, реализующий определенный алгоритм и допускающий многократное обращение к нему из различных частей программы.
В языке Турбо-Паскаль существует большой набор стандартных (библиотечных) процедур и функций. Процедуры и функции содержатся в стандартных модулях и подключаются к любой программе либо с помощью предложения 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('Mассив ',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.
Результаты работы программы:
Mассив a
-2.1 3.1 -2.4 5.6 5.4 -6.7 3.5 -3.6
Mассив b
2.3 -4.3 2.1 2.5 -3.7 -5.6 4.6 3.5 -7.5
Mассив 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