diff options
1 files changed, 55 insertions, 50 deletions
| -rw-r--r-- | src/teaching/oop-2023/week2/index.du | 105 |
diff --git a/src/teaching/oop-2023/week2/index.du b/src/teaching/oop-2023/week2/index.du index ade800c..9cecfd6 100644 --- a/src/teaching/oop-2023/week2/index.du +++ b/src/teaching/oop-2023/week2/index.du @@ -1,14 +1,17 @@ -# Задачи - ООП, Седмица 2, 29.02.2024 +'def title Задачи - ООП, Седмица 2, 29.02.2024 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/3qPsfyyI classroom.github.com/a/3qPsfyyI] +GitHub classroom: {url classroom.github.com/a/3qPsfyyI;https://classroom.github.com/a/3qPsfyyI} ## Задача 0 - Преговорна -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise0.cpp Решения] +.solution-link {url Решения;https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise0.cpp} -Ще работим върху N-мерен [url https://en.wikipedia.org/wiki/Tic-tac-toe морски шах], тоест ще имаме дъска за морски шах, която може да е по-голяма от 3 на 3 (примерно 5 на 5, 7 на 7 и т.н.). +Ще работим върху N-мерен {url морски шах;https://en.wikipedia.org/wiki/Tic-tac-toe}, тоест ще имаме дъска за морски шах, която може да е по-голяма от 3 на 3 (примерно 5 на 5, 7 на 7 и т.н.). Няма да се занимаваме с проверки дали (и кой) е спечелил след даден ход, интересуваме се само от запазването на данни. Основната логика е следната, като във всяка подточка правила по имплементацията са зададени. @@ -23,9 +26,10 @@ GitHub classroom: [url https://classroom.github.com/a/3qPsfyyI classroom.github. За всеки играч трябва съответно да изкарате общия брой X-ове или броя O-та в цялата дъска, както и дължината на най-дългата последователност от Х-ове или О-та в един реда на дъската (примерно за първия играч, търсим реда с най-много последователни X-ове, и изкарваме тяхната бройка). -[=Пример:=] +{b Пример:} -:table_2 +:table +:2 |= Вход |= Изход @@ -46,54 +50,55 @@ Emil Petkov: Total - 13, Longest - 4 BoburaBG: Total - 12, Longest - 3 + ### а) без структури -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise0.cpp#L3-L83 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise0.cpp#L3-L83} -.important Решете подточката [=без=] структури, тоест без знания по ООП +.important Решете подточката {b без} структури, тоест без знания по ООП -Имплементирайте [=функция=] [`boardCounts`], която приема дъската и връща по някакъв начин нужните бройки: общ брой X-ове, общ брой O-та, брой X-ове в най-дългата последователност от X-ове в ред, брой O-та в най-дългата последователност от O-та в ред. +Имплементирайте {b функция} {` boardCounts}, която приема дъската и връща по някакъв начин нужните бройки: общ брой X-ове, общ брой O-та, брой X-ове в най-дългата последователност от X-ове в ред, брой O-та в най-дългата последователност от O-та в ред. -След това имплементирайте фукция [`printResult`], която приема имената на двата играча, както и бройките, върнати от [`boardCounts`], и изкарва на екрана съобщенията във формата от примера. +След това имплементирайте фукция {` printResult}, която приема имената на двата играча, както и бройките, върнати от {` boardCounts}, и изкарва на екрана съобщенията във формата от примера. ### б) структура за board -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise0.cpp#L85-L166 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise0.cpp#L85-L166} "Слепете" в една съвкупност (структура) указателя към самата дъска за морски шах, както и нейния размер N. -Нека името на структурата да бъде [`GameBoard`]. +Нека името на структурата да бъде {` GameBoard}. -Обновете [`boardCounts`], така че вместо да приема дъската и размера ѝ чрез две променливи, да ги приема чрез една променлива от тип [`GameBoard`]. +Обновете {` boardCounts}, така че вместо да приема дъската и размера ѝ чрез две променливи, да ги приема чрез една променлива от тип {` GameBoard}. ### в) структура за числата -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise0.cpp#L168-L255 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise0.cpp#L168-L255} -"Слепете" в една съвкупност (структура) на име [`BoardCounts`] четирите променливи, които [`boardCounts`] връща. +"Слепете" в една съвкупност (структура) на име {` BoardCounts} четирите променливи, които {` boardCounts} връща. -Обновете [`boardCounts`] да връща една стойност от тип [`BoardCounts`], вместо да връща четирите бройки като отделни числа. -Обновете [`printResult`] да приема стойност от тип [`BoardCounts`], вместо да приема четирите бройки като отделни числа. +Обновете {` boardCounts} да връща една стойност от тип {` BoardCounts}, вместо да връща четирите бройки като отделни числа. +Обновете {` printResult} да приема стойност от тип {` BoardCounts}, вместо да приема четирите бройки като отделни числа. ### г) структура за цялата игра -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise0.cpp#L257-L300 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise0.cpp#L257-L300} -Сега "слепете" предходните две структури, заедно с имената на нашите играчи, в една голяма обща структура за цялата игра на име [`Game`]. -Тоест, всичките ни данни: дъската, бройките и имената на играчите, да се намират в [`Game`]. +Сега "слепете" предходните две структури, заедно с имената на нашите играчи, в една голяма обща структура за цялата игра на име {` Game}. +Тоест, всичките ни данни: дъската, бройките и имената на играчите, да се намират в {` Game}. -.important Искам да [*композирате*], тоест искам да използвате [`GameBoard`] и [`BoardCounts`] структурите в [`Game`] структурата. +.important Искам да {i композирате}, тоест искам да използвате {` GameBoard} и {` BoardCounts} структурите в {` Game} структурата. -Обновете [`boardCounts`] и [`printResult`], така че да използват тази структура. +Обновете {` boardCounts} и {` printResult}, така че да използват тази структура. ## Задача 1 - Основи от материала -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise1.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise1.cpp} Работите върху система за инвентар на книжарница. -.warn Не е задължително, но е препоръчително да си направите и една структура [`String`] с конструктор и деструктор +.warn Не е задължително, но е препоръчително да си направите и една структура {` String} с конструктор и деструктор -Създайте структура [`Book`] със скрити (private) данни за: +Създайте структура {` Book} със скрити (private) данни за: .bulleted - заглавие, като един низ - автори, като масив от низове @@ -108,60 +113,60 @@ Set-ърите трябва да записват стойности в данн - годината на публикация не може да надвишава 2024, не може да е по-малка от -2100 (2100 п.н.е.) и не може да бъде нула - цената не може да е отрицателна -Всеки от мутаторите трябва да връща булева стойност, [`true`] ако проверките са изпълнени (и запазването на данни е извършено) и [`false`] ако съответната проверка не е изпълнена (и няма промяна в данните). +Всеки от мутаторите трябва да връща булева стойност, {` true} ако проверките са изпълнени (и запазването на данни е извършено) и {` false} ако съответната проверка не е изпълнена (и няма промяна в данните). Създайте съответните конструктори и деструктори. -След това направете структура [`Library`], която държи масив от книги и бройката за всяка книга (отново като скрити данни). +След това направете структура {` Library}, която държи масив от книги и бройката за всяка книга (отново като скрити данни). Най-лесния вариант е да имате втори масив, като за всеки индекс в масива с книги, на същия индекс в масива за бройки се намира съответната бройка. -Можете и да го направите чрез структура [`Pair`] и да имате един масив. +Можете и да го направите чрез структура {` Pair} и да имате един масив. -Като публични методи на [`Library`] имплементирайте [`AddBook`], която вмъква нова книга в масива, и [`RemoveBook`] която съответно "премахва" книга по заглавие и година. -Допълнително направете член-функция [`StockBook`], която приема заглавие на книга, годината ѝ, и цяло число с което наличната бройка се увеличава. -Аналогично направете и [`SellBook`]. +Като публични методи на {` Library} имплементирайте {` AddBook}, която вмъква нова книга в масива, и {` RemoveBook} която съответно "премахва" книга по заглавие и година. +Допълнително направете член-функция {` StockBook}, която приема заглавие на книга, годината ѝ, и цяло число с което наличната бройка се увеличава. +Аналогично направете и {` SellBook}. За всики тези методи трябва да имате съответните проверки: .bulleted -- ако напълно идентична книга вече съществува, [`AddBook`] не трябва да я добавя на ново -- [`RemoveBook`] не трябва да "гърми" ако книгата не съществува -- бройката на добавени/продадени книги, подадени на [`SellBook`] и [`StockBook`], трябва да бъдат положителни, както и книгите да съществуват +- ако напълно идентична книга вече съществува, {` AddBook} не трябва да я добавя на ново +- {` RemoveBook} не трябва да "гърми" ако книгата не съществува +- бройката на добавени/продадени книги, подадени на {` SellBook} и {` StockBook}, трябва да бъдат положителни, както и книгите да съществуват -Аналогично като при [`Book`], тези функции трябва да връщат булева стойност, дали проверките са изпълнени. +Аналогично като при {` Book}, тези функции трябва да връщат булева стойност, дали проверките са изпълнени. Не забравяйте за конструктор и деструктор! .question Можете ли да си улесните работата, ако използвате скрити член-функции? -Не е нужно да правите потребителски вход/изход, но тествайте ръчно кода си в [`main`]. +Не е нужно да правите потребителски вход/изход, но тествайте ръчно кода си в {` main}. ## Задача 2 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise2.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise2.cpp} Работите върху система за Excel-ски таблици. Една клетка може да съдържа някаква числена стойност, или проста формула която определя тази стойност. -Създайте структура [`Cell`], която запазва (скрито) целочислена стойност, знак, който определя опреацията във формулата, и два указателя на [`Cell`] към двете страни на оператора. -Оператора (знака) може да бъде [`+`], [`-`], [`*`] или [`/`]. +Създайте структура {` Cell}, която запазва (скрито) целочислена стойност, знак, който определя опреацията във формулата, и два указателя на {` Cell} към двете страни на оператора. +Оператора (знака) може да бъде {` +}, {` -}, {` *} или {` /}. Идеята е, че ако клетката само запазва стойност, тогава оператора ще бъде нещо празно (терминираща нула например). Обаче ако се определя от формула, тогава оператора и указателите също ще са попълнени, а запазената стойност ще действа като кеш, тоест вместо всеки път да преизчисляваме стойността когато я искаме, преизчислили сме я веднъж и я запазваме. -За тази цел имплементирайте публична член-функция [`evaluate`], ако не е запазена формула, тя не прави нищо, ако е, прави съответното изчисление и запазва резултата. -Разбира се, направете и мутатори [`setValue`] и [`setFormula`], със съответните проверки. +За тази цел имплементирайте публична член-функция {` evaluate}, ако не е запазена формула, тя не прави нищо, ако е, прави съответното изчисление и запазва резултата. +Разбира се, направете и мутатори {` setValue} и {` setFormula}, със съответните проверки. Не забравяйте за конструктор и деструктор. -Сега направете структура [`Table`], която пази (скрито) двумерен масив от клетки. -Имплементирайте селектор [`getCell`], който връща указател на клетка по координати и мутатор [`setCell`], който приема клетка и координати в масива. +Сега направете структура {` Table}, която пази (скрито) двумерен масив от клетки. +Имплементирайте селектор {` getCell}, който връща указател на клетка по координати и мутатор {` setCell}, който приема клетка и координати в масива. .question Какъв ще е типа на подадената клетка и стойностите в масива? -Направете метод [`updateCell`], чрез която стойностите на клетка по координати могат да бъдат променени, и след това всички клетки в таблицата се преизчисляват. +Направете метод {` updateCell}, чрез която стойностите на клетка по координати могат да бъдат променени, и след това всички клетки в таблицата се преизчисляват. -Последно, имплементирайте и член-функция [`printTable`], която изкарва на екрана цялата таблица, като клетката на индекси 0,0 се намира в горния ляв ъгъл, всички клетки са разделени с [`|`]. +Последно, имплементирайте и член-функция {` printTable}, която изкарва на екрана цялата таблица, като клетката на индекси 0,0 се намира в горния ляв ъгъл, всички клетки са разделени с {` |}. -Не е нужно да правите потребителски вход/изход, но тествайте ръчно кода си в [`main`]. +Не е нужно да правите потребителски вход/изход, но тествайте ръчно кода си в {` main}. ## Задача 3 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise3.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise3.cpp} Изграждате "симулация" за трафик върху секция от магистрала. @@ -185,7 +190,7 @@ Set-ърите трябва да записват стойности в данн Ако една кола успешно "излиза" от участака на магистралата, тоест тя се опитва да се придвижи някъде след края ѝ, зачитаме че успешно е минала пътя и спираме да я разглеждаме. Сами определете как ще изглеждат структурите за колата и магистралата, както и нужните методи. -Имайте предвид, че трябва цялата логика да присъства в тези структури, тоест в [`main`] трябва да присъства само някакъв инициализиращ код. +Имайте предвид, че трябва цялата логика да присъства в тези структури, тоест в {` main} трябва да присъства само някакъв инициализиращ код. .important Не е позволено магистралата да бъде двумерна матрица, координатите на всяка кола се пазят в самата кола. @@ -194,7 +199,7 @@ Set-ърите трябва да записват стойности в данн ## Задача 4 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise4.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise4.cpp} Имате фабрика, цялата ѝ структура се разглежда като един конвейер, тоест като една редица машини, всяка от които приема някакъв материал и връща този материал преобразуван. @@ -207,7 +212,7 @@ Set-ърите трябва да записват стойности в данн Типовете на материалите са отделни стойности от идентификационните номера, тоест като е подаден материал, той се превръща в крайния тип, и трябва да намерите на кой материал точва число е началния тип. Всички тези данни трябва да са скрити, трябва за съответните структури да присъстват конструктори и деструктори. -Допълнително при машините трябва да има член-функция [`convertMaterial`], която получава идентификационен номер на материал и бройка, и връща колко от резултатния материал е успяла да създаде (спрямо ефикасността, закръглена надолу, и дали се нуждае от ремонт по средата на работата). +Допълнително при машините трябва да има член-функция {` convertMaterial}, която получава идентификационен номер на материал и бройка, и връща колко от резултатния материал е успяла да създаде (спрямо ефикасността, закръглена надолу, и дали се нуждае от ремонт по средата на работата). Ще получите данни за всички материали и машини, както и задачи, тоест идентификационни номера на начален и краен материал, както и бройката на началния материал. Трябва да намерите редицата от машини, които ще създадат възможно най-много краен материал. |