
- •3. Структуровані типи даних. Масиви
- •Лабораторна робота № 3 Алгоритми обробки масивів
- •4. Алгоритми обробки багатовимірних масивів
- •Лабораторна робота № 4 Алгоритми обробки багатовимірних масивів
- •5. Упорядкування і пошук даних
- •Лабораторна робота № 5 Упорядкування і пошук даних
- •6. Структуровані типи даних. Множини
- •Лабораторна робота № 6 Множини
3. Структуровані типи даних. Масиви
Масив – це структурований тип даних, який складається із фіксованої кількості елементів одного і того ж типу.
Опис масиву у програмі має вигляд
<ім’я типу> array [<список індексних типів>] of <тип>;
де <ім’я типу> – правильний ідентифікатор; array, of – зарезервовані слова (масив, із); <список індексних типів> – список з одного або декількох індексних типів (розмірність масиву не обмежується), розділених комами; <тип> – тип елементів масиву, може бути будь-яким крім файлового. В ролі індексних типів може використовуватися будь-який порядковий тип (частіше використовується діапазон).
Масив можна описати в розділі Var безпосередньо або за допомогою раніше описаного ідентифікатора типу:
Type Tm= array[1..10] of integer;
Var a, b: array[1..100] of double;
r: array[1..100] of double;
s: array[1..100] of double;
c, d: Tm;
x: array[1..10, 1..10] of integer;
y: array[1..10] of array[1..10] of integer;
тут масиви a, b, r, s описані безпосередньо, масиви c, d описані за допомогою ідентифікатора типу, а матриці x, y описані безпосередньо ідентичними способами.
Для масивів у цілому допускається тільки операція присвоєння, якщо вони описані одним ідентифікатором типу. Тому оператор a:=b; буде вірним і присвоїть елементам масиву a відповідні елементи масиву b, а оператор r:=s; буде невірним.
Для доступу до окремого елемента масиву потрібно за іменем масиву вказати у квадратних дужках його індекс (положення у масиві): a[5], x[3,4] або y[5][6]. З елементами масиву можна працювати як із звичайними скалярними змінними.
Існують так звані динамічні масиви. При опису таких масивів у програмі межі індексів не вказуються. Пам’ять для цих масивів виділяється на етапі виконання програми в динамічній області процедурою SetLength і звільняється процедурою Finalize. Наприклад,
Var a: array of integer;
b: array of array of char;
c: array of array of array of double;
i, j: integer;
Begin
{Розподіл пам’яті}
SetLength(a,10);
{Довжина першого виміру (кількість рядків)}
SetLength(b,10);
{Довжина кожного рядка)}
for i:=0 to 9 do
SetLength(b[i], 20);
{Кубічний масив c[0..2, 0..2, 0..2]}
SetLength(c,3);
for i:=0 to 2 do
begin
SetLength(c[i],3);
for j:=0 to 2 do
SetLength(c[i,j],3);
end;
{Робота з масивами}
………………
{Звільнення пам’яті}
a:=NIL;
Finalize(b);
Finalize(b);
End.
У наведеному прикладі: а – одновимірний масив цілих чисел, якому виділена пам’ять для десяти елементів; b – двовимірний масив символів із 10 рядків по 20 символів у рядку; c – тривимірний масив дійсних чисел. Нижня межа індексів по кожному виміру динамічного масиву завжди дорівнює нулю. У багатовимірних масивах спочатку встановлюється довжина його першого виміру, потім другого, третього і т. д.
Алгоритми обробки масивів. До традиційних алгоритмів обробки даних належать: пошук максимального і мінімального елементів масиву, накопичення сум і добутків елементів масиву, циклічний зсув елементів масиву, побудова об’єднання, перетину, різниці елементів масивів та інші.
Розглянемо алгоритм
пошуку максимального елемента масиву
.
Візьмемо один із елементів (як правило
це перший) і будемо порівнювати його з
усіма останніми елементами масиву. Якщо
зустрінеться більший елемент, то він
запам’ятовується і порівняння
продовжується. Після перегляду всіх
елементів масиву буде знайдено найбільший
елемент. Програма пошуку максимального
елемента масиву має вигляд:
Program LABR3_1;
{$APPTYPE CONSOLE}
uses Sysutils;
VAR a: array[1..300] of integer;
maxa: integer;
n, i: integer;
BEGIN
{Введення початкових даних}
writeln(‘Введіть розмір масиву а, (n<=300)’);
readln(n);
writeln(‘Введіть елементи масиву а’);
for i:=1 to n do
read(a[i]);
{Пошук максимального елемента масиву}
maxa:=a[1];
for i:=2 to n do
if maxa < a[i] then maxa:=a[i];
writeln(‘Максимальний елемент =’, maxa);
readln;
END.
Розглянемо алгоритм
побудови перерізу двох масивів. Нехай
задано два масиви цілих чисел
,
.
Розробити програму, яка будує переріз
масивів
.
Переріз масивів
це всі елементи масиву
,
які містяться у масиві
і взяті по одному разу. Переріз масивів
буде нараховувати не більше 200 елементів.
Помістимо їх у масив
.
Для побудови
перерізу будемо кожний елемент масиву
порівнювати з усіма елементами масиву
.
Якщо елемент масиву
збіжиться з деяким елементом масиву
,
то цей елемент буде елементом перерізу,
і якщо такого елемента ще немає в масиві
,
то він туди записується. Програма
побудови перерізу двох масивів має
вигляд:
Program LABR3_2;
{$APPTYPE CONSOLE}
uses Sysutils;
VAR a, c: array[1..200] of integer;
b: array[1..300] of integer;
n, m, k, i, j: integer;
f1, f2: boolean;
BEGIN
{Введення початкових даних}
writeln(‘Введіть розмір масиву а, (n<=200)’);
readln(n);
writeln(‘Введіть елементи масиву а’);
for i:=1 to n do
read(a[i]);
writeln(‘Введіть розмір масиву b, (m<=300)’);
readln(m);
writeln(‘Введіть елементи масиву b’);
for i:=1 to m do
read(b[i]);
{Побудова перетину масивів}
k:=0;
for i:=1 to n do
begin
j:=1; f1:=false;
while (j <= m) and (not f1) do
if a[i]=b[j] then f1:=true else j:=j+1;
if f1 then begin
j:=1; f2:=true;
while (j <= k) and f2 do
if a[i]=c[j] then f2:=false else j:=j+1;
if f2 then begin k:=k+1; c[k]:=a[i];end;
end;
end;
{Виведення перетину по п’ять елементів у рядку}
if k=0 then writeln(‘Перетин порожній’)
else
for i:=1 to k do
if i mod 5 <> 0 then write(c[i]:6)
else writeln(c[i]:6);
readln;
END.