3. Операції над структурами даних
Створення полягає у виділенні пам’яті для зберігання структури
даних.
Знищення структур даних протилежна до операції створення – вона
звільнює пам’ять, яку займала структура, для подальшого використання.
Вибору використовується програмістами для доступу до даних в
самій структурі.
Поновлення дозволяє змінити значення даних в структурі даних.
5. 5
Масиви
Масив – це група однотипних елементів, які мають загальне ім'я та
розміщуються в пам'яті поряд.
Особливості:
• всі елементи мають один тип
• весь масив має одне ім'я
• всі елементи розміщуються в пам'яті поряд
Створення масиву
тип ім’я [к-сть_елементів]
тип - будь- який із вам відомих типів. Визначає, елементи якого
типу будуть зберігатися у масиві.
ім’я – аналогічно зі змінними. По цьому імені створюються
звернення до окремих елементів.
Н-д: int a [100], bool apple1[1000]
Потрібно пам’ятати:
1. К-сть елементів завжди є натуральним числом.
2. Замість кількості елементів не можна писати змінні.
6. 6
Масиви
Для указання елемента
• Назва масиву
• Номер позиції
Формат:
ім'я масиву [ номер позиції ]
• Перший елемент на позиції 0
•n елементів в массиві c:
c[ 0 ], c[ 1 ]...c[ n – 1 ]
Ім'я масиву
Номер позиції
c[6]
-45
6
0
72
1543
-89
0
62
-3
1
6453
78
c[0]
c[1]
c[2]
c[3]
c[11]
c[10]
c[9]
c[8]
c[7]
c[5]
c[4]
7. 7
Оголошення масивів
Приклад оголошення:
int X[10], Y[10];
float zz, A[20];
char s[80];
Оголошення з присвоєнням початкових значень:
int A[4] = { 8, -3, 4, 6 };
float B[2] = { 1.2 };
char C[3] = { 'A', '1', 'Ю' };
int В[4] = { 8, -3, 4, 6, 5 };
Інші
нульові!
Синтаксична
помилка
Якщо не вказано розмір, він визначається
ініціалізацією
int n[ ] = { 1, 2, 3, 4, 5 };
розмір масиву буде 5
9. Вивід на екран
1 спосіб виводу:
cout<< "1 Output array:"<<endl;
for(i=0;i<5;i++){
cout<<"a["<<i<<"]="<< a[i]<<endl;
}
2 спосіб виводу:
cout<< "1 Output array:"<<endl;
for(i=0;i<5;i++){
cout<< a[i]<<”t”;
}
cout<< endl;
10. 10
Заповнення масиву випадковими числами
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
Int main()
{
const int N = 30;
int A[N], i;
cout << "Іnitial array:"<<endl;
for (i = 0; i < N; i++ ) {
A[i] = rand ()% 10 + 50;
cout<< A[i]<<endl;
}
return 0;
}
Який інтервал?
?
[ 50 … 59 ]
11. 11
Сортування
Сортування – це розміщення елементів масиву в
заданому порядку (за зростанням, за спаданням).
Задача: переставити елементи масиву в порядку
зростання.
Алгоритми:
• прості і зрозумілі, але неефективні для великих масивів
метод бульбашок
метод вибору
метод вставки
• складні, але ефективні
«швидке сортування» (Quick Sort)
сортування «кучею» (Heap Sort)
сортування злиттям
пірамідальне сортування
складність
O(N2)
складність
O(N·logN)
время
N
O(N2)
O(N·logN)
12. 12
Метод бульбашок
Ідея – бульбашка повітря в стакані води піднімається з дна
наверх.
Для масивів – самий маленький («легкий») елемент
переміщається наверх («вспливає»).
5
2
1
3
5
2
1
3
5
1
2
3
1
5
2
3
• починаючи знизу, порівнюємо
два сусідніх елементи; якщо вони
стоять «неправильно», міняємо їх
місцями
• за 1 прохід по масиву один
елемент (самий маленький) стає
на своє місце
1
5
2
3
1
5
2
3
1
2
5
3
1-ий прохід
2-ий прохід 3-ій прохід
1
2
5
3
1
2
3
5
Для сортування масиву з N
елементів потрібен
N-1 прохід (достатньо
поставити на свої місця N-
1 елементів).
14. 14
Програма (наступні проходи)
2-ий прохід
A[0] уже на своєму місці!
!
for ( j = N-2; j >= 1 ; j-- )
if ( A[j] > A[j+1] ) {
c = A[j];
A[j] = A[j+1];
A[j+1] = c;
}
1
(i+1)-ий прохід
for ( j = N-2; j >= i ; j-- )
...
i
1
5
…
3
6
0
1
…
N-2
N-1
15. 15
Програма
main()
{
const int N = 10;
int A[N], i, j, c;
// заповнити масив
// вивести початковий масив
for (i = 0; i < N-1; i ++){
for (j = N-2; j >= i ; j --)
if ( A[j] > A[j+1] ) {
с = A[j];
A[j] = A[j+1];
A[j+1] = с;
}
}
// вивести отриманий масив
}
Чому цикл для i < N-1,
а не i < N?
?
елементи вище
A[i] уже
поставлені
i
міняємо
A[j] і
A[j+1]
16. 16
Метод бульбашок з прапорцем
Ідея – якщо при виконанні метода бульбашок не
було обмінів, масив уже відсортовано і інші
проходи не потрібні.
Реалізація: змінна-прапорець, показує, чи був
обмін; якщо вона дорівнює 0, то вихід.
do {
flag = 0; // скинути прапорець
for (j = N-2; j >= 0; j --)
if ( A[j] > A[j+1] ) {
с = A[j];
A[j] = A[j+1];
A[j+1] = с;
flag = 1; // установити прапорець
}
}
while ( flag ); // вихід при flag = 0
flag = 0;
flag = 1;
( flag );
int flag;
2
1
4
3
1
2
3
4
17. 17
Метод бульбашок з прапорцем
i = 0;
do {
flag = 0; // скинути прапорець
for ( j = N-2; j >= i ; j -- )
if ( A[j] > A[j+1] ) {
с = A[j];
A[j] = A[j+1];
A[j+1] = с;
flag = 1; // установити прапорець
}
i ++;
}
while ( flag ); // вихід при flag = 0
i = 0;
i
i ++;
18. 18
Метод вибору
Ідея:
• знайти мінімальний елемент і поставити на перше
місце (поміняти місцями з A[0])
• з тих елементів, що залишились знайти
мінімальний елемент і поставити на друге місце
(поміняти місцями з A[1]), і т.д.
4
3
1
2
1
3
4
2
1
2
4
3
1
2
3
4
19. 19
Метод вибору
N
for( i = 0; i < N-1 ; i ++ ) {
nMin = i ;
for ( j = i+1; j < N; j ++)
if( A[j] < A[nMin] ) nMin = j;
if( nMin != i ) {
c = A[i];
A[i] = A[nMin];
A[nMin] = c;
}
}
N-1
потрібно N-1
проходів
пошук мінімального
від A[i] до A[N-1]
якщо потрібно,
переставляємо
Чи можна забрати if?
?
i+1
i
20. 20
Матриці
Матриця –це прямокутна таблиця однотипних елементів.
Матриця – це масив, в якому кожен елемент має два індекси
(номер рядка і номер стовбця).
1 4 7 3 6
2 -5 0 15 10
8 9 11 12 20
0
1
2
0 1 2 3 4
A
7
0
11
2 -5 0 15 10
12
рядок 1
стовбець 2
комірка A[2][3]
21. 21
Матриця
Оголошення:
const int N = 3, M = 4;
int A[N][M],B[3][4];
float a[2][2] = {{3.2, 4.3}, {1.1, 2.2}};
char sym[2][2] = { 'a', 'b', 'c', 'd' };
int mas [2][5] ={ 1, 5, 3, 7, 4,10, 11, ІЗ, 14, 25 };
int mas [ ][5] ={ 1, 5, 3, 7, 4, 10, 11, 13, 14, 25};
int mas [ ][5] ={ { 1, 5, 3, 7, 4 },{10, 11, 13, 14, 25} };
Ввід з клавіатури:
for ( i = 0; i < N; i ++ )
for ( j = 0; j < M; j ++ ) {
cout<<“A[“<<i<<“][“<<j<<“]=“;
cin>>A[i][j] ;
} 54
A[0][0]=25
A[0][1]=14
A[0][2]=14
...
A[2][3]=
i j
22. 22
Матриці
Вивід на екран
for ( i = 0; i < N; i ++ ) {
for ( j = 0; j < M; j ++ )
cout<<setw(5)<< A[i][j];
cout<<endl;
}
12 25 1 13
156 1 12 447
1 456 222 23
Результат
23. 23
Обробка всіх елементів матриці
Задача: заповнити матрицю з 3 рядків і 4 стовбців випадковими
числами і вивести її на екран. Знайти суму елементів
матриці.
Int main()
{
const int N = 3, M = 4;
int A[N][M], i, j, S = 0;
... // заповнення матриці і вивід на екран
for ( i = 0; i < N; i ++ )
for ( j = 0; j < M; j ++ )
S += A[i][j];
cout<<"Сума елементів матриці =”<< S <<endl;
}
for ( i = 0; i < N; i ++ )
for ( j = 0; j < M; j ++ )
S += A[i][j];
24. 24
Операції з матрицями
Задача 1. Вивести на екран головну діагональ квадратної
матриці з N рядків і N стовбців.
A[0][N-1]
A[1][1]
A[2][2]
A[N-1][N-1]
for ( i = 0; i < N; i ++ )
cout << A[i][i] << endl;
Задача 2. Вивести на екран другу діагональ.
A[N-1][0]
A[N-2][1]
A[1][N-2]
сума номерів рядка і стовбця N-1
A[0][0]
for ( i = 0; i < N; i ++)
cout << A[i][ N-1-i ]<< endl;
25. 25
Операції з матрицями
Задача 3. Знайти суму елементів, які стоять на головній
діагоналі і нижче неї.
рядок 0: A[0][0]
рядок 1: A[1][0]+A[1][1]
...
рядок i: A[i][0]+A[i][2]+...+A[i][i]
S = 0;
for ( i = 0; i < N; i ++ )
for ( j = 0; j <= i; j ++ )
S += A[i][j];
цикл за всіма рядками
додаємо потрібні
елементи рядка i
26. 26
Завдання
Заповнити матрицю з 7 рядків і 7 стовбців випадковими
числами в інтервалі [ 1, 9] і вивести її на екран. Обнулити
елементи, які відмічено зеленим фоном, і вивести отриману
матрицю на екран.
«Задача 4»: «Задача 5»: