Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на языке Паскаль в среде Turbo Pascal версии 6 и 7 (Курс лекций). Воронов Г.И.Санкт-Петербург 2010г.doc
Скачиваний:
92
Добавлен:
15.04.2015
Размер:
754.69 Кб
Скачать

Описание и вызов функций

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

FUNCTION <имя функции>(<список аргументов>):<тип результата>;

Список аргументов это, по существу, список входных параметров.

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

Следует иметь в виду, что если во внешней программе переменная описана, а в функции – нет, ее использование в теле функции означает работу с переменной внешней программы (так называемые глобальные переменные).

Выполняемый блок (который должен быть заключен в скобки Begin .. End) заканчивается символом ";", а не точкой.

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

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

Параметры процедур и функций

Все основные сложности процедур связаны с механизмом параметров. Рассмотрим правила составления списка параметров.

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

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

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

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

Остановимся на правилах записи списка формальных и фактических параметров. Элементы списка фактических параметров отделяются друг от друга запятыми, формальные параметры записываются сложнее. Перед параметрами, передаваемыми по имени должно ставиться ключевое слово VAR, за параметром после двоеточия указывается тип, после каждого имени типа ставится символ ";". Если несколько подряд расположенных параметров имеют одинаковый тип (и способ передачи), их можно записать через запятую перед типом.

Примеры написания списков параметров:

...(A,B,C: real; VAR X1,X2:real; VAR N:integer); формальные параметры

...(0.762, Alfa, C[3]-1.2, X, Y, Num); соответствующие фактические параметры

Для передачи массива в процедуру:

TYPE

Vect = array[1..10] of real;

Mas5x8 = array[1..5,1..8] of integer;

. . .

VAR

C1,C2: Vect;

A: Mas5x8;

Metod: Integer;

. . .

{ описание процедуры }

PROCEDURE GetMatr(M:integer; Var X,Y:Vect; Var Z:Mas5x8;...);

VAR

A1,C1:integer;

. . .

Begin

{ Операторы тела процедуры }

. . .

End;

BEGIN

{Операторы основной программы }

. . .

GetMatr(0, C2, C1, A,...); { обращение к процедуре }

. . .

END.

Примеры описания процедур.

1. Описание процедуры, вычисляющей корни уравнения 2-го порядка

(вида Ax2 + Bx + C=0)

Procedure XX( A1,A2,A3:real; var X1,X2:real; var K:integer);

{

процедура вычисляющая корни уравнения aX + bX + C=0, и возвращающая

количество найденных вещественных корней и их значения

VGI, MIT

}

Var D:real;

Begin

if A1 = 0 then

if A2 = 0 then

K:=0

else

begin

X1:=-A3/A2;

K:=1;

end

else

begin

D:= sqr(A2)-4.0*A1*A3;

if D < 0 then

K:=0

else

begin

X1:=(-A2-sqrt(D))/2.0/A1;

X2:=(-A2+sqrt(D))/2.0/A1;

K:=2;

end;

end;

End;

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

Так как для формального параметра – имени массива необходимо указать тип, его следует описать до описания массива.

Type mas = array[1..1000] of real;

. . .

Procedure Sr_po(var A:mas; N:integer; var Srp,Sro:real);

{

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

отрицательных элементов вещественного массива длиной N чисел.

VGI, MIT

}

Var

i,kp,ko: integer;

Sp,So : real;

Begin

So:=0;

Sp:=0;

kp:=0;

ko:=0;

for i:=1 to N do

if A[i]<0 then

begin

So:=So+A[i];

inc(ko);

end

else

begin

Sp:=Sp+A[i];

inc(kp);

end;

if ko>0 then

Sro:=So/ko

else

Sro:= +1; { признак отсутствия отрицательных чисел в массиве }

if kp>0 then

Srp:=Sp/kp

else

Sro:= -1; { признак отсутствия положительных чисел в массиве }

End.