'def title Задачи - УПП, Седмица 2, 13.10.2023 'def desc Условия на задачите за упражнение # {title} \n GitHub classroom: {url classroom.github.com/a/Bi5dhwW7;https://classroom.github.com/a/Bi5dhwW7} Решения: {url GitHub;https://github.com/Syndamia/upp-2023-solutions/tree/main/week02} ## {b Важни бележки} .numbered 1. Не е добре да ползвате {` using namespace std;} 2. Единствената библиотека, която (поне за сега) може да ползвате е {` iostream} 3. За хората с текстови редактори и {` gcc}, моля да погледнете в Moodle и да използвате предоставените флагове, най-важния от които е {` -std=c++17} 3. Като си качвате решенията в GitHub classroom, за предпочитане е имената на файловете да свършват на {` .cpp}. Отново, не е задължително, но ми улеснява живота. ## Тема: конвертиране \n ### Задача 1 - Конвертирания от int Получавате целочислено число (тип {` int}), след това, за всеки тип от следния списък, трябва да изкарате на нов ред текст във формата "Със/без загуба тип стойност": .bulleted - {` bool} - {` long long int} - {` unsigned int} - {` char} - {` short int} - {` double} - {` long int} - {` unsigned char} Целта е да напишете един низ, който съдържа "Със/без загуба тип", и след това да изкарате (конвертираната) стойност. Не се иска да правите код, който намира тази информация автоматично, всичко това просто си го напишете ръчно (hardcoded). {b Пример}   {i Нарочно са показани само първите два реда от изхода} :table :2 |= Вход |= Изход |: 5 |: Със загуба bool 1\nБез загуба long long int 5\n... ## Тема: Побитови оператори \n ### Задача 2 - Mask Получавате положително цяло число, от него трябва да "запазите" само първите (най-десните) 6 бита и да изкарате получилото се число. {b Примери} :table :2 |= Вход |= Изход |: 5 |: 5 |: 200 |: 8 ### Задача 3 - Деление и умножение Получавате положително цяло число {` а}, трябва да изкарате две числа (разделени с празно пространство):\n {` a} (целочислено) разделено на 16 и {` а} умножено по 8. {b Трябва да използвате побитови оператори за това!} {b Пример} :table :2 |= Вход |= Изход |: 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} На входа получавате цяло положително число, трябва да изкарате на екрана как би изглеждало с това представяне, с точките между осморки битове. {b Примери} :table :2 |= Вход |= Изход |: 3831791750 |: 228.100.128.134 |: 240 |: 0.0.0.240 |: 948405232 |: 56.135.131.240 ## Тема: Логически оператори \n ### Задача 5 - Дели ли се От входа получавате две числа: {` а} и {` n}. Трябва да върнете 0 ако {` a} не се дели на {` n} без остатък, и 1 иначе. {b Упътване:} Булевата стойност {` false} се изкарва като 0, а {` true} се изкарва като 1, от {` std::cout} {b Примери} :table :2 |= Вход |= Изход |: 200 10 |: 1 |: 91 5 |: 0 ### Задача 6 - Цифра ли е Получавате от входа буква, трябва да върнете 0 ако буквата не е цифра и 1 ако е. {b Примери} :table :2 |= Вход |= Изход |: 5 |: 1 |: a |: 0 |: ! |: 0 ## Тема: Условни конструкции \n ### Задача 7 - Нарастващ ред На входа получавате три целочислени, трябва да ги изкарате в нарастващ ред. {b Пример} :table :2 |= Вход |= Изход |: 5 3 8 |: 3 5 8 ### Задача 8 - Календар От входа получавате число от 1 до 12: номера на месеца. Трябва да изкарате името на месеца, където 1 съответства на "January", 2 на "February" и так. нат. Моля използвате {` switch} конструкция. {b Примери} :table :2 |= Вход |= Изход |: 1 |: January |: 10 |: October ### Задача 9 - Монети Получавате число с плаваща запетая, това ще бъде цената на даден продукт в лева. Искате да платите използвайки само монети, като целта е да използвате възможно най-големите стойности на монети, възможно най-много (тоест ситуацията в която трябва да носите един милион монети по една стотинка не трябва да е възможност). Изкарайте двойки "монета бройка", като работите с монети от по 50 стотинки, 20 стотинки, 10 стотинки, 5 стотинки, 1 стотинка. {b Примери} :table :2 |= Вход |= Изход |: 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 При кацане, един самолет се нужда от информация дали е точно приравнен със средата на пистата, особено когато видимостта е занижена. Една система за тази цел се нарича {url ILS;https://www.pilotscafe.com/Understanding-ILS/}, но ние ще разгледаме нейния компонент, {url the localizer;https://en.wikipedia.org/wiki/Instrument_landing_system_localizer}: в края на пистата големи предаватели излъчват различни радио сигнали в двете половини на пистата. Ефектът е като на стерео тон колони, когато самолетът е в ляво от пистата, той приема сигнала от лявата част на пистата по-силно от този за дясната, както ако си доближиш ухото до лявата тон колона, ти ще чуваш нейния звук по-силно от дясната. Получавате едно цяло положително число, то ще е във формата "XXXYYY", където "XXX" е три-цифрено число, което съдържа интензитета на сигнала от лявата половина, и аналогично "YYY" е три-цифрено число, което е интензитета от сигнала на дясната половина. Спрямо техните стойности, трябва да върнете "Turn right" ако самолетът е в ляво от пистата (ако XXX е по-голямо от YYY) и "Turn left" ако самолетът е в дясно. Допълнително, понеже не е нужно самолетът да се намира перфектно в средата на пистата, зачитаме че ако разликата между двата интензитета е по-малка от 4, тогава самолетът е правилно подравнен и връщаме "Follow heading". {b Примери} :table :2 |= Вход |= Изход |: 045093 |: Turn left |: 100090 |: Turn right |: 050053 |: Follow heading ### Задача 11 - GPS {i В тази задача има много "теория", иначе самия код е малък и лесен.} Кондензирайки възможно най-много, ще обясня как работи GPS. На земята имаме специални методи, чрез които можем да определим позицията на всеки сателит, обаче обратното, определянето на позицията чрез сателит, става с помощта на супер прецизни часовници и малко математика. Понеже радио комуникацията е със скоростта на светлината, можем лесно да определим разстояния между сателит и дадена точка, считайки колко време е отнело на сателита да върне отговор (припомням формулата {` s = v * t}, или {` разстояние = скорост * време}). Обаче, така получаваме само разстоянието, това не е достатъчно за да определим точната позиция, понеже има много възможни точки на земята, които да са на това разстояние. Решението на проблема, е че просто вземаш разстоянието от няколко сателита, твоята позиция се намира в общата точка между всички възможни области. С други думи, наш приятел ни се обажда, иска да разбере къде се намира. Ние знаем на кой адрес се намираме, и приятеля ни знае само, че се намира на 300 метра от нас. Този приятел също се е свързал със съседката и е казал, че се намира на 299 метра от нея. Нека да нарисуваме два кръга върху една карта, за всички възможни места, където той може да се намира спрямо нашият и на съседката адрес. Тези кръгове ще се пресичат, и знаем, че той може да се намира само в някоя от пресечените позиции. От математика, ако знаем разстоянието на нашия приятел към трети различен човек, трите кръга върху картата ще се пресичат в само една точка, а именно позицията на нашия приятел. В три измерения, правим същото, обаче със сфери, и ни трябват четири сателита. Понеже математиката в две и три измерения е малко множко, ще разгледаме всичко едноизмерно, в {url Lineland;https://en.wikipedia.org/wiki/Flatland}. \n Разработваме (сериозно опростена) GPS система, като работим с едноизмерни координати, тоест позицията на всичко се определя с по едно число. Изпращаме съобщение към два сателита по едно и също време, и получаваме отговор (какво е съобщението и отговор не е важно, интересува ни само времето). Считайки нужното време да получим отговор, намираме разстоянията, от там ще имаме общо 4 възможности, като 2 от тях ще се препокриват и това ще бъде нашата позиция. От входа получавате число, което е точното време в милисекунди спрямо денонощието, в което сме изпратили съобщение към двата сателита. След това получавате още две числа, координата на първия сателит и по кое време в милисекунди спрямо денонощието е получен отговора. Накрая получавате още две числа, пак координата и време, но за втория сателит. Изкарайте къде се намираме ние, като нека скоростта на светлината да бъде 29 метра в милисекунда. {b Пример} :table :2 |= Вход |= Изход |: 18 -100 22 132 30 |: -42