# Задачи - ООП, Седмица 1, 22.02.2024 \n GitHub classroom: [url https://classroom.github.com/a/UPJOzHty classroom.github.com/a/UPJOzHty] ## Задача 1 .solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise1.cpp Решение] Имплементирайте низ чрез структура. В структурата трябва да запазвате указател към низа и неговата дължина. Имплементирайте функция `[concatString]`, която приема две структури от този тип и връща низ, пак в същата структура, който е конкатенация (слепване) на първите два низа. .question Има ли значение дали типовете на аргументите, или на върнатата стойност, са референции или указатели (или нито едното)? В самия код тествайте функциите (не е нужен потребителски вход). ## Задача 2 .solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise2.cpp Решение] Имплементирайте структура за динамично-заделен масив от целочислени числа. Тя трябва да запазва указател към масива, размера на масива и бройката на елементи в масива. Заделянето на динамична памет е бавна операция, затова винаги ще заделяме повече клетки, отколкото са ни нужни. Имплементирайте функция `[resize]`, която удвоява размера на масива (нека първоначалния размер на масива е 2), на подадена стойност от тип вашата структура. Имплементирайте функция `[addToEnd]`, която приема (инстанция на) структурата ви и вмъква елемент в първата незаета позиция. В самия код тествайте функциите (не е нужен потребителски вход). ## Задача 3 .solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise3.cpp Решение] Разглеждате "пакети" (логове) информация от редица датчици. Един пакет запазва времето, когато информацията е била отчетена от датчиците, и стойностите на всички датчици: температура, атмосферно налягане, влажност и надморска височина. Всички типове данни са целочислени. От входа получавате N, броя пакети, които трябва да запазите, и след това 5N на брой целочислени стойности. Накрая получавате буква: `[t]`, `[p]`, `[h]`, `[e]`, всяка съответства на някоя отделна стойност от датчиците. Трябва да изкарате на екрана всичките стойности от пакетите, подредени в нарастващ ред на времето, като всички след първата са разликите им спрямо първата. =[Пример:]= .table |=Вход=||=Изход=| |:6\n 56 45 64 -8 98\n 14 40 -15 -18 -1\n 22 89 72 62 4\n 85 44 60 17 13\n 75 18 -12 48 21\n 27 10 94 -5 16\n p:| |:-15 87 109 79 3 75:| ## Задача 4 .solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise4.cpp Решение] 'footnote sabre Защото една от първите индустрии, които са се нуждаели от компютърни системи, била [url https://en.wikipedia.org/wiki/Sabre_%28travel_reservation_system%29#History авиационната индустрия]. Направете структура за съхранение на полети[$sabre]. Трябва да запазите имената на началния и крайния град като низове (допускаме, че няма шпации в имената на градовете), часът на излитане и на кацане в целочислен формат (като на циферблат на дигитален часовник, без разделителното двоеточие) и цената на полета в тип с плаваща запетая (в долари). ### а) въвеждане .solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise4.cpp#L15-L36 Решение] От входа получавате N, това определя броя полети, които трябва да се добавят в системата. Всеки полет е редица от 5 стойности, в реда в който са дефинирани. *[Напомням, че това е нагласено да ползвате `[std::cin]` вместо ръчно да обработвате целия ред.]* Изкарайте началните и крайните градове, както и цената на полетите, подредени в нарастващ ред на час на излитане. =[Пример:]= .table |=Вход=||=Изход=| |:5\n Berlin Paris 1105 1255 140\n Sofia Paris 0915 1115 140\n Paris NewYork 1225 1610 500\n Sofia NewYork 0610 1345 800\n Sofia Berlin 1020 1130 200:| |:Sofia NewYork 800\n Sofia Paris 140\n Sofia Berlin 200\n Berlin Paris 140\n Paris NewYork 500:| ### б) търсене .solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise4.cpp#L38-L247 Решение] След като се въведат всички полети, получавате от входа два низа - имена на градове. Трябва да изкарате най-евтиния, и след него най-бързия, вариант за пътуване от първия град към втория. Прикачване между полети е позволено, така че под "вариант" трябва да изкарате всичките полети, които са решение. За един полет е нужно да изкарате само началния град, крайния град, час на излитане и цена, като градовете трябва да са подредени в нарастващ ред на часа на излитане. =[Пример:]= .table |=Вход=||=Изход=| |:5\n Berlin Paris 1105 1255 140\n Sofia Paris 0915 1115 140\n Paris NewYork 1225 1610 500\n Sofia NewYork 0610 1245 800\n Sofia Berlin 1020 1130 200\n Sofia NewYork:| |:Cheapest:\n Sofia Paris 0915 140\n Paris NewYork 1225 500\n Quickest:\n Sofia NewYork 0610 800:| ## Задача 5 .solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise5.cpp Решение] Имате система за потребители, всеки потребител си има име и приятели (един приятел е =[указател към потребител]=). В началото се въвежда N, това е броят потребители в системата. За един потребител, първо се въвежда на нов ред името му, след това броя на неговите приятели и накрая, на отделни редове, имената на всички тези приятели. Накрая получавате едно име, това е началния потребител. Трябва да намерите, започвайки от него, с колко други потребителя има някаква приятелска връзка (директна, приятел на приятел, приятел на приятел на приятел, ...). =[Пример:]= .table |=Вход=||=Изход=| |:5\n Георги\n 2\n Асен Гьонов\n Майстора\n Асен Гьонов\n 2\n Георги\n др. Божидаров\n Майстора\n 1\n Георги\n др. Божидаров\n 1\n Асен Гьонов\n Павел\n 0\n Майстора:| |:3:|