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

X1,x2:real;

L,MM:INTEGER;

SP:BYTE;

D1,D2:WORD;

PROCEDURE SUMMA(X:REAL; N,K:INTEGER);

BEGIN

. . .

END;

PROCEDURE RIS(VAR X:REAL;Y,S:WORD;S2:BYTE);

BEGIN

. . .

END;

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

SUMMA (X1,L,MM);

RIS (X2,D1,D2,SP);

END.

При вызове процедуры формальный параметр-значение получает свое начальное значение путем копирования соответствующего ему фактического параметра во временную память. При изменении формального параметра-значения фактический параметр не меняется. На месте формального параметра-значения при вызове процедуры может стоять также выражение такого же типа:

SUMMA (X1+5.1,L,MM)

Если параметр процедуры определен как параметр-переменная, то при вызове процедуры ей передается сама переменная, а не её копия. Это повышает быстродействие работы процедуры и экономит память. Однако любые изменения этой переменной внутри процедуры приводят к изменению самого фактического параметра в вызывающей программе. Если параметр-переменная используется для передачи в вызывающую программу результатов работы процедуры, то это нормально. В остальных случаях целесообразно использовать параметры-значения и параметры-константы. Параметр-константа описывается в заголовке процедуры аналогично параметру-значению, но перед ним ставится служебное слово CONST. В этом случае копия исходных данных не создается, что позволяет экономить память. Таким способом часто пользуются для передачи в подпрограмму больших массивов данных.

PROCEDURE RIS(CONST X:REAL;Y,S:WORD);

Отсюда можно сделать выводы:

  • Передачу процедуре исходных данных для расчета следует производить через параметры-значения и параметры-константы.

  • Обмен данными между вызывающей программой и процедурой и обратно следует производить через параметры-переменные.

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

PROCEDURE S(A:ARRAY[1..10] OF REAL)

Чтобы в подпрограмму передать весь массив, следует первоначально описать его тип:

TYPE

AT=ARRAY[1..10] OF REAL;

PROCEDURE S(A:AT);

Т.к. строка является своеобразным одномерным массивом, то её передача в подпрограмму осуществляется аналогично:

TYPE

S15=STRING[15];

S20=STRING[20];

PROCEDURE S(A:S15;B:S20);

Пример

PROGRAM SUMMA;

CONST

C=5;

TYPE

AT=ARRAY[1..C] OF REAL;

VAR

MAS:AT;

I,nmas:byte;

FUNCTION SUM(CONST A:AT;C:BYTE):REAL;

VAR

S:REAL; K:BYTE;

BEGIN

S:=0;

FOR K:=1 TO C DO S:=S+A[K];

SUM:=S;

END;

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

FOR I:=1 TO C DO

BEGIN

WRITE (‘введите ‘,I,’-й элемент массива : ’);

READLN (MAS[I]);

END;

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

SUM(MAS,C))

END.

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

Пример

PROGRAM SUMMA;

CONST

C1=3; C2=5;

TYPE

AT3=ARRAY[1..C1] OF REAL;

AT5=ARRAY[1..C2] OF REAL;

VAR