diff options
| Commit | e06ed6dcead883a02316f5cebb054a6cb000bd82 (patch) | |
|---|---|---|
| Author | 2023-10-12 23:21:34 +0300 | |
| Committer | 2023-10-12 23:21:34 +0300 | |
| Files | 66cd4e9fcc94636581db2eba1a1cd293f9b10596 | |
| syndamia.com-e06ed6dcead883a02316f5cebb054a6cb000bd82.tar syndamia.com-e06ed6dcead883a02316f5cebb054a6cb000bd82.tar.gz syndamia.com-e06ed6dcead883a02316f5cebb054a6cb000bd82.zip | ||
| Parent | f1f2d34e28932486f9f9732be8ffd39b15f93404 (diff) | |
(te/upp-2023/w2) Added exercises
1 files changed, 231 insertions, 0 deletions
| -rw-r--r-- | src/teaching/upp-2023/week2/index.md | 231 |
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). + +**Пример** +  *Нарочно са показани само първите два реда от изхода* + +|Вход|Изход| +|----|-----| +|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| |