При записи алгоритма на алгоритмическом языке высокого уровня (в том числе и на ТР) пользователю предоставляется возможность создавать в рамках разрабатываемой программы свои собственные операторы (процедуры) и операции (функции).
Процедуры и функции (подпрограммы) представляют собой записи на алгоритмическом языке частей алгоритма (подалгоритмов). В разделе описаний процедур и функций секции описаний программы помещаются тексты описания процедур и функций, в секции действий программы осуществляется обращение к процедурам и функциям программы (вызов процедур и функций).
Тексты описания подпрограмм устроены так же, как и сами программы – начинается описание с заголовка, затем идет секция описаний подпрограммы, затем секция действий подпрограммы. Причем в секции описаний подпрограммы могут быть описаны свои подпрограммы, обращение к которым осуществляется в секции действий подпрограммы. Поэтому было бы правильнее говорить не о программах и подпрограммах, а о вызывающих и вызываемых подпрограммах.
procedure <имя>(<формальные параметры>);{заголовок процедуры}
<секция описаний процедуры>
begin
<секция действий процедуры>
end;
function <имя>(<формальные параметры>):<тип>;{заголовок функции}
<секция описаний функции>
begin
<секция действий функции>
end;
Заголовок подпрограммы служит для организации обмена данными (параметрами) между программой и подпрограммой (исходные данные для работы подпрограммы и результаты работы подпрограммы). В функции один из результатов работы подпрограммы приписывается ее имени, тип результата (и функции) – <тип> – указывается в заголовке. В качестве типа <тип> может использоваться любой простой, строковой или ссылочный. В секции описаний подпрограммы приводятся описания локальных (внутренних) меток, констант, типов данных, переменных и подпрограмм, в секции действий подпрограммы записывается алгоритм работы подпрограммы. При обращении к подпрограмме указывается ее имя и фактические параметры.
Формальные параметры представляют собой список через «точку с запятой» предложений вида:
[var/const]<список переменных>:<имя типа>
Необязательные параметры var и const указывают способ передачи данных. Ключевое слово var означает, что данные передаются по адресу. Такие данные называются параметрами-переменными. Ключевое слово const означает, что данные передаются по адресу, но с защитой от изменения их значений. Такие данные называются параметрами-константами. Если перед списком переменных ключевое слово отсутствует, то данные передаются по значению. Такие параметры называются параметрами-значениями.
Обращение к подпрограммам осуществляется по следующей схеме:
Вызов процедуры (как самостоятельного оператора):
<имя>(<список фактических параметров>)
Вызов функции (в выражении, где допустим тип функции):
…<имя>(<список фактических параметров>)…
В качестве фактических параметров могут использоваться переменные, константы, выражения, в зависимости от способа передачи данных.
Тип передачи
| Ключевое слово
| Фактический параметр
|
По значению
| -
| Любые выражения соответствующего типа
|
По адресу
| var
| Имена переменных
|
По адресу
| const
| Любые выражения соответствующего типа
|
Между формальными (в описании подпрограммы) и фактическими (при обращении к подпрограмме) параметрами должно быть согласование по количеству, типам и порядку следования. (!)
Интерпретируя подпрограммы как подалгоритмы, можно считать параметры-значения исходными данными подалгоритма, а параметры-переменные результатами работы подалгоритма. Под параметры-значения подпрограммы отводится память в подпрограмме, в которую заносятся значения фактических параметров при вызове подпрограммы. Все действия подпрограммы над параметрами-переменными осуществляются непосредственно над переменными, являющимися фактическими параметрами. Поэтому значения, полученные параметрами-переменными в подпрограмме, будут доступны в вызывающей программе.
Параметры-константы целесообразно использовать в случаях, если требуется передавать структуры данных, занимающие большой размер памяти, но изменять исходные значения параметров с алгоритмической точки зрения недопустимо. В результате экономно используется оперативная память и одновременно гарантируется целостность исходных данных.
Вот примеры использования подпрограмм (процедур и функций) в Паскале:
1. Программа вычисляет величину y=max(min(x1,x2,x3),max(min(x3,x5,x4),x4))
program minmax;
var y,x1,x2,x3,x4,x5:real;
function max(a,b:real):real;
begin if a>b then max:=a else max:=b end;
function min(a,b:real):real;
begin if a<b then min:=a else min:=b end;
begin
readln(x1,x2,x3,x4,x5);
y:=max(min(x1,min(x2,x3)),max(min(x3,min(x5,x4)),x4));
writeln(y)
end.
Обратите внимание на порядок обращений к подпрограммам!
2. Программа подсчитывает количество символов ‘A’,’B’ и ‘C’ в введенной пользователем строке:
program ABC;
var s:string; i:integer;
procedure kolABC(s:string; var kolA,kolB,kolC:integer);
begin
kolA:=0; kolB:=0; kolC:=0;
for i:=1 to length(s) do
case s[i] do
‘A’: kolA:=kola+1;
‘B’: kolB:=kolB+1;
‘C’: kolC:=kolC+1;
end;
end;
begin
readln(s);
kolABC(s,kolA,kolB,kolC);
writeln(kolA,kolB,kolC);
end.
Функция ввода данного типа integer с защитой:
function enter_integer(s:string):integer;
var i,n:integer;
begin
repeat
readln(s);
val(s,n,i);
if i=0 then enter_integer:=n
until i=0;
end;