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

Функции

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

Function < имя > : < тип результата > ;

Function <имя> (<список описаний формальных параметров>): <тип результата>;

Правило

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

Примеры описаний функций.

Пример 3. Функция GCD (алгоритм Евклида) вычисляет наибольший общий делитель двух натуральных чисел x и y.

Function GCD (x, y : Integer) : Integer ;

Begin

While x <> y do

If x < y

then y := y - x

else x := x - y ;

GCD := x

End;

Пример 4.

Функция IntPow возводит действительное число x в степень N. (Y=x N )

Function IntPow(x: Real; N: Integer) : Real;

Var i : Integer;

Begin

IntPow := 1;

For i := 1 to Abs(N) do IntPow := IntPow * x;

If N < 0

then IntPow := 1/IntPow

End;

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

Структура вложений иллюстрируется рисунком:

Program Main;

Procedure A;

Procedure B;

Procedure C;

Понятия локальных и глобальных объектов распространяются и на вложенные процедуры. Например, переменная, описанная в процедуре A локальна по отношению к основной программе и глобальна для процедур B и C, вложенных в A.

Опережающее описание процедуры (функции) - это ее заголовок, вслед за которым через “;” поставлено служебное слово Forward. В тексте программы опережа­ю­­щее описание должно предшествовать процедуре, в которой предварительно описанная процедура вызывается.

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

{Опережающее описание}

Procedure A (x : TypeX; Var y : TypeY); Forward;

Procedure B (z : TypeZ) ;

Begin

... A( p, q); ...

End;

{Основное описание}

Procedure A;

Begin

...

End;

Рекурсивно-определенные процедуры и функции

Описание процедуры A, в разделе операторов которой используется оператор этой процедуры, называется рекурсивным. Рекурсивное описание имеет вид

Procedure A(u, v : ParType);

...

Begin

...; A(x, y); ...

End;

Описание функции F, в разделе операторов которой используется вызов функции F, называется рекурсивным. Рекурсивное описание функции имеет вид

Function F(u, v : ArgType) : FunType;

...

Begin

...; z := g(F(x, y)); ...

End;

Использование рекурсии в описании алгоритмов – предмет отдельного особого изучения. Это будет сделано позже.

Пример 5. На координатной плоскости заданы координатами своих главных диагоналей 2 прямо­уголь­ника со сторонами, параллельными координатным осям:

P1 =(x1,y1, x2, y2) P2 =(u1,v1, u2, v2)

Требуется написать программу, которая находит координаты главной диагонали пересечения Р1 и Р2, если это пересечение не пусто.

P = P1 P2

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

Поэтому задача сводится к двум вызовам процедуры поиска пересечения двух отрезков, заданных координатами своих концов. Процедура поиска пересечения использует функции Min, Max.

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

Пример структурированной программы

program BoxexInterSection;

var x1, y1, x2, y2 : Real;

u1, v1, u2, v2 : Real;

a1, b1, a2, b2 : Real;

procedure ReadBox(Number : Integer; var pX1, pY1, pX2, pY2: Real);

procedure ReadPoint (var X, Y : Real);

begin

Writeln(' Enter X and Y coordinates of the Point');

Read( X, Y);

Writeln

end;

begin

Writeln(Number, ' Box ');

ReadPoint(pX1, pY1);

ReadPoint(pX2, pY2)

end;

Procedure GetProection(Left1, Left2, Right1, Right2: Real;

var Left, Right : Real);

function Max(A, B:Real):Real;

begin

If A < B then Max := B else Max := A

end;

function Min(A, B:Real):Real;

begin

If A < B then Min := A else Min := B

end;

begin

Left := Max(Left1, Left2);

Right := Min(Right1, Right2);

end;

Procedure PrintAnswer(a1, a2, b1, b2: Real);

begin

If (a1 > a2) or (b2 > b1)

then Writeln(' Intersection is Empty')

else begin

Writeln(' Left Up vertex ', a1:1:2, ' ', b1:1:2);

Writeln(' Right Down vertex ', a2:1:2, ' ', b2:1:2)

end

end;

begin

ReadBox(1, x1, y1, x2, y2);

ReadBox(2, u1, v1, u2, v2);

GetProection(x1, u1, x2, u2, a1, a2);

GetProection(y2, v2, y1, v1, b2, b1);

PrintAnswer(a1, a2, b1, b2)

end.