diff options
| Commit | 07927b6e7d46a6f644ca6a894c6a2d9f25ff5d27 (patch) | |
|---|---|---|
| Author | 2024-05-10 11:46:08 +0300 | |
| Committer | 2024-05-10 11:46:08 +0300 | |
| Files | e03d78c3149d5ff27f50fecaee700fd61caec246 /src | |
| syndamia.com-07927b6e7d46a6f644ca6a894c6a2d9f25ff5d27.tar syndamia.com-07927b6e7d46a6f644ca6a894c6a2d9f25ff5d27.tar.gz syndamia.com-07927b6e7d46a6f644ca6a894c6a2d9f25ff5d27.zip | ||
| Parent | fd27a26e4420d44b0a82731ab45d457e21c9a9fd (diff) | |
[te/oop-2023/w11,w12] Improved formatting and fixed mistakes in descriptions
2 files changed, 115 insertions, 57 deletions
| -rw-r--r-- | src/teaching/oop-2023/week11/index.md | 95 | ||||
| -rw-r--r-- | src/teaching/oop-2023/week12/index.md | 77 |
diff --git a/src/teaching/oop-2023/week11/index.md b/src/teaching/oop-2023/week11/index.md index 5029415..4060c2e 100644 --- a/src/teaching/oop-2023/week11/index.md +++ b/src/teaching/oop-2023/week11/index.md @@ -6,26 +6,26 @@ GitHub classroom: [classroom.github.com/a/oYQehcnN](https://classroom.github.com &:warn Моля, не отделяйте на преговорните задачи повече от 30мин -&:important Ако за даден клас е имплементиран деструктор, тогава в него и всичките му деца трябва да добавите `virtual` пред деструктора! +&:important Всеки бащин клас, във всички случаи, трябва да има виртуален деструктор (`virtual ~ClassName();`). ### Задача 1 - Шаблони и оператори Реализирайте шаблонен клас множество, който запазва фиксиран брой елементи от подаден тип. Реализирайте голяма петица и оператори: -- +, += които действат като обединение -- \*, \*= които действат като сечение -- -, -= които действат като допълнение +- `+`, `+=` които действат като обединение +- `*`, `*=` които действат като сечение +- `-`, `-=` които действат като допълнение ### Задача 2 - Наследяване -Реализирайте клас Employee, съхраняващ име на човек, позиция и департамент като низове със съответно дължина 512, 128 и 64, заедно със заплата като число с плаваща запетая. +Реализирайте клас `Employee`, съхраняващ име на човек, позиция и департамент като низове със съответно дължина 512, 128 и 64, заедно със заплата като число с плаваща запетая. -Реализирайте негов наследник Manager, който допълнително пази масив с фиксиран размер от Employee. +Реализирайте негов наследник `Manager`, който допълнително пази масив с фиксиран размер от Employee. -Реализирайте наследника на Employee, Developer, който допълнително пази брой проекти върху който работи. +Реализирайте наследника на `Employee`, `Developer`, който допълнително пази брой проекти върху който работи. -Наследниците не могат да достъпят заплатата, но трябва да могат да достъпят другите данни на Employee. +Наследниците не могат да достъпят заплатата, но трябва да могат да достъпят другите данни на `Employee`. ## Лесни @@ -33,75 +33,106 @@ GitHub classroom: [classroom.github.com/a/oYQehcnN](https://classroom.github.com <!-- Динамично свързване, Inherit 3 --> -Реализирайте клас Electronics, който съдържа модел (низ с максимална дължина от 255 знака), needsVolts и needsAmps (стойности с плаваща запетая). +Реализирайте клас `Electronics`, който съдържа модел (низ с максимална дължина от 255 знака), `needsVolts` и `needsAmps` (стойности с плаваща запетая). Имплементирайте негови наследници: -- Laptop, който допълнително съхранява размер на екрана като число с плаваща запетая -- WashingMachine, който допълнително запазва максимално тегло на прането, като цяло неотрицателно число -- Camera, която допълнително запазва резолюция като число с плаваща запетая (в мегапиксели) +- `Laptop`, който допълнително съхранява размер на екрана като число с плаваща запетая +- `WashingMachine`, който допълнително запазва максимално тегло на прането, като цяло неотрицателно число +- `Camera`, която допълнително запазва резолюция като число с плаваща запетая (в мегапиксели) -За всеки клас реализирайте член-функция Print, която изкарва всички данни на екрана. +За всеки клас реализирайте член-функция `Print`, която изкарва всички данни на екрана. -&:question Чрез статично или динамично свързване сте имплементирали Print? Каква е разликата? +&:question Чрез статично или динамично свързване сте имплементирали `Print`? Каква е разликата? ### Задача 4 <!-- Dynamic linking, Inherit 2 --> -Реализирайте клас String, който запазва динамично-заделен масив. +Реализирайте клас `String`, който запазва динамично-заделен масив. -Имплементирайте негов наследник Name, който допълнително запазва число: номер на името (първо име, бащино име (второ име), фамилия (трето име)). +Имплементирайте негов наследник `Name`, който допълнително запазва число: номер на името (първо име, бащино име (второ име), фамилия (трето име)). -Имплементирайте втори наследник на String, Street, който запазва и число: номер на улицата. +Имплементирайте втори наследник на `String`, `Street`, който запазва и число: номер на улицата. -Във всеки клас имплементирайте голяма петица, член-функция length, като в String връща дължината на низа, в Name връща дължината на името умножена по номера си и в Street връща дължината на името на улицата плюс броя цифри в номера на улицата. +Във всеки клас имплементирайте голяма петица, член-функция `Length`, като: + +- в `String` връща дължината на низа, +- в `Name` връща дължината на името умножена по номера си и +- в `Street` връща дължината на името на улицата плюс броя цифри в номера на улицата. + +Самият низ в `String` **не** може да се достъпва от наследниците. ### Задача 5 <!-- Templates 1 type --> -Реализирайте шаблонен клас Counted, който запазва елемент от подаден тип и неговата бройка (цяло неотрицателно число). -Имплементирайте оператори ++, --, +=, -=, които променят бройката. +Реализирайте шаблонен клас `Counted`, който запазва елемент от подаден тип и неговата бройка (цяло неотрицателно число). +Имплементирайте оператори `++`, `--`, `+=`, `-=`, които променят бройката, както и гетъри за елемента и бройката. ### Задача 6 <!-- Templates 2 types --> -Реализирайте шаблонен клас TwoArray, който запазва два динамично-заделени масива с подадени типове. +Реализирайте шаблонен клас `TwoArray`, който запазва два динамично-заделени масива с подадени типове. Масивите не могат да се оразмеряват и имат еднаква дължина. -Имплементирайте голяма петица, оператор [], който по подаден индекс връща елемент от първия масив, и оператор (), който по подаден индекс връща елемент от втория масив. +Имплементирайте: + +- голяма петица, +- оператор `[]`, който по подаден индекс връща елемент от първия масив, и +- оператор `()`, който по подаден индекс връща елемент от втория масив. ### Задача 7 <!-- Abstract class --> -Реализирайте абстрактен клас DynamicArray, който задължава наследниците да имплементират оператор [], оператор += и оператор +. +Реализирайте абстрактен клас `DynamicArray`, който задължава наследниците да имплементират оператор `[]` и оператор `+=`. + +Реализирайте негови наследници: + +- `Numbers`, който "имплементира" динамично-заделен масив от цели числа, като + + оператор `[]` връща първия елемент, по-малък от подадения индекс. Ако няма такъв, връщате първия елемент. + + оператор `+=` вмъква елементите в началото на масива +- `String`, който "имплементира" динамично-заделен масив от букви, като + + оператор `[]` връща индекс на брой (първата, втората, ...) главна буква в низа. Ако няма такава, тогава връща последната буква. + + оператор `+=` вмъква елементите в края на масива -Реализирайте негови наследници String, който имплементира динамично-заделен масив от букви, и Numbers, който имплементира динамично-заделен масив от числа. Имплементирайте голяма петица. +&:question Къде ще имплементирате динамичния масив и голямата петица? + +&:question Можем ли да използваме оператор `+=` в полиморфна йерархия? + ### Задача 8 <!-- Abstract class --> -Имплементирайте абстрактен клас Message, който съдържа динамично-заделен низ (текстово съобщение) и задължава наследниците да имплементират метод size, който връща общия размер на всички данни в байтове. +Имплементирайте абстрактен клас `Message`, който съдържа динамично-заделен низ (текстово съобщение, което се показва на екрана) и задължава наследниците да имплементират: + +- метод `size`, който връща общия размер на всички данни в байтове. + +Реализирайте негов наследник `Link` (хипервръзка), който запазва и втори динамично-заделен низ, запазващ адресът към който линкът сочи. -Реализирайте негов наследник Link (хипервръзка), който запазва и втори динамично-заделен низ, запазващ адресът към който линкът сочи. +Реализирайте втори негов наследник `Location`, чието текстово съдържание е адрес, и който допълнително запазва две стойности с плаваща запетая: една за географска ширина и втора за географска дължина. -Реализирайте втори негов наследник Location, чието текстово съдържание е адрес, и който допълнително запазва две стойности с плаваща запетая: една за географска ширина и втора за географска дължина. +За всички класове реализирайте член-функция `Length`, която връща размера на **текстовото съобщение** и оператор `<<`. -За всички класове реализирайте член-функция length, която връща размера на текстовото съобщение и operator<<. +&:question Има ли разлика между оператор `<<` на трите класа? ### Задача 9 -Реализирайте абстрактен шаблонен клас MixedArray, който съхранява алтерниращи елементи от два типа, за тях имплементира голяма петица и задължава наследниците да имплементират оператори + и +=. -Елементите не е нужно да могат да се конвертират помежду си (тоест не може да използвате полиморфен контейнер). +Реализирайте абстрактен шаблонен клас `MixedArray`, който съхранява алтерниращи елементи от два типа. +Тоест, на индекс 0 имаме елемент от първия тип, на индекс 1 от втория, на индекс 2 от първи и так. нат. + +Елементите не е нужно да могат да се конвертират помежду си (тоест не може да използвате полиморфен контейнер), затова се достъпват с член функция `At`, приемаща индекс и референции към указатели към всеки тип. +При подаден индекс, на единия указател се записва адресът на съответната стойност, а на другия `nullptr`. + +Също имплементира голяма петица и задължава наследниците да имплементират оператори `+=`, върщащи указател. -Реализирайте негов наследник DirectConcat, който реализира + и += като директно слепване (конкатениране). +Реализирайте негов наследник `DirectConcat`, който реализира `+=` като директно слепване (конкатениране). -Реализирайте втори негов наследник, MixedConcat, който реализир + и += като алтернира елемент от първия масив с елемент от втория. +Реализирайте втори негов наследник, `MixedConcat`, който реализир `+=` като алтернира елемент от първия масив с елемент от втория. ## Трудни diff --git a/src/teaching/oop-2023/week12/index.md b/src/teaching/oop-2023/week12/index.md index ddeac06..e41b4a6 100644 --- a/src/teaching/oop-2023/week12/index.md +++ b/src/teaching/oop-2023/week12/index.md @@ -6,56 +6,83 @@ GitHub classroom: [classroom.github.com/a/o7hNz1pr](https://classroom.github.com <!-- Multiple inheritance --> -Реализирайте клас Publication, който пази низ от максимална дължина 1023, съхраняващ автори и втори низ с максимална дължина от 255, съхраняващ име на (научно) списание. +Реализирайте клас `Publication`, който пази: -Реализирайте клас TextDocument, който пази неоразмеряем низ с текстово съдържание и неговия размер. +- низ от максимална дължина 1023, съхраняващ автори и +- втори низ с максимална дължина от 255, съхраняващ име на (научно) списание. -Реализирайте наследник на двата класа ScientificPaper, който допълнително пази и низ от максимално 511 знака, съдържащ име на научна дисциплина. +Реализирайте клас `TextDocument`, който пази неоразмеряем низ с текстово съдържание и неговия размер. + +Реализирайте наследник на двата класа `ScientificPaper`, който допълнително пази и низ от максимално 511 знака, съдържащ име на научна дисциплина. За всички класове реазлизирайте оператор <<. ### Задача 2 -*Не говорим за нея* +*Не говорим за нея, условието беше толкова сбъркано, че се наложи да я сваля* ### Задача 3 -Реализирайте абстрактен клас MobileDevice, който запазва телефонен номер като цяло неотрицателно число и масив с максимална дължина от 511 знака за текстово съобщение. +Реализирайте абстрактен клас `MobileDevice`, който запазва: + +- телефонен номер като цяло неотрицателно число и +- масив с максимална дължина от 511 знака за текстово съобщение. + +Допълнително нека: -- Класът задължава имплементацията на метод Show. -- Имплементирайте член-функция CanAccept, която по подадено "хиперсъобщение" връща дали неговия номер съвпада с този на класа. +- класът да задължава имплементацията на метод `Show`, +- да има член-функция `CanAccept`, която по подадено "хиперсъобщение" връща дали неговия номер съвпада с този на класа. Под "хиперсъобщение" имаме предвид низ, който започва с телефонния номер, след това има шпация и след това е самото съобщение. -- Имплементирайте втора член-функция Accept, която по подадено "хиперсъобщение" запазва текстовото съобщение ако номерът съответства и хвърля грешка иначе. +- да има член-функция `Accept`, която по подадено "хиперсъобщение" запазва текстовото съобщение. + Ако номерът не съответства тогава хвърля грешка. -Реализирайте негов наследник Telephone, за който Show изкарва съобщението на екрана. +Реализирайте негов наследник `Telephone`, за който `Show` изкарва съобщението на екрана. -Реализирайте втори негов наследник Pager[^pager], който съхранява име на файл (като динамично-заделен низ) и Show изкарва съобщението в съответния файл. +Реализирайте втори негов наследник `Pager`[^pager], който съхранява име на файл (като динамично-заделен низ) и `Show` изкарва съобщението в съответния файл. +Разбира се, имплементирайте голяма петица. -Реализирайте клас TelecommunicationCompany, която съхранява динамично-заделен и оразмеряем масив от (указатели към) MobileDevice. -Имплементирайте голяма петица. +Реализирайте клас `TelecommunicationCompany`, който съхранява динамично-заделен и оразмеряем масив от (указатели към) `MobileDevice`. +Имплементирайте всичко, **което е възможно**, от голяма петица. ### Задача 4 <!-- Multiple inheritance with mixed class types, polymorphic container, and copying --> -Реализирайте клас Employee, който запазва заплата като число с плаваща запетая и производителост също като число с плаваща запетая. -Производителността е множител на заплатата, тоест ако има производителност 0.5 значи работи като човек на който му заплащат с половината заплата. +Реализирайте клас `Employee`, който запазва: + +- заплата като число с плаваща запетая и +- производителост също като число с плаваща запетая. + +Производителността е множител на заплатата, тоест ако има производителност 0.5 значи работи като човек на който му плащат с половината заплата. + +Реализирайте абстрактен клас `Person`, който запазва: -Реализирайте абстрактен клас Person, който запазва име като низ с произволна дължина и възраст като цяло неотрицателно число, и задължава реализацията на член-функция Workload, връщаща стойност с плаваща запетая. +- име като низ с произволна дължина и +- възраст като цяло неотрицателно число + +Допълнително задължава реализацията на член-функция `Workload`, връщаща стойност с плаваща запетая. Разбира се имплементирайте голяма петица. -Реализирайте наследник на двата класа на име Developer, който допълнително запазва цяло неотрицателно число - брой проекти в които участва, и второ което е брой проекти на които ще се пуска нова версия. -Реализирайте оператори ++ и --, като префиксните променят броя проекти на които ще се пуска нова версия, докато постфиксните променя броя проекти в които участва. -За него Workload се определя като 1.1 по всеки проект и допълнително по 2.3 за всеки проект на който ще се пуска нова версия. +Реализирайте наследник на двата класа на име `Developer`, който допълнително запазва: + +- цяло неотрицателно число - брой проекти в които участва, и +- второ което е брой проекти на които ще се пуска нова версия. + +Реализирайте оператори `++` и `--`, като префиксните променят броя проекти на които ще се пуска нова версия, докато постфиксните променя броя проекти в които участва. +За него `Workload` се определя като 1.1 по всеки проект и допълнително по 2.3 за всеки проект на който ще се пуска нова версия. + +Реализирайте наследник на двата класа на име `Manager`, който допълнително запазва динамично-заделен и оразмеряем масив от `Person` указатели, които менижира. + +Имплементирайте голяма петица и: + +- член-функция `StartManaging`, която приема `Person` и го запазва, и +- член-функция `StopManaging`, която приема `Person` и го премахва от масива ако съществува в него. -Реализирайте наследник на двата класа на име Manager, който допълнително запазва динамично-заделен и оразмеряем масив от Person указатели, които менижира. -Имплементирайте голяма петица и член-функция StartManaging, която приема Person и го запазва, и член-функция StopManaging, която приема Person и го премахва от масива ако съществува в него. -Workload се определя като 0.6 на човек който менижира. +`Workload` се определя като 0.6 на човек който менижира. -Финално реализирайте клас Company, който запазва масив от указатели Person в компанията. +Финално реализирайте клас `Company`, който запазва масив от 128 указателя Person в компанията. Имплементирайте негови член-функции: -- от голямата петица -- PaymentDifference, която връща с колко платената заплата на всички служители се отличава с тази според тяхната производителност -- WorkloadByAge, която изкарва на екрана средния Workload на всички служители от десетилетни възрастови категории (18-19, 20-29, 30-39, ...) +- `PaymentDifference`, която връща с колко платената заплата на всички служители се отличава с тази според тяхната производителност +- `WorkloadByAge`, която изкарва на екрана средния Workload на всички служители от десетилетни възрастови категории (18-19, 20-29, 30-39, ...) [^pager]: От времето без мобилни телефони, хората са си купували пейджъри, които ти пращат нотификация ако някой ти звънне и не вдигнеш. Пейджърите са "заключени" за определени региони, тоест някой ти се обажда, не вдигаш, и всички телекомуникционни кули в региона изпращат съобщение "на теб ти звънна този", и пейджъра като засече сигнала ти писука. Мисля че също можеш да пращаш кратки съобщения. Не е било хич сигурна система, все още се ползва от болници в някои държави. |