Задачи - УПП, Седмица 9, 27.11.2025

important Реализирайте единствено архитектурни решения!

GitHub Classroom: https://classroom.github.com/a/ZYFDdLi4

За решаване

Задача 0

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

Нуждаят се от програма, която взема влажностите на всички хигрометри (от един момент на времето) и връща:

  1. Средната влажност в града
  2. Влагата в най-сухия и най-влажния квадрант

Примерно архитектурно решение

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

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

Ще изведем в глобална константа SIZE размера на едно измерение на матрицата, и самата матрица ще съдържа влажността в стойности от тип double.

За намиране на средната влажност в града, ще изградим функцията average, която изглежда по следния начин:

double average(const double hygrometers[SIZE][SIZE]);

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

За намиране на най-влажен и най-сух квадрант ще реализираме функцията quadrantHumidity, чиято декларация е:

double quadrantHumidity(const double hygrometers[SIZE][SIZE], unsigned startRow, unsigned startCol);

Функцията приема матрицата с влажности и начални индекси по ред и колона на съответния квадрант. Знаем, че един квадрант ще бъде една четвърт от размера на матрицата (половината височина и ширина), затова не е нужно той да бъде подаден.

В имплементацията, ще итерираме през матрицата, като започнем от началните редове и колона, и обиколим точно SIZE / 2 реда и колони. Ще пазим сума на всички елементи и накрая ще разделим на броя елементи, т.е. ще върнем средната стойност на влажност в квадранта.

В заглавната функция ще дефинираме матрицата и ще попълним входните влажности. След това ще изкараме стойността, върната от извикване на average.

За сух и влажен квадрант, ще създадем две променливи за най-голяма и най-малка стойност. След това ще извикваме quadrantHumidity, като ще запазим върната стойност като най-голяма и най-малка спрямо текущите стойности.

Началните ред и колона ще подаваме с вложен цикъл, който ще итерира колоните и редовете от най-първите (на индекси 0,0) и ще увеличава всеки индекс с размера на страната на квадрант (SIZE / 2).

След цикъла и всички извиквания ще имаме стойностите в нашите променливи и ще ги изкараме.

Задача 1

Сграда разполага с два асансьора и 5 етажа. Инженерите на асансьорите са забелязали, че асансьора се качва по-бързо отколкото слиза.

Техниците на сградата се нуждаят от програма, която получава позицията на всеки асансьор и на кои от всичките етажи е натиснат бутон за извикване на асансьор, и връща кой асансьор на кой етаж ще отиде. Приоритизирайте скорост!

Задача 2

Автобусна фирма в един град трябва да замени всички свои автобуси. В града има 6 автобусни линии и всяка линия има между 5 и 17 спирки.

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

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

Задача 3

Фабрика купува 5 нови машини, всяка от които изработва по 10000 градивни елемента на час. Всеки час от 8 часов работен ден, работниците във фабриката отбелязват в счетоводни таблици дали всеки един елемент е дефектен или не.

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

Собствениците на фабриката се съмняват, дали машините са в изправно положение и дали работници крадат елементи, отбелязвайки ги като дефектни.

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

Задача 4

Фирма за доставки се нуждае от нова система за менажиране на пратки.

Всяка пратка се идентифицира с номер и за нея се запазва тегло, начален адрес, адрес на местозначение и чупливост.

Всеки офис се идентифицира с различен номер и съдържа адреса си (като низ), както и ограничено количество пратки. Всяка пратка се съхранява по идентификационен номер в офисите.

Допълнително, за всяка пратка има 6 буквен код за проследяване. Трябва да пазите съответствие между кода и номера на пратката.

Администратор на системата трябва да може да:

Стандартен потребител трябва да може да получи локацията на пратка по подаден код за проследяване. Ако кода не съответства на никоя пратка, системата трябва да зачете кода за невалиден. Ако пратката не се намери в никой офис, тогава пратката трябва да се зачете за загубена.

Задача 5

Магазин иска да вдигне печалбата си на редица продукти. Статистика от купувачи показва, че увеличение с 50 стотинки намаля количеството купувачи с 0.0003%. Обаче, за всеки 20 стотинки над тези 50, количеството купувачи намалява двойно повече от преди това.

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

Задача 6

Фермер се нуждае от система, която следи цените на зеленчуци в 24-часов период.

Всеки зеленчук се идентифицира с пет главни букви, и за него допълнително трябва да се пази наименование и сорт.

На всеки 30 минути, системата ще получи заявка за обновяване на цени, която съдържа подаден брой обновени цени. Данните в заявката са във формата "идентификатор нова_цена".

В края на деня трябва да изкарате справка за всички зеленчуци, която съдържа:

  1. За всеки един зеленчук:
    • средната цена
    • в кои периоди от време е най-скъп
    • с колко цената най-много се различава от средната
  2. За всички зеленчуци:
    • топ 3 най-скъпи зеленчуци
    • топ 3 най-евтини зеленчуци
    • средната цена на зеленчуци на всеки 4 часа от денонощието

В справката използвайте наименованието и сорта на зеленчука, вместо неговия идентификатор.

За самоподготовка

Задача 7

Онлайн платформа планира да въведе нова функционалност, която ще очужди голяма част от потребителската база. Икономисти твърдят, че всеки ден платформата ще загуби 68% от количеството клиенти, които са загубили предходния ден, но този процент ще се намаля с 1% всеки следващ ден.

Допълнително, икономистите твърдят, че ще получава с 1.3% повече клиенти от предходния ден, и този процент ще се увеличава с 0.5% всеки следващ ден.

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

Задача 8

Стартъп решава да изгради социална мрежа. В нея ще има потребители с имейли, потребителски имена, парола, екранни имена (такива, които се показват на профила им) и профилна снимка.

Всеки потребител може да има приятели и постове. Един пост съдържа текст и/или изображение. На всеки пост може само да се пишат коментари. На всеки коментар може да се отговаря.

Изградете система, която поддържа стандартните потребителски операции:

За изображения, приемайте пътища във файловата система. Потребителския интерфейс е нужно да има валидация на входа.

Задача 9

Държава се намира в началните стадии на пандемия. Органите, отговарящи за статистически изследвания, откриват че без значение в коя община вируса се разпространява, всеки ден броя ваксинирани се увеличава с по 5.2% спрямо предходния ден. Едновременно, броя заразени (и неваксинирани) се увеличава с по 3.1% спрямо предходния ден.

Законодателството се нуждае от система, която може да изчисли след колко дена броя ваксинирани ще надвиши броя заразени (и неваксинирани), по подадени начални стойности за определена община.

Задача 10

Две суперсили се намират в политическа безизходица. Военните сили на суперсила 1 разглеждат света като една таблица с 2048 колони и 1024 реда.

Във всяка клетка на таблицата има една от пет възможни стойности:

  1. нищо,
  2. ракетен силоз на суперсилa 1
  3. точка на интерес (за суперсила 2) в територията на суперсила 1
  4. ракетен силоз на суперсила 2
  5. точка на интерес (за суперсила 1) в територията на суперсила 2

Знае се, че всеки ракетен силоз (и на двете страни) е снабден с автоматична отмъщителна система. Когато точка на интерес в територията на една суперсила е унищожена, в радиус от 3 клетки (хоризонтално, диагонално и вертикално), всички ракетни силози изтрелват ядрени бойни глави към най-близата си точка на интерес от другата суперсила.

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