Читайте также:
|
|
Для передачи одномерных массивов в подпрограмму можно использовать так называемые открытые массивы. Открытый массив представляет собой формальный параметр подпрограммы, описывающий базовый тип элементов массива, но не описывающий диапазон его индексов. Применительно к рассмотренному примеру, процедура Objedinenie при использовании открытого массива будет иметь следующий вид:
procedure Objedinenie(const X,Y:array of Real; n,m:Integer;
out Z: array of Real);
var
i:Integer;
begin
for i:=0 to n-1 do
Z[i]:=X[i];
for i:=0 to m-1 do
Z[i+n]:=Y[i];
end;
У открытого массива минимальный индекс всегда равен нулю, что и нашло отражение в тексте подпрограммы при организации циклов.
При использовании открытых массивов подпрограмма становится более универсальной, так как соответствующими фактическими параметрами могут быть массивы любого типа с тем же базовым типом, что и базовый тип формального параметра. Однако это не приводит к уменьшению расхода памяти, если в подпрограмме обрабатывается лишь часть элементов массивов, объявленных в блоке вызывающей программы, как в последней реализации процедуры Objedinenie. Максимальный эффект в использовании памяти будет в случае, когда в блоке вызывающей программы массив будет иметь размер, равный количеству обрабатываемых данных. В этом случае можно будет сократить список параметров, так как размер обрабатываемого массива можно определить в подпрограмме с помощью стандартной функции Length, а индекс последнего элемента – с помощью стандартной функции High. Возвращаемое функцией High значение будет на 1 меньше размера массива, так как индексация элементов открытого массива начинается с нуля.
Таким образом, используя открытые массивы можно передавать в подпрограмму и обрабатывать внутри подпрограммы одномерные массивы с произвольным количеством элементов. Это и демонстрирует следующее объявление процедуры Objedinenie для работы с открытыми массивами.
procedure Objedinenie(const X,Y: array of Real;
out Z: array of Real);
var
i,n:Integer;
begin
n:= High(X);
for i:=0 to n do
Z[i]:=X[i];
for i:=0 to High(Y) do
Z[i+n]:=Y[i];
end;
При обращении к подпрограмме, имеющей в качестве формального параметра открытый массив, для передачи фактического параметра можно использовать конструктор массива. Конструктор массива представляет собой список значений элементов массива, разделенных запятыми и заключенных в квадратные скобки. Например, используя конструктор массива, можно записать обращение к процедуре Objedinenie следующим образом:
Objedinenie([3.5, 2.2, 1, 8], [1.3, 3.2, 8.5, 7.4, 2.5], Z)
в результате чего элементам массива Z с индексами от 1 до 8 будут присвоены значения3.5, 2.2, 1, 8, 1.3, 3.2, 8.5, 7.4, 2.5.
При передаче константного массива соответствующий формальный параметр в подпрограмме должен быть параметром-значением или параметром-константой, он не может быть параметром-переменной или выходным параметром-результатом.
Базовым типом открытого массива может быть сложный тип, объявленный ранее, например, тип статического массива или тип записи. Соответствующим фактическим параметром должен быть массив с тем же базовым типом.
Пример. Составить процедуру для вычисления суммы элементов матриц с произвольным количеством строк и числом столбцов, равным 3. Использовать эту процедуру для матриц A(2,3) и B(4,3). Матрицы задать начальными значениями. Для контроля за изменением индексов суммируемых элементов матриц, значениями элементов и накоплением суммы использовать в процедуре оператор вывода.
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
tn=array[-1..1] of Integer;
tmn2=array[1..2] of tn;
tmn4=array[-5..-2] of tn;
procedure Pp1(mn:array of tn; out s:Integer);
var i,j:Integer;
begin
s:=0;
for i:=Low(mn) to High(mn) do
for j:=Low(tn) to High(tn) do
// или для второго измерения статического массива
// for j:=Low(mn[0]) to High(mn[0]) do
begin
s:=s+mn[i,j];
WriteLn(' i=',i,' j=',j:2,' mn[i,j]=',mn[i,j],' s=',s);
end;
end;
var
A:tmn2=((5,3,7),
(7,9,2));
B:tmn4=((2,4,1),
(7,6,2),
(0,1,8),
(3,7,5));
r:Integer;
begin // РАЗДЕЛ ОПЕРАТОРОВ ПРОГРАММЫ
WriteLn('Вызов процедуры для обработки матрицы A');
Pp1(A,R);
WriteLn('Сумма элементов массива B = ',R);
WriteLn;
WriteLn('Вызов процедуры для обработки матрицы B');
Pp1(B,R);
WriteLn('Сумма элементов массива B = ',R);
ReadLn;
end.
Результат работы программы представлен на следующем рисунке
Следует обратить внимание на граничные значения индексов, представляющих номера строк и столбцов. Номера строк изменяются от 0 до значения, на 1 меньшего числа строк в фактическом массиве, так как формальный параметр является открытым массивом (по количеству содержащихся в нём одномерных массивов типа tn), а номера столбцов изменяются от -1, как в массивах - фактических параметрах, до 1, так как для типа статического массива стандартные функции Low и High возвращают минимальное и максимальное значения индексов из объявления типа статического массива.
Дата добавления: 2015-07-26; просмотров: 76 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Пример выполнения задания на составление рекурсивной подпрограммы | | | Динамические массивы |