procedure< имя > (< список формальных параметров >); Label const type var function procedure begin …… end; |
Список параметров в заголовке функций и процедур обеспечивает связь подпрограммы с вызывающей их программой. Через него в подпрограмму передаются исходные данные и возвращается результат.
Список формальных параметров в общем случае включает:
1) параметры-значения, которые приводятся без каких-либо ключевых слов:
(…; q1, …, qn: T1; …;p1, …, pm: Tk; …)
2) параметры-константы, которые записываются после ключевого слова const:
(…; const q1, …, qn: T1; …; const p1, …, pm: Tk; …)
3) параметры-переменные, которые приводятся с ключевым словом var:
(…; var q1, …, qn: T1; …; var p1, …, pm: Tk; …)
Здесь qi, pi – формальные параметры; Ti – типы формальных параметров.
Формальные параметры можно указывать в любом порядке, при этом параметры одного типа не обязательно группировать в одном месте. Операторы тела подпрограммы рассматривают их как своеобразное расширение раздела описаний: все переменные из этого списка могут использоваться в любых выражениях внутри подпрограммы.
Обращение к функции осуществляется подстановкой ее имени в выражение оператора присваивания вызывающей программы (подпрограммы) с указанием в скобках через запятую фактических параметров. В отличие от функций обращение к процедуре производится как к отдельному оператору с помощью записи имени с фактическими параметрами. При этом фактические параметры должны соответствовать формальным по количеству, типу и месту расположения в заголовке подпрограммы, т.е. фактические параметры следует записывать в той же последовательности, что и формальные.
В качестве фактических параметров-значений и параметров-констант можно применять любые выражения, в простейшем случае – переменные или константы различных типов, а в качестве фактических параметров-переменных – переменные любых типов, кроме констант. Параметры-значения и параметры-константы используются для передачи входных, а параметры-переменные – выходных данных подпрограммы.
Тип формального параметра должен определяться одним идентификатором. Поэтому если параметром подпрограммы является массив, то перед описанием подпрограммы необходимо дать определение типа массива. Например,
const N = 10;
type matrix = array [1.. N, 1.. N] of real;
.................................
procedure EX (a, b: matrix; var c: matrix);
Аналогично если возникает необходимость описать в заголовке подпрограммы как формальный параметр процедуру или функцию, то последние должны быть типизированы. Например,
type yOFx = function (x: real): real;
.............................
function Integral (a, b: real; y: yOFx; N: word): real;
При этом вызываемая функция оформляется в виде подпрограммы с директивой far, которая записывается после ее заголовка, в частности в рассмотренном примере:
function F (z: real): real; far;
Имена, объявленные в вызывающей программе (подпрограмме), являются глобальными по отношению к вызываемой подпрограмме, т.е. они могут использоваться в теле последней и соответственно изменять свои значения. Это, по существу, дополнительный способ передачи результатов из подпрограммы. В предельном варианте подпрограмма может быть организована без параметров, т.е. подпрограмма будет связана с программой посредством глобальных имен.
Имена, объявленные в заголовке подпрограммы и в разделе описаний, являются локальными. Они не должны совпадать с именем самой подпрограммы. Доступ к ним из других программ и подпрограмм невозможен. При совпадении локальных и глобальных имен локальные определения в пределах своего действия отменяют действие глобальных (блокируют их).
Примером взаимодействия подпрограмм может служить структура программы, приведенная на рис. 7.1.
Рис. 7.1. Программа с вложенной структурой подпрограмм
Здесь из основной программы можно обратиться к подпрограммам P и Q, но нельзя вызвать ни одну из вложенных в них подпрограмм P1, P2, Q1.
При входе в подпрограмму низшего уровня доступными становятся не только объявленные в ней имена, но и сохраняется доступ ко всем переменным (именам) верхнего уровня. Например, из подпрограммы Q21 можно вызвать подпрограмму P и Q1, использовать имена, объявленные в основной программе и подпрограммах Q и Q2.
Локализация переменных делает подпрограмму независимой от основной программы. Общение между ними, как правило, должно идти через список параметров подпрограммы, что придает последней необходимую гибкость, поэтому в соответствии с требованиями хорошего стиля программирования рекомендуется там, где это возможно, использовать передачу результатов через фактические параметры-переменные.
Для досрочного выхода из подпрограммы предусмотрена стандартная процедура exit.
В ТР возможен рекурсивный вызов процедур или функций. Это делает программу иногда изящной, но, как правило, ненадежной из-за зацикливания программы и переполнения стека. Поэтому на практике рекурсия заменяется итерацией, что в большинстве случаев выполнимо.
Пример. Составить программу для вычисления значения z: , где при заданных значениях a и b.
Вычисление th(х) можно оформить в виде функции:
Program Th_1;
Uses Printer;
Var z,a,b,t1,t2,t3:real;
{вычисление th с помощью функции}
Function th(x:real):real;
var c:real;
Begin
c:=exp(2*x);
th:=(c-1)/(c+1);
end;
BEGIN
writeln('Введите переменные:');
write('a='); readln(a);
write('b='); readln(b);
t1:=sqr(th(a)); {обращения к функции th}
t2:=th(a-b);
t3:=sqrt(th(a*a-b*b));
z:=(t1+t2)/t3;
writeln(Lst, 'z=',z:12, ' при a=',a:4:1,
' и b=',b:4:1);
END.
При оформлении вычисления th(x) в виде процедуры программа будет иметь следующий вид:
Program Th_2;
Uses Printer;
Var z,a,b,y1,y2,y3:real;
{вычисление th с помощью процедуры}
Procedure th(x:real;var y:real);
var c:real;
Begin
c:=exp(2*x);
y:=(c-1)/(c+1);
end;
BEGIN
writeln('Введите переменные:');
write('a='); readln(a);
write('b='); readln(b);
th(a,y1); {обращения к процедуре th}
th(a-b,y2);
th(a*a-b*b,y3);
z:=(sqr(y1)+y2)/sqrt(y3);
writeln(Lst, 'z=',z:12, ' при a=',a:4:1,
' и b=',b:4:1);
END.
Date: 2016-02-19; view: 361; Нарушение авторских прав