diff options
1 files changed, 136 insertions, 0 deletions
| -rw-r--r-- | src/teaching/upp-2023/week5/index.md | 136 |
diff --git a/src/teaching/upp-2023/week5/index.md b/src/teaching/upp-2023/week5/index.md new file mode 100644 index 0000000..ca60e23 --- /dev/null +++ b/src/teaching/upp-2023/week5/index.md @@ -0,0 +1,136 @@ +# Задачи - УПП, Седмица 5, 03.11.2023 + +GitHub classroom: [classroom.github.com/a/3KoIQ71H](https://classroom.github.com/a/3KoIQ71H) + +## Задача 1 + +Дефинираме двуизмерен координат като две числа с плаваща запетая. +Направете функция, която получава два двуизмерни координата, покомпонентно ги сумира и връща резултатните координати. +Няма как функцията да върне две стойности, затова последните два аргумента трябва да са указатели към променливи в които да запазим сумираните координати. + +От входа получавате два координата, след това връщате тяхната покомпонентна сума **използвайки функцията**. + +**Пример:** + +|Вход|Изход| +|----|-----| +|8.0 1.5 -1.9 -100.741|6.1 -99.241| + +## Задача 2 + +Използвайки масиви, имплементирайте 30-цифрени цели положителни числа. +Трябва да поддържате операциите събиране и изваждане между две такива числа. + +Първо ще получите 30 цифри, които отговарят на първото числа, после още 30 цифри, които отговарят на втрото число и накрая ще получите знак. +Ако знака е `+`, трябва да ги съберете и да изкарате резултата на екрана. +Ако знака е `-`, трябва да ги извадите и да изкарате резултата на екрана. + +При изкарване трябва да следвате "нормалните" правила: цифрите са долепени и водещите нули не се пишат. + +**Пример:** + +|Вход|Изход| +|----|-----| +|4 6 9 2 7 5 2 2 3 3 4 2 9 5 7 4 2 3 3 7 1 9 2 6<br>9 3 4 2 1 6 0 3 3 5 5 1 0 1 3 0 0 0 6 3 2<br>+|470209439376508436372558| +|4 6 9 2 7 5 2 2 3 3 4 2 9 5 7 4 2 3 3 7 1 9 2 6<br>9 3 4 2 1 6 0 3 3 5 5 1 0 1 3 0 0 0 6 3 2<br>-|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<br>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<br>+|0| + +## Задача 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<br>1 3 8 8 7 5 5 5 5 7 7 8 8 8 8 6|1 3 6| +|40<br>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<br>4 6 2 1 5 0 0 3 8|7 7| +|20<br>16 10 6 11 1 1 9 12 15 17 0 0 9 15 8 16 7 0 16 18|4 9| +|30<br>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<br>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). + Ако искате може и други да приемате, пълен списък има [тук](https://en.wikipedia.org/wiki/List_of_country_calling_codes#Alphabetical_order). + +### б) вход и команди + +От входа първо получавате ПИН кода и отблокиращия код. +Ако отблокиращия е в невалиден формат, връщате съответно съобщение за грешка и спирате програмата. + +След това получавате команди, всяка команда се определя с букви и още някакви стойности. +**Всяка команда трябва да бъде изкарана в отделна функция!** + +- `v` - пробвате се да се "логнете" в сим картата. + След буквата получавате и едно число, което е въведения ПИН код. + Ако е правилен, следващите 5 команди, които изискват упълномощение могат да се изпълнят. + След 5те команди, упълномощението се "премахва" и трябва пак да се въведе ПИН код при упълномощени команди. + Ако е грешен, общо има 3 опита, и след тях картата се блокира. +- `u` - отпблокиране на блокирана карта. + След буквата получавате отблокиращ код и нов ПИН код. + Ако отблокиращия код е в грешен формат или е грешната стойност, премахваме един опит. + При 10 неуспешни опита, изкарвате съобщение, че картата е перманентно блокирана и спирате програмата. + Ако е успешно отблокирана, тогава променяте ПИН кода и сте се "логнали" автоматично. +- `i` - връща информация за СИМ картата, това са общо броя команди които са изпълнявани до сега + +### в) команди с упълномощение + +Всички от следните команди изискват упълномощение. +Ако преди това сме били логнати, директно изпълняваме командата (и декрементираме броя упълномощени команди), ако обаче не сме упълномощени, трябва да поискаме ПИН код и след това да продължим както нормално. + +Ако някоя търсена стойност е невалидна или не съществува, връщате съответната грешка. + +- `c` - променя ПИН код. + Получавате нов ПИН код и го променяте. +- `a` - добавя контакт в паметта, общо може да имаме 10 контакта. + Всеки контакт се определя с буква, неговото "име", и 10-цифрен мобилен номер. + Приема допълнително неговото име и тел. номер. + Добавяме контакта в първото незаето място, а ако всички са заети, връщаме съобщение с грешка. +- `r` - приема и още една буква (име), връща телефонния номер на съответния контакт. + Ако той не съществува или телефонния номер е невалиден, връщаме съответно съобщение с грешка. +- `d` - приема и още една буква (име), изтрива съответния контакт. + Ако той не съществува, връщаме съответно съобщение с грешка. +- `o` - променя контакт, приема допълнително две имена на контакти и телефонен номер. + Променя контакта с първото име, като второто име и тел. номер стават новите му стойности. |