- •Формальные параметры. Локальные и глобальные объекты
- •Оператор процедуры. Фактические параметры
- •Пример. Программа вычисляет координаты точки (x0, y0) при последовательных поворотах и параллельных переносах системы координат.
- •Var cosFi, sinFi : Real; { локальные переменные }
- •Функции
- •Примеры описаний функций.
- •Рекурсивно-определенные процедуры и функции
Функции
Наряду со стандартными функциями, в языке можно определить и другие необходимые программе функции. Функция - это подпрограмма, определяющая одно - единственное скалярное или ссылочное значение, используемое при вычислении выражения.
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.
