Задачи - ООП, Седмица 10, 25.04.2024
GitHub classroom: classroom.github.com/a/PbkITWhF
Преговорни
#Моля, не отделяйте на преговорните задачи повече от 30мин
Задача 1 - Шаблони
#Реализирайте шаблонен клас Array
, който запазва динамично-заделен и оразмеряем масив от елементи с подаден тип.
Имплементирайте голяма четворка.
Задача 2 - Оператори
#За предходния шаблонен клас имплементирайте оператори:
- [], който връща референция към елемента на подадения индекс
- == и !=, които сравняват поелементно
- +, += които конкатенират (слепват) два масива
Задача 3 - Грешки
#Имплементирайте функция, която приема име на текстов файл и изкарва на екрана първия ред от него.
Ако файлът не може да бъде отворен, хвърлете грешка - низ.
Ако във файлът няма други редове (няма знакът '\n'
), тогава хвърлете грешка число - размерът на файла.
В главната функция, приемете името на файла от потребителския вход и извикайте функцията. Ако файлът не може да бъде отворен, тогава изкарайте хвърлената грешка на терминала и приключете програмата (успешно). Ако няма други редове в него, тогава изкарайте съобщението “In X characters, there is no newline!”, където X е хвърленото число, и пробвайте да приемете пак име на файла от потребителския вход.
Лесни
#Задача 4
#Реализирайте клас Time24
, който запазва час и минути (в 24-часов формат) в две отделни целичислени член-данни.
Имплементирайте член-функция Print24
, която изкарва часа на екрана в 24-часов формат.
Нека конструкторът му приема две целочислени променливи, една за часа и втора за минутите.
Реализирайте негов наследник Time12
, който имплементира метод Print12
, принтиращ часа в 12-часов формат.
Имплементирайте и негов конструктор, който приема две целочислени променливи (една за часа и една за минутите), заедно с булева променлива описваща дали часа е следобеден или не.
Задача 5
#Реализирайте клас FN
, който запазва факултетен номер като неотрицателно цяло число от 5 цифри.
Реализирайте негов наследник ModernFN
, който запазва и начален (префиксен) низ, състоящ се от цифра, две букви и още две цифри.
Имплементирайте конструктори, като този на FN
приема число, докато този на ModernFN
приема низ, състоящ се от целия факултетен номер (и трябва да конвертирате последните 5 цифри към число).
Имплементирайте метод PrintOldFN
на класа FN
и метод PrintNewFN
на класа ModernFN
, които изкарват целия факултетен номер на съответния клас.
Задача 6
#Реализирайте клас Grade
, който запазва оценка (от 2 до 6) като неотрицателна целочислена член-данна.
Реализирайте и негов наследник GradeWithName
, който запазва и името на оценката като низ с произволна дължина.
Конструктора на Grade
приема само числовата стойност, докато този на наследника приема и името на оценката.
Имплементирайте голяма петица на GradeWithName
.
Задача 7
#Реализирайте клас String
, който запазва низ с произволна дължина.
Имплементирайте голяма петица и член-функция At
, която приема индекс и връща референция към буквата на този индекс (при невалиден индекс хвърляте грешка).
Реализирайте негов наследник FileString
, който запазва и името на текстов файл като низ с произволна дължина.
Ако е нужно, имплементирайте голяма петица.
Самия низ в FileString
е първия низ (начало първата буква и край '\n'
) от файла с подадено име.
Имплементирайте метод ChangeAt
, който приема индекс и нова буква, променя буквата на дадения индекс с подадената и обновява файла със запазеното име.
Задача 8
#Реализирайте клас User
, който запава име и парола като два низа с произволна дължина.
Реализирайте негов наследник Moderator
, който запазва и подпис, който също е низ с произволна дължина.
Реализирайте наследник Administrator
на Moderator
, който запазва и оразмеряващ се масив от цели числа.
Идеята е, че всяко действие от модератор или администратор се “подписва” публично (за да се знае, че той го е направил, дори да си смени името), а за администратор допълнително пазим масив от идентификатори на форуми, които администрира.
За всеки клас имплементирайте голяма петица и гетъри и сетъри за името и паролата, когато е нужно.
За Moderator
имплементирайте гетър за подписа, но без сетър.
За Administrator
имплементирайте методи за добавяне и премахване на идентификатор на форум.
Задача 9
#Реализирайте клас CommunicationPacket
, който запазва начален и краен адрес като две неотрицателни цели числа, заедно с трето число за размера на данните.
В този клас никога няма данни, затова размера винаги е нула.
Реализирайте негови наследници StringPacket
и IntPacket
, където първия запазва и низ с произволна дължина (и дължината му е размера на данните) докато втория запазва и едно цяло число (и размера на int
е размера на данните).
Размерът не се подава на конструктори, а се изчислява в конструктори. Имплементирайте голяма петица и конструктори с нужните параметри.
Задача 10
#Реализирайте клас String
, който запазва низ с произволна дължина, и имплементира оператори ==, !=, + (който връща нов низ с конкатенацията на двата низа).
Реализирайте негов наследник ModifiableString
, който имплементира оператор[] (връщащ референция към буквата на дадения индекс) и оператор+=.
Реализирайте наследник на ModifiableString
, ShowableString
, който имплементира оператори << и >>.
Реализирайте наследник на ModifiableString
, SaveableString
, който имплементира методи write и read, приемащи име на двоичен файл и записващи или четещи низа от този файл.
За всички класове имплементирайте голяма петица, когато е нужно.
Трудни
#Задача 11
#Реализирайте шаблонен клас Array
, който запазва оразмеряем масив с елементи от подаден тип.
Имплементирайте оператор== и оператор!=, заедно с метод isEmpty
.
Концептуално идеята е, че този масив не може да се променя след като му се въведат стойностите от конструктора.
Реализирайте негов наследник PrintableArray
, който имплементира оператори << и >>.
Реализирайте наследник SaveableArray
на Array
, който имплементира методи write и read, приемащи име на файл и булева стойност дали е двоичен или не, и съответно прочитат или запазват елементите от този масив във файла.
Реализирайте трети наследник, ModifiableArray
, на Array
, в който са имплементирани член-функции:
push
, която приема елемент и го вмъква в (десния) края на масиваpop
, който премахва елемент от (десния) края на масиваlast
, който връща последния елемент от масива
Може да се налага масива да се оразмерява. Като подсказка, имплементирайте си метод, наличен за класа и наследници, който вмъква елемент на произволен индекс.
Реализирайте наследник IndexableArray
на ModifiableArray
, който имплементира оператор[].
Ако индекса е след края, тогава “вмъквате” елементи по подразбиране между края и подадения индекс, и връщате елемента от сега новия край.
Реализирайте наследник FrontableArray
на ModifiableArray
, който имплементира методи pushf
и popf
, които работят като push
и pop
, но с елемента в началото на масива (първия елемент).