Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commite06ed6dcead883a02316f5cebb054a6cb000bd82 (patch)
Author
 Syndamia <kamen@syndamia.com>
2023-10-12 23:21:34 +0300
Committer
 Syndamia <kamen@syndamia.com>
2023-10-12 23:21:34 +0300
Files66cd4e9fcc94636581db2eba1a1cd293f9b10596
syndamia.com-e06ed6dcead883a02316f5cebb054a6cb000bd82.tar
syndamia.com-e06ed6dcead883a02316f5cebb054a6cb000bd82.tar.gz
syndamia.com-e06ed6dcead883a02316f5cebb054a6cb000bd82.zip
Parentf1f2d34e28932486f9f9732be8ffd39b15f93404 (diff)
(te/upp-2023/w2) Added exercises
1 files changed, 231 insertions, 0 deletions
-rw-r--r--src/teaching/upp-2023/week2/index.md231
diff --git a/src/teaching/upp-2023/week2/index.md b/src/teaching/upp-2023/week2/index.md
new file mode 100644
index 0000000..8347345
--- /dev/null
+++ b/src/teaching/upp-2023/week2/index.md
@@ -0,0 +1,231 @@
+# Задачи - УПП, Седмица 2, 13.10.2023
+
+GitHub classroom: [classroom.github.com/a/Bi5dhwW7](https://classroom.github.com/a/Bi5dhwW7)
+
+## **Важни бележки**
+
+1. Не е добре да ползвате `using namespace std;`
+2. Единствената библиотека, която (поне за сега) може да ползвате е `iostream`
+3. За хората с текстови редактори и `gcc`, моля да погледнете в Moodle и да използвате предоставените флагове, най-важния от които е `-std=c++17`
+3. Като си качвате решенията в GitHub classroom, за предпочитане е имената на файловете да свършват на `.cpp`.
+ Отново, не е задължително, но ми улеснява живота.
+
+## Тема: конвертиране
+
+<br>
+
+### Задача 1 - Конвертирания от int
+
+Получавате целочислено число (тип `int`), след това, за всеки тип от следния списък, трябва да изкарате на нов ред текст във формата "Им/експлицитно тип стойност":
+
+- `bool`
+- `long long int`
+- `unsigned int`
+- `char`
+- `short int`
+- `double`
+- `long int`
+- `unsigned char`
+
+Целта е да напишете един низ, който съдържа "Им/експлицитно тип", и след това да изкарате (конвертираната) стойност.
+Не се иска да правите код, който намира тази информация автоматично, всичко това просто си го напишете ръчно (hardcoded).
+
+**Пример**
+&emsp; *Нарочно са показани само първите два реда от изхода*
+
+|Вход|Изход|
+|----|-----|
+|5 |Експлицитно bool 1<br>Имплицитно long long int 5<br>...|
+
+## Тема: Побитови оператори
+
+<br>
+
+### Задача 2 - Mask
+
+Получавате положително цяло число, от него трябва да "запазите" само първите (най-десните) 6 бита и да изкарате получилото се число.
+
+**Примери**
+
+|Вход|Изход|
+|----|-----|
+|5 |5 |
+|200 |72 |
+
+### Задача 3 - Деление и умножение
+
+Получавате положително цяло число `а`, трябва да изкарате две числа (разделени с празно пространство):
+`a` (целочислено) разделено на 16 и `а` умножено по 8.
+**Трябва да използвате побитови оператори за това!**
+
+**Пример**
+
+|Вход|Изход|
+|----|-----|
+|73 |4 584|
+
+### Задача 4 - IP адрес
+
+Разграничаваме устройствата, свързани към интернет, по техния IP адрес.
+Това е едно най-обикновено цяло без-знаково 32-битово число.
+Да се гледа като число не е удобно, заради това (и други причини, които ще учите във втори курс) IP адресът се изписва във формата "a.b.c.d", като a, b, c и d са съответно десетичното представяне на всички осморки битове.
+
+Тоест, един валиден адрес би бил числото "2155905152", което разглеждайки по битове изглежда така:
+
+```
+10000000100000001000000010000000
+```
+
+Разделяйки по осморки битове:
+
+```
+10000000 10000000 10000000 10000000
+```
+
+Всяка като я превърнем в десетично число става:
+
+```
+128 128 128 128
+```
+
+И накрая изкарания резултат трябва да бъде `128.128.128.128`
+
+На входа получавате цяло положително число, трябва да изкарате на екрана как би изглеждало с това представяне, с точките между осморки битове.
+
+**Примери**
+
+|Вход|Изход|
+|----|-----|
+|3831791750|228.100.128.134|
+|240|0.0.0.240|
+|948405232|56.135.131.240|
+
+## Тема: Логически оператори
+
+<br>
+
+### Задача 5 - Дели ли се
+
+От входа получавате две числа: `а` и `n`.
+Трябва да върнете 0 ако `a` не се дели на `n` без остатък, и 1 иначе.
+
+**Упътване:** Булевата стойност `false` се изкарва като 0, а `true` се изкарва като 1, от `std::cout`
+
+**Примери**
+
+|Вход|Изход|
+|----|-----|
+|200 10|1 |
+|91 5 |0 |
+
+
+### Задача 6 - Цифра ли е
+
+Получавате от входа буква, трябва да върнете 0 ако буквата не е цифра и 1 ако е.
+
+**Примери**
+
+|Вход|Изход|
+|----|-----|
+|5 |1 |
+|a |0 |
+|! |0 |
+
+## Тема: Условни конструкции
+
+<br>
+
+### Задача 7 - Нарастващ ред
+
+На входа получавате три целочислени, трябва да ги изкарате в нарастващ ред.
+
+**Пример**
+
+|Вход|Изход|
+|----|-----|
+|5 3 8|3 5 8|
+
+### Задача 8 - Календар
+
+От входа получавате число от 1 до 12: номера на месеца.
+Трябва да изкарате името на месеца, където 1 съответства на "January", 2 на "February" и так. нат.
+Моля използвате `switch` конструкция.
+
+**Примери**
+
+|Вход|Изход|
+|----|-----|
+|1 |January|
+|10 |October|
+
+### Задача 9 - Монети
+
+Получавате число с плаваща запетая, това ще бъде цената на даден продукт в лева.
+Искате да платите използвайки само монети, като целта е да използвате възможно най-големите стойности на монети, възможно най-много (тоест ситуацията в която трябва да носите един милион монети по една стотинка не трябва да е възможност).
+Изкарайте двойки "монета бройка", като работите с монети от по 50 стотинки, 20 стотинки, 10 стотинки, 5 стотинки, 1 стотинка.
+
+**Примери**
+
+|Вход|Изход|
+|----|-----|
+|12.0|0.5 24 0.2 0 0.1 0 0.05 0 0.01 0|
+|3.37|0.5 6 0.2 1 0.1 1 0.05 1 0.01 2|
+
+### Задача 10 - ILS
+
+При кацане, един самолет се нужда от информация дали е точно приравнен със средата на пистата, особено когато видимостта е занижена.
+Една система за тази цел се нарича [ILS](https://www.pilotscafe.com/Understanding-ILS/), но ние ще разгледаме нейния компонент, [the localizer](https://en.wikipedia.org/wiki/Instrument_landing_system_localizer): в края на пистата големи предаватели излъчват различни радио сигнали в двете половини на пистата.
+
+Ефектът е като на стерео тон колони, когато самолетът е в ляво от пистата, той приема сигнала от лявата част на пистата по-силно от този за дясната, както ако си доближиш ухото до лявата тон колона, ти ще чуваш нейния звук по-силно от дясната.
+
+Получавате едно цяло положително число, то ще е във формата "XXXYYY", където "XXX" е три-цифрено число, което съдържа интензитета на сигнала от лявата половина, и аналогично "YYY" е три-цифрено число, което е интензитета от сигнала на дясната половина.
+
+Спрямо техните стойности, трябва да върнете "Turn right" ако самолетът е в ляво от пистата (ако XXX е по-голямо от YYY) и "Turn left" ако самолетът е в дясно.
+Допълнително, понеже не е нужно самолетът да се намира перфектно в средата на пистата, зачитаме че ако разликата между двата интензитета е по-малка от 3, тогава самолетът е правилно подравнен и връщаме "Follow heading".
+
+**Примери**
+
+|Вход|Изход|
+|----|-----|
+|045093|Turn left|
+|100090|Turn right|
+|050053|Follow heading|
+
+### Задача 11 - GPS
+
+*В тази задача има много "теория", иначе самия код е малък и лесен.*
+
+Кондензирайки възможно най-много, ще обясня как работи GPS.
+На земята имаме специални методи, чрез които можем да определим позицията на всеки сателит, обаче обратното, определянето на позицията чрез сателит, става с помощта на супер прецизни часовници и малко математика.
+
+Понеже радио комуникацията е със скоростта на светлината, можем лесно да определим разстояния между сателит и дадена точка, считайки колко време е отнело на сателита да върне отговор (припомням формулата `s = v * t`, или `разстояние = скорост * време`).
+
+Обаче, така получаваме само разстоянието, това не е достатъчно за да определим точната позиция, понеже има много възможни точки на земята, които да са на това разстояние.
+Решението на проблема, е че просто вземаш разстоянието от няколко сателита, твоята позиция се намира в общата точка между всички възможни области.
+
+С други думи, наш приятел ни се обажда, иска да разбере къде се намира.
+Ние знаем на кой адрес се намираме, и приятеля ни знае само, че се намира на 300 метра от нас.
+Този приятел също се е свързал със съседката и е казал, че се намира на 299 метра от нея.
+Нека да нарисуваме два кръга върху една карта, за всички възможни места, където той може да се намира спрямо нашият и на съседката адрес.
+Тези кръгове ще се пресичат, и знаем, че той може да се намира само в някоя от пресечените позиции.
+
+От математика, ако знаем разстоянието на нашия приятел към трети различен човек, трите кръга върху картата ще се пресичат в само една точка, а именно позицията на нашия приятел.
+В три измерения, правим същото, обаче със сфери, и ни трябват четири сателита.
+Понеже математиката в две и три измерения е малко множко, ще разгледаме всичко едноизмерно, в [Lineland](https://en.wikipedia.org/wiki/Flatland).
+
+<br>
+
+Разработваме (сериозно опростена) GPS система, като работим с едноизмерни координати, тоест позицията на всичко се определя с по едно число.
+Изпращаме съобщение към два сателита по едно и също време, и получаваме отговор (какво е съобщението и отговор не е важно, интересува ни само времето).
+Считайки нужното време да получим отговор, намираме разстоянията, от там ще имаме общо 4 възможности, като 2 от тях ще се препокриват и това ще бъде нашата позиция.
+
+От входа получавате число, което е точното време в милисекунди спрямо денонощието, в което сме изпратили съобщение към двата сателита.
+След това получавате още две числа, координата на първия сателит и по кое време в милисекунди спрямо денонощието е получен отговора.
+Накрая получавате още две числа, пак координата и време, но за втория сателит.
+Изкарайте къде се намираме ние, като нека скоростта на светлината да бъде 29 метра в милисекунда.
+
+**Пример**
+
+|Вход|Изход|
+|----|-----|
+|18 -100 20 103 23|-42|