Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Масив_лр_6.doc
Скачиваний:
0
Добавлен:
13.12.2019
Размер:
450.56 Кб
Скачать

92

Лабораторна робота №6

Багатовимірні масиви

1 Мета роботи

Вивчити засоби використання багатовимірних масивів в програмах алгоритмічною мовою Object Pascal у середовищі Delphi.

2 Основні теоретичні відомості

2.1 Вимірність масиву

Кількість індексів визначає вимірність масиву, наприклад, вектори в програмах – це одновимірні масиви, матриці – двовимірні. Кількість індексів у елементів масивів є необмежена. Значення індексів записують після імені масиву в квадратних дужках і відокремлюють комами. Наприклад:

b[4,5], Matr [I,J+1], P['F','K']  елементи матриць: b45, Matri,j+1, P’F’,’K’;

Masivlarge[i+2*m,True,25,n]  елемент масиву з чотирма індексами Masivlargei+2m,True,25,n.

У пам’яті комп’ютера елементи масиву розміщуються один за одниму такій спосіб, що при переході від молодших адрес до старших найперш змінюється крайній правий індекс. Так само, як і одновимірний масив, багатовимірний масив загалом може займати в пам’яті не більш за 2 Гбайт.

2.2 Описування багатовимірних масивів

Багатовимірні масиви (як і одновимірні) в програмах можна описувати двома способами :

1) Type ім'я_типу = аrray [тип_індексу1, тип індексу2, …] оf тип_елементів_масиву;

Var ім'я_масиву : ім'я_типу;

2) Var ім'я_масиву : аrray [тип_індексу1, тип індексу2, …] оf

тип_елементів;

Можна вказувати індекси іншим способом, наприклад, для двовимірного масиву :

Var ім'я_масиву : аrray [тип_індексу1] of array [тип індексу2] оf

тип_елементів;

Кількість елементів масиву дорівнює добутку кількості елементів кожного індексу.

Приклади описування масивів:

Type Matr1 = array [ 0.. 11,1..4,3..7 ] of boolean;

Matr2 = array [ 1.. 5, 1.. 5 ] of integer;

Matr3 = array [ 'a'..'e', -2..5, 1..8 ] of real;

Matr4 = array [ Boolean ,1..5,1..3,2..5] of char;

Var A : Matr1; B : Matr2; C : Matr3; D : Matr4;

X : array [ 1.. 8, 0.. 5 ] of boolean;

Тут описано :

А  тривимірний масив 240 елементів логічного типу;

B  квадратна матриця величин розміром 55

B 11 B12 … B15

B21 B22 … B25

……………… ,

B51 B52 … B55

яка складена з цілих елементів :B[1,1], B[1,2], ... , B[1,5], B[2,1], B[2,2], ... , B[2,5], ... , B[5,1], B[5,2], ... , B[5,5].

C  тривимірний масив 320 елементів дійсного типу;

D  четиривимірний масив 120 елементів символьного типу;

X  матриця елементів логічного типу розміром 86 елементів.

Для описування багатовимірних масивів зручно використовувати також типізовані констант-масиви, які дозволяють одночас описати масив й задати його значення в розділі констант:

Const ім'я_масиву :аrray [тип_індексів] оf тип_елементів_масиву=

(значення_елементів_масиву);

Значення елементів багатовимірних масивів слід записувати використовуючи вкладені дужки для кожного індексу, враховуючи, що спочатку змінюється останній індекс, за ним – передостанній і так далі, до першого індексу. Так, значення елементів матриць слід перераховувати за рядками. Наприклад, для матриці В розміром 3х4

1 2 3 4

R = 5 6 7 8

9 0 –1 –2

слід записати такий оператор:

Соnst R:array[1..3,1..4] of integer = ((1,2,3,4),(5,6,7,8),(9,0, –1,–2));

Значення елементів багатовимірних масивів, як і одновимірних масивів із загальним описом, можна присвоювати один одному лише одним оператором присвоєння, не використовуючи цикли. Наприклад, при описуванні масивів

Var F,G : array[1..4,1..4] of real;

після введення або обчислення значень масиву G можна присвоїти такі ж самі значення масиву F одним оператором F:=G;

2.3Виведення елементів багатовимірних масивів

Виводити значення масивів можна у файл або на форму, використо-вуючи різноманітні компонети Delphi. При цьому, виводити значення елементів масивів можна лише поелементно, для чого слід зорганізувати цикли змінювання за значеннями кожного індексу. Як зорганізувати виведення масивів у файл, буде розглянуто далі в інших лабораторних роботах. Тепер розглянемо, як організувати виведення багатовимірних масивів на форму за допомогою компонентів Edit, Label, Memo, ListBox, StringGrid та функції ShowMessage.

В наведених прикладах використовуватимемо змінні, які мають такий опис:

Соnst R :array[1..3,1..4] of integer = ((1,2,3,4),(5,6,7,8),(9,–1,–2,–3));

Var B: array [ 1.. 5, 1.. 5 ] of integer;

i,j, ier : integer ;

sb, st :string ;

