diff options
1 files changed, 48 insertions, 33 deletions
| -rw-r--r-- | src/teaching/upp-2023/week12/index.du | 81 |
diff --git a/src/teaching/upp-2023/week12/index.du b/src/teaching/upp-2023/week12/index.du index 3fa25ff..c54114c 100644 --- a/src/teaching/upp-2023/week12/index.du +++ b/src/teaching/upp-2023/week12/index.du @@ -1,14 +1,17 @@ -# Задачи - УПП, Седмица 12, 05.01.2024 +'def title Задачи - УПП, Седмица 12, 05.01.2024 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/KEDSxDjl classroom.github.com/a/KEDSxDjl] +GitHub classroom: {url classroom.github.com/a/KEDSxDjl;https://classroom.github.com/a/KEDSxDjl} -.important Във всички задачи [=трябва=] да използвате рекурсия! +.important Във всички задачи {b трябва} да използвате рекурсия! ## Алтернативни задачи -Считайте [url https://github.com/ivanahristova/introduction-to-programming-2023-2024/tree/main/sem12 задачите от семинара] и [url ../week11/ тези от миналия път] като част от днешните задачи. +Считайте {url задачите от семинара;https://github.com/ivanahristova/introduction-to-programming-2023-2024/tree/main/sem12} и {url тези от миналия път;../week11/} като част от днешните задачи. Тоест, за хората които се затрудняват повечко, решете ги и след това се върнете тук. Разбира се, ще помагам и с тях. @@ -21,9 +24,10 @@ GitHub classroom: [url https://classroom.github.com/a/KEDSxDjl classroom.github. Накрая получавате максималната обща тежест за раницата. Трябва да изкарате на екрана максималната възможна обща ценност. -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход @@ -62,11 +66,12 @@ GitHub classroom: [url https://classroom.github.com/a/KEDSxDjl classroom.github. .comment https://people.sc.fsu.edu/~jburkardt/datasets/knapsack_01/knapsack_01.html + ## Задача 2 Получавате N и M, съответно броя редове и колони в дъска. Всяка клетка от дъската е пълна или празна. -След това получавате NxM на брой символа за всяка клетка, като [`-`] означава празна клетка, докато [`#`] означава пълна. +След това получавате NxM на брой символа за всяка клетка, като {` -} означава празна клетка, докато {` #} означава пълна. Накрая получавате две числа - координати (започващи от нула, като 0,0 е горния-ляв ъгъл) в дъската. От подадените координати трябва да запълните "фигурата" в която се намира (фигурата която огражда) дадената плочка. @@ -74,31 +79,37 @@ GitHub classroom: [url https://classroom.github.com/a/KEDSxDjl classroom.github. Оцветяването да се случва само в 4те прави посоки (без диагонали). -[image https://upload.wikimedia.org/wikipedia/commons/7/7e/Recursive_Flood_Fill_4_%28aka%29.gif] +{img https://upload.wikimedia.org/wikipedia/commons/7/7e/Recursive_Flood_Fill_4_%28aka%29.gif} -[=Пример:=] +{b Пример:} -:table_2 +:table +:2 |= Вход |= Изход |: ``` +'emplace 5 11 - - # # - - - - - - - - # - - # - - - - - - -\# - - - - # # # # # # +# - - - - # # # # # # - # - - # - - - # - # - - # # - - - - - - - 2 2 +'endemplace |: ``` +'emplace - - # # - - - - - - - - # # # # - - - - - - -\# # # # # # # # # # # +# # # # # # # # # # # - # # # # - - - # - # - - # # - - - - - - - +'endemplace + ## Задача 3 @@ -109,14 +120,15 @@ GitHub classroom: [url https://classroom.github.com/a/KEDSxDjl classroom.github. Интересуваме се от такова поставяне на всички царици, че нито една няма да вземе никоя друга царица в един ход. Пример: -[image https://upload.wikimedia.org/wikipedia/commons/6/69/Solution_A_for_8_Queen_Puzzles.png] +{img https://upload.wikimedia.org/wikipedia/commons/6/69/Solution_A_for_8_Queen_Puzzles.png} Напишете програма, която намира броя на възможните такива поставяния на цариците. От входа не получавате нищо. -[=Пример:=] +{b Пример:} -:table_2 +:table +:2 |= Вход |= Изход @@ -124,45 +136,47 @@ GitHub classroom: [url https://classroom.github.com/a/KEDSxDjl classroom.github. |: 92 -[=Бонус:=] направете програмата да изкарва всяко решение + +{b Бонус:} направете програмата да изкарва всяко решение ## Задача 4 .comment https://mathcenter.oxford.emory.edu/site/cs171/probSetUsingStacks/ -Нормално ние представяме математически операции чрез "инфиксен" запис, тоест операторът е по средата, между нещата върху които работи (пример: [`1 + 2`]). -Обаче, това не е задължително, по обратната полска нотация винаги слагаме оператът след нещата върху които работи (пример: [`1 2 +`]). +Нормално ние представяме математически операции чрез "инфиксен" запис, тоест операторът е по средата, между нещата върху които работи (пример: {` 1 + 2}). +Обаче, това не е задължително, по обратната полска нотация винаги слагаме оператът след нещата върху които работи (пример: {` 1 2 +}). Бонусът на това, е че не ни трябва скобуване и ред на операциите. -В инфиксния израз [`(2 + 3) * (2 ^^ 2)`], без скобите, сбора ще се извърши след умножението и степенуването ще се извърши след умножението. -Обаче, ако искаме да изразим това в обратен полски запис, просто правим [`2 3 + 2 2 ^^ *`]. -А ако искаме оригиналното действие, без скоби, записваме [`2 3 2 * 2 ^^ +`]. +В инфиксния израз {` (2 + 3) * (2 ^^ 2)}, без скобите, сбора ще се извърши след умножението и степенуването ще се извърши след умножението. +Обаче, ако искаме да изразим това в обратен полски запис, просто правим {` 2 3 + 2 2 ^^ *}. +А ако искаме оригиналното действие, без скоби, записваме {` 2 3 2 * 2 ^^ +}. Ако изглежда объркващо, идеята е че всеки оператор работи върху предходните две стойности, изчисляваме изразите от ляво надясно и заместваме веднага. -Тоест, при последния пример, пропускаме първите три числа, стигаме до [`*`], умножаваме последните две и заместваме трите неща ([`3 2 *`]) с резултата, следователно имаме [`2 6 2 ^^ +`], пропускаме две, стигаме до [`^^`] и так.нат. +Тоест, при последния пример, пропускаме първите три числа, стигаме до {` *}, умножаваме последните две и заместваме трите неща ({` 3 2 *}) с резултата, следователно имаме {` 2 6 2 ^^ +}, пропускаме две, стигаме до {` ^^} и так.нат. -Направете програма, която чисто рекурсивно изчислиява изрази в обратен полски запис, който поддържа цели числа и операциите събиране, умножение, деление, изваждане и степенуване (за степенуване ще използваме знакът [`^`]). +Направете програма, която чисто рекурсивно изчислиява изрази в обратен полски запис, който поддържа цели числа и операциите събиране, умножение, деление, изваждане и степенуване (за степенуване ще използваме знакът {` ^}). .important Обаче, за едно извикване на рекурсивната функция, може да пазите само един елемент на израза (число или оператор)! -Изразът винаги завършва на знака [`$`]. +Изразът винаги завършва на знака {` $}. :warn .p -Относно вход/изход, понеже няма как да знаем дали i-тата стойност е число или знак (операция), трябва да използваме функцията [`std::cin.fail()`], която връща булева стойност, която ни казва дали записването на входа е било успешно. +Относно вход/изход, понеже няма как да знаем дали i-тата стойност е число или знак (операция), трябва да използваме функцията {` std::cin.fail()}, която връща булева стойност, която ни казва дали записването на входа е било успешно. .p -Тоест, може винаги да запазвате входа в целочислен тип, когато стигнете до знак [`std::cin.fail()`] ще върне [`true`]. -След това трябва да "забравите" за грешката чрез [`std::cin.clear()`] и може втори път да запазите входа (провалените данни ще се препрочетат) в променлива от знаков тип. +Тоест, може винаги да запазвате входа в целочислен тип, когато стигнете до знак {` std::cin.fail()} ще върне {` true}. +След това трябва да "забравите" за грешката чрез {` std::cin.clear()} и може втори път да запазите входа (провалените данни ще се препрочетат) в променлива от знаков тип. .p -Но това поражда друг проблем, понеже записваме в целочислен тип, когато въведем [`+`] или [`-`], [`std::cin`] ще очаква това да е водещ знак на число, и ще продължи да чака входа докато не въведем друг знак, тоест [`+`] и [`-`] ще бъдат пропуснати. -Като компромисен вариант, просто пред тях винаги ще слагаме [`'`] и в кода ще го пропускаме. +Но това поражда друг проблем, понеже записваме в целочислен тип, когато въведем {` +} или {` -}, {` std::cin} ще очаква това да е водещ знак на число, и ще продължи да чака входа докато не въведем друг знак, тоест {` +} и {` -} ще бъдат пропуснати. +Като компромисен вариант, просто пред тях винаги ще слагаме {` '} и в кода ще го пропускаме. -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход @@ -173,8 +187,9 @@ GitHub classroom: [url https://classroom.github.com/a/KEDSxDjl classroom.github. |: 35 + ## Attribution .bulleted -- Анимация в [url #2 Задача 2] от André Karwath (Aka) на [url https://commons.wikimedia.org/w/index.php?curid=481651 Уикипедия] под лиценз CC BY-SA 2.5 -- Изображение на шахматна дъска в [url #3 Задача 3] от Encik Tekateki в [url https://commons.wikimedia.org/w/index.php?curid=77832290 Уикипедия] под лиценз CC BY-SA 4.0 +- Анимация в {url Задача 2;#2} от André Karwath (Aka) на {url Уикипедия;https://commons.wikimedia.org/w/index.php?curid=481651} под лиценз CC BY-SA 2.5 +- Изображение на шахматна дъска в {url Задача 3;#3} от Encik Tekateki в {url Уикипедия;https://commons.wikimedia.org/w/index.php?curid=77832290} под лиценз CC BY-SA 4.0 |