Задачи - ООП, Седмица 9, 18.04.2024
На днешното упражнение ще решаваме задачата от Контролно 1, затова задачите ще са в същия дух (макар и да не включват най-новия материал).
Решението, което писахме по време на практикума, с някои разширения и коментари, може да намерите тук.
GitHub classroom: classroom.github.com/a/wlL1oUg2
Преговорни
#Задача 1 - Голяма петица
#Реализирайте клас Printer, който съдържа модел като низ с произволна дължина и брой принтирани страници като неотрицателно цяло число. Имплементирайте голяма петица.
Задача 2 - Файлове и класове
#Реализирайте клас Date, който съдържа номера на деня, месеца и годината в три отделни целочислени член-данни.
Имплементирайте член-методи storeText
, storeBinary
, които съответно запазват данните в текстов файл (във формата “YEAR MONTH DAY”) и в двоичен файл с подадени имена.
Аналогично имплементирайте loadText
и loadBinary
, които презаписват член-данните с тези от подадените (имена на) файлове.
В главната функция създайте 5 дати, запазете всяка в един и същ текстов файл, след това прочетете датите в нови 5 променливи и изкарайте датите в обратен ред.
Лесни
#Задача 3
#Реализирайте клас Train, който съдържа:
- модел като низ с максимална дължина от 127 знака
- идентификационен номер на релсовата линия върху която се намира, като целочислена неотрицателна стойност
- име на текстов файл, съдържащ всички райони от сегашната релсова линия, всеки на нов ред. Самото име представяйте като низ с произволна дължина.
- сегашна локация (район) от релсовата линия като низ с произволна дължина. Тази локация не се подава, и при създаване на обекта винаги е първата във файла.
Имплементирайте методите:
- от голямата петица
TransferNextRegion
, който променя сегашната локация на следващата по ред в текстовия файл (чието име е подадено в конструктор). Ако няма следващо по ред, тогава локацията да си остане същата и да се хвърли грешка. Ако се срещнат проблеми с файла, хвърлете грешка.SwitchRailLine
, който приема идентификационен номер на релсовата линия и име на текстов файл, и променя вътрешните стойности. Съответно локацията трябва да бъде първата в подадения файл. Ако се срещнат проблеми с файла, хвърлете грешка.
Реализирайте клас TrainNetwork, който съдържа:
- идентификационен код, като низ с максимална дължина от 7 знака
- масив, запазващ максимум 511 влака (типа се оставя по ваша преценка)
За този клас имплементирайте методите:
HaveCollided
, който приема индекс на два влака и връща дали са се блъснали. Това се случва ако в една и съща релсова линия и един и същи регион, когато регионът не е последния възможен.RunTrains
, който придвижва напред всички влакове, докато не стигнат финалната си възможна дестинация. Влакове които са се ударили не се придвижват напред. Връщате броя ударили се влакове.
Да се имплементира главна функция, в която приемате име на двоичен файл от потребителя. В този файл имате някакъв брой редици с идентификационен номер на релсова линия, брой локации върху съответната линия и всички локации като нормални низове, разделени с нови редове.
Допълнително в главната функция приемайте от потребителя влаковете, като имената на текстовите файлове се избират от програмата (НЕ от потребителя) според идентификационния номер на релсовата линия и информацията във файла с редиците. Не може да променяте Train класа!
Последно в главната функция създайте обект от тип TrainNetwork и изкарайте резултата от RunTrains
на екрана.
Трудни
#Задача 4
#Реализирайте клас Car, в който се запазват:
- марка като низ с максимум 31 знака
- модел като низ с произволна дължина
- брой седалки като положително цяло число
- гладност на човека на всяка седлка като целочислен масив с размер броя седалки
Имплементирайте методи:
- от голямата петица
AddPassenger
, който добавя нов човек на дадения индекс на седалкаRemovePassenger
, който премахва човека от дадения индексTotalHunger
, който връща общото количество гладност в колатаStoreData
, който запазва всички данни от колата в двоичен файл с подадено имеLoadData
, който презаписва всички данни с тези от подадения по име двоичен файл
Реализирайте клас DriveThrough, в който се запазват:
- име на ресторант, към който е свързано съответния проход, като низ с произволна дължина
- коли на опашка, като масив с коли с произволна дължина
Имплементирайте методи:
- от голяма петица
QueueUp
, който приема кола и я вкарва в края на опашката. Разбира се, масивът се уголемява ако е нужно.Serve
, който изпълнява поръчката на най-предната кола в опашката. За единица глад, ресторанта може да сготви достатъчно храна (за да нахрани клиента с “единица” храна) за единици време между половината от дължината на името на ресторанта и три пъти дължината на името на ресторанта време.
Максималното възможно количество време за изпълнение на поръчката варира и според броя коли в опашка: ако са под 6 на брой, тогава тогава се увеличава с 10%, а ако са над 10 тогава се намалява с по 5% за всяка кола след десетата.EfficiencyService
, който изпълнява поръчките на всички коли в опашката и връща средно колко време е отнело на поръчка.StoreData
, който запазва всички данни в текстов файл с подадено имеLoadData
, който презаписва всички данни с тези от подадения по име текстов файл
Имплементирайте главна функция, в която от потребителския вход приемате име на текстов файл.
Създайте обект от тип DriveThrough, който да запълни своите стойности с тези от подадения файл и изкарайте на екрана стойността от EfficiencyService
.