Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Параметры - открытые массивы

Читайте также:
  1. Базовые параметры типологизации словарей
  2. Выходные параметры
  3. Гарантии социально-экономических прав работников при проведении приватизации и преобразования государственных унитарных предприятий в открытые акционерные общества
  4. Две стены – это ограничения Аллаха, открытые двери – это запреты Аллаха.
  5. Двумерные массивы
  6. Динамические массивы
  7. Другие параметры

Для передачи одномерных массивов в подпрограмму можно использовать так называемые открытые массивы. Открытый массив представляет собой формальный параметр подпрограммы, описывающий базовый тип элементов массива, но не описывающий диапазон его индексов. Применительно к рассмотренному примеру, процедура 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 | Нарушение авторских прав


Читайте в этой же книге: Процедуры | Список формальных параметров | Задания 5.1 для самостоятельной проработки | Обращение к функции | Пример 5.2 выполнения задания | Задания 5.2 для самостоятельной проработки | Рекурсивные подпрограммы | Примеры программ с подпрограммами |
<== предыдущая страница | следующая страница ==>
Пример выполнения задания на составление рекурсивной подпрограммы| Динамические массивы

mybiblioteka.su - 2015-2024 год. (0.01 сек.)