diff options
1 files changed, 67 insertions, 48 deletions
| -rw-r--r-- | src/teaching/upp-2023/additional1/index.du | 115 |
diff --git a/src/teaching/upp-2023/additional1/index.du b/src/teaching/upp-2023/additional1/index.du index 0356403..9956e2e 100644 --- a/src/teaching/upp-2023/additional1/index.du +++ b/src/teaching/upp-2023/additional1/index.du @@ -1,17 +1,20 @@ -# Допълнително упражнение 1 - УПП, 04.11.2023 +'def title Допълнително упражнение 1 - УПП, 04.11.2023 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github.com/a/nlFuKALw] +GitHub classroom: {url classroom.github.com/a/nlFuKALw;https://classroom.github.com/a/nlFuKALw} -При изображението [image /img/dialog-question.png трябва да спрете, да помислите и да си отговорите на дадения въпрос. +При изображението {img /img/dialog-question.png} трябва да спрете, да помислите и да си отговорите на дадения въпрос. Почти винаги ако не може да отговорите, ще имате проблеми в бъдеще с решаването. Понякога ще ви спираме и ще ви питаме за тези въпроси. ## Задача - База гаднни -.warn [=Нямате=] право да използвате каквито и да е функции, които вие не сте написали, както и неизучаван материал като двуизмерни масиви или динамична памет. -[=Не=] употребявайте търсачки, ако ви трябва информация за нещо, ще може да си я изкарате с една проста тестова програма или калкулатор. +.warn {b Нямате} право да използвате каквито и да е функции, които вие не сте написали, както и неизучаван материал като двуизмерни масиви или динамична памет. +{b Не} употребявайте търсачки, ако ви трябва информация за нещо, ще може да си я изкарате с една проста тестова програма или калкулатор. \n @@ -41,7 +44,7 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github. Стойностите от таблица А са винаги ограничени отгоре с най-големия брой битове, които комфортно може да поберем в 7 цифри. Тоест 9999999 не е валидна стойност от таблица А, докато 8388608 e. -.question Колко най-много [*битове*] можем със сигурност да поберем в 7 цифри? +.question Колко най-много {i битове} можем със сигурност да поберем в 7 цифри? Понеже редовете са от 1 до 9, ако в таблица А имаме ред 0 правим нещо специално, но това ще видите в бъдеще. @@ -51,15 +54,16 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github. Преди да започнем, трябва да имплементираме функция, която разделя дадения ред от таблица А на трите му компонента (ред, тип и стойност): -[`getRow`] - приема ред от таблица А и указатели към променливи за ред, тип и стойност; не връща нищо\n +{` getRow} - приема ред от таблица А и указатели към променливи за ред, тип и стойност; не връща нищо\n В подадените указатели пази съответните стойности от реда .question Защо приемаме указатели към променливи? Каква е "сигнатурата" на функцията? \n -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Извикване |= Резултат @@ -73,6 +77,7 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github. |: row = 1, type = 2, value = 3456789 + ### б) обикновенно число Ако типа е цифрата "0", тогава стойността в базата данни е някакво число с плаваща запетая. @@ -82,13 +87,14 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github. Имплементирайте функция: -[`parseNumber`] - приема стойност от таблица А и ред от таблица Б; връща полученото число от тези стойности +{` parseNumber} - приема стойност от таблица А и ред от таблица Б; връща полученото число от тези стойности \n -[=Примери:=] -[*Възможно е отклонението на последния пример да бъде повече от 2 единици*] +{b Примери:} +{i Възможно е отклонението на последния пример да бъде повече от 2 единици} -:table_2 +:table +:2 |= Извикване |= Резултат @@ -105,12 +111,14 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github. |: a = 8388607.18446744073709551615 + ### в) числов текст (част едно) Ако типа е "1", тогава стойността в базата данни е някакъв низ (последователност от букви), която е кодирана в числата. Всеки 5 бита в реда (от дясно на ляво) от таблица Б определя буква, като: -:table_3 +:table +:3 |: Битове |: Десетично число |: Буква @@ -137,7 +145,7 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github. |: 11010 |: 26 -|: [*шпация*] +|: {i шпация} |: 11011 |: 27 @@ -160,22 +168,24 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github. |: ! -Тоест ако в нашия тип данни запазваме само 10 бита, тогава числото "2" ще бъде [`0000000010`] и имаме низа "AC". + +Тоест ако в нашия тип данни запазваме само 10 бита, тогава числото "2" ще бъде {` 0000000010} и имаме низа "AC". Игнорирайте старшите битове, които остават като "остатък" (по-малко от 5 бита ширина). .question Колко бита наистина запазваме в нашия тип данни? Колко бита ще трябва да игнорираме? Колко най-много букви може да поберем? Имплементирайте функция: -[`decodeNumberText`] - приема ред от таблица Б и указател към "низ"; не връща нищо\n +{` decodeNumberText} - приема ред от таблица Б и указател към "низ"; не връща нищо\n Записва декодиран текстът от реда в указателя .question Нарочно има кавички около думата "низ", какъв трябва наистина да е типа на указателя? \n -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Извикване |= Резултат @@ -189,12 +199,13 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github. |: decodedText = "!. ,:?!. ,:?" + ### г) числов текст (част две) Дотук добре, обаче не сме свършили съвсем. -От гледна точка на сигурност, искаме дори някой да получи достъп до таблица Б, да не може да разбере текста дори след като е използвал [`decodeNumberText`]. +От гледна точка на сигурност, искаме дори някой да получи достъп до таблица Б, да не може да разбере текста дори след като е използвал {` decodeNumberText}. -Ще използваме [url https://en.wikipedia.org/wiki/Caesar_cipher шифъра на Цезар]: един много прост шифър, където отместваме позицията на всяка буква с няколко места "напред". +Ще използваме {url шифъра на Цезар;https://en.wikipedia.org/wiki/Caesar_cipher}: един много прост шифър, където отместваме позицията на всяка буква с няколко места "напред". Тоест, при отместаване 3, буквата A става D, B става E, и так. нат. Как декодираме? Отместваме буквите назад, тоест ако имаме текста "KHOOR" и ви кажа, че съм го кодирал като съм отместил всяка буква напред с 3 позиции, тогава при декодиране от K става на H, от H става на E, от О става на L и от R става на O. @@ -205,13 +216,14 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github. Промененте функцията: -[`decodeNumberText`] - приема ред от таблица Б, стойност от таблица А и указател към "низ"; не връща нищо\n +{` decodeNumberText} - приема ред от таблица Б, стойност от таблица А и указател към "низ"; не връща нищо\n След като декодира текста от реда от Б, дешифрира го със стойността от таблица А \n -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Извикване |= Резултат @@ -237,6 +249,7 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github. |: decodedText = "!. ,:?!., :?" + ### д) масив (част едно) Ако типа е "2", тогава в реда от Б сме вложили масив от стойности (числа). @@ -246,13 +259,14 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github. Имплементирайте функцията: -[`decodeArray`] - приема ред от таблица Б и указател към масив; не връща нищо\n +{` decodeArray} - приема ред от таблица Б и указател към масив; не връща нищо\n Декодира елементите от реда и ги запазва в указателя \n -[=Пример:=] +{b Пример:} -:table_2 +:table +:2 |= Извикване |= Резултат @@ -260,6 +274,7 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github. |: arr = { 0, 11, 11, 15, 0, 10, 9, 10, 0, 0, 15, 5, 3, 11, 15, 0 } + ### е) масив (част две) От гледна точка на сигурност или оптимизране на памет, искаме да "лимитираме" какви стойности са валидни, и всички невалидни да станат някоя друга стойност по подразбиране. @@ -267,21 +282,22 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github. В старшите 20 бита от стойността в таблица А ще пазим общо 5 възможни валидни стойности, а в останалите (младши) 3 бита ще пазим индекс към тези стойности, който индекс (започвайки от 1) определя стойността по подразбиране. -Пример: ако имаме побитово [`1111100000100011101101010101`], тогава: +Пример: ако имаме побитово {` 1111100000100011101101010101}, тогава: .bulleted -- валидните числа са [`11111, 00000, 10001, 11011 и 01010`] -- числото по подразбиране е 5-тото ([`101 = 5`]), което е числото [`01010`] -- ако от реда в Б изкараме [`11011`], тогава го запазваме, обаче ако изкараме примерно [`11000`] тогава го превръщаме в стойността по подразбиране, а именно [`01010`] +- валидните числа са {` 11111, 00000, 10001, 11011 и 01010} +- числото по подразбиране е 5-тото ({` 101 = 5}), което е числото {` 01010} +- ако от реда в Б изкараме {` 11011}, тогава го запазваме, обаче ако изкараме примерно {` 11000} тогава го превръщаме в стойността по подразбиране, а именно {` 01010} Разширете функцията: -[`decodeArray`] - приема стойност от таблица А, ред от таблица Б и указател към масив; не връща нищо\n +{` decodeArray} - приема стойност от таблица А, ред от таблица Б и указател към масив; не връща нищо\n Декодира елементите от реда, като всички невалидни стойност се превръщат в стойността по подразбиране, и ги запазва в указателя \n -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Извикване |= Резултат @@ -292,6 +308,7 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github. |: arr = { 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 15, 5, 3, 8, 15, 8 } + ### ж) компресирани стойности Ако редът в таблица А е 0, тогава цялата стойност в базата данни е побрана в стойността на таблица А. @@ -306,15 +323,15 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github. .comment 000 001 010 011 100 101 :bulleted -- Kриптографски ред е [`00000, 10101, 11011, 10001, 01101, 10100`] +- Kриптографски ред е {` 00000, 10101, 11011, 10001, 01101, 10100} .bulleted - Индексираме от 0 до 5, което побитово е от 000 до 101 -- Стойност в таблицата А е [`011001000001101101`] +- Стойност в таблицата А е {` 011001000001101101} .bulleted - - Разделяйки го на индекси, това са [`011, 001, 000, 001, 101, 101`] + - Разделяйки го на индекси, това са {` 011, 001, 000, 001, 101, 101} -- Слепвайки от криптографския ред на тези индекси получаваме [`100011010100000101011010010100`] +- Слепвайки от криптографския ред на тези индекси получаваме {` 100011010100000101011010010100} Във вашата програма ще се наложи да направите още една променлива, в която пазите криптографския ред. @@ -326,12 +343,13 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github. Напишете функция: -[`decompress`] - приема стойност от таблица А, криптографски ред, указател за запазване на декомпресираната стойност от таблица А и указател за запазване на декомпресирания ред от таблица Б; не връща нищо +{` decompress} - приема стойност от таблица А, криптографски ред, указател за запазване на декомпресираната стойност от таблица А и указател за запазване на декомпресирания ред от таблица Б; не връща нищо \n -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Извикване |= Резултат @@ -342,6 +360,7 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github. |: decompA = 8388607, decompB = 18446744073709551615 + ### з) входни данни В началото на програмата получавате броя на редове от таблица А (между 1 и 16), след това толкова "реда". @@ -352,22 +371,22 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github. След това получавате команди (знак): .bulleted -- [`g X`]: изкарвате на екрана стойността в базата данни, започвайки с ред X от таблица А -- [`i`]: Връщате информация за базата данни -- [`q`]: спиране на програмата +- {` g X}: изкарвате на екрана стойността в базата данни, започвайки с ред X от таблица А +- {` i}: Връщате информация за базата данни +- {` q}: спиране на програмата ### й) заявки .bulleted -- [`t X`]: връщате броя и след това всички редове от таблица А с тип X -- [`r X`]: връщате броя и всички редове от таблица А, които използват реда Х\n +- {` t X}: връщате броя и след това всички редове от таблица А с тип X +- {` r X}: връщате броя и всички редове от таблица А, които използват реда Х\n Ако реда е 0, тогава трябва да върнете и размера на криптографския ред ### к) презаписване в базата данни .bulleted -- [`w T R V`]: запазвате (презаписвате) стойност V в таблица Т (може да бъде [`A`] или [`B`]) на ред R -- [`s T V`]: запазвате стойност V от тип Т в базата данни\n +- {` w T R V}: запазвате (презаписвате) стойност V в таблица Т (може да бъде {` A} или {` B}) на ред R +- {` s T V}: запазвате стойност V от тип Т в базата данни\n Пробвате се да я запазите, използвайки и двете таблици, но ако Б вече е запълнена, добавяте я като компресирана стойност в таблица А. Ако и А е запълнена, изкарвате съобщение за запълнена база данни и не запазвате стойността. |