2.3.1 В компонент Edit можна виводити лише один рядок значень багатовимірного масиву, відокремлюючи елементи пропусками. Кількість елементів, котрі можна побачити, є обмеженою довжиною компонента Edit на формі вікна.

Приклад фрагмента програми виведення 3-го рядка масиву В:

і:=3; // присвоєння номера рядка

st:=’’; // очищення рядка st,

For j:=1 to 5 do // початок циклу за індексами у рядку масиву

begin

str(В[i,j]:4:1, sb); // перетворення числа на рядкову величину

st:=st+sb +’ ’; // нагромадження рядка значень масиву

end;

Edit1.Text:=st; // присвоєння значень рядка масиву компоненту Edit1

2.3.2 В компонент Label можна виводити масиви, відокремлюючи елементи пропусками (’ ’) або символами переходу до нового рядка (#13) за тими ж самими правилами, що і в компонент Edit, лише в програмі замість Edit1.Text треба писати Label1.Caption (наприклад, Label1.Caption:=st; ).

Приклад виведення матриці R:

Label1.Caption:= ’’; // очищення компоненти Label

For i:=1 to 3 do // початок циклу за індексами рядків

begin

st:=’’; // очищення рядка st

For j:=1 to 4 do // початок циклу за індексами стовпчиків

begin

str(R[i,j]:2, sb); // перетворення числа на рядкову величину

st:=st+sb +’ ’; // нагромадження рядка значень масиву

end;

Label1.Caption:=Label1.Caption+st+#13; // виведення рядка

end;

2.3.3 Виведення у вікно діалогу за допомогою функції ShowMessage організують так само, як і в попередніх прикладах, лише замість оператора присвоєння треба записати оператор виклику процедури. Наприклад,

ShowMessage(st);.

2.3.4 За допомогою компонента Memo можна виводити масиви з будь-якою кількістю елементів, оскільки можна використовувати лінійки прокручування (надати властивості ScroollBar значення ssBoth або ssVertical).

Приклад виведення значень матриці R:

Memo2.Clear; // очищення компонента

For i:=1 to 3 do // початок циклу за індексами рядків

begin

st:=’’; // очищення рядка st

For j:=1 to 4 do // початок циклу за індексами стовпчиків

begin

str(B[i,j]:2, sb); // перетворення числа на рядкову величину

st:=st+sb +’ ’; // нагромадження рядка значень масиву

end;

Memo2.Lines.Add(sb); // виведення рядка значень масиву

end;

2.3.5 Виведення масивів за допомогою компонента ListBox організують так само, як і з компонентом Memo, лише замість Memo треба писати оператор виклику процедури ListBox. Наприклад, замість оператора

Memo2.Lines.Add(sb);

треба записати

ListBox1.Items.Add(sb); .

2.3.6 Виведення масивів за допомогою компоненту StringGrid (сітка).

К омпонент String-Grid має вигляд таблиці з комірками і розташована на вкладці Additional палітри компонент.

Цю компоненту ми будемо використовувати вперше, тому наведемо опис її основних власти-востей (таблиця 6.1):

Таблиця 6.1 – Властивості компонента StringGrid

Властивість

Призначення

Name

Ім’я компонента для доступу до його властивостей

ColCount

Кількість стовпчиків таблиці

RowCount

Кількість рядків таблиці

Cells

Масив комірок таблиці. Наприклад, Cells[i,j] – це комірка розташована на перетинанні i-го стовпчика та j-го рядка (нумерація починається з нуля).

FixedCol

Кількість фіксованих стовпчиків (для заголовка)

FixedRow

Кількість фіксованих рядків (для заголовка)

Options.goEditing

Ознака дозволу на редагування вмісту комірки

Options.Tabs

Ознака дозволу на переміщення по таблиці за до-помогою клавіші <Tab>

Options.goColSizing

Ознака дозволу на змінювання ширини стовпчиків

Options.goRowSizing

Ознака дозволу на змінювання висоти рядків

В кожній комірці (Cells) можна розташувати величину рядкового типу, як і в іншіх компонентах, якими ми користувалися раніше (Edit, Label та ін.). Властивості групи Options відкривають подвійним клацанням і надають їм значення true або false. Наприклад для виведення матриці R компоненті StringGrid слід надати властивості, подані в таблиці 6.2.

Таблиця 6.2 – Значення властивостей компоненти StringGrid

Властивість

Значення

Name

mb

ColCount

5

RowCount

4

FixedCol

1

FixedRow

1

Options.goColSizing

True

Options.goRowSizing

True

Приклад фрагмента програми:

For i:=1 to 3 do // цикл фіксованих заголовків рядків

mb.cells[0,i]:=IntToStr(i)+'-й рядок';

For j:=1 to 4 do // цикл фіксованих заголовків стовпчиків

mb.cells[j,0]:=IntToStr(j)+'-й стовпчик';

For i:=1 to 3 do // початок циклу за індексами рядків

begin

For j:=1 to 4 do // початок циклу за індексами стовпчиків

begin

str(R[i,j]:3, sb); // перетворення числа на рядкову величину

mb.cells[j,i]:=sb; // виведення значення масиву в комірку

end;

end;