Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основи програмування Паскаль.docx
Скачиваний:
51
Добавлен:
12.05.2015
Размер:
511.7 Кб
Скачать

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.