Українська
Завдання
Відповідно до номера свого варіанта виконайте завдання обраного рівня складності.
Варіанти
Варіант 1. Генератор промокодів
1. Початковий рівень. Створити клас PromoCode з приватним конструктором, статичним лічильником і статичним методом Create(int discountPercent), який формує код PROMO-0001, PROMO-0002… і перевіряє знижку 1–50 %. Створити кілька кодів і вивести їх та загальну кількість.
2. Базовий рівень. Створити клас PromoCode з незмінними властивостями Code, DiscountPercent, ExpiresOn, методом Redeem(DateTime date) (код використовується один раз, прострочений код не приймається) і статичним генератором випадкових кодів із 8 символів без повторів (статичний масив виданих кодів). Консольна програма генерує коди й перевіряє їх використання.
3. Високий рівень. Створити рішення з бібліотекою класів Promo.Core (публічні PromoCode і PromoService, внутрішній клас генерації кодів) і консольним застосунком dotnet CLI, який виконує команди generate N --discount --days, redeem код, report. Інваріанти (код використовується не більше разу, знижка в межах) не можна порушити із застосунку; помилки – у Console.Error; коди завершення: 0, 1, 2.
Варіант 2. Облік пального на АЗС
1. Початковий рівень. Створити клас FuelTank з приватним залишком, властивістю Capacity (init) і методами Fill(double liters) та Dispense(double liters), які не дозволяють від’ємний залишок або перевищення місткості. Продемонструвати операції.
2. Базовий рівень. Створити клас GasStation з масивом резервуарів (за видами пального), методом Sell із ціною зі статичного довідника цін (static readonly) і захисною копією журналу продажів, яку повертає метод GetSales(). Консольна програма моделює зміну продажів.
3. Високий рівень. Створити рішення з бібліотекою класів Fuel.Core (публічні класи станції та звітів, internal клас перевірки операцій) і застосунком dotnet CLI, що обробляє журнал поставок і продажів зі стандартного введення, гарантує невід’ємні залишки й виводить звіт зміни; відхилені операції – у Console.Error; коди завершення: 0, 1, 2.
Варіант 3. Налаштування застосунку
1. Початковий рівень. Створити статичний клас AppSettings з константами значень за замовчуванням (MaxUsers, Language) і статичними властивостями з приватним сеттером, які ініціалізуються в статичному конструкторі. Вивести налаштування.
2. Базовий рівень. Створити статичний клас AppSettings з методом Set(string key, string value), який перевіряє допустимі ключі та значення (числа в межах, мова з переліку), методом Reset() і методом Describe(). Консольна програма зчитує рядки ключ=значення і виводить підсумкові налаштування та відхилені рядки.
3. Високий рівень. Створити рішення з бібліотекою Settings.Core, де клас Settings (не статичний, з фабричним методом Load(string text) і закритим конструктором) завантажує налаштування з тексту формату INI з секціями, перевіряє типи значень і надає лише читання. Застосунок dotnet CLI читає файл зі стандартного введення, застосовує перевизначення з аргументів --set ключ=значення і виводить результат; помилки – у Console.Error; коди завершення: 0, 1, 2.
Варіант 4. Облік відвідувань
1. Початковий рівень. Створити клас Visit з незмінними властивостями StudentName, Date і Present (задаються в конструкторі) та масив відвідувань за тиждень; вивести кількість присутніх для кожного дня.
2. Базовий рівень. Створити клас AttendanceJournal з приватним масивом записів, методом Mark (не можна двічі відмітити студента на ту саму дату), методом GetVisits(string student), що повертає копію, і статичним методом Percent(int attended, int total). Консольна програма виводить відсоток відвідувань для кожного студента.
3. Високий рівень. Створити рішення з бібліотекою Attendance.Core і застосунком dotnet CLI, що імпортує журнал зі стандартного введення, забороняє зміну вже закритих днів (CloseDay), виводить таблицю студенти × дати та студентів з відвідуваністю нижче --min; внутрішні класи розбору – internal; помилки – у Console.Error; коди завершення: 0, 1, 2.
Варіант 5. Датчик вологості
1. Початковий рівень. Створити клас HumiditySensor з приватним полем останнього вимірювання, константами MinValue = 0 і MaxValue = 100 та методом Record(double value), який відхиляє значення поза межами. Вивести останнє коректне значення.
2. Базовий рівень. Створити клас HumiditySensor з калібрувальним зсувом (private set, змінюється методом Calibrate з перевіркою), приватною історією вимірювань, статичним лічильником створених датчиків і методом Average(). Консольна програма вводить вимірювання для двох датчиків і виводить статистику.
3. Високий рівень. Створити рішення з бібліотекою Sensors.Core (публічний HumiditySensor, internal фільтр викидів) і застосунком dotnet CLI, що обробляє виміри кількох датчиків зі стандартного введення, застосовує калібрування з аргументів, відкидає викиди й виводить попередження при виході за межі --min/--max; помилки – у Console.Error.
Варіант 6. Шкали оцінювання
1. Початковий рівень. Створити статичний клас GradeScale з константами меж балів ЄКТС і статичним методом ToEcts(int points), який генерує ArgumentOutOfRangeException для балів поза 0–100. Вивести оцінки для кількох значень.
2. Базовий рівень. Створити статичний клас GradeScale з методами ToEcts, ToNational і ToFivePoint, статичною властивістю, що повертає копію масиву меж шкали, та використанням using static у консольній програмі, яка перетворює бали, введені рядком, на таблицю оцінок.
3. Високий рівень. Створити рішення з бібліотекою Grading.Core: клас GradingScheme із закритим конструктором і фабричними методами Standard() та Custom(string definition) (межі з рядка з перевіркою впорядкованості), статичним кешем стандартної схеми. Застосунок dotnet CLI перетворює бали зі стандартного введення за схемою з опції --scheme; помилки – у Console.Error; коди завершення: 0, 1, 2.
Варіант 7. Шкільний журнал
1. Початковий рівень. Створити клас GradeBook з приватним масивом оцінок і методами AddGrade(int grade) та GetGrades(), який повертає захисну копію; показати, що зміна отриманого масиву не змінює журнал.
2. Базовий рівень. Створити клас GradeBook з оцінками за предметами (приватна матриця), методами SetGrade, GetSubjectGrades(int subject) (копія), Average і блокуванням змін після виклику Close() (InvalidOperationException). Консольна програма демонструє спроби змінити закритий журнал.
3. Високий рівень. Створити рішення з бібліотекою School.Core (публічні ClassJournal, Student, internal перевірки прав учителя) і застосунком dotnet CLI, що обробляє дії вчителів зі стандартного введення (виставлення, зміна з поясненням, закриття семестру) і виводить журнал та протокол змін; спроби змін без прав – у Console.Error; коди завершення: 0, 1, 2.
Варіант 8. Електронний гаманець
1. Початковий рівень. Створити клас Wallet з приватним балансом і PIN-кодом, заданим у конструкторі, та методом Pay(decimal amount, string pin), який перевіряє PIN і достатність коштів. Продемонструвати успішну та невдалі оплати.
2. Базовий рівень. Створити клас Wallet з лічильником невдалих спроб введення PIN (після трьох гаманець блокується), методом ChangePin(string oldPin, string newPin) з перевіркою формату (4 цифри), властивістю IsBlocked лише для читання і приватною історією операцій. Консольна програма реалізує меню гаманця.
3. Високий рівень. Створити рішення з бібліотекою Wallet.Core, де розблокування гаманця виконує лише internal клас SupportService цієї збірки, а PIN зберігається як хеш. Застосунок dotnet CLI обробляє сценарій операцій зі стандартного введення, виводить журнал і блокування; спроба розблокувати гаманець із застосунку неможлива; коди завершення: 0, 1, 2.
Варіант 9. Реєстр автомобілів
1. Початковий рівень. Створити клас Car з незмінним номерним знаком (перевірка формату АА1234АА у конструкторі), моделлю та роком випуску і статичним методом IsValidPlate(string plate). Створити кілька автомобілів і перевірити некоректні номери.
2. Базовий рівень. Створити клас Car зі статичним реєстром зареєстрованих номерів (статичний масив), який не дозволяє створити два автомобілі з однаковим номером, статичним методом IsRegistered і методом Deregister(). Консольна програма реєструє автомобілі з введення.
3. Високий рівень. Створити рішення з бібліотекою Registry.Core (публічний VehicleRegistry з фабричним методом реєстрації, internal клас перевірки номерів за кодами регіонів) і застосунком dotnet CLI, що обробляє реєстрацію, перереєстрацію та зняття з обліку зі стандартного введення; інваріант унікальності не можна порушити; помилки – у Console.Error.
Варіант 10. Спідометр велосипеда
1. Початковий рівень. Створити клас BikeComputer з приватним загальним пробігом (лише зростає), пробігом поїздки та методами Ride(double km) і ResetTrip(). Продемонструвати кілька поїздок.
2. Базовий рівень. Створити клас BikeComputer з обхватом колеса (константа за замовчуванням і перевірка в конструкторі), методом AddRotations(int count, double seconds), властивостями CurrentSpeed, MaxSpeed, TripDistance з private set і статичним методом перетворення м/с у км/год. Консольна програма моделює поїздку.
3. Високий рівень. Створити рішення з бібліотекою Cycling.Core і застосунком dotnet CLI, що обробляє дані датчика обертів зі стандартного введення (час;оберти), виявляє неможливі значення, розбиває поїздку на відрізки й виводить звіт; загальний пробіг змінюється лише внутрішнім методом бібліотеки; помилки – у Console.Error; коди завершення: 0, 1, 2.
Варіант 11. Торговий автомат снеків
1. Початковий рівень. Створити клас SnackMachine з приватним масивом кількостей товарів, статичним меню цін (static readonly) і методом Buy(int slot, decimal paid), що повертає решту або генерує виняток. Продемонструвати покупки.
2. Базовий рівень. Створити клас SnackMachine з методами-командами InsertCoin, Select, Cancel, властивістю Balance з private set, сервісним методом Restock з перевіркою пароля та захищеною виручкою. Консольна програма реалізує меню покупця й сервісного режиму.
3. Високий рівень. Створити рішення з бібліотекою Vending.Core (сервісні операції – internal, доступні лише класу ServiceTerminal бібліотеки) і застосунком dotnet CLI, що обробляє сценарій дій покупців зі стандартного введення, виводить журнал і фінансовий звіт; помилки – у Console.Error; коди завершення: 0, 1, 2.
Варіант 12. Каталог товарів
1. Початковий рівень. Створити клас CatalogItem з незмінним артикулом, закритим конструктором і статичним фабричним методом Create(string name, decimal price), який генерує артикул ART-00001… Створити кілька товарів і вивести їх.
2. Базовий рівень. Створити клас Catalog з приватним масивом товарів, методами пошуку за назвою (без урахування регістру) і ціновим діапазоном, методом ChangePrice з перевіркою (не більше ніж на 50 % за раз) і статичним методом TryCreate з out-результатом. Консольна програма керує каталогом у меню.
3. Високий рівень. Створити рішення з бібліотекою Catalog.Core і застосунком dotnet CLI, що імпортує каталог зі стандартного введення, перевіряє унікальність артикулів, виконує пошук з аргументів і зміну цін за правилами; історія цін доступна лише для читання (копії); помилки – у Console.Error; коди завершення: 0, 1, 2.
Варіант 13. Бонусна картка
1. Початковий рівень. Створити клас BonusCard з приватним балансом балів і методом AddPurchase(decimal amount), який нараховує 1 бал за кожні 10 грн. Вивести баланс після кількох покупок.
2. Базовий рівень. Створити клас BonusCard з рівнями лояльності (срібний, золотий, платиновий залежно від суми покупок), прихованими правилами нарахування в приватному методі, методом Redeem(int points) і властивістю Level лише для читання. Консольна програма моделює покупки й списання балів.
3. Високий рівень. Створити рішення з бібліотекою Loyalty.Core, де правила рівнів задає internal клас LoyaltyRules із static readonly таблицею порогів, а картки створюються фабричним методом. Застосунок dotnet CLI обробляє транзакції зі стандартного введення, виводить рух балів і зміни рівнів; помилки – у Console.Error; коди завершення: 0, 1, 2.
Варіант 14. Журнал подій
1. Початковий рівень. Створити статичний клас Logger з методами Info, Warning, Error, які виводять повідомлення з часом і рівнем, та статичними лічильниками повідомлень кожного рівня. Вивести підсумок.
2. Базовий рівень. Створити статичний клас Logger з мінімальним рівнем виведення (static властивість з перевіркою), приватним буфером останніх 100 повідомлень і методом GetRecent(int count), що повертає копію. Консольна програма генерує повідомлення різних рівнів і виводить останні.
3. Високий рівень. Створити рішення з бібліотекою Logging.Core, де замість статичного класу використовується клас Logger з фабричним методом ForCategory(string name) і спільним статичним налаштуванням рівня. Застосунок dotnet CLI обробляє журнал зі стандартного введення, фільтрує за рівнем і категорією та виводить статистику; помилки – у Console.Error.
Варіант 15. Математичні утиліти
1. Початковий рівень. Створити статичний клас MathUtils з методами Gcd, Lcm, IsPrime і Factorial (з перевіркою аргументів) та продемонструвати їх виклики через using static.
2. Базовий рівень. Створити статичний клас MathUtils з методами PrimesUpTo(int n) (решето Ератосфена, результат кешується в приватному статичному масиві й повертається копією), Binomial і DigitSum. Консольна програма виконує обчислення за меню та показує, що повторний виклик використовує кеш.
3. Високий рівень. Створити рішення з бібліотекою MathKit (публічні статичні класи NumberTheory і Combinatorics, internal класи кешів) і застосунком dotnet CLI, що виконує обчислення з аргументів (gcd 84 36, primes 1000, binom 30 12); перевіряє аргументи й переповнення; помилки – у Console.Error; коди завершення: 0, 1, 2.
Варіант 16. Генератор тестових даних
1. Початковий рівень. Створити статичний клас FakeData зі статичними масивами імен і прізвищ та методом FullName(), що повертає випадкове повне ім’я (Random з фіксованим зерном у статичному полі). Вивести 5 імен.
2. Базовий рівень. Створити статичний клас FakeData з методами Phone() (+380XXXXXXXXX), BirthDate(int minAge, int maxAge) і Email(string name), статичним методом SetSeed(int seed) для відтворюваності. Консольна програма генерує таблицю з N тестових користувачів.
3. Високий рівень. Створити рішення з бібліотекою FakeData.Core (публічний клас-генератор із закритим конструктором і фабричним методом WithSeed, internal словники) і застосунком dotnet CLI, що генерує CSV з N записами полів з опції --fields і гарантує унікальність e-mail і телефонів; помилки – у Console.Error; коди завершення: 0, 1, 2.
Варіант 17. Переговорні кімнати
1. Початковий рівень. Створити клас MeetingRoom з назвою, місткістю (init) і приватним масивом зайнятих годин (8:00–18:00) та методом Book(int hour), що не дозволяє повторне бронювання.
2. Базовий рівень. Створити клас MeetingRoom з бронюваннями інтервалів (початок і кінець із кроком 30 хвилин), методом TryBook з out-повідомленням, методом GetBookings() (копія) і статичним методом перевірки перетину інтервалів. Консольна програма бронює кімнати з введення.
3. Високий рівень. Створити рішення з бібліотекою Rooms.Core і застосунком dotnet CLI, що обробляє запити бронювання кількох кімнат зі стандартного введення, підбирає найменшу придатну вільну кімнату, скасовує бронювання лише автором і виводить розклад; внутрішня логіка підбору – internal; помилки – у Console.Error; коди завершення: 0, 1, 2.
Варіант 18. Гральні кубики
1. Початковий рівень. Створити клас Dice з кількістю граней (перевірка 4–20), статичним спільним генератором Random і методом Roll(). Кинути кубик 20 разів і вивести результати.
2. Базовий рівень. Створити клас Dice зі статичним лічильником усіх кидків, приватним масивом частот і методом GetFrequencies() (копія). Консольна програма кидає N разів, виводить частоти й перевіряє чесність кубика критерієм хі-квадрат (статичний метод).
3. Високий рівень. Створити рішення з бібліотекою Dice.Core (фабричний метод Dice.Parse("3d6+2"), internal розбір виразу) і застосунком dotnet CLI, що кидає кубики за виразами з аргументів, моделює розподіл сум для --trials і виводить гістограму та ймовірності; помилки – у Console.Error; коди завершення: 0, 1, 2.
Варіант 19. Облікові записи
1. Початковий рівень. Створити клас UserAccount з незмінним логіном і приватним хешем пароля SHA-256 (SHA256.HashData), методом CheckPassword(string password) без зберігання самого пароля. Продемонструвати перевірку правильного й неправильного пароля.
2. Базовий рівень. Створити клас UserAccount з сіллю (випадкові байти), методом ChangePassword з перевіркою старого пароля та вимог до нового, лічильником невдалих входів і блокуванням. Консольна програма реалізує реєстрацію та вхід кількох користувачів.
3. Високий рівень. Створити рішення з бібліотекою Auth.Core (публічний AuthService, internal класи хешування та сховища) і застосунком dotnet CLI з командами register, login, passwd, що зберігає користувачів у текстовому файлі без відкритих паролів; помилки – у Console.Error; коди завершення: 0, 1 (невдалий вхід), 2.
Варіант 20. Картка працівника
1. Початковий рівень. Створити клас Employee з приватною зарплатою, властивістю MaskedSalary (*****) і методом GetSalary(string role), який повертає суму лише для ролі hr. Вивести дані працівника для різних ролей.
2. Базовий рівень. Створити клас Employee з персональними даними (телефон, адреса, дата народження), методом ToString(string role) з маскуванням полів залежно від ролі, незмінним табельним номером зі статичного лічильника і журналом звернень до зарплати. Консольна програма демонструє перегляд для ролей.
3. Високий рівень. Створити рішення з бібліотекою Hr.Core, де перевірка прав (internal клас AccessPolicy) недоступна застосунку, а дані видаються лише через публічний сервіс. Застосунок dotnet CLI обробляє запити зі стандартного введення (роль;табельний номер;поле) і виводить відповіді та журнал відмов у Console.Error; коди завершення: 0, 1, 2.
Варіант 21. Курси валют
1. Початковий рівень. Створити статичний клас CurrencyRates зі статичним довідником курсів (static readonly масиви кодів і курсів), статичною датою оновлення і методом Convert(decimal amount, string from, string to). Виконати кілька конвертацій.
2. Базовий рівень. Створити статичний клас CurrencyRates з методом Update(string code, decimal rate) (перевірка коду й додатного курсу), методом TryConvert з out-результатом і методом, що повертає копію таблиці курсів. Консольна програма оновлює курси з введення й конвертує суми.
3. Високий рівень. Створити рішення з бібліотекою Fx.Core (клас RateTable із закритим конструктором і фабричним методом Parse, незмінний після створення; internal перевірка кодів ISO) і застосунком dotnet CLI, що завантажує курси зі стандартного введення й конвертує суми з аргументів через крос-курс; помилки – у Console.Error; коди завершення: 0, 1, 2.
Варіант 22. Електронна черга
1. Початковий рівень. Створити клас Ticket зі статичним лічильником номерів талонів, незмінним номером і часом видачі. Видати 5 талонів і вивести їх.
2. Базовий рівень. Створити клас Queue з приватним масивом талонів, методами IssueTicket(string service) (префікс номера за послугою, окремий статичний лічильник для кожної), CallNext(int window) і властивістю Waiting. Консольна програма моделює роботу трьох вікон.
3. Високий рівень. Створити рішення з бібліотекою Queue.Core і застосунком dotnet CLI, що моделює електронну чергу за подіями зі стандартного введення (видача, виклик, завершення обслуговування), скидає лічильники на початку дня (internal метод), виводить середній час очікування за послугами; помилки – у Console.Error; коди завершення: 0, 1, 2.
Варіант 23. Ліфт
1. Початковий рівень. Створити клас Elevator з приватними полями поточного поверху й стану дверей та методами OpenDoors(), CloseDoors() і MoveTo(int floor), який не дозволяє рух із відчиненими дверима. Продемонструвати коректні й некоректні команди.
2. Базовий рівень. Створити клас Elevator з кількістю поверхів і вантажопідйомністю (задаються в конструкторі), методами Enter(double weight), Exit(double weight), перевіркою перевантаження перед рухом і журналом поїздок (копія). Консольна програма виконує команди ліфта.
3. Високий рівень. Створити рішення з бібліотекою Elevator.Core (публічний контролер, internal класи двигуна й дверей) і застосунком dotnet CLI, що обробляє виклики зі стандартного введення, гарантує безпечні стани (рух лише із зачиненими дверима, без перевантаження) і виводить журнал станів; помилки – у Console.Error; коди завершення: 0, 1, 2.
Варіант 24. Календар свят
1. Початковий рівень. Створити статичний клас Holidays зі статичним масивом дат державних свят (день і місяць) та методом IsHoliday(DateTime date). Перевірити кілька дат.
2. Базовий рівень. Створити статичний клас WorkCalendar з методами IsWorkingDay, WorkingDaysBetween і AddWorkingDays(DateTime start, int days), статичними переліками свят і перенесених днів (копії через методи). Консольна програма обчислює строки виконання робіт.
3. Високий рівень. Створити рішення з бібліотекою Calendar.Core, у якій календар створюється фабричним методом FromDefinition(string text) зі свят і перенесень, а стандартний календар кешується в static readonly полі. Застосунок dotnet CLI обчислює робочі дні за аргументами й виводить календар місяця; помилки – у Console.Error; коди завершення: 0, 1, 2.
Варіант 25. Спортивний хронометраж
1. Початковий рівень. Створити клас RaceResult з незмінними властивостями Athlete, Bib і Time, заданими в конструкторі з перевіркою, та статичною властивістю BestTime, що оновлюється під час створення кращого результату.
2. Базовий рівень. Створити клас RaceResult і статичний клас Records з рекордами за дисциплінами (приватний масив, метод TryUpdate з out-попереднім рекордом, метод GetAll() з копією). Консольна програма вводить результати й повідомляє про нові рекорди.
3. Високий рівень. Створити рішення з бібліотекою Timing.Core і застосунком dotnet CLI, що обробляє відмітки старту й фінішу зі стандартного введення, обчислює незмінні результати, місця та рекорди; виправлення результатів можливі лише internal методом судді бібліотеки; помилки – у Console.Error; коди завершення: 0, 1, 2.
Варіант 26. Сейф
1. Початковий рівень. Створити клас Safe з приватним кодом (4 цифри), властивістю IsOpen лише для читання та методами Open(string code) і Close(). Продемонструвати спроби відкриття.
2. Базовий рівень. Створити клас Safe зі станами «зачинено», «відчинено», «заблоковано» (після трьох невдалих спроб на 5 хвилин моделювання часу), методом зміни коду лише у відчиненому стані й приватним журналом подій. Консольна програма моделює сценарій використання.
3. Високий рівень. Створити рішення з бібліотекою Safe.Core (публічний Safe, internal класи тривоги та майстер-коду) і застосунком dotnet CLI, що виконує сценарій зі стандартного введення, гарантуючи, що стан неможливо змінити в обхід методів, і виводить журнал подій; помилки – у Console.Error; коди завершення: 0, 1, 2.
Варіант 27. Проїзний квиток
1. Початковий рівень. Створити клас TransitCard з приватним балансом поїздок, статичною вартістю поїздки (const) і методами TopUp(int trips) та Ride(). Продемонструвати поїздки до вичерпання.
2. Базовий рівень. Створити клас TransitCard з типами карток (звичайна, студентська), статичною таблицею тарифів (static readonly), пересадкою без оплати протягом 60 хвилин і захищеною історією поїздок. Консольна програма моделює день поїздок.
3. Високий рівень. Створити рішення з бібліотекою Transit.Core (фабричні методи створення карток, internal розрахунок тарифу) і застосунком dotnet CLI, що обробляє валідації зі стандартного введення й формує звіт поїздок і списань за картками; помилки – у Console.Error; коди завершення: 0, 1, 2.
Варіант 28. Теплиця
1. Початковий рівень. Створити клас Greenhouse з приватними температурою й вологістю, константами допустимих меж і методом Update(double temp, double humidity), що повертає попередження при виході за межі.
2. Базовий рівень. Створити клас Greenhouse з приватними перевірками параметрів, методами OpenVents() і StartWatering() (дозволені лише за певних умов), приватною історією вимірювань і статичним методом перетворення °F у °C. Консольна програма моделює добу.
3. Високий рівень. Створити рішення з бібліотекою Greenhouse.Core (публічний контролер, internal правила автоматики) і застосунком dotnet CLI, що обробляє показники датчиків зі стандартного введення, застосовує правила й виводить журнал дій і попереджень; помилки – у Console.Error; коди завершення: 0, 1, 2.
Варіант 29. Кошторис ремонту
1. Початковий рівень. Створити статичний клас MaterialPrices зі статичними цінами матеріалів (static readonly) і клас EstimateItem з незмінними назвою, кількістю й обчислюваною вартістю. Вивести кошторис із трьох позицій.
2. Базовий рівень. Створити клас Estimate з приватним масивом позицій, методами Add, Remove, властивістю Total і методом GetItems() (копія), а також статичною надбавкою на непередбачені витрати. Консольна програма формує кошторис кімнати з введення.
3. Високий рівень. Створити рішення з бібліотекою Estimate.Core (кошторис створюється фабричним методом з прайс-листа, після затвердження стає незмінним; internal класи розрахунку матеріалів за площею) і застосунком dotnet CLI, що будує кошторис за описом кімнат зі стандартного введення; помилки – у Console.Error; коди завершення: 0, 1, 2.
Варіант 30. Мобільний трафік
1. Початковий рівень. Створити клас DataPlan з приватним використаним обсягом, лімітом пакета (init) і константами перетворення одиниць (КБ, МБ, ГБ). Додати кілька сесій і вивести залишок.
2. Базовий рівень. Створити клас DataPlan з приватним масивом сесій (початок, обсяг), методом AddSession з перевіркою ліміту, статичним методом форматування обсягу (1,5 ГБ) і властивістю RemainingPercent. Консольна програма моделює місяць використання.
3. Високий рівень. Створити рішення з бібліотекою Traffic.Core і застосунком dotnet CLI, що обробляє журнал сесій кількох абонентів зі стандартного введення, застосовує тарифи з перевищенням (internal розрахунок), виводить звіт за абонентами й днями; помилки – у Console.Error; коди завершення: 0, 1, 2.
Порядок виконання та захисту роботи
- Опрацювати теоретичні відомості та приклади розв’язання завдань.
- Для класів свого варіанта сформулювати інваріанти та визначити публічний контракт: які члени публічні, які приватні чи
internal, які статичні. - Створити рішення; для базового та високого рівнів винести класи предметної області в окремий проєкт бібліотеки класів і додати посилання на нього з консольного застосунку.
- Реалізувати класи відповідно до обраного рівня складності; жодних публічних полів, внутрішні масиви – лише через захисні копії.
- Перевірити, що інваріанти неможливо порушити ззовні (спроби мають спричиняти помилки компіляції або винятки); переглянути статичні поля в налагоджувачі.
- Продемонструвати роботу програми викладачеві, пояснити програмний код і відповісти на контрольні питання.