У С++ вказівники пов’язані з динамічним виділенням і звільненням пам’яті. З цим механізмом треба бути особливо обережним, бо він і є причиною основних помилок:
- Повільна робота програми через те, що виділення і звільнення великих об’ємів динамічної пам’яті відбувається дуже часто.
- Виліт програми, через доступ до пам’яті, яка вже звільнена.
- Витік пам’яті, коли виділена динамічна пам’ять більше не використовується, але і не звільнена.
Для практики роботи з динамічною пам’яттю напишіть програму, яка в циклі виконує наступні кроки:
- Вивести запит “Enter array:” і зчитати масив чисел: розмір масиву і його елементи.
- Якщо розмір масиву 0 — звільнити пам’ять і завершити роботу програми.
- Виділити пам’ять під масив тільки якщо попередньо виділеної пам’яті недостатньо (задля швидкодії). При цьому потрібно вивести повідомлення “Reallocation”.
- Вивести зчитаний масив як “Origin: ” і елементи масиву.
- Відсортувати масив в порядку спадання. Можна використовувати будь-які відомі алгоритми чи функції.
- Вивести посортований масив як “Sorted: ” і елементи масиву.
Приклади роботи:
Сценарій 1: Негайне завершення.
Enter array: 0
Сценарій 2: Одне виділення пам’яті (найбільший масив — перший).
Enter array: 3 2 1 3
Reallocation
Origin: 2 1 3
Sorted: 3 2 1
Enter array: 2 2 1
Origin: 2 1
Sorted: 2 1
Enter array: 1 1
Origin: 1
Sorted: 1
Enter array: 0
Сценарій 3: Кілька виділень пам’яті (найбільший масив — останній).
Enter array: 1 1
Reallocation
Origin: 1
Sorted: 1
Enter array: 2 1 2
Reallocation
Origin: 1 2
Sorted: 2 1
Enter array: 3 3 1 2
Reallocation
Origin: 3 1 2
Sorted: 3 2 1
Enter array: 0
Відповідь:
#include <iostream>
int main() {
int capacity = 0; // Фактичний розмір (місткість) масиву.
int size = 0; // Поточна кількість елементів (розмір) масиву.
int* array = nullptr;
while (true) {
std::cout << "Enter array: ";
// Зчитати лише розмір масиву.
std::cin >> size;
// Вийти з програми, якщо розмір 0.
if (size == 0) {
delete[] array;
return 0;
}
// Перевиділити пам'ять, якщо поточної недостатньо.
if (size > capacity) {
std::cout << "Reallocation" << std::endl;
delete[] array;
capacity = size;
array = new int[capacity];
}
// Зчитати елементи масиву.
for (int i = 0; i < size; ++i) {
std::cin >> array[i];
array[i] = array[i];
}
// Вивести зчитаний масив.
std::cout << "Origin:";
for (int i = 0; i < size; ++i) {
std::cout << ' ' << array[i];
}
// Відсортувати масив.
std::cout << std::endl;
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size - i - 1; j++) {
if (array[j] < array[j + 1]) {
std::swap(array[j], array[j + 1]);
}
}
}
// Вивести відсортований масив.
std::cout << "Sorted:";
for (int i = 0; i < size; ++i) {
std::cout << ' ' << array[i];
}
std::cout << std::endl;
}
}
Добавить комментарий