Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Мет_Паскаль_5_6.doc
Скачиваний:
4
Добавлен:
09.11.2019
Размер:
228.86 Кб
Скачать

Формальные и фактические параметры

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

Все формальные параметры можно разбить на следующие категории:

  • параметры-значения (не меняются подпрограммой в основной программе);

  • параметры-переменные (подпрограмма может их изменить в основной программе);

  • параметры-константы;

  • параметры-процедуры и параметры-функции.

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

Пример 5:

var

A, B : Integer;

function Sum2(A : Integer) : Integer;

var

B : Integer;

begin

B := 15;

A := A + 2;

Sum2 := A;

end;

begin

A := 2;

B := 3;

writeln(A);

writeln(B);

writeln(Sum2(A));

writeln(Sum2(4));

writeln(A);

writeln(B);

end.

Результат работы программы в примере 5 (с добавленными комментариями) будет следующим:

2

3

4

6

2 (значение A не изменилось!)

3 (значение B не изменилось!)

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

function Max(A : Array [1..100] of Real) : Real;

В этом случае нужно сначала объявить тип-массив, а затем использовать его в заголовке.

type

TArr=array[1..100] of Real;

function Max(A : TArr) : Real;

Параметры значения

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

Параметр-значение указывается в заголовке подпрограммы своим именем и через двоеточие – типом.

function Mult(X, Y : Integer) : Real;

Параметры-переменные

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

При описании параметра-переменной перед ее именем записывается зарезервированное слово var. Действие var распространяется до ближайшей точки запятой.

Пример 6:

Program Test;

var

M : Real;

procedure Mult(X, Y : Real; var Result : real);

begin

Result := X * Y;

end;

begin

M := 15;

Mult(6, 1.5, M);

writeln('M=',M:10:2);

end.

В примере 6 значение переменной M измениться внутри подпрограммы Mult. Результат работы программы:

M=3.00

Пример 7:

Program Test;

type

TArr=array[1..100] of Real;

var

A : TArr;

i : Integer;

function Max(var Mass : TArr; N : Byte) : Real;

var

Ma, i : Integer;

begin

Ma := Mass[1];

for i := 2 to N do

if Mass[i]>Ma then Ma := Mass[i];

Max := Ma;

end;

begin

{Ввод 5 элементов массива}

for i := 1 to 5 do begin

write('A[',i,']:');

readln(A[i]);

end;

{Поиск и вывод максимального}

writeln('Максимальный элемент=',Max(A, 5):10:2);

end.

В примере 7 реализована функция поиска максимального элемента массива. Пример работы программы приведен ниже.

A[1]:3

A[2]:1

A[3]:7

A[4]:1.2

A[5]:4

Максимальный элемент=7

В примере 7 можно было описать массив как переменную-значение:

function Max(Mass : TArr; N : Byte) : Integer;

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

Параметры-константы

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

Пример 8

Program Test;

var

St : String;

function NewString(const S : String) : String;

begin

NewString := '('+S +')';

end;

begin

St := 'Example';

writeln(NewString(S));

end.

В результате работы программы из примера 8 на экране будет выведено:

(Example)

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

Параметры без типа

Можно использовать параметры-переменные и параметры-константы без указания типа. В этом случае фактический параметр может быть переменной любого типа, а ответственность за правильность использования такого параметра возлагается на программиста.

Параметр без типа внутри подпрограммы типа не имеет, поэтому перед использованием его следует привести к конкретному типу. При этом полученный результат может быть любого размера (см. пример 9).

Пример 9:

Program Test;

var

A : array [1..5] of Integer;

i : Integer;

function Max(var Mass; N : Byte) : Integer;

type

TArray = array [1..MaxInt] of Integer;

var

I, Ma : Integer;

begin

Ma := TArray(Mass)[1]; {Приведение к типу TArray и взятие первого элемента}

for i := 2 to N do

if TArray(Mass)[i]>Ma then

Ma := TArray(Mass)[i];

Max := Ma;

end;

begin

{Ввод 5 элементов массива}

for i := 1 to 5 do begin

write('A[',i,']:');

readln(A[i]);

end;

{Поиск и вывод максимального}

writeln('Максимальный элемент=',Max(A, 5):10:2);

end.

Удобство использования параметров без типа заключается, например, в возможности нахождения максимального элемента в любом массиве с элементами целого типа, тогда как рассмотренная в примере 7 для параметров-переменных функция могла работать только с массивами типа TArr.

Массивы открытого типа

В качестве параметров можно использовать массивы открытого типа, у которых не задаются размеры, например, массив целых чисел:

function Max(var Mass : array of Integer) : Integer;

Подпрограмма может обрабатывать массивы любого размера. Элементы фактического массива должны быть указанного в заголовке типа. Индексация элементов массива начинается с 0. Максимальный индекс элемента равен значению функции High.

Пример 10:

function Max(var Mass : array of Integer) : Integer;

var

I, Ma : Integer;

begin

Ma := Mass[0];

for i := 1 to High(Mass) do

if Mass[i]>Ma then

Ma := Mass[i];

Max := Ma;

end;

В примере 10 описана функция нахождения максимального элемента в массиве с элементами целого типа. В отличие от примера 9 здесь нет необходимости в приведении типов и указании количества элементов массива.