Summary Files Commits Branches @commit @diff @stats
path: root / src / teaching / upp-2023 / week3 / index.du
diff options
context:
space:
mode:
1 files changed, 103 insertions, 67 deletions
-rw-r--r--src/teaching/upp-2023/week3/index.du170
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
|= Вход
|= Изход