Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 7 Процедуры и функции.doc
Скачиваний:
6
Добавлен:
08.11.2019
Размер:
117.76 Кб
Скачать

I:byte; mas1:at3; mas2:at5;

FUNCTION SUM(A:ARRAY OF REAL):REAL;

VAR

S:REAL; K:BYTE;

BEGIN

S:=0;

FOR K:=0 TO high(A) DO S:=S+A[K];

SUM:=S;

END;

BEGIN {основная программа}

FOR I:=1 TO C1 DO

BEGIN

WRITE ('введите ',I,

'-ый элемент первого массива : ');

READLN (MAS1[I]);

END;

WRITELN ('Сумма элементов массива = ',

SUM(MAS1));

FOR I:=1 TO C2 DO

BEGIN

WRITE ('введите ',I,'-ый элемент второго

массива : ');

READLN (MAS2[I]);

END;

WRITELN ('Сумма элементов массива = ‘,

SUM(MAS2));

END.

Любая программа, процедура или функция представляют собой блок со своей областью описаний. Внутри этого блока могут содержаться описания других процедур и функций, а также обращения к ним. В них в свою очередь могут содержаться описания иных процедур и т.д. Блок, содержащий в своем разделе описаний другой блок (процедуру или функцию) называется внешним по отношению к нему, а тот – внутренним или подблоком.

Объекты, описанные внутри какого-то подблока, являются по отношению к внешнему блоку локальными и недоступны внешним блокам, т.е. на них можно ссылаться только внутри блока, в котором они описаны.

Объекты, описанные в некотором внешнем блоке, доступны и могут использоваться во всех его подблоках и называются глобальными. Под этими объектами понимаются метки и имена констант, типов, переменных, процедур и функций.

PROGRAM PR1; {Блок 1}

VAR

A, B, C : REAL;

BEGIN

END.

PROCEDURE PR2; {Блок 2}

VAR

X, Y, Z : REAL;

BEGIN

END;

PROCEDURE PR3; {Блок 3}

VAR

I, J, K: REAL;

BEGIN

END;

Параметры I, J, K являются локальными по отношению к блоку 3. Они доступны только внутри процедуры PR3 и недоступны в блоках 2 и 1. Переменные X, Y, Z доступны в блоках 2 и 3 и недоступны в блоке 1. При этом по отношению к процедуре PR2 они являются локальными, а по отношению к процедуре PR3 – глобальными. Переменные А, В, С доступны во всех блоках и являются глобальными в блоках 2 и 3.

Возможны ситуации, когда имя локальной переменной в какой-то процедуре совпадает с именем глобальной переменной из внешнего блока

PROGRAM PR1; {Блок 1}

VAR

A, B, C : REAL;

BEGIN

END.

PROCEDURE PR2; {Блок 2}

VAR

X, Y, Z, A : REAL;

BEGIN

END;

PROCEDURE PR3; {Блок 3}

VAR

I, J, K : REAL;

BEGIN

END;

Имя переменной А, описанной в блоке 2 совпадает с именем глобальной переменной, описанной в блоке 1. В этом случае глобальная переменная А становится недоступна в блоках 2 и 3. Локальная переменная А из блока 2 как бы закрывает собой глобальную переменную А из блока 1. Следует иметь в виду, что это совершенно разные переменные. Любые изменения локальной переменной А никак не отразятся на значении глобальной переменной А из блока 1.

Рекомендуется во избежание путаницы выбирать имена локальных и глобальных переменных так, чтобы они не совпадали. Имена формальных и фактических параметров процедуры могут совпадать, но целесообразно выбирать их также различными, что делает программу более читаемой.

Рассмотрим пример программы, в которой вещественное число x возводится в целую степень n, причем это вычисление организуем с помощью процедуры, в которую передадим исходные параметры-значения b и m, а результат запишем в параметр-переменную a.

program proc1;

var

y,x:real;

n:byte;

procedure step1(var a:real; b:real; m:byte);

var

k:byte;

begin

a:=1;

for k:=1 to m do a:=a*b;

end;

begin {Основная программа}

write('Введите вещественное число x=');

readln(x);

write('Введите целое число n=');

readln(n);

step1(y,x,n);

writeln('x^n=',y);

end.

Рассмотрим модификацию этой программы, в которой передачу данных осуществим через глобальные параметры.

program proc2;

var

y,x:real;

n:byte;

procedure step2;

var

k:byte;

begin

y:=1;

for k:=1 to n do y:=y*x;

end;

begin {Основная программа}

write('Введите вещественное число x=');

readln(x);

write('Введите целое число n=');

readln(n);

step2;

writeln('x^n=',y);

end.

Рассмотрим пример решения этой же задачи с помощью функции.

program proc3;

var

y,x:real;

n:byte;

function step3(b:real; m:byte):real;

var

k:byte;

y:real;

begin

y:=1;

for k:=1 to n do y:=y*x;

step3:=y

end;

begin

write('Введите вещественное число x=');

readln(x);

write('Введите целое число n=');

readln(n);

writeln('x^n=',step3(x,n));

end.

В качестве формальных параметров допускается использовать имена процедур или функций. При вызове подпрограммы на место формальных параметров процедур или функций осуществляется подстановка имен соответствующих им фактических процедур или функций. При этом используется понятие процедурного типа, определяющего, какой вид подпрограммы (процедуру или функцию) можно использовать в качестве параметра и с какими параметрами, в свою очередь, должна быть эта подпрограмма. При объявлении процедурного типа указывается заголовок процедуры или функции, в котором опускается ее имя.

TYPE

PROC0=PROCEDURE;

PROC1=PROCEDURE(VAR X,Y);

PROC2=PROCEDURE(A,B:REAL; VAR Y:BYTE);

FUNC0=FUNCTION:INTEGER;

FUNC1=FUNCTION(S:REAL):REAL;

Установлены следующие правила использования подпрограмм в качестве параметров:

  • они не должны быть стандартными процедурами или функциями;

  • они не должны объявляться внутри других процедур или функций;

  • для установки правильных связей с между вызывающими и вызываемыми подпрограммами они должны иметь в заголовке опцию FAR, что определяет “дальнюю” модель вызова этих подпрограмм или функций;

  • процедура или функция может обращаться только к той процедуре или функции, описание которых располагается перед описанием вызывающей процедуры или функции.

PROGRAM FUNC;

CONST

N=10;

TYPE

MASSIV=ARRAY[1..N] OF REAL;

PROC=PROCEDURE(X0,XN,H:REAL;N:INTEGER;VAR F:MASSIV);

VAR

K:INTEGER;