
Ивт-20 / САОД и др / ОЗО_2010-САОД_1 / Методический материал / Процедуры и функции
.docПроцедуры и функции
Delphi позволяет выделять фрагменты программ во вспомогательные алгоритмы (ВА) или подпрограммы. Это позволяет писать хорошо структурированные программы. Структурированные программы обычно проще в понимании и отладке. Наличие подпрограмм в языке программирования позволяет применять более совершенные методы при разработке и проектировании сложных программных комплексов.
В Delphi подпрограммы оформляются в виде процедур или функций. Каждая подпрограмма имеет собственное имя. Вызов процедуры на выполнение осуществляется отдельным оператором с помощью ее имени. Вызов функции может быть составной частью любого выражения при условии согласованности типов.
Описание процедур и функций располагается в разделе реализации модуля ( implementation ). Чтобы подпрограмма была глобальной ( то есть могла быть использована в другом модуле ), то ее заголовок необходимо дополнительно поместить в интерфейсный раздел ( interface ).
В теле подпрограммы можно описывать и использовать другие подпрограммы ( локальные ). Вовне нельзя вызывать на выполнение локальные подпрограммы. Описание процедуры имеет следующую структуру:
procedure Имя (Список формальных параметров);
< локальные описания >
begin
Операторы < тело процедуры >
end;
Описание функции имеет следующую структуру:
function Имя (Список формальных параметров) : Тип результата;
< локальные описания >
begin
< тело функции >
Операторы, среди которых хотя бы один, который
присваивает имени функции значение результата или
Result:=…..
end;
Процедуры и функции могут быть без параметров ( не содержать список формальных параметров ).
Существуют понятия локальных и глобальных типов и переменных. Поясним эти понятия на примере переменных. Переменные, описанные в основной программе, являются глобальными по отношению к процедурам и функциям. Переменные, описанные в процедурах и функциях, являются локальными. Их область действия локализована, т.е. ограничена, той подпрограммой, где они описаны.
Исходные данные для работы подпрограммы можно передавать через глобальные переменные, а также через параметры. Параметры при вызове подпрограммы называются фактическими, а параметры в заголовке подпрограммы называются формальными.
Формальные параметры подпрограммы также относятся к его локальным переменным. Локальные данные создаются, т.е. им выделяется память, при вызове подпрограммы, а освобождение этой памяти происходит при завершении работы.
По способу передачи параметры в Delphi делятся на:
-
параметры-значения,
-
параметры-переменные,
Параметры-значения
При вызове процедур и функций формальным параметрам-значениям выделяется новое место в памяти и присваиваются значения фактических параметров. При этом на месте фактических параметров могут стоять выражения. Параметры значения как правило используются в качестве аргументов (входных значений). После выполнения подпрограммы место формальных параметров освобождается. Изменение формальных параметров не сказывается на значении фактических.
Пример
// заголовок процедуры с 4 параметрами
procedure MyProc1(Par1, Par2 : Type1; Par3, Par4 : Type2);
// заголовок функции с 2 параметрами
function MyCNM( N,M: Integer):Integer;
Параметры-переменные
При вызове процедур и функций формальные параметры-переменные занимают то же самое место в памяти, что и соответствующие им фактические параметры. Таким образом, дополнительное место в памяти не выделяется и изменения формального параметра приводят к изменениям фактического. Параметры-переменные, как правило, используются для передачи результатов из процедур в вызывающий алгоритм.
Такой механизм передачи данных требует, чтобы фактические параметры были переменными, причем в точности того же типа, что и формальные параметры. При описании процедуры перед параметрами-переменными должно присутствовать слово var.
Пример
// процедура с 5 параметрами, A,B,C–параметры значения; X1,X2 –параметры переменные
procedure EQ(A, B, C:Real; var X1,X2 : Real);
Пример
// Функция вычисления факториала.
var
N : Byte; // глобальная переменная
R : Word; // глобальная переменная
……
function Fасt(K:Byte):Word; // заголовок функции Fact, k – параметр значение
var I: Integer; { локальная переменная}
begin
Fact :=1;
if k=0 then
Fact:=1
else
for i:=1 to K do Fact := Fact *k;
// Вместо переменной Fact можно использовать Result
end;
…..
R:=Fact(N); // Вызов функции
Пример
// Процедура поиска наибольшего в массиве.
type t_X = array[1..100] of Integer;
var i , X_Max : byte; X : t_X; { глобальные переменные}
….
procedure Max(A : t_X; var M:Integer); //
var I: Integer; { локальная переменная}
begin
M :=A[1];
for i:=1 to 100 do
if M < A[ i ] then M := A[ i ];
end;
….
for i:=1 to 100 do X[ i ] :=Random(50)-25;
Max(X; X_Max ); { вызов процедуры Max }