Українська
Завдання
Відповідно до номера свого варіанта виконайте завдання обраного рівня складності.
Позначте власників і невласницькі зв’язки у схемі.
Варіанти
Варіант 1. Черга пацієнтів
1. Початковий рівень. Створити консольну програму. Зчитати кількість до 100 та навчальні імена пацієнтів, вивести порядок обслуговування. Побудувати однозв’язну чергу з вузлами на unique_ptr; після вилучення останнього вузла коректно обнулити невласницький хвіст.
2. Базовий рівень. Створити консольну програму. Зчитати кількість до 100, навчальні імена пацієнтів і пріоритет 0–2 кожного, вивести порядок обслуговування. Зберігати чергу в однозв’язному списку вузлів unique_ptr; обслуговувати більший пріоритет першим, за рівності зберігати порядок надходження; усі вузли мають одного власника.
3. Високий рівень. Створити консольну програму. Зчитати кількість до 100 та навчальні імена пацієнтів, вивести порядок обслуговування. Зберігати чергу у вузлах unique_ptr. Приймати команди add, serve, cancel до end з унікальним ID і пріоритетом 0–2. Передавати володіння вузлами через move, відхиляти невідомі ID; наприкінці вивести чергу й перевірити звільнення всіх вузлів.
Варіант 2. Склад потяга
1. Початковий рівень. Створити консольну програму. Зчитати кількість і унікальні номери вагонів, вивести склад від голови до хвоста і назад. Створити список: next володіє через unique_ptr, prev є невласницьким вказівником. Для порожнього складу вивести empty.
2. Базовий рівень. Створити консольну програму. Зчитати кількість і унікальні номери вагонів, вивести склад від голови до хвоста і назад. Зберігати склад у двозв’язному списку: next володіє через unique_ptr, prev невласницький. Приймати команди додавання і вилучення за номером; після кожної зміни перевірити узгодженість prev і next та вивести склад в обох напрямах.
3. Високий рівень. Створити консольну програму. Зчитати два склади з унікальними номерами вагонів у двозв’язних списках (next – unique_ptr, prev – невласницький) і номер розчеплення; переносити хвостову частину між списками без копіювання вагонів. Вивести обидва склади від голови до хвоста і назад, перевірити перенос усіх вузлів, одного й відсутнього номера.
Варіант 3. Задача Йосипа
1. Початковий рівень. Створити консольну програму. Зчитати n від 1 до 100 та додатний крок k; учасники мають номери 1..n. Рахувати за зростанням номерів циклічно, починаючи з 1; поточний учасник рахується першим, кожний k-й вибуває, наступний відлік починається з його наступника. Вивести порядок вибуття і номер останнього учасника. Володіти вузлами в контейнері unique_ptr, кільце утворити невласницькими вказівниками. Перед знищенням вузла оновити сусідні посилання.
2. Базовий рівень. Створити консольну програму. Зчитати n від 1 до 100 та додатний крок k; учасники мають номери 1..n. Рахувати за зростанням номерів циклічно, починаючи з 1; поточний учасник рахується першим, кожний k-й вибуває, наступний відлік починається з його наступника. Вивести порядок вибуття і номер останнього учасника. Побудувати кільце з єдиним явним власником кожного вузла; перевірити n=1, k=1 і k понад n, не розіменовувати вилучений вузол.
3. Високий рівень. Створити консольну програму. Зчитати n від 1 до 100 та додатний крок k; учасники мають номери 1..n. Рахувати за зростанням номерів циклічно, починаючи з 1; поточний учасник рахується першим, кожний k-й вибуває, наступний відлік починається з його наступника. Вивести порядок вибуття і номер останнього учасника. Учасників зберігати в кільці вузлів з єдиним власником кожного. Після кожного вибуття новим кроком зробити номер вилученого учасника. Вивести покрокову трасу й порівняти результат з незалежною моделлю на vector для малих n.
Варіант 4. Дерево термінів
1. Початковий рівень. Створити консольну програму. Зчитати пари термін/пояснення до end; вивести словник за алфавітом. Побудувати бінарне дерево з left/right на unique_ptr; повторний термін оновлює пояснення.
2. Базовий рівень. Створити консольну програму. Зчитати пари термін/пояснення до end; вивести словник за алфавітом. Зберігати словник у бінарному дереві пошуку з left/right на unique_ptr. Підтримати пошук і вилучення терміна, включно з вузлом із двома дітьми; після команди друкувати впорядкований обхід.
3. Високий рівень. Створити консольну програму. Зчитати два словники пар термін/пояснення до end у бінарні дерева пошуку з left/right на unique_ptr; об’єднати їх у нове незалежне дерево, для однакових термінів зберегти пояснення другого. Вивести результат за алфавітом і довести, що зміна копії не змінює джерела; перевірити звільнення дерев.
Варіант 5. Історія браузера
1. Початковий рівень. Створити консольну програму. Зчитувати команди visit URL і back до end; після кожної вивести поточну сторінку або empty. Реалізувати історію назад як стек вузлів unique_ptr; перехід назад передає володіння без висячих посилань.
2. Базовий рівень. Створити консольну програму. Зчитувати команди visit URL, back і forward до end; після кожної вивести поточну сторінку або empty. Історію зберігати у двох стеках назад/вперед із вузлів unique_ptr; новий visit очищає майбутню історію, невдалий перехід залишає поточну сторінку.
3. Високий рівень. Створити консольну програму. Зчитувати команди visit URL, back, forward і clear до end; після кожної вивести поточну сторінку або empty. Історію зберігати у двох стеках назад/вперед із вузлів unique_ptr. Зчитати невід’ємний ліміт кожного стека на початку; найдавніші записи понад ліміт видаляти. Новий visit очищає майбутню історію. Вивести обидва стеки й поточний URL; перевірити ліміт 0, порожні переходи та звільнення відкинутих вузлів.
Варіант 6. Список рядків редактора
1. Початковий рівень. Створити консольну програму. Зчитати початкові рядки та команди insert index text, erase index до end; вивести текст після кожної команди. Зберігати рядки в однозв’язному списку unique_ptr; індекси нульові, вставка дозволена також у кінець.
2. Базовий рівень. Створити консольну програму. Зчитати початкові рядки та команди insert index text, erase index і undo до end; вивести текст після кожної команди. Зберігати рядки в однозв’язному списку unique_ptr; undo скасовує останню вставку або вилучення, вилучений вузол зберігається в єдиному власнику до відновлення.
3. Високий рівень. Створити консольну програму. Зчитати початкові рядки та команди insert index text, erase index, undo і redo до end; вивести текст після кожної команди. Зберігати рядки в однозв’язному списку unique_ptr. Підтримати довільний стек undo/redo на вузлах, після нової правки очищати redo. Вивести текст і довжини історій; перевірити скасування після вилучення останнього рядка.
Варіант 7. Родинне дерево
1. Початковий рівень. Створити консольну програму. Задати у коді навчальні імена та зв’язки батько–дитина; зчитати ім’я і вивести предків. Діти зберігаються shared_ptr, посилання на батька – weak_ptr; перед доступом використовувати lock.
2. Базовий рівень. Створити консольну програму. Задати у коді навчальні імена та зв’язки батько–дитина; зчитати ім’я і вивести предків. Діти зберігаються shared_ptr, батько – weak_ptr. Перевіряти відсутність циклу перед додаванням зв’язку, заборонити другого батька у цій спрощеній моделі; вивести дерево й причини відмов.
3. Високий рівень. Створити консольну програму. Задати у коді навчальні імена та зв’язки батько–дитина (діти – shared_ptr, батько – weak_ptr); зчитати ім’я і вивести предків. Дозволити від’єднати гілку і перенести її до іншого батька через команди з клавіатури. Вивести предків після переносу, перевірити expired після вилучення всіх власників гілки.
Варіант 8. Навчальна соціальна мережа
1. Початковий рівень. Створити консольну програму. Зчитати ID користувачів та пари дружби; вивести для кожного список доступних друзів. Реєстр володіє користувачами через shared_ptr, дружба містить weak_ptr; пропускати прострочені зв’язки.
2. Базовий рівень. Створити консольну програму. Зчитати ID користувачів та пари дружби; вивести для кожного список доступних друзів. Реєстр володіє користувачами через shared_ptr, дружба містить weak_ptr. Підтримати команду видалення користувача, очищати expired зв’язки, не створюючи циклів володіння; вивести оновлену мережу.
3. Високий рівень. Створити консольну програму. Зчитати ID користувачів та пари дружби; вивести для кожного список доступних друзів. Реєстр володіє користувачами через shared_ptr, дружба містить weak_ptr. Шукати найкоротший шлях дружби між двома введеними ID. Тимчасові shared_ptr отримувати лише через lock; після очищення реєстру перевірити знищення всіх користувачів.
Варіант 9. Книги й читачі
1. Початковий рівень. Створити консольну програму. Задати у коді книги з ID і назвою, зчитувати команди позики та повернення; вивести книги кожного навчального читача. Каталог і активна позика спільно володіють описом книги через shared_ptr; одна книга може мати кілька незалежних посилань на опис.
2. Базовий рівень. Створити консольну програму. Задати у коді книги з ID і назвою, зчитувати команди позики та повернення; вивести книги кожного навчального читача. Каталог і позики спільно володіють описом книги через shared_ptr. Зчитати кількість доступних примірників кожної книги окремо від опису, відхиляти позику понад запас; друкувати залишки без використання use_count як бізнес-лічильника.
3. Високий рівень. Створити консольну програму. Задати у коді книги з ID і назвою, зчитувати команди позики та повернення; вивести книги кожного навчального читача. Каталог і позики спільно володіють описом книги через shared_ptr. Підтримати вилучення опису з каталогу: активна позика зберігає його живим до повернення. Вивести доступність опису через weak_ptr до і після останнього повернення.
Варіант 10. Динамічна матриця
1. Початковий рівень. Створити консольну програму. Зчитати рядки й стовпці 1–20 та елементи матриці; вивести таблицю й суму елементів. Виділити один суцільний масив через new[], індексувати як row*cols+col, завершити delete[]. Перевірити розміри до виділення.
2. Базовий рівень. Створити консольну програму. Зчитати рядки й стовпці 1–20 та елементи матриці; вивести таблицю й суму елементів. Зчитати дві сумісні матриці й обчислити добуток у третьому буфері; використовувати unique_ptr для автоматичного звільнення масивів, перевіряти сумісність.
3. Високий рівень. Створити консольну програму. Зчитати рядки й стовпці 1–20 та елементи матриці в суцільний динамічний масив; вивести таблицю й суму елементів. Реалізувати незалежне глибоке копіювання буфера та транспонування у новий буфер. Зчитати координату й нове значення для копії, надрукувати обидві матриці, довівши незалежність і відсутність витоків.
Варіант 11. Кільцевий буфер датчика
1. Початковий рівень. Створити консольну програму. Зчитати місткість 1–100 і серію чисел до end; вивести збережені значення від найстарішого. Виділити сирий масив new[], підтримати head і count; при заповненні відхиляти нове значення без зміни буфера. Звільнити delete[] після завершення.
2. Базовий рівень. Створити консольну програму. Зчитати місткість 1–100 і серію чисел до end; вивести збережені значення від найстарішого. Зберігати їх у кільцевому буфері на масиві new[] з head і count; при заповненні перезаписувати найстаріше значення; після кожного додавання виводити логічний порядок і середнє наявних даних.
3. Високий рівень. Створити консольну програму. Зчитати місткість 1–100 і серію чисел до end у кільцевий буфер на масиві new[] з head і count; вивести збережені значення від найстарішого. Додати команду resize з новою додатною місткістю; зберігати найновіші значення у новому масиві, старий звільняти після успішного переносу. Перевірити зменшення, збільшення й місткість 1.
Варіант 12. Поліном на списку
1. Початковий рівень. Створити консольну програму. Зчитати пари коефіцієнт/степінь, степені 0–20; вивести ненульові члени за спаданням степеня. Зберігати члени у списку unique_ptr, об’єднувати однакові степені та видаляти нульові коефіцієнти.
2. Базовий рівень. Створити консольну програму. Зчитати два поліноми парами коефіцієнт/степінь, степені 0–20; зберігати члени у списках unique_ptr, об’єднуючи однакові степені. Побудувати суму в незалежному списку; вивести обидва джерела й результат ненульовими членами за спаданням степеня.
3. Високий рівень. Створити консольну програму. Зчитати два поліноми парами коефіцієнт/степінь, степені 0–20, коефіцієнти до 100 за модулем, не більш ніж 20 членів кожний; зберігати члени у списках unique_ptr. Перемножити поліноми, об’єднати повторні степені, вивести добуток ненульовими членами за спаданням степеня та перевірити обчислення у x=0 і x=1.
Варіант 13. Розріджена матриця
1. Початковий рівень. Створити консольну програму. Зчитати розміри до 20×20 і трійки row,col,value; вивести щільну таблицю. Кожний рядок подати списком unique_ptr ненульових елементів, індекси перевірити до доступу; повторну координату замінювати.
2. Базовий рівень. Створити консольну програму. Зчитати дві розріджені матриці однакової форми до 20×20 трійками row,col,value; кожний рядок зберігати списком unique_ptr ненульових елементів. Додати матриці, не зберігаючи нульові суми; друкувати кількість вузлів і щільну таблицю.
3. Високий рівень. Створити консольну програму. Зчитати розміри до 20×20 і трійки row,col,value; кожний рядок розрідженої матриці зберігати списком unique_ptr ненульових елементів; вивести щільну таблицю. Побудувати транспоновану матрицю та добуток на введений вектор сумісної довжини. Вивести результати, перевірити нульову матрицю й очищення всіх списків.
Варіант 14. Велике ціле число
1. Початковий рівень. Створити консольну програму. Зчитати два невід’ємні десяткові числа довжиною до 100 цифр; вивести їхню суму. Зберігати цифри у списку unique_ptr молодшими вперед, перенос додавання виконувати по вузлах; прибрати зайві початкові нулі у виведенні.
2. Базовий рівень. Створити консольну програму. Зчитати два невід’ємні десяткові числа довжиною до 100 цифр і зберігати цифри у списках unique_ptr молодшими вперед; вивести їхню суму. Порівняти числа й відняти менше від більшого, вивести знак відносно порядку введення та модуль різниці; перевірити рівність.
3. Високий рівень. Створити консольну програму. Зчитати два невід’ємні десяткові числа довжиною до 100 цифр і зберігати цифри у списках unique_ptr молодшими вперед; вивести їхню суму. Реалізувати множення цифр у списках із переносами, не перетворюючи весь рядок на вбудований числовий тип. Вивести добуток та перевірити множення на 0, 1 і 99.
Варіант 15. Планувальник завдань
1. Початковий рівень. Створити консольну програму. Зчитати ID і назви завдань; вивести чергу виконання. Кожне завдання створити як unique_ptr та передати у чергу через move; після переносу джерело не розіменовувати.
2. Базовий рівень. Створити консольну програму. Зчитати ID і назви завдань, кожне створити як unique_ptr і розмістити в черзі ready. Приймати команди переносу за ID між чергами ready і waiting через move; виводити обидві черги, заборонити дублікати ID.
3. Високий рівень. Створити консольну програму. Зчитати ID і назви завдань, кожне створити як unique_ptr і передати в чергу через move; вивести чергу. Зчитати список ID для пакетного виконання: спершу перевірити існування всіх завдань, потім вилучити їх із черги й виконати. За відмови вивести незмінний стан, інакше результат; перевірити знищення виконаних завдань.
Варіант 16. Буфер зображення
1. Початковий рівень. Створити консольну програму. Зчитати розміри до 20×20 та цілі яскравості 0–255; вивести матрицю пікселів. Використати суцільний масив new[]/delete[] та горизонтально віддзеркалити кожний рядок.
2. Базовий рівень. Створити консольну програму. Зчитати розміри до 20×20 та цілі яскравості 0–255; вивести матрицю пікселів. Повернути зображення на 90 градусів у новому масиві unique_ptr, помінявши місцями розміри; надрукувати результат.
3. Високий рівень. Створити консольну програму. Зчитати розміри до 20×20 та цілі яскравості 0–255 у суцільний динамічний масив; вивести матрицю пікселів. Реалізувати глибоку копію і обрізання прямокутника за введеними координатами. Вивести оригінал та обрізану копію, перевірити вихід за межі до виділення й незалежність буферів.
Варіант 17. Дерево виразу
1. Початковий рівень. Створити консольну програму. Зчитати постфіксний вираз з цілих чисел і знаків +, -; вивести значення й інфіксний запис із дужками. Побудувати вузли на unique_ptr за допомогою стека власників; перед операцією перевірити два операнди.
2. Базовий рівень. Створити консольну програму. Зчитати постфіксний вираз із дійсних чисел і знаків +, -, *, /; побудувати дерево виразу з вузлами unique_ptr через стек власників; вивести значення й інфіксний запис із дужками. Відхиляти нульовий дільник та незавершений вираз; друкувати діагноз без витоків часткового дерева.
3. Високий рівень. Створити консольну програму. Зчитати постфіксний вираз з цілих чисел і знаків +, -; побудувати дерево виразу з вузлами unique_ptr; вивести значення й інфіксний запис із дужками. Створити незалежну копію дерева, замінити у ній усі числові листки на їхні модулі; вивести обидва вирази та результати, перевірити незалежність вузлів.
Варіант 18. Граф маршрутів
1. Початковий рівень. Створити консольну програму. Зчитати назви вершин і пари суміжних вершин неорієнтованого графа; вивести списки сусідів. Реєстр володіє вершинами через shared_ptr, ребра містять weak_ptr; петлі й повторні ребра відхиляти.
2. Базовий рівень. Створити консольну програму. Зчитати назви вершин і пари суміжних вершин неорієнтованого графа; реєстр володіє вершинами через shared_ptr, ребра містять weak_ptr; вивести списки сусідів. Зчитати початок і кінець, знайти найкоротший шлях за кількістю ребер; expired посилання пропускати, вивести шлях або none.
3. Високий рівень. Створити консольну програму. Зчитати назви вершин і пари суміжних вершин неорієнтованого графа; реєстр володіє вершинами через shared_ptr, ребра містять weak_ptr; вивести списки сусідів. Підтримати видалення вершини й очищення прострочених ребер, після кожного видалення повторити пошук найкоротшого шляху між введеними вершинами. Вивести результат і довести знищення всіх вершин після очищення реєстру.
Варіант 19. Ієрархічне меню
1. Початковий рівень. Створити консольну програму. Задати у коді дерево розділів і страв з назвами та цінами в копійках; вивести меню з відступами. Діти належать батькові через unique_ptr; рекурсивно порахувати кількість страв.
2. Базовий рівень. Створити консольну програму. Задати у коді дерево розділів і страв з назвами та цінами в копійках, діти належать батькові через unique_ptr; вивести меню з відступами. Зчитати назву розділу, вивести кількість страв і мінімальну ціну його піддерева; відсутність страв подати окремо.
3. Високий рівень. Створити консольну програму. Задати у коді дерево розділів і страв з назвами та цінами в копійках, діти належать батькові через unique_ptr; вивести меню з відступами. Приймати команду переносу розділу між двома батьками; заборонити перенос у власне піддерево. Передати володіння без копіювання, вивести дерево та перевірити незмінну загальну кількість страв.
Варіант 20. Інвентар гравців
1. Початковий рівень. Створити консольну програму. Зчитати ID і назви предметів для двох навчальних гравців; вивести інвентарі. Кожний предмет має єдиного власника unique_ptr; передати введений ID першому чи другому гравцеві через move.
2. Базовий рівень. Створити консольну програму. Зчитати ID і назви предметів для двох навчальних гравців; кожний предмет має єдиного власника unique_ptr; вивести інвентарі. Задати місткість кожного інвентарю й передавати предмет за ID через move, перевіривши місце й ID до передачі; невдалий перенос не втрачає предмет.
3. Високий рівень. Створити консольну програму. Зчитати ID і назви предметів для двох навчальних гравців; кожний предмет має єдиного власника unique_ptr; вивести інвентарі. Виконати обмін двома предметами за ID без копіювання об’єктів; спочатку перевірити обидва ID. Вивести результати та перевірити незмінність стану за відсутнього другого предмета.
Варіант 21. Кеш зображень
1. Початковий рівень. Створити консольну програму. Задати у коді ресурси з ID та навчальним масивом пікселів; зчитувати команди load ID і release ID, виводити стан кешу. Кеш зберігає weak_ptr, клієнт – shared_ptr; load використовує lock або створює новий ресурс.
2. Базовий рівень. Створити консольну програму. Задати у коді ресурси з ID та навчальним масивом пікселів; зчитувати команди load ID і release ID, виводити стан кешу. Кеш зберігає weak_ptr, клієнти – shared_ptr. Підтримати двох незалежних клієнтів й лічильник фактичних завантажень; вивести, коли повторне load використовує живий ресурс.
3. Високий рівень. Створити консольну програму. Задати у коді ресурси з ID та навчальним масивом пікселів; зчитувати команди load ID і release ID, виводити стан кешу. Кеш зберігає weak_ptr, клієнти – shared_ptr. Підтримати очищення expired записів та порівняти адреси лише живих ресурсів. Перевірити звільнення після останнього клієнта й повторне завантаження; кеш не має подовжувати життя ресурсу.
Варіант 22. Турнірна сітка
1. Початковий рівень. Створити консольну програму. Зчитати 4 або 8 імен учасників і результати матчів; вивести дерево матчів та переможця. Побудувати повне бінарне дерево на unique_ptr, для кожного матчу зчитати 0 або 1 як вибір переможця з двох дітей.
2. Базовий рівень. Створити консольну програму. Зчитати 4 або 8 імен учасників і результати матчів (0 або 1 – переможець з двох дітей); побудувати повне бінарне дерево матчів на unique_ptr; вивести дерево та переможця. Знайти шлях введеного учасника до фіналу; невласницьке посилання на батька не має переживати дерево.
3. Високий рівень. Створити консольну програму. Зчитати 4 або 8 імен учасників і результати матчів; побудувати повне бінарне дерево матчів на unique_ptr; вивести дерево та переможця. Створити незалежну копію сітки для альтернативного прогнозу, змінити один результат і перерахувати залежні матчі. Вивести обидва фінали, не змінюючи оригінал.
Варіант 23. Рядки C
1. Початковий рівень. Створити консольну програму. Зчитати два ASCII-рядки довжиною до 100; вивести результат конкатенації та пошуку введеного символу. Виділити char-масив достатнього розміру з місцем для нульового термінатора; написати власні функції копіювання й пошуку, завершити delete[].
2. Базовий рівень. Створити консольну програму. Зчитати два ASCII-рядки довжиною до 100 у динамічні char-масиви з нульовим термінатором; вивести результат конкатенації та пошуку введеного символу. Функція конкатенації приймає місткість і відмовляє до запису, якщо місця бракує. Вивести незмінний буфер при відмові та перевірити порожні рядки.
3. Високий рівень. Створити консольну програму. Зчитати ASCII-рядок довжиною до 100 у динамічний char-масив і символ-роздільник. Розбити рядок на невласницькі діапазони початок/довжина без глобального стану. Вивести всі токени, також порожні; власник початкового буфера має жити довше всіх діапазонів.
Варіант 24. Пул частинок
1. Початковий рівень. Створити консольну програму. Зчитати місткість 1–100 і команди create x y та erase index до end; вивести активні частинки. Виділити один масив частинок і масив ознак зайнятості; повторно використовувати першу вільну позицію, не виділяти окремий об’єкт для кожного create.
2. Базовий рівень. Створити консольну програму. Зчитати місткість 1–100 і команди create x y та erase index generation до end; вивести активні частинки. Зберігати частинки в одному масиві з ознаками зайнятості, повторно використовувати першу вільну позицію. Create повертає дескриптор index/generation; після erase збільшувати покоління, старий дескриптор відхиляти.
3. Високий рівень. Створити консольну програму. Зчитати місткість 1–100 і команди create x y та erase index generation до end; вивести активні частинки. Зберігати частинки в одному масиві пулу, використати дескриптор index/generation; після вилучення збільшувати покоління. Додати переміщення активних частинок на введений вектор і звіт числа створень/повторних використань. Перевірити переповнений пул, подвійне erase та застарілий дескриптор без розіменування звільненої пам’яті.
Варіант 25. Скасування калькулятора
1. Початковий рівень. Створити консольну програму. Зчитати початкове число і команди add число та undo до end; вивести стан після кожної. Зберігати попередні стани у стеку вузлів unique_ptr, підтримати add та undo без копіювання списку.
2. Базовий рівень. Створити консольну програму. Зчитати початкове число і команди add число, undo та redo до end; вивести стан після кожної. Попередні стани зберігати у стеку вузлів unique_ptr, скасовані – у другому стеку для redo; новий add очищає майбутні стани; порожній undo/redo виводить повідомлення.
3. Високий рівень. Створити консольну програму. Зчитати початкове число і команди add число, undo та redo до end; вивести стан після кожної. Стани зберігати у двох стеках вузлів unique_ptr; новий add очищає redo. Зчитати невід’ємний ліміт кожного стека, звільняти найстаріші вузли понад ліміт. Вивести розміри стеків і перевірити ліміт 0, послідовне скасування та очищення redo після нової дії.
Варіант 26. Сортування списків
1. Початковий рівень. Створити консольну програму. Зчитати два впорядковані списки цілих чисел; вивести об’єднаний впорядкований список. Вузли належать unique_ptr; злити списки перенесенням вузлів, без створення копій значень у нових вузлах.
2. Базовий рівень. Створити консольну програму. Зчитати невпорядкований список цілих чисел у вузли unique_ptr і виконати сортування злиттям, розділяючи володіння двома половинами та зливаючи їх перенесенням вузлів; вивести результат.
3. Високий рівень. Створити консольну програму. Зчитати невпорядкований список цілих чисел у вузли unique_ptr, до кожного числа додати початковий індекс і стабільно відсортувати злиттям перенесенням вузлів. Вивести пари число/індекс, перевірити порожній список, повтори та збереження точної кількості вузлів.
Варіант 27. Маршрут доставки
1. Початковий рівень. Створити консольну програму. Зчитати назви зупинок та їхні координати на площині; вивести порядок і сумарну евклідову довжину маршруту. Створити двозв’язний список: next – unique_ptr, prev – невласницький вказівник; вивести також зворотний обхід.
2. Базовий рівень. Створити консольну програму. Зчитати назви зупинок та їхні координати на площині у двозв’язний список (next – unique_ptr, prev – невласницький); вивести порядок і сумарну евклідову довжину маршруту. Зчитати два індекси й переставити відповідні вузли без копіювання даних; перерахувати довжину, перевірити сусідні вузли та крайні позиції.
3. Високий рівень. Створити консольну програму. Зчитати назви зупинок та їхні координати на площині у двозв’язний список (next – unique_ptr, prev – невласницький); вивести порядок і сумарну евклідову довжину маршруту. Перенести введений відрізок маршруту після іншої зупинки, відхиляючи позицію всередині відрізка. Вивести обидва напрями обходу, довжину й перевірку prev/next.
Варіант 28. Навчальний каталог файлів
1. Початковий рівень. Створити консольну програму. Задати у коді дерево каталогів і файлів з розмірами в байтах; вивести дерево й сумарний розмір. Реальну файлову систему не змінювати. Кожний вузол має єдиного власника unique_ptr; рекурсивно підсумувати лише розміри файлів.
2. Базовий рівень. Створити консольну програму. Задати у коді навчальне дерево каталогів і файлів з розмірами в байтах, кожний вузол має єдиного власника unique_ptr; вивести дерево й сумарний розмір. Реальну файлову систему не змінювати. Зчитати шлях у дереві, вивести розмір піддерева або not found; відрізняти файл від каталогу.
3. Високий рівень. Створити консольну програму. Задати у коді навчальне дерево каталогів і файлів з розмірами в байтах, кожний вузол має єдиного власника unique_ptr; вивести дерево й сумарний розмір. Реальну файлову систему не змінювати. Зчитати джерело і каталог призначення, перенести піддерево без копіювання. Заборонити перенос у власного нащадка й конфлікт імен; вивести нове дерево та незмінний загальний розмір.
Варіант 29. Кільцевий плейлист
1. Початковий рівень. Створити консольну програму. Зчитати назви треків і команди next, previous до end; вивести поточний трек. Володіти треками у контейнері unique_ptr, кільцеві переходи подати невласницькими вказівниками; порожній список обробити окремо.
2. Базовий рівень. Створити консольну програму. Зчитати назви треків і команди next, previous та delete до end; вивести поточний трек. Треками володіє контейнер unique_ptr, кільцеві переходи – невласницькі вказівники. Delete видаляє поточний трек, коректно переналаштувавши сусідів до звільнення; перевірити список з одного елемента.
3. Високий рівень. Створити консольну програму. Зчитати назви треків і команди next, previous до end; вивести поточний трек. Треками володіє контейнер unique_ptr, кільцеві переходи – невласницькі вказівники. Реалізувати перемішування порядку за введеним seed без переміщення самих об’єктів. Вивести повний цикл, перевірити, що кожний живий трек зустрівся рівно один раз і повторюваний seed відтворює порядок.
Варіант 30. Облік виділеної пам’яті
1. Початковий рівень. Створити консольну програму. Зчитати довжини кількох навчальних масивів 1–100; вивести лічильники виділень, звільнень і живих блоків. Написати парні функції allocate/release для int-масивів із явними new[]/delete[]; не перевизначати глобальні оператори. Після звільнення обнулити вказівник.
2. Базовий рівень. Створити консольну програму. Зчитати довжини кількох навчальних масивів 1–100; вивести лічильники виділень, звільнень і живих блоків. Огорнути масив у unique_ptr з власним deleter, який оновлює лічильник; перевірити ранній вихід із функції й вивести нуль живих блоків.
3. Високий рівень. Створити консольну програму. Зчитати довжини кількох навчальних масивів 1–100 і число k; виділяти int-масиви у unique_ptr з лічильниками виділень, звільнень і живих блоків. Задати в коді відмову (виняток) після k-го успішного виділення. Перевірити автоматичне звільнення раніше створених буферів при винятку; вивести баланс лічильників та ненульовий код лише при витоку.
Порядок виконання та захисту
- Намалюйте граф володіння і поясніть час життя об’єктів.
- Виберіть контейнер,unique_ptr або shared_ptr за вимогами.
- Перевірте порожню структуру, додавання й вилучення всіх вузлів.
- Переконайтеся, що спостерігачі не використовуються після знищення.
- Запустіть діагностичну збірку AddressSanitizer.
- Зіставте повідомлення з правилами володіння та виправте причини.
- Збережіть код, схему й справжні результати перевірки у Git.