Задачи - УПП, Седмица 2, 13.10.2023

GitHub classroom: classroom.github.com/a/Bi5dhwW7

Решения: GitHub

Важни бележки

  1. Не е добре да ползвате using namespace std;
  2. Единствената библиотека, която (поне за сега) може да ползвате е iostream
  3. За хората с текстови редактори и gcc, моля да погледнете в Moodle и да използвате предоставените флагове, най-важния от които е -std=c++17
  4. Като си качвате решенията в GitHub classroom, за предпочитане е имената на файловете да свършват на .cpp. Отново, не е задължително, но ми улеснява живота.

Тема: конвертиране


Задача 1 - Конвертирания от int

Получавате целочислено число (тип int), след това, за всеки тип от следния списък, трябва да изкарате на нов ред текст във формата “Със/без загуба тип стойност”:

Целта е да напишете един низ, който съдържа “Със/без загуба тип”, и след това да изкарате (конвертираната) стойност. Не се иска да правите код, който намира тази информация автоматично, всичко това просто си го напишете ръчно (hardcoded).

ПримерНарочно са показани само първите два реда от изхода

Вход Изход
5 Със загуба bool 1
Без загуба long long int 5

Тема: Побитови оператори


Задача 2 - Mask

Получавате положително цяло число, от него трябва да “запазите” само първите (най-десните) 6 бита и да изкарате получилото се число.

Примери

Вход Изход
5 5
200 8

Задача 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

Тема: Логически оператори


Задача 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

Тема: Условни конструкции


Задача 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, но ние ще разгледаме нейния компонент, the localizer: в края на пистата големи предаватели излъчват различни радио сигнали в двете половини на пистата.

Ефектът е като на стерео тон колони, когато самолетът е в ляво от пистата, той приема сигнала от лявата част на пистата по-силно от този за дясната, както ако си доближиш ухото до лявата тон колона, ти ще чуваш нейния звук по-силно от дясната.

Получавате едно цяло положително число, то ще е във формата “XXXYYY”, където “XXX” е три-цифрено число, което съдържа интензитета на сигнала от лявата половина, и аналогично “YYY” е три-цифрено число, което е интензитета от сигнала на дясната половина.

Спрямо техните стойности, трябва да върнете “Turn right” ако самолетът е в ляво от пистата (ако XXX е по-голямо от YYY) и “Turn left” ако самолетът е в дясно. Допълнително, понеже не е нужно самолетът да се намира перфектно в средата на пистата, зачитаме че ако разликата между двата интензитета е по-малка от 4, тогава самолетът е правилно подравнен и връщаме “Follow heading”.

Примери

Вход Изход
045093 Turn left
100090 Turn right
050053 Follow heading

Задача 11 - GPS

В тази задача има много “теория”, иначе самия код е малък и лесен.

Кондензирайки възможно най-много, ще обясня как работи GPS. На земята имаме специални методи, чрез които можем да определим позицията на всеки сателит, обаче обратното, определянето на позицията чрез сателит, става с помощта на супер прецизни часовници и малко математика.

Понеже радио комуникацията е със скоростта на светлината, можем лесно да определим разстояния между сателит и дадена точка, считайки колко време е отнело на сателита да върне отговор (припомням формулата s = v * t, или разстояние = скорост * време).

Обаче, така получаваме само разстоянието, това не е достатъчно за да определим точната позиция, понеже има много възможни точки на земята, които да са на това разстояние. Решението на проблема, е че просто вземаш разстоянието от няколко сателита, твоята позиция се намира в общата точка между всички възможни области.

С други думи, наш приятел ни се обажда, иска да разбере къде се намира. Ние знаем на кой адрес се намираме, и приятеля ни знае само, че се намира на 300 метра от нас. Този приятел също се е свързал със съседката и е казал, че се намира на 299 метра от нея. Нека да нарисуваме два кръга върху една карта, за всички възможни места, където той може да се намира спрямо нашият и на съседката адрес. Тези кръгове ще се пресичат, и знаем, че той може да се намира само в някоя от пресечените позиции.

От математика, ако знаем разстоянието на нашия приятел към трети различен човек, трите кръга върху картата ще се пресичат в само една точка, а именно позицията на нашия приятел. В три измерения, правим същото, обаче със сфери, и ни трябват четири сателита. Понеже математиката в две и три измерения е малко множко, ще разгледаме всичко едноизмерно, в Lineland.


Разработваме (сериозно опростена) GPS система, като работим с едноизмерни координати, тоест позицията на всичко се определя с по едно число. Изпращаме съобщение към два сателита по едно и също време, и получаваме отговор (какво е съобщението и отговор не е важно, интересува ни само времето). Считайки нужното време да получим отговор, намираме разстоянията, от там ще имаме общо 4 възможности, като 2 от тях ще се препокриват и това ще бъде нашата позиция.

От входа получавате число, което е точното време в милисекунди спрямо денонощието, в което сме изпратили съобщение към двата сателита. След това получавате още две числа, координата на първия сателит и по кое време в милисекунди спрямо денонощието е получен отговора. Накрая получавате още две числа, пак координата и време, но за втория сателит. Изкарайте къде се намираме ние, като нека скоростта на светлината да бъде 29 метра в милисекунда.

Пример

Вход Изход
18 -100 22 132 30 -42