Українська
Завдання
Відповідно до номера свого варіанта виконайте завдання обраного рівня складності.
Варіанти
Варіант 1. Платіжні провайдери
1. Початковий рівень. Створити інтерфейс IPaymentProvider з методом Pay(decimal amount), що повертає комісію, і класи CardProvider, BankTransferProvider, WalletProvider. Виконати платіж через кожного провайдера за змінною інтерфейсного типу й вивести комісії.
2. Базовий рівень. Створити інтерфейс IPaymentProvider з властивостями Name, MaxAmount і методом TryPay з out-повідомленням, абстрактний клас PaymentProviderBase зі спільним журналом транзакцій і три провайдери (картка, банківський переказ, гаманець) з різними комісіями. Консольна програма для кожної введеної суми обирає провайдера з найменшою комісією й виводить звіт.
3. Високий рівень. Створити бібліотеку класів з інтерфейсами IPaymentProvider і IRefundable, абстрактним базовим класом і трьома провайдерами (один без повернень). Застосунок dotnet CLI обробляє платежі й повернення зі стандартного введення, перевіряє підтримку повернення через is і виводить звіт транзакцій; помилки – у Console.Error; коди завершення: 0, 1, 2.
Варіант 2. Книжковий каталог
1. Початковий рівень. Створити клас Book (назва, автор, рік), що реалізує IComparable<Book> за назвою, і відсортувати масив книг методом Array.Sort. Вивести книги до й після сортування.
2. Базовий рівень. Створити клас Book (назва, автор, рік, сторінки) з IComparable<Book> (за автором, потім назвою) і класи-порівнювачі IComparer<Book> за роком видання та кількістю сторінок. Консольна програма сортує каталог за полем, обраним користувачем, і виводить таблицю.
3. Високий рівень. Створити бібліотеку класів з класом Book (назва, автор, рік, сторінки), що реалізує IComparable<Book> і IEquatable<Book> з перевизначеними Equals/GetHashCode, та порівнювачем з кількох критеріїв (CompositeComparer з масивом IComparer<Book>). Застосунок dotnet CLI сортує каталог зі стандартного введення за опцією --sort author,year:desc,title, видаляє дублікати й виводить таблицю; помилки – у Console.Error.
Варіант 3. Охоронна система
1. Початковий рівень. Створити інтерфейс ISensor з властивістю IsTriggered і методом Check() та класи DoorSensor, MotionSensor і SmokeSensor. Перевірити масив датчиків і вивести спрацювання.
2. Базовий рівень. Створити інтерфейси ISensor (спрацювання, перевірка) і IArmable (постановка й зняття з охорони), абстрактний клас SensorBase із зоною й журналом подій та датчики дверей, руху й диму (датчик диму не знімається з охорони). Консольна програма моделює добу охорони за сценарієм подій з введення й виводить журнал.
3. Високий рівень. Створити бібліотеку охоронної системи з датчиками дверей, руху й диму, інтерфейсами ISensor (спрацювання), IArmable (постановка на охорону), IBatteryPowered (частина датчиків) і класом SecurityPanel, що приймає будь-які ISensor. Застосунок dotnet CLI обробляє події зі стандартного введення, формує тривоги із затримкою для вхідних дверей і попередження про низький заряд; помилки – у Console.Error.
Варіант 4. Експорт звітів
1. Початковий рівень. Створити інтерфейс IReportFormatter з методом Format(string[] headers, string[][] rows) і класи TextFormatter та CsvFormatter. Вивести одну таблицю в обох форматах.
2. Базовий рівень. Створити інтерфейс IReportFormatter з методом Format(string[] headers, string[][] rows), абстрактний клас FormatterBase зі спільним обчисленням ширини стовпців і форматувальники тексту, CSV та Markdown. Метод звіту приймає IReportFormatter. Консольна програма формує звіт успішності групи у форматі, обраному користувачем.
3. Високий рівень. Створити бібліотеку форматувальників (текст із рамкою, CSV з екрануванням, Markdown, HTML) і реєстр форматувальників за назвою. Застосунок dotnet CLI перетворює CSV зі стандартного введення на формат --to і перевіряє, що CSV-форматувальник відтворює вихідні дані; помилки – у Console.Error; коди завершення: 0, 1, 2.
Варіант 5. Кулінарні рецепти
1. Початковий рівень. Створити абстрактний клас Recipe із шаблонним методом Cook() (підготовка, приготування, подача), де приготування абстрактне, і класи Soup та Salad. Приготувати обидві страви.
2. Базовий рівень. Створити абстрактний клас Recipe із шаблонним методом Cook(), абстрактними кроком приготування й властивістю Minutes, віртуальним кроком Serve і необов’язковим кроком Marinate (лише якщо віртуальна властивість NeedsMarinade істинна) та кілька страв. Консольна програма складає меню з обраних страв і виводить план приготування з часом.
3. Високий рівень. Створити бібліотеку рецептів із шаблонним методом, інтерфейсом IVegetarian і розрахунком паралельного плану кухні (кроки різних страв з урахуванням часу). Застосунок dotnet CLI будує план обіду з рецептів з аргументів і виводить хронологію кроків; помилки – у Console.Error.
Варіант 6. Ігрові об’єкти
1. Початковий рівень. Створити інтерфейси IMovable і IDamageable та класи Player (обидва), Wall (IDamageable) і Cloud (IMovable). Для масиву об’єктів типу object перемістити рухомі й завдати шкоди руйнівним через is.
2. Базовий рівень. Створити абстрактний клас GameObject з позицією й абстрактним методом Update(), інтерфейси IMovable, IAttackable, IDamageable та класи Player, Enemy, Wall і Cloud, що реалізують різні набори інтерфейсів. Консольна програма виконує 10 кроків ігрового циклу й виводить дії кожного об’єкта.
3. Високий рівень. Створити бібліотеку ігрових об’єктів з абстрактним GameObject (позиція, Update()), інтерфейсами IMovable, IDamageable і ICollidable (колізії), знищенням об’єктів і журналом подій. Застосунок dotnet CLI моделює гру на сітці з конфігурації зі стандартного введення з фіксованим зерном і виводить стан поля після кожного кроку; помилки – у Console.Error.
Варіант 7. Бібліотечні видання
1. Початковий рівень. Створити абстрактний клас Publication з назвою й абстрактним методом LoanDays() та класи Book, Magazine, Reference (не видається, LoanDays = 0). Вивести терміни видачі.
2. Базовий рівень. Створити абстрактний клас Publication з назвою, абстрактними методами LoanDays() і розрахунку штрафу за прострочення, класи Book, Magazine, Reference та інтерфейс IBorrowable з методами Borrow і Return, який реалізують лише книги й журнали. Консольна програма видає й повертає видання за командами та виводить штрафи.
3. Високий рівень. Створити бібліотеку з абстрактним Publication, інтерфейсами IBorrowable, IReservable і IDigital (електронні видання не мають прострочень). Застосунок dotnet CLI обробляє журнал операцій зі стандартного введення й виводить звіт боржників і черги резервувань; помилки – у Console.Error; коди завершення: 0, 1, 2.
Варіант 8. Щоденник харчування
1. Початковий рівень. Створити абстрактний клас FoodEntry з масою й абстрактною властивістю CaloriesPer100g та класи Fruit, Dish і Drink. Вивести калорійність записів за день.
2. Базовий рівень. Створити абстрактний клас FoodEntry (маса, калорійність на 100 г), класи Fruit, Dish, Drink, інтерфейс INutritionInfo (білки, жири, вуглеводи), який напої не реалізують, і клас DailyLog, що приймає FoodEntry. Консольна програма виводить звіт дня з калорійністю й частками макронутрієнтів для записів, що їх підтримують.
3. Високий рівень. Створити бібліотеку щоденника харчування із записами FoodEntry (назва, час, маса, калорійність), що реалізують IComparable<FoodEntry> за калорійністю, і порівнювачами IComparer<FoodEntry> за часом і назвою. Застосунок dotnet CLI обробляє щоденник за тиждень зі стандартного введення, порівнює дні з нормою калорій і виводить топ продуктів; помилки – у Console.Error.
Варіант 9. Сховище даних
1. Початковий рівень. Створити інтерфейс IRepository з методами Add(string item), GetAll() і Count та клас MemoryRepository. Додати кілька елементів і вивести їх через змінну інтерфейсу.
2. Базовий рівень. Створити інтерфейс IStudentRepository з методами додавання, пошуку за прізвищем, видалення та реалізацію в пам’яті з масивом. Клас StudentService приймає репозиторій у конструкторі. Консольна програма керує студентами через сервіс.
3. Високий рівень. Створити бібліотеку з інтерфейсом IStudentRepository (додавання, пошук за прізвищем, видалення), двома реалізаціями – у пам’яті та у текстовому файлі (з IDisposable для завершення запису) – і сервісом студентів, що не залежить від реалізації. Застосунок dotnet CLI обирає сховище опцією --storage memory|file і виконує команди з аргументів; помилки – у Console.Error; коди завершення: 0, 1, 2.
Варіант 10. Податкові правила країн
1. Початковий рівень. Створити інтерфейс ITaxRule з методом Calculate(decimal income) і класи з пласкою та прогресивною ставками. Обчислити податок для одного доходу за кожним правилом.
2. Базовий рівень. Створити абстрактний клас TaxRuleBase з назвою країни й соціальними внесками та інтерфейс ITaxRule; клас TaxComparer порівнює податкове навантаження за кількома правилами. Консольна програма виводить таблицю порівняння для введених доходів.
3. Високий рівень. Створити бібліотеку податкових правил, що завантажує шкали з текстового опису, з ITaxRule і IDeductible (податкові знижки). Застосунок dotnet CLI обчислює й порівнює податки для доходів зі стандартного введення за правилами з опції --rules; помилки – у Console.Error.
Варіант 11. Маршрути доставки
1. Початковий рівень. Створити інтерфейс IRoute з методами Cost() і Hours() та класи RoadRoute, RailRoute і AirRoute. Для масиву маршрутів вивести вартість і час.
2. Базовий рівень. Створити інтерфейс IRoute з методами Cost() і Hours(), абстрактний клас RouteBase з відстанню й вагою вантажу, класи автомобільного, залізничного й авіамаршруту та IComparer<IRoute> за вартістю й за часом. Консольна програма для введених відстані, ваги й терміну підбирає найдешевший маршрут, який вкладається в термін.
3. Високий рівень. Створити бібліотеку маршрутів доставки з інтерфейсом IRoute (вартість, час), автомобільними, залізничними й авіамаршрутами, комбінованими маршрутами (композиція кількох IRoute з перевантаженням), обмеженнями ваги й вихідних днів. Застосунок dotnet CLI обирає маршрут для замовлень зі стандартного введення за критерієм --optimize cost|time; помилки – у Console.Error.
Варіант 12. Музичний плеєр
1. Початковий рівень. Створити інтерфейс IPlayable з методами Play(), Pause() і властивістю Title та класи Song і Podcast. Відтворити елементи масиву через змінну інтерфейсу.
2. Базовий рівень. Створити абстрактний клас MediaTrack зі станом відтворення (зупинено, грає, пауза) і перевіркою дозволених переходів, класи Song, Podcast (із запам’ятовуванням позиції) та плейлист. Консольна програма виконує команди плеєра.
3. Високий рівень. Створити бібліотеку плеєра з IPlayable, ISeekable (перемотування підтримують не всі треки) і IDisposable для завершення сесії. Застосунок dotnet CLI виконує сценарій команд зі стандартного введення й виводить журнал станів і статистику прослуховування; помилки – у Console.Error.
Варіант 13. Ґаджети розумного годинника
1. Початковий рівень. Створити абстрактний клас WatchApp з назвою й абстрактним методом Render() та класи ClockApp, StepsApp і WeatherApp. Вивести екрани застосунків.
2. Базовий рівень. Створити абстрактний клас WatchApp з назвою й методом Render(), застосунки годинника, крокоміра й погоди, інтерфейси INotifier (надсилання сповіщень) і IBatteryHungry (витрата заряду) та клас SmartWatch, що перемикає застосунки й рахує заряд. Консольна програма моделює день використання годинника за командами користувача.
3. Високий рівень. Створити бібліотеку розумного годинника з абстрактним WatchApp (назва, Render()), шаблонним методом оновлення застосунку, сповіщеннями з пріоритетами (IComparable<Notification>), режимом «Не турбувати» й обліком заряду. Застосунок dotnet CLI обробляє події зі стандартного введення й виводить стрічку сповіщень і витрату заряду.
Варіант 14. Шашки
1. Початковий рівень. Створити абстрактний клас Checker з кольором, позицією й абстрактним методом CanMoveTo(int row, int col) та класи Man і King. Перевірити кілька ходів.
2. Базовий рівень. Створити абстрактний клас Checker з кольором, позицією й методом CanMoveTo(int row, int col), класи Man і King та клас Board з поліморфним масивом шашок, перевіркою взяття й перетворенням шашки на дамку на останньому ряду. Консольна програма виконує ходи з введення й виводить дошку.
3. Високий рівень. Створити бібліотеку шашок з інтерфейсом IMoveValidator (можна замінити правила на «українські» або «міжнародні») і обов’язковим взяттям. Застосунок dotnet CLI відтворює партію зі стандартного введення, виводить дошку й повідомляє про неможливі ходи в Console.Error.
Варіант 15. Автопарк
1. Початковий рівень. Створити інтерфейс IMaintainable з методами NeedsService(int mileage) і Service() та класи Car і Truck з різними інтервалами обслуговування. Перевірити автопарк.
2. Базовий рівень. Створити абстрактний клас FleetVehicle з пробігом і журналом обслуговування та інтерфейси IMaintainable і IInspectable (техогляд для вантажівок). Консольна програма моделює рік роботи й виводить графік обслуговування.
3. Високий рівень. Створити бібліотеку автопарку з абстрактним FleetVehicle (пробіг, інтервал обслуговування), легковими й вантажними авто, IComparer<FleetVehicle> за терміновістю обслуговування й плануванням з обмеженням кількості місць у сервісі на день. Застосунок dotnet CLI обробляє пробіги зі стандартного введення й виводить розклад сервісу; помилки – у Console.Error.
Варіант 16. Плагіни калькулятора
1. Початковий рівень. Створити інтерфейс IOperation з властивістю Symbol і методом Apply(double a, double b) та класи додавання, віднімання, множення й ділення. Обчислити вираз за символом операції.
2. Базовий рівень. Створити інтерфейс IOperation (Symbol, Apply), операції додавання, віднімання, множення й ділення, абстрактний клас UnaryOperation для операцій з одним аргументом (корінь, модуль) і реєстр операцій (масив IOperation) з пошуком за символом та обробкою невідомих символів. Консольна програма обчислює команди з введення й виводить результати.
3. Високий рівень. Створити бібліотеку плагінів калькулятора з IOperation, IDescribed (довідка) і пріоритетом операцій, що використовується у виразах. Застосунок dotnet CLI обчислює вирази з аргументів із будь-якими зареєстрованими операціями й виводить довідку --help; помилки – у Console.Error; коди завершення: 0, 1, 2.
Варіант 17. Опитувальник
1. Початковий рівень. Створити абстрактний клас Question з текстом і абстрактним методом IsCorrect(string answer) та класи ChoiceQuestion, NumberQuestion і TextQuestion. Перевірити відповіді на три запитання.
2. Базовий рівень. Створити абстрактний клас Question з текстом, абстрактними методом IsCorrect(string answer) і властивістю MaxScore, запитання з вибором, числом і текстом, інтерфейс IPartialScore для запитань з частковими балами (кілька правильних варіантів) і клас Quiz, що проводить опитування. Консольна програма проводить тест і виводить бали за кожне запитання.
3. Високий рівень. Створити бібліотеку тестування, що завантажує запитання різних типів з текстового опису, з IShuffleable для перемішування варіантів і часом на відповідь. Застосунок dotnet CLI перевіряє відповіді студентів зі стандартного введення й виводить відомість; помилки – у Console.Error.
Варіант 18. Картка товару
1. Початковий рівень. Створити інтерфейси IPrintable і IExportable з методом Print() у кожному та клас Product, що реалізує обидва явно: друк – форматована картка, експорт – рядок CSV. Викликати обидві реалізації.
2. Базовий рівень. Створити класи Product і Service з явною реалізацією IPrintable.Print та IExportable.Print і звичайним методом ToString, а також функції друку й експорту, що приймають інтерфейси. Консольна програма виводить каталог у двох режимах.
3. Високий рівень. Створити бібліотеку каталогу з явною реалізацією IExportable для кількох форматів через окремі інтерфейси (ICsvExportable, IJsonExportable) з однаковим методом Export. Застосунок dotnet CLI експортує каталог зі стандартного введення у форматі --format; помилки – у Console.Error; коди завершення: 0, 1, 2.
Варіант 19. Шифри
1. Початковий рівень. Створити інтерфейс ICipher з методами Encrypt і Decrypt та класи CaesarCipher і AtbashCipher. Зашифрувати й розшифрувати рядок кожним шифром.
2. Базовий рівень. Створити інтерфейс ICipher з методами Encrypt і Decrypt, абстрактний клас AlphabetCipher зі спільною обробкою алфавіту (українська й англійська абетки, збереження регістру) та шифри Цезаря, Атбаш і Віженера. Консольна програма перевіряє оборотність кожного шифру для введеного тексту.
3. Високий рівень. Створити бібліотеку шифрів з ICipher, IKeyed (шифри з ключем і перевіркою ключа) і ланцюжком шифрів (CipherChain, теж ICipher). Застосунок dotnet CLI шифрує стандартне введення ланцюжком з опції --chain caesar:3,vigenere:КЛЮЧ і перевіряє оборотність; помилки – у Console.Error.
Варіант 20. Складські одиниці
1. Початковий рівень. Створити інтерфейс IStorable з властивостями Volume і Weight та класи Box, Barrel і Pallet. Обчислити загальний об’єм масиву одиниць.
2. Базовий рівень. Створити абстрактний клас StorageUnit з маркуванням і IStorable, клас Shelf з обмеженнями об’єму й ваги та методом розміщення. Консольна програма розміщує одиниці на полицях і повідомляє, що не вмістилося.
3. Високий рівень. Створити бібліотеку складу з інтерфейсом IStorable (об’єм, вага), ящиками, бочками й палетами, IStackable (що можна ставити одне на одне) і IComparer<IStorable> для порядку розміщення (спочатку важчі). Застосунок dotnet CLI розміщує вантажі зі стандартного введення на стелажах з обмеженнями об’єму й ваги та виводить схему завантаження; помилки – у Console.Error.
Варіант 21. Тарифи комунальних послуг
1. Початковий рівень. Створити абстрактний клас Tariff з назвою й абстрактним методом Cost(double usage) та класи FlatTariff і TieredTariff. Обчислити вартість для кількох обсягів.
2. Базовий рівень. Створити абстрактний клас Tariff з назвою й методом Cost(double usage), плаский і ступінчастий тарифи, інтерфейс ISeasonal (тариф залежить від місяця) і клас Bill, що підсумовує послуги з різними тарифами. Консольна програма формує рахунок за введені покази лічильників.
3. Високий рівень. Створити бібліотеку тарифів комунальних послуг (пласкі, ступінчасті) з абстрактним Tariff, шаблонним методом розрахунку (обсяг, пільги, округлення) і IComparable<Tariff> за вартістю для типового споживання. Застосунок dotnet CLI підбирає найвигідніший тариф для профілю споживання зі стандартного введення; помилки – у Console.Error.
Варіант 22. Навчальна платформа
1. Початковий рівень. Створити інтерфейс IGradable з методом Grade() і абстрактний клас Assignment з назвою та класи Test і Essay. Оцінити масив завдань.
2. Базовий рівень. Створити інтерфейс IGradable з методом Grade(), абстрактний клас Assignment з назвою, дедлайном і абстрактним методом штрафу за запізнення, класи Test і Essay, інтерфейс IPeerReviewed для есе й клас Course з підсумковою оцінкою. Консольна програма виводить відомість студента.
3. Високий рівень. Створити бібліотеку навчальної платформи з абстрактним Assignment (назва, дедлайн), тестами й есе, інтерфейсами IGradable, IAutoChecked (тести перевіряються автоматично) і шаблонним методом перевірки роботи. Застосунок dotnet CLI обробляє здачі робіт зі стандартного введення й виводить оцінки та рейтинг; помилки – у Console.Error.
Варіант 23. Салон краси
1. Початковий рівень. Створити абстрактний клас Master з іменем і абстрактним методом ServiceMinutes(string service) та класи Barber і Manicurist. Вивести тривалість послуг.
2. Базовий рівень. Створити абстрактний клас Master з іменем і методом ServiceMinutes(string service), класи Barber і Manicurist, інтерфейс ISchedulable з методами перевірки вільного часу й запису та клас Salon, що підбирає майстра для послуги. Консольна програма записує введених клієнтів на день і виводить розклад.
3. Високий рівень. Створити бібліотеку салону краси з абстрактним Master (ім’я, рейтинг, тривалість послуг), перукарями й майстрами манікюру, IComparer<Master> за рейтингом і завантаженістю, шаблонним методом оформлення запису й перервами майстрів. Застосунок dotnet CLI обробляє заявки зі стандартного введення й виводить розклад майстрів; помилки – у Console.Error.
Варіант 24. Транспортна картка
1. Початковий рівень. Створити абстрактний клас Trip з абстрактним методом Fare() та класи BusTrip, MetroTrip і TramTrip. Обчислити вартість поїздок за день.
2. Базовий рівень. Створити абстрактний клас Trip (час, Fare()), класи BusTrip, MetroTrip, TramTrip та інтерфейс IChargeable з методом Charge(Trip trip) для транспортної картки з балансом і безоплатними пересадками протягом 60 хвилин. Консольна програма моделює день поїздок і виводить списання.
3. Високий рівень. Створити бібліотеку транспортних карток з поїздками автобусом, метро й трамваєм, кількома типами карток (IChargeable з різними пільгами) і денним лімітом списань. Застосунок dotnet CLI обробляє валідації зі стандартного введення й виводить звіт за картками; помилки – у Console.Error; коди завершення: 0, 1, 2.
Варіант 25. Меню ресторану
1. Початковий рівень. Створити інтерфейс IPriced з властивістю Price і класи Dish та Drink. Обчислити суму замовлення за масивом IPriced.
2. Базовий рівень. Створити інтерфейси IPriced (Price) і IDiscountable (знижка в певні години), класи Dish і Drink та клас Combo, що реалізує IPriced і складається з кількох позицій. Консольна програма формує замовлення з меню й виводить чек зі знижками.
3. Високий рівень. Створити бібліотеку меню з IPriced, IDiscountable, IAllergenInfo і порівнювачами за ціною й калорійністю. Застосунок dotnet CLI обробляє замовлення зі стандартного введення, перевіряє алергени відвідувача з опції --allergies і виводить чек; помилки – у Console.Error.
Варіант 26. Клонування документів
1. Початковий рівень. Створити клас Document з назвою й масивом розділів, що реалізує ICloneable поверхневою копією. Показати, що зміна розділу в копії змінює оригінал.
2. Базовий рівень. Створити клас Document з назвою й масивом розділів, що реалізує ICloneable поверхневою копією (Clone()) і має метод глибокого копіювання DeepClone() зі створенням нових розділів. Консольна програма створює шаблон документа й кілька копій, змінює їх і виводить результати, що показують різницю.
3. Високий рівень. Створити бібліотеку документів з інтерфейсом IDeepCloneable<T> для документа, розділів і вкладень та перевіркою незалежності копій. Застосунок dotnet CLI створює документи зі шаблону зі стандартного введення, заповнює поля з аргументів і виводить результати; помилки – у Console.Error.
Варіант 27. Об’ємні тіла
1. Початковий рівень. Створити інтерфейс IVolume з методом Volume() і класи Cube, Sphere та Cylinder. Вивести об’єми тіл масиву.
2. Базовий рівень. Створити інтерфейс IVolume, абстрактний клас Solid, що реалізує IVolume і IComparable<Solid> за об’ємом та має абстрактну площу поверхні, і класи Cube, Sphere та Cylinder. Консольна програма сортує тіла й виводить таблицю об’ємів і площ.
3. Високий рівень. Створити бібліотеку об’ємних тіл (куб, куля, циліндр) з об’ємом і площею поверхні, порівнювачами за об’ємом, площею й відношенням площі до об’єму та перевіркою, чи вміщується одне тіло в інше. Застосунок dotnet CLI обробляє тіла зі стандартного введення й виводить відсортовані звіти; помилки – у Console.Error.
Варіант 28. Рейтингові системи
1. Початковий рівень. Створити інтерфейс IRatingSystem з методом Update(ref double winner, ref double loser) і класи PointsRating (+3/−1) та EloRating. Оновити рейтинги після одного матчу.
2. Базовий рівень. Створити інтерфейс IRatingSystem з методом оновлення рейтингів після матчу, абстрактний клас RatingSystemBase з назвою й журналом змін та очкову систему й систему Ело, що обробляють нічиї. Консольна програма проводить турнір за введеними результатами й порівнює підсумкові таблиці за обома системами.
3. Високий рівень. Створити бібліотеку рейтингових систем (очкова, Ело, Глікко спрощена) з IRatingSystem і IComparer<Player>. Застосунок dotnet CLI обробляє результати матчів зі стандартного введення й виводить таблиці за системою --system; помилки – у Console.Error.
Варіант 29. Фільтри ASCII-зображення
1. Початковий рівень. Створити інтерфейс IImageFilter з методом Apply(char[,] image), що повертає нове зображення, і класи InvertFilter та MirrorFilter. Застосувати фільтри до зображення.
2. Базовий рівень. Створити інтерфейс IImageFilter з методом Apply(char[,] image), що повертає нове зображення, абстрактний клас PixelFilter із шаблонним методом обходу пікселів і абстрактним перетворенням одного символу та фільтри RotateFilter і OutlineFilter, що реалізують IImageFilter напряму. Консольна програма застосовує ланцюжок фільтрів до ASCII-зображення й виводить результат.
3. Високий рівень. Створити бібліотеку фільтрів ASCII-зображень (char[,]) з IImageFilter, IParameterized (фільтри з параметрами, як-от поворот чи поріг) і композитним фільтром. Застосунок dotnet CLI застосовує ланцюжок фільтрів з аргументів до зображення зі стандартного введення й виводить результат; помилки – у Console.Error.
Варіант 30. Таймер виконання
1. Початковий рівень. Створити клас ExecutionTimer, що реалізує IDisposable: у конструкторі запам’ятовує час початку, а в Dispose виводить тривалість блоку. Виміряти два фрагменти коду в блоках using.
2. Базовий рівень. Створити ExecutionTimer з назвою, вкладеністю таймерів (відступи для внутрішніх блоків) і захистом від повторного Dispose. Консольна програма вимірює етапи сортування різними методами у вкладених блоках using.
3. Високий рівень. Створити бібліотеку профілювання з IDisposable-таймером, інтерфейсом IProfileSink (консоль, CSV) і звітом із мінімальним, середнім і максимальним часом повторюваних блоків. Застосунок dotnet CLI виконує набір алгоритмів із аргументів і виводить профіль; помилки – у Console.Error.
Порядок виконання та захисту роботи
- Опрацювати теоретичні відомості та приклади розв’язання завдань.
- Визначити для свого варіанта, які абстракції описати абстрактним класом, а які – інтерфейсами; обґрунтувати вибір; побудувати UML-діаграму класів та інтерфейсів.
- Створити рішення та проєкт; кожен тип розмістити в окремому файлі.
- Реалізувати типи відповідно до обраного рівня складності, використовуючи автоматичну генерацію реалізацій (Implement abstract class, Implement interface).
- Перевірити поліморфну роботу через змінні абстрактного та інтерфейсного типів; для типів з
IDisposableпереконатися, що ресурси звільняються і в разі винятку. - Продемонструвати роботу програми викладачеві, пояснити програмний код і відповісти на контрольні питання.