Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект_ лекций по Паскалю_ИиКТ.doc
Скачиваний:
12
Добавлен:
24.09.2019
Размер:
2.85 Mб
Скачать

Функции

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

Она имеет следующую структуру:

Function < имя > ( p1,p2, ... ,pn ) :<тип возвращаемого результата>;

< раздел описаний >

begin

<раздел операторов>

end ;

Заголовок включает в себя зарезервированное слово Function, идентификатор (имя) функции, заключенный в круглые скобки список формальных параметров (p1,p2, ... ,pn) и тип возвращаемого функцией значения. Имя функции - идентификатор уникальный в пределах блока. Возвращаемый результат может иметь любой скалярный тип (вещественный, целый и некоторые другие).

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

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

Формат вызова таков:

< имя > ( f1,f2,...fn );

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

Следующая программа вычисляет площадь двух треугольников ABC и DEF используя определенную программистом функцию SqGeron. У функции SqGeron три параметра  стороны треугольника. Возвращает функция значение типа REAL. В основе вычисления площади треугольника лежит формула Герона.

Program Example ;

VAR

A,B,C:Real ; { стороны треугольника ABC }

D,E,F:Real ; { стороны треугольника DEF }

Sq1:Real ; {площадь треугольника ABC }

Sq2:Real ; {площадь треугольника DEF }

{ функция программиста }

{ Вычисление площади треугольника по формуле Герона }

Function SqGeron(a,b,c:real):real ;

var

p:real ;

begin

p:=(a+b+c)/2;

SqGeron:=sqrt(p*(p-a)*(p-b)*(p-c))

end;

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

BEGIN

writeln('Введите значения сторон треугольника ABC') ;

readln(A,B,C) ;

writeln('Введите значения сторон треугольника DEF') ;

readln(D,E,F) ;

Sq1:=SqGeron(A,B,C);

Sq2:=SqGeron(D,E,F);

writeln('Площадь треугольника ABC =',Sq1:6:3) ;

writeln('Площадь треугольника DEF =',Sq2:6:3) ;

END.

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

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

Описание процедурного типа осуществляется в соответствии с принятым синтаксисом языка.

Формат оператора:

Type < имя-типа >=Procedure( p1,p2,...,pn );

или

Type < имя-типа >=Function( p1,p2,...,pn ):< тип результата >;

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

Включение директивы компилятора осуществляется записью {$F+}. Знак $, расположенный сразу после открывающей фигурной скобки показывает, что это директива компилятора. Символ F показывает, что устанавливаем Far (дальний) вызов, а знак + показывает, что включаем эту директиву.

Параметры-процедуры и параметры-функции не должны быть стандартными подпрограммами, не должны объявляться внутри других подпрограмм, не иметь директив inline и interrupt.

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

Program Example ;

TYPE

Func = function(X, Y : Integer) : Integer ;

{$F+}

function Add(X, Y : Integer) : Integer ;

begin

Add := X + Y

end ;

function Multiply(X, Y : Integer) : Integer ;

begin

Multiply := X * Y

end ;

{$F-}

Procedure PrintTable(A, B : Integer; Operation : Func) ;

{ процедура печати таблицы }

var

i,j : integer ;

begin

for i:=1 to A do

begin

for J:=1 to B do

write(Operation(i,j):5) ;

writeln

end ;

writeln

end ;

BEGIN

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

PrintTable(10, 10, Add) ;

PrintTable(10, 10, Multiply) ;

END.