diff options
1 files changed, 103 insertions, 67 deletions
| -rw-r--r-- | src/teaching/upp-2023/week3/index.du | 170 |
diff --git a/src/teaching/upp-2023/week3/index.du b/src/teaching/upp-2023/week3/index.du index 1b0f213..7669ca0 100644 --- a/src/teaching/upp-2023/week3/index.du +++ b/src/teaching/upp-2023/week3/index.du @@ -1,8 +1,11 @@ -# Задачи - УПП, Седмица 3, 20.10.2023 +'def title Задачи - УПП, Седмица 3, 20.10.2023 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/JgMSXuCf classroom.github.com/a/JgMSXuCf] +GitHub classroom: {url classroom.github.com/a/JgMSXuCf;https://classroom.github.com/a/JgMSXuCf} ## Тема: цикли @@ -10,11 +13,12 @@ GitHub classroom: [url https://classroom.github.com/a/JgMSXuCf classroom.github. ### Задача 1 - Степенуване -Получавате цяло число [`x`] и цяло положително число [`n`], трябва да върнете [`x`] на степен [`n`]-та. +Получавате цяло число {` x} и цяло положително число {` n}, трябва да върнете {` x} на степен {` n}-та. -[=Примери=] +{b Примери} -:table_2 +:table +:2 |= Вход |= Изход @@ -28,92 +32,112 @@ GitHub classroom: [url https://classroom.github.com/a/JgMSXuCf classroom.github. |: 4 + ### Задача 2 - Progress bar -Получавате цяло число [`x`], което е по-голямо или равно на 1, и на всеки ред трябва да изкарате един "progress bar", чиято дължина се увеличава с всеки изминал ред. -На практика, този "progress bar" трябва да бъде една права, съставена от знакът [`#`], която трябва с всеки изминал ред да се удължава с един знак. -В началото прогресът е 1 и продължава до [`x`] включително. +Получавате цяло число {` x}, което е по-голямо или равно на 1, и на всеки ред трябва да изкарате един "progress bar", чиято дължина се увеличава с всеки изминал ред. +На практика, този "progress bar" трябва да бъде една права, съставена от знакът {` #}, която трябва с всеки изминал ред да се удължава с един знак. +В началото прогресът е 1 и продължава до {` x} включително. -[=Примери=] +{b Примери} -:table_2 +:table +:2 |= Вход |= Изход |: 3 |: ``` +'emplace # ## ### +'endemplace |: 5 |: ``` +'emplace # ## ### #### ##### +'endemplace + #### Бонус -Направете дължината на този progress bar фиксирана на 10 знака, и въведеното [`x`] да определя след колко реда трябва да запълним progress bar-а. +Направете дължината на този progress bar фиксирана на 10 знака, и въведеното {` x} да определя след колко реда трябва да запълним progress bar-а. Този път, прогресът започва от 0. -[=Примери=] +{b Примери} -:table_2 +:table +:2 |= Вход |= Изход |: 1 |: ``` +'emplace ########## +'endemplace |: 2 |: ``` +'emplace ##### ########## +'endemplace |: 3 |: ``` +'emplace ### ###### ########## +'endemplace |: 10 |: ``` +'emplace # ## ### -[*...*] +'endemplace +{i ...} |: 20 |: ``` +'emplace # # ## ## ### -[*...*] +'endemplace +{i ...} + ### Задача 3 - Endless program with an end От входа получавате букви, не се знае колко. На нов ред, за всяка буква, трябва да върнете "letter" ако е латинска буква, "digit" ако е цифра и "other" ако не е нито едно от двете. -Обаче, буквата [`^`] има специално значение, когато я получим трябва програмата да свърши изпълнение. +Обаче, буквата {` ^} има специално значение, когато я получим трябва програмата да свърши изпълнение. -[=Примери=] +{b Примери} -:table_2 +:table +:2 |= Вход |= Изход @@ -126,17 +150,19 @@ other letter + ### Задача 4 - Premature end -Ще получите максимум 10 цели числа, трябва (целочислено) да разделите числото [`65536`] на всяко от въведените числа. +Ще получите максимум 10 цели числа, трябва (целочислено) да разделите числото {` 65536} на всяко от въведените числа. Но, когато получите числото 0, веднага трябва да спрете вземане на числа от входа. Финално, изкарайте резултата от всички тези деления. -[=Упътване:=] Използвайте [`break`]. +{b Упътване:} Използвайте {` break}. -[=Примери=] +{b Примери} -:table_2 +:table +:2 |= Вход |= Изход @@ -156,19 +182,20 @@ letter Получавате букви, незнайно колко. Трябва да броите колко от тях са малки букви, колко са главни и колко са цифри. -В момента в който получите [`$`] трябва да спрете приемане на букви и да изкарате +В момента в който получите {` $} трябва да спрете приемане на букви и да изкарате ``` Lowercase: X Uppercase: Y Digit: Z където X, Y и Z са съответните бройки. -Обаче, ако получите буква, която не е малка, главна, цифра или [`$`], трябва моментално да спрете изпълнението на програмата, без да отпечатвате нищо. +Обаче, ако получите буква, която не е малка, главна, цифра или {` $}, трябва моментално да спрете изпълнението на програмата, без да отпечатвате нищо. -[=Упътване:=] Използвайте [`return`]. +{b Упътване:} Използвайте {` return}. -[=Примери=] +{b Примери} -:table_2 +:table +:2 |= Вход |= Изход @@ -179,28 +206,30 @@ Lowercase: X Uppercase: Y Digit: Z |: + ### Задача 6 - Глупави сметки От входа получавате букви, това ще са "команди", като при всяка буква трябва да направите различно действие: .bulleted -- [`s`]: след като я получите, трябва да вземете цяло число от входа и да го запазите (първоначалната стойност на числото е 15) -- [`l`]: трябва побитово да отместите наляво запазеното число с един бит -- [`r`]: трябва побитово да отместите надясно запазеното число с един бит -- [`q`]: трябва да запазите сегашното число на втора степен -- [`c`]: трябва да запазите сегашното число на трета степен -- [`m`]: трябва да запазите сегашното число минус 351 -- [`p`]: трябва да запазите сегашното число плюс 94 -- [`&`]: прекратявате програмата +- {` s}: след като я получите, трябва да вземете цяло число от входа и да го запазите (първоначалната стойност на числото е 15) +- {` l}: трябва побитово да отместите наляво запазеното число с един бит +- {` r}: трябва побитово да отместите надясно запазеното число с един бит +- {` q}: трябва да запазите сегашното число на втора степен +- {` c}: трябва да запазите сегашното число на трета степен +- {` m}: трябва да запазите сегашното число минус 351 +- {` p}: трябва да запазите сегашното число плюс 94 +- {` &}: прекратявате програмата След всяка операция трябва да изкарате сегашната стойност на числото. -Обаче, ако се въведе буква, за която няма дефинирана операция (не е команда) трябва да изкарате "Invalid command!" и да [=не=] изкарвате сегашната стойност на числото. +Обаче, ако се въведе буква, за която няма дефинирана операция (не е команда) трябва да изкарате "Invalid command!" и да {b не} изкарвате сегашната стойност на числото. -[=Упътване:=] Използвайте [`switch`], [`default`] и [`continue`]. +{b Упътване:} Използвайте {` switch}, {` default} и {` continue}. -[=Примери=] +{b Примери} -:table_2 +:table +:2 |= Вход |= Изход @@ -224,6 +253,7 @@ Invalid command! 1 + ### Задача 7 - Безсмислена "тивност" Получавате от входа число с плаваща запетая. @@ -232,11 +262,12 @@ Invalid command! Първоначалната стойност на числото е 3.14159 и трябва в началото да изкарате "Positive". -[=Упътване:=] Използвайте [`do-while`]. +{b Упътване:} Използвайте {` do-while}. -[=Примери=] +{b Примери} -:table_2 +:table +:2 |= Вход |= Изход @@ -255,23 +286,24 @@ Negative Получавате букви (команди), като на всяка трябва да извършите някакво действие: :bulleted -- [`t`] - увеличавате минутите с единица (не забравяйте, че ако времето е било "0:59", трябва да стане "1:00") и изкарвате сегашното време -- [`c`] - в зависимост от предишни натискания, прави различни неща: +- {` t} - увеличавате минутите с единица (не забравяйте, че ако времето е било "0:59", трябва да стане "1:00") и изкарвате сегашното време +- {` c} - в зависимост от предишни натискания, прави различни неща: .bulleted - ако преди не е натиснат, влизаме в режим на промяна на часовете, от входа приемаме число което ще бъде новия час и изкарваме сегашното време - ако вече е натиснат, влизаме в режим на минутите, от входа приемаме число, което ще бъде новата стойност на минутите и изкарваме сегашното време - ако вече два пъти е бил натиснат, излизаме от режима - - ако сме в някой от първите два режима и получим [`t`] преди да излезем, не увеличаваме минутите + - ако сме в някой от първите два режима и получим {` t} преди да излезем, не увеличаваме минутите -- [`f`] - променяме изкараното време от 12 часов формат на 24 часов и обратно, като първоначално започваме с 24 часов, и изкарваме сегашното време +- {` f} - променяме изкараното време от 12 часов формат на 24 часов и обратно, като първоначално започваме с 24 часов, и изкарваме сегашното време .bulleted - - При 24 часов формат изкарваме "XX:YY", където [`XX`] е часа и [`YY`] са минутите + - При 24 часов формат изкарваме "XX:YY", където {` XX} е часа и {` YY} са минутите - При 12 часов формат е почти същото "XX:YY ZM" където ZM е PM или AM -[=Примери=] +{b Примери} -:table_2 +:table +:2 |= Вход |= Изход @@ -286,6 +318,7 @@ Negative 7:3 PM + ### Задача 9 - BASIC maze Това е една популярна тестова програма на (много стари) компютри, които са идвали с интерпретатор на езика BASIC: @@ -293,9 +326,9 @@ Negative ``` 10 PRINT CHR$(205.5+RND(1));:GOTO 10 -Задачата е да я пресъздадем, тоест на 20 реда трябва да има по 20 букви, като всяка буква е, на случаен принцип, [`/`] или [`\\`] . +Задачата е да я пресъздадем, тоест на 20 реда трябва да има по 20 букви, като всяка буква е, на случаен принцип, {` /} или {` \\} . -[=Упътване:=] Формално никога не се преподават или изискват случайни стойности, затова ги показвам сега: +{b Упътване:} Формално никога не се преподават или изискват случайни стойности, затова ги показвам сега: Най-отгоре на сорс-файла добавете нужната библиотека: @@ -303,21 +336,21 @@ Negative #include <stdlib.h> #include <ctime> -След това, в [`main`], преди да използвате случайни стойности, трябва да "инициализираме системата": +След това, в {` main}, преди да използвате случайни стойности, трябва да "инициализираме системата": ```cpp srand(time(NULL)); -С функцията [`rand()`] получавате случайна положителна стойност, може да я ограничите до две стойности с модулно деление, [`rand() % 2`]. +С функцията {` rand()} получавате случайна положителна стойност, може да я ограничите до две стойности с модулно деление, {` rand() % 2}. -[=Примерен изход=] [*Нямаме вход, вашия изход няма да изглежда напълно еднакъв*] +{b Примерен изход} {i Нямаме вход, вашия изход няма да изглежда напълно еднакъв} ``` -'include ./example_maze.txt +'snippet 1 $ ./example_maze.txt ### Задача 10 - Елка -[*Решението на тази задача е по-дълго!*] +{i Решението на тази задача е по-дълго!} Сега имплементирате кода на една елка. Елката запазва две числа, първото е "сегашното" число с което правим нормалните операции и "виждаме" на екрана, и второто е отделна памет, в която можем да добавяме и изваждаме числа. @@ -328,16 +361,17 @@ srand(time(NULL)); Буквата е команда, като може да бъде +,-,\*,/, които са обикновените операции с които променяме сегашното число, докато: .bulleted -- [`a`] - добавя сегашното число в отделната памет -- [`s`] - изважда сегашното число от тази памет -- [`c`] - занулява сегашното число -- [`m`] - занулява числото в отделната памет +- {` a} - добавя сегашното число в отделната памет +- {` s} - изважда сегашното число от тази памет +- {` c} - занулява сегашното число +- {` m} - занулява числото в отделната памет -След [`a`], [`s`] и [`m`] трябва да изкарате числото в отделната памет, докато след всички други команди трябва да изкарате сегашното число. +След {` a}, {` s} и {` m} трябва да изкарате числото в отделната памет, докато след всички други команди трябва да изкарате сегашното число. -[=Примери=] +{b Примери} -:table_2 +:table +:2 |= Вход |= Изход @@ -352,6 +386,7 @@ srand(time(NULL)); 0 + ## Тема: assert \n @@ -363,7 +398,7 @@ srand(time(NULL)); ``` int parseSensor(int s) { return ((((s=(s>>1)&(~0xF617A100))<0x54)?s|0xF01:s&0xCBFF)>>2)-21; } -Все още не сме учили функции, затова просто пльоснете горното нещо във вашия сорс код, [*над*] [`int main()`] и [*в*] [`main`] може да я използвате чрез [`parseSensor(inputValue)`]. +Все още не сме учили функции, затова просто пльоснете горното нещо във вашия сорс код, {i над} {` int main()} и {i в} {` main} може да я използвате чрез {` parseSensor(inputValue)}. Вашата задача е при определени градуси да връщате съобщение на екрана: @@ -376,7 +411,7 @@ int parseSensor(int s) { return ((((s=(s>>1)&(~0xF617A100))<0x54)?s|0xF01:s&0xCB Обаче, това не е всичко. Поглеждате функцията на вашия колега и не сте уверени в нея, обаче нямате документацията за обработка на входа. -Единственото нещо, което знаете, е че стойностите от функцията не трябва да са извън обхвата -20 и 40, затова използвайте [`assert`] и проверете/тествайте дали това винаги е вярно. +Единственото нещо, което знаете, е че стойностите от функцията не трябва да са извън обхвата -20 и 40, затова използвайте {` assert} и проверете/тествайте дали това винаги е вярно. Ето стойности с които може да тествате: @@ -391,9 +426,10 @@ int parseSensor(int s) { return ((((s=(s>>1)&(~0xF617A100))<0x54)?s|0xF01:s&0xCB На кои стойности функцията на колегата не работи? -[=Примери=] [*Входът е различен от горепосочените стойности (и при него функцията работи коректно)*] +{b Примери} {i Входът е различен от горепосочените стойности (и при него функцията работи коректно)} -:table_2 +:table +:2 |= Вход |= Изход |