Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
основы программирования на Паскале.doc
Скачиваний:
255
Добавлен:
25.03.2016
Размер:
4.34 Mб
Скачать

18.4 Открытые массивы

Недостатки изученного ранее способа передачи массивов-параметров очевидны: во-первых, необходимость описания типа данных массива оператором typeнарушает правило переносимости подпрограмм (действие подпрограммы становится зависимым от внешнего оператора), во-вторых, для указания реальной размерности передаваемых в подпрограмму массивов приходится использовать дополнительные параметры-значения, в-третьих, при обработке массивов меньшей, чем указано в оператореtypeразмерности, неэффективно теряется оперативная память. В какой то мере исправить эти недостатки позволяет использованиеоткрытых массивов.

Способ подходит только для одномерных массивов. Использовать его с матрицами возможно, если интерпретировать матрицу как вектор (см. главу 17).

Имеющиеся в программе векторы описываются в разделе varобычным способом, без определения типаtype. В списке формальных параметров подпрограммы параметр-вектор указываетсябездиапазона размерности:

Function Sum(Var X : Array Of Real) : Real;

При вызове подпрограммы фактический параметр-массив подставляется на место формального:

Var a:array [1..5] of real;

S:real;

. . .

S:=Sum(a);

Открытым остается вопрос – как отслеживать из подпрограммы размерность переданного массива? Для этого в Паскале существуют стандартные функции LowиHigh. Их единственным параметром передается идентификатор массива,Lowвозвращает самое низкое значение допустимое значение индекса, аHigh– самое высокое. ЕслиA– одномерный массив, величиныLow(A)иHigh(A)можно непосредственно применять как границы циклаfor:

Function Sum(Var X : Array Of Real) : Real;

Var I : Word;

S : Real;

Begin

S:=0;

For I:=Low(X) To High(X) Do S:=S+X[I];

Sum:=S;

End;

Чтобы завершить пример, вызовем написанную функцию Sum:

Const a:array [1..5] of real=(1,2,3,4,5.5);

Var s:real;

begin

writeln (Sum(a):6:1);

end.

Как правило, номер первого элемента открытого массива равен нулю, однако, надежнее все-таки указывать Low. Приведем еще один пример программы, включающей подпрограмму с открытыми массивами в качестве параметров.

Пр. Найти количество элементов вектора X[7], попадающих в интервал [0,3] и количество элементов вектора Y[5], попадающих в интервал [-1,1].

Для ввода элементов массива с клавиатуры напишем процедуру Input, которой все-таки придется передавать размерность массива-параметра (ведь вводятся два вектора различной размерности). Поэтому вInputиспользован тот факт, что нумерация элементов открытого массива по умолчанию выполняется в нуля. Функцииkol, вычисляющей количество элементов открытого массива, попадающих в интервал[x1,x2], достаточно стандартного указанияLowиHigh:

var x:array [1..7] of real;

y:array [1..5] of real;

k1,k2,i:integer;

procedure Input (n:integer; var a:array of real);

var i:integer;

begin

writeln ('Enter ',n,' items of array:');

for i:=0 to n-1 do read (a[i]);

end;

function Kol (var a:array of real; x1,x2:real):integer;

var i,k:integer;

begin

k:=0;

for i:=Low(a) to High(a) do

if (a[i]>=x1) and (a[i]<=x2) then k:=k+1;

Kol:=k;

end;

begin

Input (7,x);

Input (5,y);

k1:=Kol(x,0,3);

k2:=Kol(y,-1,1);

writeln ('k1=',k1,' k2=',k2);

end.