Задачи - УПП, Седмица 5, 03.11.2023
GitHub classroom: classroom.github.com/a/3KoIQ71H
Задача 1
#Дефинираме двуизмерен координат като две числа с плаваща запетая. Направете функция, която получава два двуизмерни координата, покомпонентно ги сумира и връща резултатните координати. Няма как функцията да върне две стойности, затова добаваете оше два аргумента, които да са указатели към променливи в които да запазим сумираните координати.
От входа получавате два координата, след това връщате тяхната покомпонентна сума използвайки функцията.
Пример:
Вход | Изход |
---|---|
8.0 1.5 -1.9 -100.741 | 6.1 -99.241 |
Задача 2
#Използвайки масиви, имплементирайте 30-цифрени цели положителни числа. Трябва да поддържате операциите събиране и изваждане между две такива числа.
Първо ще получите 30 цифри, които отговарят на първото числа, после още 30 цифри, които отговарят на втрото число и накрая ще получите знак.
Ако знака е +
, трябва да ги съберете и да изкарате резултата на екрана.
Ако знака е -
, трябва да ги извадите и да изкарате резултата на екрана.
При изкарване трябва да следвате “нормалните” правила: цифрите са долепени и водещите нули не се пишат.
Пример:
Вход | Изход |
---|---|
0 0 0 0 0 0 4 6 9 2 7 5 2 2 3 3 4 2 9 5 7 4 2 3 3 7 1 9 2 6 0 0 0 0 0 0 0 0 0 9 3 4 2 1 6 0 3 3 5 5 1 0 1 3 0 0 0 6 3 2 + |
470209439376508436372558 |
0 0 0 0 0 0 4 6 9 2 7 5 2 2 3 3 4 2 9 5 7 4 2 3 3 7 1 9 2 6 0 0 0 0 0 0 0 0 0 9 3 4 2 1 6 0 3 3 5 5 1 0 1 3 0 0 0 6 3 2 - |
468341007309406410371294 |
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + |
0 |
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 - |
999999999999999999999999999999 |
Задача 3
#Получавате редица цифри.
Ако имаме поне 3 повтарящи се цифри една след друга, можем да ги премахнем.
Тоест редицата 0 3 1 2 2 2 4 7
може да стане 0 3 1 4 7
.
След едно премахване, трябва да можем после да премахнем новопоявило се премахване.
Тоест редицата 5 1 3 3 3 3 1 1 1 9 2
първо става 5 1 1 1 1 9 2
и след това 5 9 2
.
Не е нужно да гледате напред за възможно най-много премахване.
Тоест в случая 8 1 3 4 4 4 5 5 5 5 4 4
не се очаква да предвидите, че ако първо премахнете 5-те, после ще може да премахнете всички 4ки.
Премахвате първата валидна повтаряща се редица, връщате се малко назад, поглеждате дали някоя нова редица не се е появила, премахвате нея или отивате на следващата.
От входа първо получавате броя N
на цифрите в редицата, като N
е между 1 и 40.
След това получавате N
на брой цифри и накрая връщате редицата с премахнати повтаряния.
Примери:
Вход | Изход |
---|---|
16 1 3 8 8 7 5 5 5 5 7 7 8 8 8 8 6 |
1 3 6 |
40 7 1 5 2 1 7 2 1 2 1 7 2 6 1 6 7 6 9 7 3 8 6 6 5 1 2 7 4 6 8 3 8 2 2 6 9 4 2 6 5 |
7 1 5 2 1 7 2 1 2 1 7 2 6 1 6 7 6 9 7 3 8 6 6 5 1 2 7 4 6 8 3 8 2 2 6 9 4 2 6 5 |
Задача 4
#Получавате редица числа.
Всяко число е индекс към друго число в редицата (индексите започва от 0).
Започвайки от всяка цифра, проследяваме всички “скоци”, тоест ако имаме 1 3 0 2
и започваме от индекс 0, тогава от него скачаме на индекс 1, от него на индекс 3, от него на индекс 2 и от него се връщаме в индекс 0.
Докато прескачаме не може да посетим вече посетен индекс, тоест ако имаме 1 3 0 1
, от 0 отиваме в 1, от 1 в 3 и от 3 в 1, обаче вече сме посетили индекс 1, така че спираме да скачаме.
Търси се колко най-много скока можем да направим, започайки от който и да е индекс. Ако има няколко индекса с максималния брой скоци, връщаме само първия.
Получавате от входа брой N
на числата (индексите), като N
е между 1 и 30, след това получавате толкова на брой числа (между 0 и N-1) и накрая връщате при кой начален индекс имаме най-много скока и колко са тези скоци.
Примери:
Вход | Изход |
---|---|
9 4 6 2 1 5 0 0 3 8 |
7 7 |
20 16 10 6 11 1 1 9 12 15 17 0 0 9 15 8 16 7 0 16 18 |
4 9 |
30 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
0 1 |
30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 |
0 2 |
Задача 5
#sim картите са типове smart-card, това означава че в себе си имат един миниатюрен компютър с миниатюрна памет. Нека да имплементираме съвсем опростено една сим карта.
Трябва да запазите един четири-цифрен ПИН код и един еднобуквен отблокиращ код. В тази задача се изисква коректно валидиране на входни данни, така че ще направим:
а) валидационни функции
#isUnblockCode
, приема буква и връща дали е отблокиращ код
Само главни, малки и цифри са валидни отблокиращи кодовеisPhoneNumber
, приема число (10 цифрено) и поглежда най-левите 3 цифри
Те трябва да са валиден код на държава. Нужно е да приемате поне кодовете за България (359) и за Франция (033). Ако искате може и други да приемате, пълен списък има тук.
б) вход и команди
#От входа първо получавате ПИН кода и отблокиращия код. Ако отблокиращия е в невалиден формат, връщате съответно съобщение за грешка и спирате програмата.
След това получавате команди, всяка команда се определя с букви и още някакви стойности. Всяка команда трябва да бъде изкарана в отделна функция!
v
- пробвате се да се “логнете” в сим картата. След буквата получавате и едно число, което е въведения ПИН код. Ако е правилен, следващите 5 команди, които изискват упълномощение могат да се изпълнят. След 5те команди, упълномощението се “премахва” и трябва пак да се въведе ПИН код при упълномощени команди. Ако е грешен, общо има 3 опита, и след тях картата се блокира.u
- отпблокиране на блокирана карта. След буквата получавате отблокиращ код и нов ПИН код. Ако отблокиращия код е в грешен формат или е грешната стойност, премахваме един опит. При 10 неуспешни опита, изкарвате съобщение, че картата е перманентно блокирана и спирате програмата. Ако е успешно отблокирана, тогава променяте ПИН кода и сте се “логнали” автоматично.i
- връща информация за СИМ картата, това са общо броя команди които са изпълнявани до сега
в) команди с упълномощение
#Всички от следните команди изискват упълномощение. Ако преди това сме били логнати, директно изпълняваме командата (и декрементираме броя упълномощени команди), ако обаче не сме упълномощени, трябва да поискаме ПИН код и след това да продължим както нормално.
Ако някоя търсена стойност е невалидна или не съществува, връщате съответната грешка.
c
- променя ПИН код. Получавате нов ПИН код и го променяте.a
- добавя контакт в паметта, общо може да имаме 10 контакта. Всеки контакт се определя с буква, неговото “име”, и 10-цифрен мобилен номер. Приема допълнително неговото име и тел. номер. Добавяме контакта в първото незаето място, а ако всички са заети, връщаме съобщение с грешка.r
- приема и още една буква (име), връща телефонния номер на съответния контакт. Ако той не съществува или телефонния номер е невалиден, връщаме съответно съобщение с грешка.d
- приема и още една буква (име), изтрива съответния контакт. Ако той не съществува, връщаме съответно съобщение с грешка.o
- променя контакт, приема допълнително две имена на контакти и телефонен номер. Променя контакта с първото име, като второто име и тел. номер стават новите му стойности.