Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка DELPHI.DOC
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.73 Mб
Скачать

Процедура

Заголовок процедуры имеет следующий синтаксис:

Procedure <имя>(<список формальных парам.>);

Например, пусть заданы 2 массива вещественных чисел, преобразовать их в массивы целых чисел.

Program primer;

Type ArInt = Array[1..100] of Integer;

ArFloat = Array[1..100] of Double;

var ArInt1, ArInt2: ArInt;

ArFloat1, ArFloat2: ArFloat;

procedure FloattoInt (n:byte; const IntArray: ArInt;

var FloatArray: ArFloat);

var i : Byte;

Begin

for i:=1 to n do IntArray[i]:=round(FloatArray[i]);

End;

begin

FloatToInt (20, ArInt1, ArFloat1);

FloatToInt (30, ArInt2, ArFloat2);

End.

При разработке подпрограммы следует выделять входные и выходные параметры. В данном случае подпрограмма имеет два входных параметра: n и IntArray – и один выходной - FloatArray. В то же время эти параметры являются формальными параметрами. Фактические параметры – это “настоящие” переменные, с помощью которых заменяются формальные параметры при выполнении расчетов, т.е. при вызове процедуры (в примере имеются два вызова процедуры между begin и end).

Функция

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

Заголовок функции имеет следующий синтаксис:

Function <имя>(<список формальных парам.>):

<тип возвращаемого результата>;

Как следует из объявления, необходимо задавать тип возвращаемого результата. Это означает, что имя функции представляет собой ячейку (совокупность ячеек) памяти, с помощью которой передаётся результат расчета в блок, который является владельцем данной функции. Таким образом, синтаксис функции не указывает на то, что передавать данные нужно с помощью выходных формальных параметров, как для процедуры. Например, рассмотрим вычисление факториала:

Напишем функцию для вычисления N!:

Function Factorial(N : Byte): Cardinal;

Var Fact: Cardinal; i: Byte;

begin

If N=0 then Fact:=1 else Fact := N;

For i := N-1 downto 2 do Fact := Fact * i;

Factorial := Fact;

End;

Здесь введена вспомогательная переменная Fact. Необходимость этого заключается в следующем. Дело в том, что, если справа от знака присваивания появляется имя функции, например, Factorial := i * Factorial . . . ;,

то это означает, что справа при расчёте функция вызывает саму себя (рекурсия). Рекурсия – особая форма математических вычислений, когда функция строится посредством рекурентных соотношений, вызывая саму себя. В данном примере не используется рекурсивная форма расчёта факториала, поэтому пеобходимо написать все операторы без вызова самой функции Factorial. Для того чтобы упростить программирование функций и не вводить вспомогательных переменных типа Fact, синтаксически встроена специальная переменная Result, которая имеет тот же тип, что и функция, и используется только внутри функции. Перепишем подпрограмму выше:

Function Factorial(N : Byte): Cardinal;

Var I : Byte;

begin

If N=0 then Result:= 1 else Result:= N;

For i := N-1 downto 2 do Result := Result * i;

End;

В данном случае использование справа от знака присваивания переменной Result рекурсии не образует. Присваивание результата расчета имени функции из переменной Result осуществляется автоматически.

Для расчёта, например 12!, сначала объявим какую-либо переменную (пусть Q) Var Q : Cardinal;

Теперь можно записать оператор вычисления 12!

Q := Factorial(12);

Подпрограмму-функцию при необходимости можно вызвать так же, как процедуру, если программиста не интересует результат, возвращаемый функцией, а важны те действия, которые она выполняет. Такая возможность задается с помощью директивы {$X+} (расширенный синтаксис, установлено по умолчанию).