Завдання 11 Дедлайн 14 грудня

в

У С++ вказівники пов’язані з динамічним виділенням і звільненням пам’яті. З цим механізмом треба бути особливо обережним, бо він і є причиною основних помилок:

  • Повільна робота програми через те, що виділення і звільнення великих об’ємів динамічної пам’яті відбувається дуже часто.
  • Виліт програми, через доступ до пам’яті, яка вже звільнена.
  • Витік пам’яті, коли виділена динамічна пам’ять більше не використовується, але і не звільнена.

Для практики роботи з динамічною пам’яттю напишіть програму, яка в циклі виконує наступні кроки:

  1. Вивести запит “Enter array:” і зчитати масив чисел: розмір масиву і його елементи.
  2. Якщо розмір масиву 0 — звільнити пам’ять і завершити роботу програми.
  3. Виділити пам’ять під масив тільки якщо попередньо виділеної пам’яті недостатньо (задля швидкодії). При цьому потрібно вивести повідомлення “Reallocation”.
  4. Вивести зчитаний масив як “Origin: ” і елементи масиву.
  5. Відсортувати масив в порядку спадання. Можна використовувати будь-які відомі алгоритми чи функції.
  6. Вивести посортований масив як “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;
   }
}

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Максимальный размер загружаемого файла: 1 ГБ. Вы можете загрузить: изображение, аудио, видео, документ, таблица, интерактив, текст, архив, код, другое. Ссылки на YouTube, Facebook, Twitter и другие сервисы, вставленные в текст комментария, будут автоматически встроены. Перетащите файл сюда