34. Структура программ с использованием функций. Использование массивов в качестве параметров функций и процедур. Открытые массивы, динамические массивы.
Функция, определенная пользователем, состоит из заголовка и тела функции. Заголовок содержит зарезервированное слово function, идентификатор (имя) функции, заключенный в круглые скобки, необязательный список формальных параметров и тип возвращаемого функцией значения. Тело функции представляет собой локальный блок, по структуре аналогичный программе:
function <имя> (Формальные параметры) : тип результата;
const ...;
type ...;
var ...;
begin
<операторы функции>
end;
В разделе операторов должен присутствовать, по крайней мере, один оператор, присваивающий имени функции значение. В точку вызова возвращается результат последнего такого присваивания.
Обращение к функции осуществляется по имени с необязательным указанием списка аргументов. Каждый аргумент должен соответствовать формальным параметрам, указанным в заголовке, и иметь тот же тип.
Использование функции на примере программы поиска максимума из двух целых чисел.
var x,y,m,n: integer;
function MaxNumber(a,b: integer): integer;
var max: integer;
begin
if a>b then max:=a else max:=b;
MaxNumber := max;
end;
begin
write('Введите x,y ');
readln(x,y);
m := MaxNumber(x,y);
n := MaxNumber(2,x+y);
writeln('m=',m,'n=',n);
end.
Использование массивов в качестве параметров функций и процедур.
При создании функции или процедуры работы с массивами в ее объявление нельзя включать описание индексов.
Пример, объявление procedure MyProc(A: array[1..10] of Integer);
будет расценено как синтаксическая ошибка и вызовет соответствующее сообщение компилятора. Правильным будет объявление
type ta = array[1..10] of Integer; procedure MyProc(A: ta);
Функции и процедуры могут воспринимать в качестве параметров не только массивы фиксированного размера, но и так называемые открытые массивы, размер которых неизвестен. В этом случае в объявлении функции или процедуры они описываются как массивы базовых типов без указания их размерности.
Пример:
procedure SumArray(A:array of integer; var B: array of integer);
При таком определении передаваемый в функцию первый массив будет копироваться и с этой копией - массивом A, будет работать процедура. Второй открытый массив определен как var. Этот массив передается по ссылке, т.е. он не копируется, и процедура будет работать непосредственно с исходным массивом.
Массив, переданный как открытый, воспринимается в теле процедуры или функции как массив с целыми индексами, начинающимися с 0. Размер массива может быть определен функциями Length - число элементов и High - наибольшее значение индекса.
Очевидно, что всегда High = Length - 1.
При вызове функции или процедуры с параметром в виде открытого массива можно использовать в качестве аргумента конструктор открытого массива, который формирует массив непосредственно в операторе вызова. Список элементов такого конструктора массива заключается в квадратные скобки, а значения элементов разделяются запятыми. Например, функцию Sum, суммирующую элементы числового массива, можно вызвать следующим образом:
Sum([1.2,4.45,0.1]);
Пример:
В качестве примера использования открытых массивов рассмотрим процедуру, которая принимает два открытых одинакового размера массива целых чисел, суммирует их и заносит результат во второй из переданных массивов.
procedure SumArray(A:array of integer; var B: array of integer);
var i:word;
begin
for i:=0 to High(A) do B[i]:=A[i]+B[i];
end;
Вызов этой процедуры может иметь вид:
var A1,A2: array [1..3] of integer;
begin
<операторы заполнения массивов>
SumArray(A1,A2);
end;
Открытые массивы.
В Object Pascal имеется возможность использования открытых массивов, которые позволяют указывать базовый тип массива, не фиксируя при этом его размер. У аргумента для параметра - открытого массива должен быть такой же тип элемента.
Общий синтаксис открытого массива выглядит так:
openArray: array of типЭлемента;
Базовый тип параметра openArray - типЭлемента. У этого параметра нет фиксированного размера. Параметр openArray отображается на диапазоне индексов 0 .. (N-1), где N - количество элементов в фактическом аргументе параметра openArray.
Пример:
function sumArray (var arr: array of real) : real;
procedure linearRegression (var X,Y: array of real;
var slope, intercept,R2: real);
Параметр arr функции sumArray - открытый массив элементов типа real. У процедуры linearRegression два параметра - открытых массивов, а именно X и Y. Открытые массивы следует использовать при разработке обобщенных
подпрограмм, работающих с массивами данных. Не следует забывать, что нижний индекс открытого массива всегда равен 0, а не 1.
Динамические массивы.
Динамические массивы не имеют фиксированного размера или длины. Для объявления такого массива достаточно записать:
var My_Array : array of Real;
Динамическим называется массив, размер которого может меняться во время исполнения программы. Для изменения размера динамического массива язык программирования, поддерживающий такие массивы, должен предоставлять встроенную функцию или оператор. Динамические массивы дают возможность более гибкой работы с данными, так как позволяют не прогнозировать хранимые объёмы данных, а регулировать размер массива в соответствии с реально необходимыми объёмами.