350 Алгоритми та структури даних

Конспекти лекцій та Лабораторні роботи з дисципліни "Алгоритми та структури даних" для III курсу спеціальності 121 "Інженерія програмного забезпечення" ОКР "Фаховий молодший бакалавр" Херсонського політехнічного фахового коледжу Державного університету "Одеська політехніка"

View the Project on GitHub solidol/nmk-asd

Перелік усіх робіт

Обробка багатовиміних динамічних масивів

Мета роботи

Ознайомитись з IDE Visual Studio. Навчитися створювати проект. Здобути навички у знаходженнi мінімального і максимального значення в масиві. Обладнання та ПЗ: персональний комп’ютер, Visual Studio 2008.

Обладнання

Персональний комп’ютер, Visual Studio 2008 або інша середа розробки для мови C++

Теоретичні відомості

Крім одновимірних масивів, тобто таких, де позиція елемента визначається за допомогою одного індексу, у практиці розв’язання задач часто застосовуються багатовимірні масиви. У них позиція елемента визначається записом декількох індексів. Найбільш розповсюджені двовимірні масиви або матриці. Матриці являють собою порядковий запис декількох одновимірних масивів. Місце розташування кожного елемента визначається за допомогою двох індексів — номера рядка і номера стовпця, тобто порядкового номера в рядку. Індекси двовимірних масивів записуються в квадратних дужках і нумерація індексів починається з нуля (0).

Статичні багатовимірні масиви

Наприклад, двовимірний масив цілих чисел int а[3][4], що має три рядки та чотири стовпці, представлений в таблиці:

  Ст1 Ст2 Ст3 Ст4
Р1 а[0][0] а[0][1] а[0][2] а[0][3]
Р2 а[1][0] а[1][1] а[1][2] а[1][3]
Р3 а[2][0] а[2][1] а[2][2] а[2][3]

У пам’яті комп’ютера масив розташовується безперервно за рядками:

а[0][0], а[0][1], а[0][2], а[0][3], а[1][0], а[1][1], а[1][2], а[1][3], … а[2][3].

Двовимірні (і багатовимірні) масиви оголошуються так:

int arr1[2][5] = {1, 5, 3, 7, 4,10, 11, 13, 14, 25};
int arr2[][5] = {1, 5, 3, 7, 4, 10, 11, 13, 14, 25};
int arr3[][5] = { {1, 5, 3, 7, 4}, {10, 11, 13, 14, 25} };

Масив задається або списком елементів у тому порядку, в якому вони розташовані у пам’яті, або подається як масив масивів, кожний з яких поміщається в свої фігурні дужки {}. При оголошенні і одночасному ініціюванні багатовимірних масивів можна опускати кількість індексів тільки першого виміру. Якщо ініціювання не здійснюється під час оголошення масиву, то кількість індексів треба вказувати явно.

Динамічні багатовимірні масиви

У багатьох задачах розмір масиву може бути відомий лише під час виконання програми. Для цього використовують динамічні масиви, які створюються під час виконання програми за допомогою оператора new (у C++) або функцій malloc/calloc (у C).

Динамічний двовимірний масив у C++

Для створення динамічного двовимірного масиву розміром n x m можна використати масив покажчиків:

int n = 10, m = 10;
int** arr = new int*[n];
for (int i = 0; i < n; ++i) {
    arr[i] = new int[m];
}

Заповнення випадковими числами:

for (int i = 0; i < n; ++i)
    for (int j = 0; j < m; ++j)
        arr[i][j] = rand() % 11 - 5; // від -5 до 5

Звільнення пам’яті:

for (int i = 0; i < n; ++i)
    delete[] arr[i];
delete[] arr;

Особливості роботи з динамічними масивами

Приклад створення тривимірного динамічного масиву

int x = 3, y = 4, z = 5;
int*** arr = new int**[x];
for (int i = 0; i < x; ++i) {
    arr[i] = new int*[y];
    for (int j = 0; j < y; ++j) {
        arr[i][j] = new int[z];
    }
}
// ... використання ...
// Звільнення пам’яті:
for (int i = 0; i < x; ++i) {
    for (int j = 0; j < y; ++j)
        delete[] arr[i][j];
    delete[] arr[i];
}
delete[] arr;

