Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Масивы,регулярные типы данных..doc
Скачиваний:
3
Добавлен:
25.11.2018
Размер:
206.85 Кб
Скачать

Операції з масивами

Масиви, як цілісні структури, можуть брати участь тільки в операціях "дорівнює" / "не дорівнює" і в операторах присвоювання. При цьому відповідні масиви повинні бути ідентичні за структурою (мати однакові типи індексів і типи компонентів).

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

Базові операції обробки векторів (одновимірних масивів). Такими базовими операціями є:

  • введення-виведення масиву

    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.

8