
Операції з масивами
Масиви, як цілісні структури, можуть брати участь тільки в операціях "дорівнює" / "не дорівнює" і в операторах присвоювання. При цьому відповідні масиви повинні бути ідентичні за структурою (мати однакові типи індексів і типи компонентів).
Всі інші дії виконуються тільки з елементами масивів відповідно до їх типу. При цьому обробка елементів масивів виконується в циклах.
Базові операції обробки векторів (одновимірних масивів). Такими базовими операціями є:
-
введення-виведення масиву
for i := 1 to n do
ReadLn (a [i]);
for i := 1 to n do
WriteLn (‘А [‘, i, ‘] = ‘, a [i] );
-
ініціалізація масиву (присвоєння початкових значень)
for i := 1 to n do
ReadLn (a [i]);
for i := 1 to n do
a [i] := 0;
for i := 1 to n do
a [i] := random;
-
пошук заданого елемента
for i := 1 to n do
if a [i] mod 7 = 0 then WriteLn (a[i] );
-
пошук максимального (мінімального) елемента
max := a [1];
for i := 2 to n do
if a [i] > max then max := a [i];
-
перестановка елементів
t := a [i] ;
a [i] := a [j];
a [j] := t;
-
вставка та видалення елементів
Базові операції обробки матриць (двовимірних масивів). В оперативній пам’яті матриця також зберігається як безперервна послідовність елементів.
Базовими операціями обробки двовимірних масивів є:
-
введення-виведення матриці
for i := 1 to n do
for j := 1 to m do
ReadLn (a [i, j]);
for i := 1 to n do
begin
for j := 1 to m-1 do
Write ( a [i, j]:3 );
WriteLn (a [i, m]:3);
end;
-
ініціалізація матриці
for i := 1 to n do
for j := 1 to m do
ReadLn (a [i, j]);
for i := 1 to n do
for j := 1 to m do
a [i] := 0;
for i := 1 to n do
for j := 1 to m do
a [i] := random;
-
пошук заданого елемента
for i := 1 to n do
for j := 1 to m do
if a [i, j] mod 7 then WriteLn (a[i, j]);
-
підсумовування елементів матриці
for i := 1 to n do
for j := 1 to m do
s := s + a [i, j];
-
підсумовування діагональних елементів матриці
for i := 1 to n do
s := s+ a [i, i];
-
транспонування матриці
for i := 1 to n do
for j := 1 to m do
b[ i, j] := a [j, i];
-
перестановка n-го і m-го рядків
for j := 1 to m do
begin
t := a [n, j] ;
a [n, j] := a [m, j];
a [m, j] := t;
end;
-
видалення рядка (на місце рядка / стовпця, що видаляється, потрібно записати елементи наступного рядка /стовпця і циклічно повторити цю операцію до кінця матриці)
for i := k to n-1 do { Видалення к-го рядка }
for j := 1 to m do
a [i, j] := a [i+1, j];
-
включення рядка у матрицю
for i := n downto k do { Включення к-го рядка }
for j := 1 to m do
a [i+1, j] := a [i, j];
for j := 1 to m do
ReadLn (a [k, j] );
-
множення матриці на матрицю
for i := 1 to n do
for j := 1 to m do
begin
c[i, j] :=0;
for k := 1 to n do
c[i, j] := c[i, j] + a [i, k]* b [k, j];
end;
Базові операції обробки масивів зручно реалізовувати у вигляді процедур, які надалі можуть використовуватися у більш складних задачах.
Арифметика покажчиків. При організації доступу до елементів масиву за покажчиком використовуються наступні операції роботи з покажчиками:
-
операція інкремента (++) – значення покажчика збільшується на кількість байт, що визначається типом, на який він вказує;
-
операція декремента (--) – значення покажчика зменшується на кількість байт, що визначається типом, на який він вказує;
-
додавання цілого числа (+) - задає логічне зміщення на кількість байт, яка необхідна для розміщення заданого числа об’єктів, на які посилається покажчик;
-
скорочене додавання цілого числа (+=) - задає фізичне зміщення на кількість байт, яка необхідна для розміщення заданого числа об’єктів, на які посилається покажчик;
-
скорочене віднімання цілого числа (-=) - задає фізичне зміщення на кількість байт, яка необхідна для розміщення заданого числа об’єктів, на які посилається покажчик;
-
віднімання цілого числа (-) - задає логічне зміщення на кількість байт, яка необхідна для розміщення заданого числа об’єктів, на які посилається покажчик;
-
віднімання покажчиків - визначення значення різниці номерів елементів масиву, на які вказують покажчики,
Наприклад,
float m[7], n,*mPtr1,*mPtr2;
mPtr1 = &m[0];
mPtr2 = m;
mPtr1 += 5; // зміщення вперед на 4 об’єкта (дійсних числа)
mPtr1 --; // перехід до попереднього елемента масиву
mPtr2 ++; // перехід до наступного елемента масиву
cout<<*(mPtr2+3)<<“\n”; // покажчик-зміщення вперед на 5 об’єктів (дійсних чисел)
cout<<*(mPtr1-2)<<“\n”; // покажчик-зміщення назад на 3 об’єкта (дійсних числа)
mPtr1 -= 1; // зміщення назад на 1 об’єкт (дійснех число)
n = mPtr1 - mPtr2; // відстань (у елементах) між елементами масиву, на які вказують покажчики mPtr1 і mPtr2
Сортування масиву. Розрізняють декілька алгоритмів сортування елементів масиву:
-
сортування вибором,
-
сортування вставками
-
сортування обміном (бульбашкове сортування), тощо.
Сортування вибором: відшукуються максимальний (мінімальний) елемент і переноситься в початок масиву; потім ця операція застосовується до всіх елементів, крім першого і т.ін.
Сортування вставками: якщо перші k елементів масиву вже впорядковані, наприклад, по зростанню, то береться (k+1)-й елемент і розміщається серед перших k елементів так, щоб упорядкованими виявилися вже k+1 перших елементів; цей алгоритм застосовується при k від 1 до n -1.
Сортування обміном: послідовно порівнюються пари сусідніх елементів xk u xk+1 (k = 1, 2, 3, ..., n -1) і якщо xk >/< xk+1, то вони переставляються; тим самим найбільший (найменший) елемент виявиться на своєму місці наприкінці масиву; потім цей метод застосовується до всіх елементів, крім останнього, і т.ін.
Приклад. Сформувати вектор В, що складається з максимальних елементів рядків матриці А (10 х 3):
Const n=10;
m=3;
Var a : array [1..n, 1..m] of real;
b : array [1..n] of real;
i, j : integer;
max : real;
Begin
for i := 1 to n do
for j := 1 to m do
ReadLn (a [i, j]);
for i := 1 to n do
begin
max := a [i, 1];
for j := 2 to m do
if a [i, j] > max then max := a [i, j];
b [i] := max;
end;
for i := 1 to n do
Write (b [i], ‘ ‘ );
ReadLn;
End.