Задачи - УПП, Седмица 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
- променя контакт, приема допълнително две имена на контакти и телефонен номер. Променя контакта с първото име, като второто име и тел. номер стават новите му стойности.