Переваги та недоліки динамічних масивів

Переваги:

Недоліки:

Приклад вкладених циклів для перебору двовимірного масиву

for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
        // робота з arr[i][j]
    }
}

Приклад заповнення двовимірного масиву випадковими числами

srand(time(0));
for (int i = 0; i < n; ++i)
    for (int j = 0; j < m; ++j)
        arr[i][j] = rand() % 11 - 5; // від -5 до 5

Хід роботи

  1. Завантажити Visual Studio. Знайдіть на робочому столі ярлик з Visual Studio 2008 або Пуск → Всі програми→ Microsoft → Microsoft Visual Studio 2008.

  2. Створити новий проект «Visual C++ (консольное приложение Win32)». Файл → Cтворити → Проект, тип проекту «Консольное приложение Win32».

  3. Перевірте роботу прикладів ха посиланнями нижче, поясніть їх роботу

  4. Розв’яжіть задачу згідно з варіантом. Знайдіть час роботи програми.

    Варіант 1. Даний двовимірний динамічний масив розміру 10x10 заповнений випадковими числами. Для кожного рядка масиву знайти суму елементів

    Варіант 2. Даний двовимірний динамічний масив розміру 10x10 заповнений випадковими числами. Для кожного стовпця масиву знайти суму елементів.

    Варіант 3. Даний двовимірний динамічний масив розміру 10x10 заповнений випадковими числами. Обчислити суму всіх елементів масиву.

    Варіант 4. Даний двовимірний динамічний масив розміру 10x10 заповнений випадковими числами. Підрахувати кількість нульових елементів.

    Варіант 5. Даний двовимірний динамічний масив розміру 10x10 заповнений випадковими числами. Обчислити середнє арифметичне ненульових елементів масиву.

    Варіант 6. Даний двовимірний динамічний масив розміру 10x10 заповнений випадковими числами. Для кожного рядка масиву з непарним номером знайти середнє арифметичне елементів.

    Варіант 7. Даний двовимірний динамічний масив розміру 10x10 заповнений випадковими числами. Для кожного стовпця масиву з парним номером знайти суму елементів.

    Варіант 8. Даний двовимірний динамічний масив розміру 10x10 заповнений випадковими числами. Для кожного рядка масиву знайти мінімальний елемент.

    Варіант 9. Даний двовимірний динамічний масив розміру 10x10 заповнений випадковими числами. Для кожного стовпця масиву можна знайти максимальний елемент.

    Варіант 10. Даний двовимірний динамічний масив розміру 10x10 заповнений випадковими числами. Підрахувати кількість рядків, що містять лише парні числа.

  5. Для кожного етапу роботи зробити знімки екрану та додати їх у звіт з описом кожного скіншота
  6. Додати програмний код завдання для самомтійного виконання
  7. Дати відповіді на контрольні запитання
  8. Зберегти звіт у форматі PDF

Контрольні питання

  1. Що таке багатовимірний масив? Які бувають типи багатовимірних масивів?
  2. Наведіть приклади оголошення двовимірного масиву (статичного та динамічного).
  3. Яким чином задається багатовимірний масив у C та C++?
  4. Наведіть приклад конструкції вкладених циклів, яка перебирає двовимірний масив.
  5. Наведіть приклад заповнення двовимірного масиву випадковими числами від -5 до 5 за допомогою функції rand().
  6. Як створити динамічний двовимірний масив у C++? Наведіть приклад коду.
  7. Як звільнити пам’ять, виділену під динамічний багатовимірний масив?
  8. Які переваги та недоліки використання динамічних масивів порівняно зі статичними?
  9. Як створити тривимірний динамічний масив? Наведіть приклад.
  10. Які помилки можуть виникнути при роботі з динамічними масивами?

Приклади

  1. Приклад 1
  2. Приклад 2

Довідники та додаткові матеріали

  1. Arrays - cplusplus.com
  2. Arrays (C++) - Microsoft Docs
  3. Використання масивів