
Лабораторна робота №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 квадратна матриця величин розміром 55
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 матриця елементів логічного типу розміром 86 елементів.
Для описування багатовимірних масивів зручно використовувати також типізовані констант-масиви, які дозволяють одночас описати масив й задати його значення в розділі констант:
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;