diff options
| Commit | 6b8cae12cb5d60b37931332d9d8008649ae14566 (patch) | |
|---|---|---|
| Author | 2026-09-12 11:31:19 +0300 | |
| Committer | 2026-09-12 13:54:29 +0300 | |
| Files | 9ff20cdba71fff44e7b23b43e46a75276df6d7f1 /src/teaching | |
| syndamia.com-6b8cae12cb5d60b37931332d9d8008649ae14566.tar syndamia.com-6b8cae12cb5d60b37931332d9d8008649ae14566.tar.gz syndamia.com-6b8cae12cb5d60b37931332d9d8008649ae14566.zip | ||
| Parent | 918bac7614e560678d51bfba2a25582a3284bdd9 (diff) | |
feat!: Update dunbar markup
Currently the newest version of the markup is not on the main branch,
mostly because of polish and the documentation.
As an effect from the changes to the language, the sitemap is the only
thing which needs to be created externally.
86 files changed, 4014 insertions, 3260 deletions
diff --git a/src/teaching/index.du b/src/teaching/index.du index cf675b3..3888537 100644 --- a/src/teaching/index.du +++ b/src/teaching/index.du @@ -4,27 +4,27 @@ This is a list of all the subjects I've taught professionally. \n -#### [*2025 - 2026*] +#### {i 2025 - 2026} :defs -; [$bg] 2025-2026   [url https://learn.fmi.uni-sofia.bg/course/view.php?id=12341 З629 Универсални конфигурации с Nix] - [url https://github.com/universal-configurations-with-nix/fmi-2025-2026 лекции, материали и задачи] -: Хоноруван преподавател във [url https://www.fmi.uni-sofia.bg/ ФМИ] на избираем курс +; {bg} 2025-2026   {url З629 Универсални конфигурации с Nix;https://learn.fmi.uni-sofia.bg/course/view.php?id=12341} - {url лекции, материали и задачи;https://github.com/universal-configurations-with-nix/fmi-2025-2026} +: Хоноруван преподавател във {url ФМИ;https://www.fmi.uni-sofia.bg/} на избираем курс -; [$bg] 2025-2026   [url /teaching/oop-2025 З520 Обектно-ориентирано програмиране - практикум, КН, 5 група] -: Хоноруван преподавател във [url https://www.fmi.uni-sofia.bg/ ФМИ] на специалност [url https://www.fmi.uni-sofia.bg/bg/kompyutrni-nauki Компютърни науки] +; {bg} 2025-2026   {url З520 Обектно-ориентирано програмиране - практикум, КН, 5 група;/teaching/oop-2025} +: Хоноруван преподавател във {url ФМИ;https://www.fmi.uni-sofia.bg/} на специалност {url Компютърни науки;https://www.fmi.uni-sofia.bg/bg/kompyutrni-nauki} -; [$bg] 2025-2026   [url /teaching/upp-2025 3107 Увод в програмирането - практикум, КН, 5 група] -: Хоноруван преподавател във [url https://www.fmi.uni-sofia.bg/ ФМИ] на специалност [url https://www.fmi.uni-sofia.bg/bg/kompyutrni-nauki Компютърни науки] +; {bg} 2025-2026   {url 3107 Увод в програмирането - практикум, КН, 5 група;/teaching/upp-2025} +: Хоноруван преподавател във {url ФМИ;https://www.fmi.uni-sofia.bg/} на специалност {url Компютърни науки;https://www.fmi.uni-sofia.bg/bg/kompyutrni-nauki} -; [$bg] 2025   [url https://github.com/universal-configurations-with-nix Универсални конфигурации с Nix] - [url https://github.com/universal-configurations-with-nix/academy-2025 лекции, материали, задачи] и [url https://www.youtube.com/watch?v=QcHIeRtySxA&list=PLjPLCCBcJVpGfRHmHlucj3D7lbNkQZAH- записи] -: Преподавател в частна академия по Nix към [url https://blocksense.network blocksense.network] +; {bg} 2025   {url Универсални конфигурации с Nix;https://github.com/universal-configurations-with-nix} - {url лекции, материали, задачи;https://github.com/universal-configurations-with-nix/academy-2025} и {url записи;https://www.youtube.com/watch?v=QcHIeRtySxA&list=PLjPLCCBcJVpGfRHmHlucj3D7lbNkQZAH-} +: Преподавател в частна академия по Nix към {url blocksense.network;https://blocksense.network} -#### [*2023 - 2024*] +#### {i 2023 - 2024} :defs -; [$bg] 2023-2024   [url /teaching/oop-2023 З520 Обектно-ориентрано програмиране - практикум, КН, 8 група] -: Хоноруван преподавател във [url https://www.fmi.uni-sofia.bg/ ФМИ] на специалност [url https://www.fmi.uni-sofia.bg/bg/kompyutrni-nauki Компютърни науки] +; {bg} 2023-2024   {url З520 Обектно-ориентрано програмиране - практикум, КН, 8 група;/teaching/oop-2023} +: Хоноруван преподавател във {url ФМИ;https://www.fmi.uni-sofia.bg/} на специалност {url Компютърни науки;https://www.fmi.uni-sofia.bg/bg/kompyutrni-nauki} -; [$bg] 2023-2024   [url /teaching/upp-2023 3107 Увод в програмирането - практикум, КН, 8 група] -: Хоноруван преподавател във [url https://www.fmi.uni-sofia.bg/ ФМИ] на специалност [url https://www.fmi.uni-sofia.bg/bg/kompyutrni-nauki Компютърни науки] +; {bg} 2023-2024   {url 3107 Увод в програмирането - практикум, КН, 8 група;/teaching/upp-2023} +: Хоноруван преподавател във {url ФМИ;https://www.fmi.uni-sofia.bg/} на специалност {url Компютърни науки;https://www.fmi.uni-sofia.bg/bg/kompyutrni-nauki} diff --git a/src/teaching/oop-2023/index.du b/src/teaching/oop-2023/index.du index 1cd59f5..e4963a6 100644 --- a/src/teaching/oop-2023/index.du +++ b/src/teaching/oop-2023/index.du @@ -1,82 +1,86 @@ -# Обектно-ориентирано програмиране - практикум, Компютърни науки, 8 група +'def title Обектно-ориентирано програмиране - практикум, Компютърни науки, 8 група +'def desc Материали на проведените през 2023/2024 практикуми по Обектно-ориентирано програмиране на Компютърни науки (2 поток), 8 група. + +# {title} Материали на проведените през 2023/2024 практикуми по Обектно-ориентирано програмиране на Компютърни науки (2 поток), 8 група. -[=Зала:=] ФМИ 120 || -[=Време:=] 13:15 - 15:00 || -[=Ден:=] Четвъртък -\n -[=Директни връзки:=] -[url ../upp-2023/week1/welcome.html?a#section-4 Контакт с мен] | -[url https://github.com/Syndamia/oop-2023-solutions Решения на задачи] | -[url https://github.com/Aleksis99/Object-Oriented-Programming_FMI_2023-2024 Материали от семинари] | -[url https://learn.fmi.uni-sofia.bg/course/view.php?id=10041 Курс в мудъл] +{b Зала:} ФМИ 120 || +{b Време:} 13:15 - 15:00 || +{b Ден:} Четвъртък +<br/> +{b Директни връзки:} +{url Контакт с мен;../upp-2023/week1/welcome.html?a#section-4} | +{url Решения на задачи;https://github.com/Syndamia/oop-2023-solutions} | +{url Материали от семинари;https://github.com/Aleksis99/Object-Oriented-Programming_FMI_2023-2024} | +{url Курс в мудъл;https://learn.fmi.uni-sofia.bg/course/view.php?id=10041} -:table_3 +:table +:3 |= № |= Дата |= Материали |: 1 |: 22.02.2024 -|: [url ./week1/organization.html?a Организационно] \|\| [url ./week1/good-software.html?a Основни добри софтуерни практики] \|\| [url ./week1/ Задачи] \|\| [url https://github.com/Syndamia/oop-2023-solutions/tree/main/week01 Решения] \|\| [url https://classroom.github.com/a/UPJOzHty GitHub classroom] +|: {url Организационно;./week1/organization.html?a} || {url Основни добри софтуерни практики;./week1/good-software.html?a} || {url Задачи;./week1/} || {url Решения;https://github.com/Syndamia/oop-2023-solutions/tree/main/week01} || {url GitHub classroom;https://classroom.github.com/a/UPJOzHty} |: 2 |: 29.02.2024 -|: [url ./week2/ Задачи] \|\| [url https://github.com/Syndamia/oop-2023-solutions/tree/main/week02 Решения] \|\| [url https://classroom.github.com/a/3qPsfyyI GitHub classroom] +|: {url Задачи;./week2/} || {url Решения;https://github.com/Syndamia/oop-2023-solutions/tree/main/week02} || {url GitHub classroom;https://classroom.github.com/a/3qPsfyyI} |: 3 |: 07.03.2024 -|: [url ./week3/ Задачи] \|\| [url https://github.com/Syndamia/oop-2023-solutions/tree/main/week03 Решения] \|\| [url https://classroom.github.com/a/KPMqXsFp GitHub classroom] +|: {url Задачи;./week3/} || {url Решения;https://github.com/Syndamia/oop-2023-solutions/tree/main/week03} || {url GitHub classroom;https://classroom.github.com/a/KPMqXsFp} |: 4 |: 14.03.2024 -|: [url ./week4/ Задачи] \|\| [url https://github.com/Syndamia/oop-2023-solutions/tree/main/week04 Решения] \|\| [url https://classroom.github.com/a/qa_FfWeG GitHub classroom] +|: {url Задачи;./week4/} || {url Решения;https://github.com/Syndamia/oop-2023-solutions/tree/main/week04} || {url GitHub classroom;https://classroom.github.com/a/qa_FfWeG} |: 5 |: 21.03.2024 -|: [url ./week5/ Задачи] \|\| [url https://github.com/Syndamia/oop-2023-solutions/tree/main/week05 Решения] \|\| [url https://classroom.github.com/a/42ZZ56Mg GitHub classroom] +|: {url Задачи;./week5/} || {url Решения;https://github.com/Syndamia/oop-2023-solutions/tree/main/week05} || {url GitHub classroom;https://classroom.github.com/a/42ZZ56Mg} |: 6 |: 28.03.2024 -|: [url ./week6/ Задачи] \|\| [url https://github.com/Syndamia/oop-2023-solutions/tree/main/week06 Решения] \|\| [url https://classroom.github.com/a/rzSTn5pu GitHub classroom] +|: {url Задачи;./week6/} || {url Решения;https://github.com/Syndamia/oop-2023-solutions/tree/main/week06} || {url GitHub classroom;https://classroom.github.com/a/rzSTn5pu} |: 7 |: 04.04.2024 -|: [url ./week7/ Задачи] \|\| [url https://github.com/Syndamia/oop-2023-solutions/tree/main/week07 Решения] \|\| [url https://classroom.github.com/a/vvZENbkX GitHub classroom] +|: {url Задачи;./week7/} || {url Решения;https://github.com/Syndamia/oop-2023-solutions/tree/main/week07} || {url GitHub classroom;https://classroom.github.com/a/vvZENbkX} |: 8 |: 11.04.2024 -|: [url ./week8/ Задачи] \|\| [url https://github.com/Syndamia/oop-2023-solutions/tree/main/week08 Решения] \|\| [url https://classroom.github.com/a/7d0MBjcK GitHub classroom] +|: {url Задачи;./week8/} || {url Решения;https://github.com/Syndamia/oop-2023-solutions/tree/main/week08} || {url GitHub classroom;https://classroom.github.com/a/7d0MBjcK} |: 9 |: 18.04.2024 -|: [url ./week9/ Задачи] \|\| [url https://github.com/Syndamia/oop-2023-solutions/tree/main/week09 Решения] \|\| [url https://classroom.github.com/a/wlL1oUg2 GitHub classroom] +|: {url Задачи;./week9/} || {url Решения;https://github.com/Syndamia/oop-2023-solutions/tree/main/week09} || {url GitHub classroom;https://classroom.github.com/a/wlL1oUg2} |: 10 |: 25.04.2024 -|: [url ./week10/ Задачи] \|\| [url https://github.com/Syndamia/oop-2023-solutions/tree/main/week10 Решения] \|\| [url https://classroom.github.com/a/PbkITWhF GitHub classroom] +|: {url Задачи;./week10/} || {url Решения;https://github.com/Syndamia/oop-2023-solutions/tree/main/week10} || {url GitHub classroom;https://classroom.github.com/a/PbkITWhF} |: 11 |: 09.05.2024 -|: [url ./week11/ Задачи] \|\| [url https://github.com/Syndamia/oop-2023-solutions/tree/main/week11 Решения] \|\| [url https://classroom.github.com/a/oYQehcnN GitHub classroom] [=Това упражнение е от 11:15 до 13:15=] +|: {url Задачи;./week11/} || {url Решения;https://github.com/Syndamia/oop-2023-solutions/tree/main/week11} || {url GitHub classroom;https://classroom.github.com/a/oYQehcnN} {b Това упражнение е от 11:15 до 13:15} |: 12 |: 09.05.2024 -|: [url ./week12/ Задачи] \|\| [url https://github.com/Syndamia/oop-2023-solutions/tree/main/week12 Решения] \|\| [url https://classroom.github.com/a/o7hNz1pr GitHub classroom] +|: {url Задачи;./week12/} || {url Решения;https://github.com/Syndamia/oop-2023-solutions/tree/main/week12} || {url GitHub classroom;https://classroom.github.com/a/o7hNz1pr} |: 13 |: 16.05.2024 -|: [url ./week13/ Задачи] \|\| [url https://github.com/Syndamia/oop-2023-solutions/tree/main/week13 Решения] \|\| [url https://classroom.github.com/a/GvV1wrC1 GitHub classroom] +|: {url Задачи;./week13/} || {url Решения;https://github.com/Syndamia/oop-2023-solutions/tree/main/week13} || {url GitHub classroom;https://classroom.github.com/a/GvV1wrC1} |: 14 |: 23.05.2024 -|: [url ./week14/ Задачи] <!-- \|\| [url https://github.com/Syndamia/oop-2023-solutions/tree/main/week12 Решения] --> \|\| [url https://classroom.github.com/a/K0XomKEP GitHub classroom] +|: {url Задачи;./week14/} <!-- || {url Решения;https://github.com/Syndamia/oop-2023-solutions/tree/main/week12} --> || {url GitHub classroom;https://classroom.github.com/a/K0XomKEP} |: 15 |: 30.05.2024 -|: [url ./week15/ Задачи] <!-- \|\| [url https://github.com/Syndamia/oop-2023-solutions/tree/main/week12 Решения] --> \|\| [url https://classroom.github.com/a/z2QadyEE GitHub classroom] [=Това упражнение е от 11:15 до 13:15=] +|: {url Задачи;./week15/} <!-- || {url Решения;https://github.com/Syndamia/oop-2023-solutions/tree/main/week12} --> || {url GitHub classroom;https://classroom.github.com/a/z2QadyEE} {b Това упражнение е от 11:15 до 13:15} |: 16 |: 06.06.2024 -|: [url ./week16/ Задачи] <!-- \|\| [url https://github.com/Syndamia/oop-2023-solutions/tree/main/week12 Решения] --> \|\| [url https://classroom.github.com/a/BWjw2dUC GitHub classroom] +|: {url Задачи;./week16/} <!-- || {url Решения;https://github.com/Syndamia/oop-2023-solutions/tree/main/week12} --> || {url GitHub classroom;https://classroom.github.com/a/BWjw2dUC} diff --git a/src/teaching/oop-2023/week1/good-software.du b/src/teaching/oop-2023/week1/good-software.du index 3f8fd9a..bb19eb0 100644 --- a/src/teaching/oop-2023/week1/good-software.du +++ b/src/teaching/oop-2023/week1/good-software.du @@ -1,4 +1,7 @@ -# Основни добри софтуерни практики - ООП, Седмица 1, 22.02.2024 +'def title Основни добри софтуерни практики - ООП, Седмица 1, 22.02.2024 +'def desc Миналия семестър не ни стигна времето да обсъдим домашното по-сериозно. Главния проблем, който забелязах, беше колко грозно и нагласено бяха написани решенията. Ще поговорим по тази тема. + +# {title} \n @@ -6,7 +9,7 @@ Главния проблем, който забелязах, беше колко грозно и нагласено бяха написани решенията. Като въведение в ООП, ще поговорим по тази тема. -[$presentation-controller] +{presentation-controller} :title_slide @@ -18,7 +21,7 @@ ## Какво прави програмиста с чужд код? -[$br4] +{br4} .numbered 1. Чете @@ -32,17 +35,19 @@ ## Подобряване на четене -[$br4] +{br4} .unordered - Лично вярвам, че четимост е по-важна от конвенции - Човек вижда най-лесно "контрастни" шаблони ``` +'emplace . . 0.00.0 010010 815213 000000 000000 738438 . . .0000. 100001 122481 .... 0....0 011110 511119 +'endemplace Както виждате, в примера има усмихнато личице, "закодирано" по различни начини. @@ -54,7 +59,7 @@ :middle_slide -Труден за четене код [*(забелязвате ли грешките?)*]: +Труден за четене код {i (забелязвате ли грешките?)}: .font22 ``` @@ -84,7 +89,7 @@ if (board[a][b][i] == ' ') { :middle_slide -По-лесен за четене код [*(а сега виждат ли се по-лесно?)*]: +По-лесен за четене код {i (а сега виждат ли се по-лесно?)}: :font18 :code @@ -120,7 +125,7 @@ for (int i = 0; i < layers; i++) -Би трябвало да е малко по-лесно, в последния [`if`] имаме "e[=n=]ptyRow", което е печатната грешка, [`!=`] което трябва да бъде [`==`] и липсва въвеждането на [`b`] след първия [`if`]. +Би трябвало да е малко по-лесно, в последния {` if} имаме "e{b n}ptyRow", което е печатната грешка, {` !=} което трябва да бъде {` ==} и липсва въвеждането на {` b} след първия {` if}. Примерът не е перфектен, но илюстрира какво се опитвам да кажа: формата на код е от огромно значение, обръщайте ѝ внимание. @@ -130,20 +135,20 @@ for (int i = 0; i < layers; i++) ## Абстракцията - улеснява изучаване И употреба/модификация -[$br1] +{br1} .bulleted - Разделяме обработване на стойностите от директната имплементацията - Създаваме нови "машинни инструкции" -[$br1] +{br1} .bulleted -- [`doX()`] е по-лошо от [`do(X)`] +- {` doX()} е по-лошо от {` do(X)} .unordered - - можем да преизползваме [`do()`] за неща, различни от [`X`] - - един път разбрано, всяка употреба на [`do()`] също е разбрана; този стил кара [`do()`] да бъде по-обща функция, което я прави по-лесна за разбиране - - модификация на [`do(X)`] се свежда до заменяне на [`do()`] с [`doOther()`] или до заменяне на [`X`] с [`Y`]; променяме "инструкцията" или променяме данната + - можем да преизползваме {` do()} за неща, различни от {` X} + - един път разбрано, всяка употреба на {` do()} също е разбрана; този стил кара {` do()} да бъде по-обща функция, което я прави по-лесна за разбиране + - модификация на {` do(X)} се свежда до заменяне на {` do()} с {` doOther()} или до заменяне на {` X} с {` Y}; променяме "инструкцията" или променяме данната Нека сега разгледаме няколко примера, първият е много груб и елементарен, но служи за добро начало: @@ -168,14 +173,14 @@ int fib5() │ int fib(int n) Би трябвало да е супер очевидно, никой няма да пише отделна функция на Фибоначи за всяко число. -Нека сега да разгледаме няколко "реални" примера, свързани с домашното (за припомняне, условието се намира [url https://learn.fmi.uni-sofia.bg/mod/assign/view.php?id=296069 тук]). +Нека сега да разгледаме няколко "реални" примера, свързани с домашното (за припомняне, условието се намира {url тук;https://learn.fmi.uni-sofia.bg/mod/assign/view.php?id=296069}). Самите решения няма винаги да са добре форматирани, това е направено с цел да се поберат добре в слайда. Първия е върху функция, която приема координатите на плочка, премахва я от дъската (ако съществува) и я слага в края на празния ред. :slide -Лошо - [`doX()`] в тялото на функцията +Лошо - {` doX()} в тялото на функцията ```cpp void tryTakeTile(char** board, int rows, int cols, @@ -201,16 +206,16 @@ void tryTakeTile(char** board, int rows, int cols, Повечето предадени работи са имплементирали функционалността по точно този начин. Замислете се обаче, какво става ако сменим типа данна, тоест ако дъската е триизмерна? -Тогава трябва да добавим още една [`int`] променлива, още едно условие в [`if`], трябва да я добавим при трите индексирания на [`board`]. +Тогава трябва да добавим още една {` int} променлива, още едно условие в {` if}, трябва да я добавим при трите индексирания на {` board}. -Какво става ако променим самата структура от данни за [`emptyRow`] (за сега сте учили само масиви, но скоро ще видите, че има и други начини да съхраняваш редица информация), тогава ще трябва да пренапишем целия цикъл. +Какво става ако променим самата структура от данни за {` emptyRow} (за сега сте учили само масиви, но скоро ще видите, че има и други начини да съхраняваш редица информация), тогава ще трябва да пренапишем целия цикъл. Тоест, ако променим нещо, трябва да пренапишем значителни части от самия код, и като разширим това върху 10-20 функции, изведнъж малка промяна става голяма. Нека сега да пренапишем функцията, използвайки колкото се може повече абстракция. :middle_slide -Добро - [`do(X)`] +Добро - {` do(X)} :code_cpp bool tryReadCoordinates(int& x, int& y) { @@ -233,9 +238,9 @@ void tryTakeTile(char** board, int rows, int cols, -Искаме трето измерение на [`board`]? -Няма проблем, написали сме нова [`tryReadCoordinates`], която приема три променливи, и в [`tryTakeTile`] добавяме една декларация и обновяваме двете индексирания на [`board`]. -Ако [`emptyRow`] стане друг тип данна, просто променяме функцията да бъде [`appendToOtherDataType`] и сме готови. +Искаме трето измерение на {` board}? +Няма проблем, написали сме нова {` tryReadCoordinates}, която приема три променливи, и в {` tryTakeTile} добавяме една декларация и обновяваме двете индексирания на {` board}. +Ако {` emptyRow} стане друг тип данна, просто променяме функцията да бъде {` appendToOtherDataType} и сме готови. И ако тази промяна трябва да се направи в много функции, даже бихме могли да употребяваме функционалност на самия текстов редактор да търси и заменя срещания на един низ с друг. @@ -244,7 +249,7 @@ void tryTakeTile(char** board, int rows, int cols, :slide -Лошо - всички цикли са [`doX()`] +Лошо - всички цикли са {` doX()} ```cpp void generateLayer(char** layer, int rows, int cols, @@ -272,15 +277,15 @@ void generateLayer(char** layer, int rows, int cols, Този сегмент е по-интересен за променяне от преди, понеже за да го направим хубаво трябва да променим самата ни логика. Запълването със шпации е ясно, обаче случайното поставяне на плочки не е. -Ако имаме функция [`placeRandomЕлемент`] която само поставя една плочка в слоя, пак ще имаме вложени цикли, трябва да има начин да останем с един цикъл. -Ако направим [`placeRandomElementNTimes`], тогава пък абстрахираната функция става твърде специфична и вече имаме [`doX()`] при самата нея. +Ако имаме функция {` placeRandomЕлемент} която само поставя една плочка в слоя, пак ще имаме вложени цикли, трябва да има начин да останем с един цикъл. +Ако направим {` placeRandomElementNTimes}, тогава пък абстрахираната функция става твърде специфична и вече имаме {` doX()} при самата нея. Чрез функционално програмиране този проблем може да се разреши лесно, обаче вие ще го учите следващия семестър. С достатъчно размишления, може да стигнем до следния вариант: вместо всяка плочка да я поставяме на случайна позиция, защо не поставим всички плочки една след друга и не разбъркаме слоя? :middle_slide -Добро - [`do(X)`] +Добро - {` do(X)} ```cpp void generateLayer(char** layer, int rows, int cols, @@ -296,7 +301,7 @@ void generateLayer(char** layer, int rows, int cols, shuffleMatrix(layer, rows, cols); } -[=Бонус:=] работи по-коректно от преди +{b Бонус:} работи по-коректно от преди В предходния вариант, ако примерно цялата е пълна освен една клетка, и трябва да поставим една финална плочка, тогава трябва да чакаме докато случайните стойности се напаснат точно с координатите на тази една клетка. @@ -304,14 +309,14 @@ void generateLayer(char** layer, int rows, int cols, Даже, този проблем става все по-тегав с времето: с всяка запълнена клетка, шанса случайните стойности да ударят на заети координати се увеличава. Докато тук, нямаме този проблем, отнема някакво консистентно предопределено време да разбъркаме матрицата. -Как имплементираме [`shuffleMatrix`] си има и своите тънкости, но най-елементарния начин е просто да направим сортираш алгоритъм, при който вместо да сравним две стойности, използваме случайна стойност, която определя дали ще разменим плочките. +Как имплементираме {` shuffleMatrix} си има и своите тънкости, но най-елементарния начин е просто да направим сортираш алгоритъм, при който вместо да сравним две стойности, използваме случайна стойност, която определя дали ще разменим плочките. Друго хубаво нещо на решения с абстракция, е един лек лавинен ефект, където веднъж като почнем да мислим за абстракции, намираме къде да ги ползваме навсякъде. Да разгледаме същата функция, обаче при D подточка. :middle_slide -Решения със слоеве правят същото. Лошо - [`doX()`] при циклите: +Решения със слоеве правят същото. Лошо - {` doX()} при циклите: ```cpp void generate(char*** board, int rows, int cols, int layers, @@ -325,13 +330,13 @@ void generate(char*** board, int rows, int cols, int layers, } -Без абстракция отново ще пренапишем голяма част от [`generate`] функцията, за да се побере на слайда съм оставил само "най-сложната" промяна - случайните стойности. -Пак, имаше решения на подточката, без преизползване на [`generate`] за един слой. -Айде да разгледаме решението, заедно с абстрахираната [`generate`]. +Без абстракция отново ще пренапишем голяма част от {` generate} функцията, за да се побере на слайда съм оставил само "най-сложната" промяна - случайните стойности. +Пак, имаше решения на подточката, без преизползване на {` generate} за един слой. +Айде да разгледаме решението, заедно с абстрахираната {` generate}. :slide -Добро - [`do(X)`] +Добро - {` do(X)} ```cpp void generateLayer(char** layer, int rows, int cols, @@ -357,14 +362,14 @@ void generate(char*** board, int rows, int cols, int layers, Супер елементарно, има-няма 5-6 реда код промяна, при генериране за всеки слой, просто извикваме функцията за генериране върху един слой, за всеки слой. А в самата функция само премахваме броя вмъкнати плочки от сумата на даден тип. -Наблюдателните са забелязали, че в "ръчното" решение слоевете са третия индекс, тоест имаме [`board[x][y][layer]`], докато в това решение е първия, тоест [`board[layer][x][y]`]. +Наблюдателните са забелязали, че в "ръчното" решение слоевете са третия индекс, тоест имаме {` board[x][y][layer]}, докато в това решение е първия, тоест {` board[layer][x][y]}. Разликата е значителна, но от гледна точка на код, особено когато използваме абстракция, промяната е лесна. Иначе, в момента се намираме в много добра позиция, без абстракция как правим рестартирането на играта? По условие броя и типовете плочки трябва да се запазят, но позиции не. Истината е, че става малко тромаво: цикълът за намираме на позиции се преизползва, и броя плочки трябва да се запази. -Обаче, сега това става с едно [`shuffleMatrix`], не е нужно нищо специално да правим! +Обаче, сега това става с едно {` shuffleMatrix}, не е нужно нищо специално да правим! :middle_slide35 @@ -372,7 +377,7 @@ void generate(char*** board, int rows, int cols, int layers, .unordered - Целта на коментарите е да направи разбиране и модификация на код по-лесни. -- В повечето случаи, коментарът трябва да ни дава [*нова*] информация или да [*свърже*] парчета информация +- В повечето случаи, коментарът трябва да ни дава {i нова} информация или да {i свърже} парчета информация Да разгледаме следния пример. @@ -401,7 +406,7 @@ for (int i = 0; i < rows; i++) { } -При добрия вариант, получаваме нова информация, че това запълване се случва понеже ще подаваме към някаква си [`functionX`], и че евентуално може да има други функции, при които празни клетки може да не се обозначават с [`'\0'`]. +При добрия вариант, получаваме нова информация, че това запълване се случва понеже ще подаваме към някаква си {` functionX}, и че евентуално може да има други функции, при които празни клетки може да не се обозначават с {` '\0'}. В лошия можем да стигнем до същото заключение като погледнем самия код. :comment @@ -412,9 +417,9 @@ for (int i = 0; i < rows; i++) { .quote For practical reasons, the demonstration programs must be small, many times smaller than the "life-size programs" I have in mind. My basic problem is that precisely this difference in scale is one of the major sources of our difficulties in programming! -— Edsger W. Dijkstra, [url https://www.cs.utexas.edu/users/EWD/ewd02xx/EWD249.PDF Notes on Structured Programming, On our inability to do much] +— Edsger W. Dijkstra, {url Notes on Structured Programming, On our inability to do much;https://www.cs.utexas.edu/users/EWD/ewd02xx/EWD249.PDF} -[$br1] +{br1} Решение на цялото домашно, с описаните методи TODO @@ -424,13 +429,13 @@ for (int i = 0; i < rows; i++) { -Умението да разрешиш един проблем [*не те*] прави добър програмист, да го разрешиш по четим, разширяем, лесен, ефикасен, ... начин [*те*] прави добър програмист. +Умението да разрешиш един проблем {i не те} прави добър програмист, да го разрешиш по четим, разширяем, лесен, ефикасен, ... начин {i те} прави добър програмист. :slide35 ## Изводи -[$br4] +{br4} .unordered - Форматирайте/подравнявайте си кода, искате лесно четене diff --git a/src/teaching/oop-2023/week1/index.du b/src/teaching/oop-2023/week1/index.du index f229343..5dd5787 100644 --- a/src/teaching/oop-2023/week1/index.du +++ b/src/teaching/oop-2023/week1/index.du @@ -1,17 +1,20 @@ -# Задачи - ООП, Седмица 1, 22.02.2024 +'def title Задачи - ООП, Седмица 1, 22.02.2024 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/UPJOzHty classroom.github.com/a/UPJOzHty] +GitHub classroom: {url classroom.github.com/a/UPJOzHty;https://classroom.github.com/a/UPJOzHty} ## Задача 1 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise1.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise1.cpp} Имплементирайте низ чрез структура. В структурата трябва да запазвате указател към низа и неговата дължина. -Имплементирайте функция [`concatString`], която приема две структури от този тип и връща низ, пак в същата структура, който е конкатенация (слепване) на първите два низа. +Имплементирайте функция {` concatString}, която приема две структури от този тип и връща низ, пак в същата структура, който е конкатенация (слепване) на първите два низа. .question Има ли значение дали типовете на аргументите, или на върнатата стойност, са референции или указатели (или нито едното)? @@ -19,35 +22,36 @@ GitHub classroom: [url https://classroom.github.com/a/UPJOzHty classroom.github. ## Задача 2 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise2.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise2.cpp} Имплементирайте структура за динамично-заделен масив от целочислени числа. Тя трябва да запазва указател към масива, размера на масива и бройката на елементи в масива. Заделянето на динамична памет е бавна операция, затова винаги ще заделяме повече клетки, отколкото са ни нужни. -Имплементирайте функция [`resize`], която удвоява размера на масива (нека първоначалния размер на масива е 2), на подадена стойност от тип вашата структура. +Имплементирайте функция {` resize}, която удвоява размера на масива (нека първоначалния размер на масива е 2), на подадена стойност от тип вашата структура. -Имплементирайте функция [`addToEnd`], която приема (инстанция на) структурата ви и вмъква елемент в първата незаета позиция. +Имплементирайте функция {` addToEnd}, която приема (инстанция на) структурата ви и вмъква елемент в първата незаета позиция. В самия код тествайте функциите (не е нужен потребителски вход). ## Задача 3 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise3.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise3.cpp} Разглеждате "пакети" (логове) информация от редица датчици. Един пакет запазва времето, когато информацията е била отчетена от датчиците, и стойностите на всички датчици: температура, атмосферно налягане, влажност и надморска височина. Всички типове данни са целочислени. От входа получавате N, броя пакети, които трябва да запазите, и след това 5N на брой целочислени стойности. -Накрая получавате буква: [`t`], [`p`], [`h`], [`e`], всяка съответства на някоя отделна стойност от датчиците. +Накрая получавате буква: {` t}, {` p}, {` h}, {` e}, всяка съответства на някоя отделна стойност от датчиците. Трябва да изкарате на екрана всичките стойности от пакетите, подредени в нарастващ ред на времето, като всички след първата са разликите им спрямо първата. -[=Пример:=] +{b Пример:} -:table_2 +:table +:2 |= Вход |= Изход @@ -65,29 +69,31 @@ p |: -15 87 109 79 3 75 + ## Задача 4 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise4.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise4.cpp} -'footnote sabre Защото една от първите индустрии, които са се нуждаели от компютърни системи, била [url https://en.wikipedia.org/wiki/Sabre_%28travel_reservation_system%29#History авиационната индустрия]. +'footnote sabre Защото една от първите индустрии, които са се нуждаели от компютърни системи, била {url авиационната индустрия;https://en.wikipedia.org/wiki/Sabre_%28travel_reservation_system%29#History}. -Направете структура за съхранение на полети[$sabre]. +Направете структура за съхранение на полети{sabre}. Трябва да запазите имената на началния и крайния град като низове (допускаме, че няма шпации в имената на градовете), часът на излитане и на кацане в целочислен формат (като на циферблат на дигитален часовник, без разделителното двоеточие) и цената на полета в тип с плаваща запетая (в долари). ### а) въвеждане -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise4.cpp#L15-L36 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise4.cpp#L15-L36} От входа получавате N, това определя броя полети, които трябва да се добавят в системата. Всеки полет е редица от 5 стойности, в реда в който са дефинирани. -[*Напомням, че това е нагласено да ползвате [`std::cin`] вместо ръчно да обработвате целия ред.*] +{i Напомням, че това е нагласено да ползвате {` std::cin} вместо ръчно да обработвате целия ред.} Изкарайте началните и крайните градове, както и цената на полетите, подредени в нарастващ ред на час на излитане. -[=Пример:=] +{b Пример:} -:table_2 +:table +:2 |= Вход |= Изход @@ -109,9 +115,10 @@ Berlin Paris 140 Paris NewYork 500 + ### б) търсене -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise4.cpp#L38-L247 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise4.cpp#L38-L247} След като се въведат всички полети, получавате от входа два низа - имена на градове. Трябва да изкарате най-евтиния, и след него най-бързия, вариант за пътуване от първия град към втория. @@ -119,9 +126,10 @@ Paris NewYork 500 Прикачване между полети е позволено, така че под "вариант" трябва да изкарате всичките полети, които са решение. За един полет е нужно да изкарате само началния град, крайния град, час на излитане и цена, като градовете трябва да са подредени в нарастващ ред на часа на излитане. -[=Пример:=] +{b Пример:} -:table_2 +:table +:2 |= Вход |= Изход @@ -144,11 +152,12 @@ Quickest: Sofia NewYork 0610 800 + ## Задача 5 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise5.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise5.cpp} -Имате система за потребители, всеки потребител си има име и приятели (един приятел е [=указател към потребител=]). +Имате система за потребители, всеки потребител си има име и приятели (един приятел е {b указател към потребител}). В началото се въвежда N, това е броят потребители в системата. За един потребител, първо се въвежда на нов ред името му, след това броя на неговите приятели и накрая, на отделни редове, имената на всички тези приятели. @@ -156,9 +165,10 @@ Sofia NewYork 0610 800 Накрая получавате едно име, това е началния потребител. Трябва да намерите, започвайки от него, с колко други потребителя има някаква приятелска връзка (директна, приятел на приятел, приятел на приятел на приятел, ...). -[=Пример:=] +{b Пример:} -:table_2 +:table +:2 |= Вход |= Изход diff --git a/src/teaching/oop-2023/week1/organization.du b/src/teaching/oop-2023/week1/organization.du index 3732566..b16b1f3 100644 --- a/src/teaching/oop-2023/week1/organization.du +++ b/src/teaching/oop-2023/week1/organization.du @@ -1,8 +1,11 @@ -# Организация - ООП, Седмица 1, 22.02.2024 +'def title Организация - ООП, Седмица 1, 22.02.2024 +'def desc Организационни бележки и новини + +# {title} \n -[$presentation-controller] +{presentation-controller} :title_slide35 @@ -39,16 +42,16 @@ :middle_slide35 :unordered -- Зачитат се [=единствено нещата, качени в GitHub classroom, качени в срок=] +- Зачитат се {b единствено нещата, качени в GitHub classroom, качени в срок} .unordered - - До [=15=] минути след края на часа + - До {b 15} минути след края на часа - Както преди, не е нужно да присъствате, за да качвате решения - Ако случайно някой не знае как се ползва: -.centered [url ../upp-2023/week1/setup.html?a syndamia.com/upp-2023/week1/setup.html?a] +.centered {url syndamia.com/upp-2023/week1/setup.html?a;../upp-2023/week1/setup.html?a} Който по време на УП е използвал GitHub classroom не би трябвало да прави нещо, продължавате си по старо му, със същите акаунти. -Разбира се, за всякакви проблеми се [url ../upp-2023/week1/welcome.html?a#section-4 свържете с мен]. +Разбира се, за всякакви проблеми се {url свържете с мен;../upp-2023/week1/welcome.html?a#section-4}. diff --git a/src/teaching/oop-2023/week10/index.du b/src/teaching/oop-2023/week10/index.du index d36406b..1cc62a5 100644 --- a/src/teaching/oop-2023/week10/index.du +++ b/src/teaching/oop-2023/week10/index.du @@ -1,8 +1,11 @@ -# Задачи - ООП, Седмица 10, 25.04.2024 +'def title Задачи - ООП, Седмица 10, 25.04.2024 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/PbkITWhF classroom.github.com/a/PbkITWhF] +GitHub classroom: {url classroom.github.com/a/PbkITWhF;https://classroom.github.com/a/PbkITWhF} ## Преговорни @@ -10,14 +13,14 @@ GitHub classroom: [url https://classroom.github.com/a/PbkITWhF classroom.github. ### Задача 1 - Шаблони -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise01 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise01} -Реализирайте шаблонен клас [`Array`], който запазва динамично-заделен и оразмеряем масив от елементи с подаден тип. +Реализирайте шаблонен клас {` Array}, който запазва динамично-заделен и оразмеряем масив от елементи с подаден тип. Имплементирайте голяма четворка. ### Задача 2 - Оператори -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise02 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise02} За предходния шаблонен клас имплементирайте оператори: @@ -28,11 +31,11 @@ GitHub classroom: [url https://classroom.github.com/a/PbkITWhF classroom.github. ### Задача 3 - Грешки -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise03 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise03} Имплементирайте функция, която приема име на текстов файл и изкарва на екрана първия ред от него. Ако файлът не може да бъде отворен, хвърлете грешка - низ. -Ако във файлът няма други редове (няма знакът [`'\\n'`]), тогава хвърлете грешка число - размерът на файла. +Ако във файлът няма други редове (няма знакът {` '\\n'}), тогава хвърлете грешка число - размерът на файла. В главната функция, приемете името на файла от потребителския вход и извикайте функцията. Ако файлът не може да бъде отворен, тогава изкарайте хвърлената грешка на терминала и приключете програмата (успешно). @@ -42,85 +45,85 @@ GitHub classroom: [url https://classroom.github.com/a/PbkITWhF classroom.github. ### Задача 4 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise04 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise04} -Реализирайте клас [`Time24`], който запазва час и минути (в 24-часов формат) в две отделни целичислени член-данни. -Имплементирайте член-функция [`Print24`], която изкарва часа на екрана в 24-часов формат. +Реализирайте клас {` Time24}, който запазва час и минути (в 24-часов формат) в две отделни целичислени член-данни. +Имплементирайте член-функция {` Print24}, която изкарва часа на екрана в 24-часов формат. Нека конструкторът му приема две целочислени променливи, една за часа и втора за минутите. -Реализирайте негов наследник [`Time12`], който имплементира метод [`Print12`], принтиращ часа в 12-часов формат. +Реализирайте негов наследник {` Time12}, който имплементира метод {` Print12}, принтиращ часа в 12-часов формат. Имплементирайте и негов конструктор, който приема две целочислени променливи (една за часа и една за минутите), заедно с булева променлива описваща дали часа е следобеден или не. ### Задача 5 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise05 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise05} -Реализирайте клас [`FN`], който запазва факултетен номер като неотрицателно цяло число от 5 цифри. -Реализирайте негов наследник [`ModernFN`], който запазва и начален (префиксен) низ, състоящ се от цифра, две букви и още две цифри. +Реализирайте клас {` FN}, който запазва факултетен номер като неотрицателно цяло число от 5 цифри. +Реализирайте негов наследник {` ModernFN}, който запазва и начален (префиксен) низ, състоящ се от цифра, две букви и още две цифри. -Имплементирайте конструктори, като този на [`FN`] приема число, докато този на [`ModernFN`] приема низ, състоящ се от целия факултетен номер (и трябва да конвертирате последните 5 цифри към число). -Имплементирайте метод [`PrintOldFN`] на класа [`FN`] и метод [`PrintNewFN`] на класа [`ModernFN`], които изкарват целия факултетен номер на съответния клас. +Имплементирайте конструктори, като този на {` FN} приема число, докато този на {` ModernFN} приема низ, състоящ се от целия факултетен номер (и трябва да конвертирате последните 5 цифри към число). +Имплементирайте метод {` PrintOldFN} на класа {` FN} и метод {` PrintNewFN} на класа {` ModernFN}, които изкарват целия факултетен номер на съответния клас. ### Задача 6 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise06 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise06} -Реализирайте клас [`Grade`], който запазва оценка (от 2 до 6) като неотрицателна целочислена член-данна. -Реализирайте и негов наследник [`GradeWithName`], който запазва и името на оценката като низ с произволна дължина. +Реализирайте клас {` Grade}, който запазва оценка (от 2 до 6) като неотрицателна целочислена член-данна. +Реализирайте и негов наследник {` GradeWithName}, който запазва и името на оценката като низ с произволна дължина. -Конструктора на [`Grade`] приема само числовата стойност, докато този на наследника приема и името на оценката. -Имплементирайте голяма петица на [`GradeWithName`]. +Конструктора на {` Grade} приема само числовата стойност, докато този на наследника приема и името на оценката. +Имплементирайте голяма петица на {` GradeWithName}. ### Задача 7 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise07 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise07} -Реализирайте клас [`String`], който запазва низ с произволна дължина. -Имплементирайте голяма петица и член-функция [`At`], която приема индекс и връща референция към буквата на този индекс (при невалиден индекс хвърляте грешка). +Реализирайте клас {` String}, който запазва низ с произволна дължина. +Имплементирайте голяма петица и член-функция {` At}, която приема индекс и връща референция към буквата на този индекс (при невалиден индекс хвърляте грешка). -Реализирайте негов наследник [`FileString`], който запазва и името на текстов файл като низ с произволна дължина. +Реализирайте негов наследник {` FileString}, който запазва и името на текстов файл като низ с произволна дължина. Ако е нужно, имплементирайте голяма петица. -Самия низ в [`FileString`] е първия низ (начало първата буква и край [`'\\n'`]) от файла с подадено име. +Самия низ в {` FileString} е първия низ (начало първата буква и край {` '\\n'}) от файла с подадено име. -Имплементирайте метод [`ChangeAt`], който приема индекс и нова буква, променя буквата на дадения индекс с подадената и обновява файла със запазеното име. +Имплементирайте метод {` ChangeAt}, който приема индекс и нова буква, променя буквата на дадения индекс с подадената и обновява файла със запазеното име. ### Задача 8 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise08 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise08} -Реализирайте клас [`User`], който запава име и парола като два низа с произволна дължина. -Реализирайте негов наследник [`Moderator`], който запазва и подпис, който също е низ с произволна дължина. -Реализирайте наследник [`Administrator`] на [`Moderator`], който запазва и оразмеряващ се масив от цели числа. +Реализирайте клас {` User}, който запава име и парола като два низа с произволна дължина. +Реализирайте негов наследник {` Moderator}, който запазва и подпис, който също е низ с произволна дължина. +Реализирайте наследник {` Administrator} на {` Moderator}, който запазва и оразмеряващ се масив от цели числа. Идеята е, че всяко действие от модератор или администратор се "подписва" публично (за да се знае, че той го е направил, дори да си смени името), а за администратор допълнително пазим масив от идентификатори на форуми, които администрира. За всеки клас имплементирайте голяма петица и гетъри и сетъри за името и паролата, когато е нужно. -За [`Moderator`] имплементирайте гетър за подписа, но без сетър. -За [`Administrator`] имплементирайте методи за добавяне и премахване на идентификатор на форум. +За {` Moderator} имплементирайте гетър за подписа, но без сетър. +За {` Administrator} имплементирайте методи за добавяне и премахване на идентификатор на форум. ### Задача 9 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise09 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise09} -Реализирайте клас [`CommunicationPacket`], който запазва начален и краен адрес като две неотрицателни цели числа, заедно с трето число за размера на данните. +Реализирайте клас {` CommunicationPacket}, който запазва начален и краен адрес като две неотрицателни цели числа, заедно с трето число за размера на данните. В този клас никога няма данни, затова размера винаги е нула. -Реализирайте негови наследници [`StringPacket`] и [`IntPacket`], където първия запазва и низ с произволна дължина (и дължината му е размера на данните) докато втория запазва и едно цяло число (и размера на [`int`] е размера на данните). +Реализирайте негови наследници {` StringPacket} и {` IntPacket}, където първия запазва и низ с произволна дължина (и дължината му е размера на данните) докато втория запазва и едно цяло число (и размера на {` int} е размера на данните). Размерът не се подава на конструктори, а се изчислява в конструктори. Имплементирайте голяма петица и конструктори с нужните параметри. ### Задача 10 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise10 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week10/Exercise10} -Реализирайте клас [`String`], който запазва низ с произволна дължина, и имплементира оператори ==, !=, + (който връща нов низ с конкатенацията на двата низа). +Реализирайте клас {` String}, който запазва низ с произволна дължина, и имплементира оператори ==, !=, + (който връща нов низ с конкатенацията на двата низа). -Реализирайте негов наследник [`ModifiableString`], който имплементира оператор[] (връщащ референция към буквата на дадения индекс) и оператор+=. +Реализирайте негов наследник {` ModifiableString}, който имплементира оператор[] (връщащ референция към буквата на дадения индекс) и оператор+=. -Реализирайте наследник на [`ModifiableString`], [`ShowableString`], който имплементира оператори << и >>. -Реализирайте наследник на [`ModifiableString`], [`SaveableString`], който имплементира методи write и read, приемащи име на двоичен файл и записващи или четещи низа от този файл. +Реализирайте наследник на {` ModifiableString}, {` ShowableString}, който имплементира оператори << и >>. +Реализирайте наследник на {` ModifiableString}, {` SaveableString}, който имплементира методи write и read, приемащи име на двоичен файл и записващи или четещи низа от този файл. За всички класове имплементирайте голяма петица, когато е нужно. @@ -128,23 +131,23 @@ GitHub classroom: [url https://classroom.github.com/a/PbkITWhF classroom.github. ### Задача 11 -Реализирайте шаблонен клас [`Array`], който запазва оразмеряем масив с елементи от подаден тип. -Имплементирайте оператор== и оператор!=, заедно с метод [`isEmpty`]. +Реализирайте шаблонен клас {` Array}, който запазва оразмеряем масив с елементи от подаден тип. +Имплементирайте оператор== и оператор!=, заедно с метод {` isEmpty}. Концептуално идеята е, че този масив не може да се променя след като му се въведат стойностите от конструктора. -Реализирайте негов наследник [`PrintableArray`], който имплементира оператори << и >>. -Реализирайте наследник [`SaveableArray`] на [`Array`], който имплементира методи write и read, приемащи име на файл и булева стойност дали е двоичен или не, и съответно прочитат или запазват елементите от този масив във файла. +Реализирайте негов наследник {` PrintableArray}, който имплементира оператори << и >>. +Реализирайте наследник {` SaveableArray} на {` Array}, който имплементира методи write и read, приемащи име на файл и булева стойност дали е двоичен или не, и съответно прочитат или запазват елементите от този масив във файла. -Реализирайте трети наследник, [`ModifiableArray`], на [`Array`], в който са имплементирани член-функции: +Реализирайте трети наследник, {` ModifiableArray}, на {` Array}, в който са имплементирани член-функции: .unordered -- [`push`], която приема елемент и го вмъква в (десния) края на масива -- [`pop`], който премахва елемент от (десния) края на масива -- [`last`], който връща последния елемент от масива +- {` push}, която приема елемент и го вмъква в (десния) края на масива +- {` pop}, който премахва елемент от (десния) края на масива +- {` last}, който връща последния елемент от масива Може да се налага масива да се оразмерява. Като подсказка, имплементирайте си метод, наличен за класа и наследници, който вмъква елемент на произволен индекс. -Реализирайте наследник [`IndexableArray`] на [`ModifiableArray`], който имплементира оператор[]. +Реализирайте наследник {` IndexableArray} на {` ModifiableArray}, който имплементира оператор[]. Ако индекса е след края, тогава "вмъквате" елементи по подразбиране между края и подадения индекс, и връщате елемента от сега новия край. -Реализирайте наследник [`FrontableArray`] на [`ModifiableArray`], който имплементира методи [`pushf`] и [`popf`], които работят като [`push`] и [`pop`], но с елемента в началото на масива (първия елемент). +Реализирайте наследник {` FrontableArray} на {` ModifiableArray}, който имплементира методи {` pushf} и {` popf}, които работят като {` push} и {` pop}, но с елемента в началото на масива (първия елемент). diff --git a/src/teaching/oop-2023/week11/index.du b/src/teaching/oop-2023/week11/index.du index 295c2de..661a24f 100644 --- a/src/teaching/oop-2023/week11/index.du +++ b/src/teaching/oop-2023/week11/index.du @@ -1,165 +1,168 @@ -# Задачи - ООП, Седмица 11, 09.05.2024 +'def title Задачи - ООП, Седмица 11, 09.05.2024 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/oYQehcnN classroom.github.com/a/oYQehcnN] +GitHub classroom: {url classroom.github.com/a/oYQehcnN;https://classroom.github.com/a/oYQehcnN} ## Преговорни .warn Моля, не отделяйте на преговорните задачи повече от 30мин -.important Всеки бащин клас, във всички случаи, трябва да има виртуален деструктор ([`virtual ~ClassName();`]). +.important Всеки бащин клас, във всички случаи, трябва да има виртуален деструктор ({` virtual ~ClassName()\;}). ### Задача 1 - Шаблони и оператори -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise01 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise01} Реализирайте шаблонен клас множество, който запазва фиксиран брой елементи от подаден тип. Реализирайте голяма петица и оператори: .bulleted -- [`+`], [`+=`] които действат като обединение -- [`*`], [`*=`] които действат като сечение -- [`-`], [`-=`] които действат като допълнение +- {` +}, {` +=} които действат като обединение +- {` *}, {` *=} които действат като сечение +- {` -}, {` -=} които действат като допълнение ### Задача 2 - Наследяване -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise02 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise02} -Реализирайте клас [`Employee`], съхраняващ име на човек, позиция и департамент като низове със съответно дължина 512, 128 и 64, заедно със заплата като число с плаваща запетая. +Реализирайте клас {` Employee}, съхраняващ име на човек, позиция и департамент като низове със съответно дължина 512, 128 и 64, заедно със заплата като число с плаваща запетая. -Реализирайте негов наследник [`Manager`], който допълнително пази масив с фиксиран размер от Employee. +Реализирайте негов наследник {` Manager}, който допълнително пази масив с фиксиран размер от Employee. -Реализирайте наследника на [`Employee`], [`Developer`], който допълнително пази брой проекти върху който работи. +Реализирайте наследника на {` Employee}, {` Developer}, който допълнително пази брой проекти върху който работи. -Наследниците не могат да достъпят заплатата, но трябва да могат да достъпят другите данни на [`Employee`]. +Наследниците не могат да достъпят заплатата, но трябва да могат да достъпят другите данни на {` Employee}. ## Лесни ### Задача 3 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise03 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise03} .comment Динамично свързване, Inherit 3 -Реализирайте клас [`Electronics`], който съдържа модел (низ с максимална дължина от 255 знака), [`needsVolts`] и [`needsAmps`] (стойности с плаваща запетая). +Реализирайте клас {` Electronics}, който съдържа модел (низ с максимална дължина от 255 знака), {` needsVolts} и {` needsAmps} (стойности с плаваща запетая). Имплементирайте негови наследници: .bulleted -- [`Laptop`], който допълнително съхранява размер на екрана като число с плаваща запетая -- [`WashingMachine`], който допълнително запазва максимално тегло на прането, като цяло неотрицателно число -- [`Camera`], която допълнително запазва резолюция като число с плаваща запетая (в мегапиксели) +- {` Laptop}, който допълнително съхранява размер на екрана като число с плаваща запетая +- {` WashingMachine}, който допълнително запазва максимално тегло на прането, като цяло неотрицателно число +- {` Camera}, която допълнително запазва резолюция като число с плаваща запетая (в мегапиксели) -За всеки клас реализирайте член-функция [`Print`], която изкарва всички данни на екрана. +За всеки клас реализирайте член-функция {` Print}, която изкарва всички данни на екрана. -&:question Чрез статично или динамично свързване сте имплементирали [`Print`]? Каква е разликата? +&:question Чрез статично или динамично свързване сте имплементирали {` Print}? Каква е разликата? ### Задача 4 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise04 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise04} .comment Dynamic linking, Inherit 2 -Реализирайте клас [`String`], който запазва динамично-заделен масив. +Реализирайте клас {` String}, който запазва динамично-заделен масив. -Имплементирайте негов наследник [`Name`], който допълнително запазва число: номер на името (първо име, бащино име (второ име), фамилия (трето име)). +Имплементирайте негов наследник {` Name}, който допълнително запазва число: номер на името (първо име, бащино име (второ име), фамилия (трето име)). -Имплементирайте втори наследник на [`String`], [`Street`], който запазва и число: номер на улицата. +Имплементирайте втори наследник на {` String}, {` Street}, който запазва и число: номер на улицата. -Във всеки клас имплементирайте голяма петица, член-функция [`Length`], като: +Във всеки клас имплементирайте голяма петица, член-функция {` Length}, като: .bulleted -- в [`String`] връща дължината на низа, -- в [`Name`] връща дължината на името умножена по номера си и -- в [`Street`] връща дължината на името на улицата плюс броя цифри в номера на улицата. +- в {` String} връща дължината на низа, +- в {` Name} връща дължината на името умножена по номера си и +- в {` Street} връща дължината на името на улицата плюс броя цифри в номера на улицата. -Самият низ в [`String`] [=не=] може да се достъпва от наследниците. +Самият низ в {` String} {b не} може да се достъпва от наследниците. ### Задача 5 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise05 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise05} .comment Templates 1 type -Реализирайте шаблонен клас [`Counted`], който запазва елемент от подаден тип и неговата бройка (цяло неотрицателно число). -Имплементирайте оператори [`++`], [`--`], [`+=`], [`-=`], които променят бройката, както и гетъри за елемента и бройката. +Реализирайте шаблонен клас {` Counted}, който запазва елемент от подаден тип и неговата бройка (цяло неотрицателно число). +Имплементирайте оператори {` ++}, {` --}, {` +=}, {` -=}, които променят бройката, както и гетъри за елемента и бройката. ### Задача 6 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise06 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise06} .comment Templates 2 types -Реализирайте шаблонен клас [`TwoArray`], който запазва два динамично-заделени масива с подадени типове. +Реализирайте шаблонен клас {` TwoArray}, който запазва два динамично-заделени масива с подадени типове. Масивите не могат да се оразмеряват и имат еднаква дължина. Имплементирайте: .bulleted - голяма петица, -- оператор [`[]`], който по подаден индекс връща елемент от първия масив, и -- оператор [`()`], който по подаден индекс връща елемент от втория масив. +- оператор {` []}, който по подаден индекс връща елемент от първия масив, и +- оператор {` ()}, който по подаден индекс връща елемент от втория масив. ### Задача 7 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise07 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise07} .comment Abstract class -Реализирайте абстрактен клас [`DynamicArray`], който задължава наследниците да имплементират оператор [`[]`] и оператор [`+=`]. +Реализирайте абстрактен клас {` DynamicArray}, който задължава наследниците да имплементират оператор {` []} и оператор {` +=}. Реализирайте негови наследници: :unordered -- [`Numbers`], който "имплементира" динамично-заделен масив от цели числа, като +- {` Numbers}, който "имплементира" динамично-заделен масив от цели числа, като .bulleted - - оператор [`[]`] връща първия елемент, по-малък от подадения индекс. Ако няма такъв, връщате първия елемент. - - оператор [`+=`] вмъква елементите в началото на масива + - оператор {` []} връща първия елемент, по-малък от подадения индекс. Ако няма такъв, връщате първия елемент. + - оператор {` +=} вмъква елементите в началото на масива -- [`String`], който "имплементира" динамично-заделен масив от букви, като +- {` String}, който "имплементира" динамично-заделен масив от букви, като .bulleted - - оператор [`[]`] връща индекс на брой (първата, втората, ...) главна буква в низа. Ако няма такава, тогава връща последната буква. - - оператор [`+=`] вмъква елементите в края на масива + - оператор {` []} връща индекс на брой (първата, втората, ...) главна буква в низа. Ако няма такава, тогава връща последната буква. + - оператор {` +=} вмъква елементите в края на масива Имплементирайте голяма петица. .question Къде ще имплементирате динамичния масив и голямата петица? -.question Можем ли да използваме оператор [`+=`] в полиморфна йерархия? +.question Можем ли да използваме оператор {` +=} в полиморфна йерархия? ### Задача 8 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise08 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise08} .comment Abstract class -Имплементирайте абстрактен клас [`Message`], който съдържа динамично-заделен низ (текстово съобщение, което се показва на екрана) и задължава наследниците да имплементират: +Имплементирайте абстрактен клас {` Message}, който съдържа динамично-заделен низ (текстово съобщение, което се показва на екрана) и задължава наследниците да имплементират: .unordered -- метод [`size`], който връща общия размер на всички данни в байтове. +- метод {` size}, който връща общия размер на всички данни в байтове. -Реализирайте негов наследник [`Link`] (хипервръзка), който запазва и втори динамично-заделен низ, запазващ адресът към който линкът сочи. +Реализирайте негов наследник {` Link} (хипервръзка), който запазва и втори динамично-заделен низ, запазващ адресът към който линкът сочи. -Реализирайте втори негов наследник [`Location`], чието текстово съдържание е адрес, и който допълнително запазва две стойности с плаваща запетая: една за географска ширина и втора за географска дължина. +Реализирайте втори негов наследник {` Location}, чието текстово съдържание е адрес, и който допълнително запазва две стойности с плаваща запетая: една за географска ширина и втора за географска дължина. -За всички класове реализирайте член-функция [`Length`], която връща размера на [=текстовото съобщение=] и оператор [`<<`]. +За всички класове реализирайте член-функция {` Length}, която връща размера на {b текстовото съобщение} и оператор {` <<}. -.question Има ли разлика между оператор [`<<`] на трите класа? +.question Има ли разлика между оператор {` <<} на трите класа? ### Задача 9 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise09 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week11/Exercise09} -Реализирайте абстрактен шаблонен клас [`MixedArray`], който съхранява алтерниращи елементи от два типа. +Реализирайте абстрактен шаблонен клас {` MixedArray}, който съхранява алтерниращи елементи от два типа. Тоест, на индекс 0 имаме елемент от първия тип, на индекс 1 от втория, на индекс 2 от първи и так. нат. -Елементите не е нужно да могат да се конвертират помежду си (тоест не може да използвате полиморфен контейнер), затова се достъпват с член функция [`At`], приемаща индекс и референции към указатели към всеки тип. -При подаден индекс, на единия указател се записва адресът на съответната стойност, а на другия [`nullptr`]. +Елементите не е нужно да могат да се конвертират помежду си (тоест не може да използвате полиморфен контейнер), затова се достъпват с член функция {` At}, приемаща индекс и референции към указатели към всеки тип. +При подаден индекс, на единия указател се записва адресът на съответната стойност, а на другия {` nullptr}. -Също имплементира голяма петица и задължава наследниците да имплементират оператори [`+=`], върщащи указател. +Също имплементира голяма петица и задължава наследниците да имплементират оператори {` +=}, върщащи указател. -Реализирайте негов наследник [`DirectConcat`], който реализира [`+=`] като директно слепване (конкатениране). +Реализирайте негов наследник {` DirectConcat}, който реализира {` +=} като директно слепване (конкатениране). -Реализирайте втори негов наследник, [`MixedConcat`], който реализир [`+=`] като алтернира елемент от първия масив с елемент от втория. +Реализирайте втори негов наследник, {` MixedConcat}, който реализир {` +=} като алтернира елемент от първия масив с елемент от втория. ## Трудни @@ -183,7 +186,7 @@ GitHub classroom: [url https://classroom.github.com/a/oYQehcnN classroom.github. Имплементирайте клас Document, който запазва масив от Node-ове и за който са имплементирани: .bulleted -- методи save и load, които запазват и четат цялото съдържание на документа в [=текстов=] файл с произволен формат. +- методи save и load, които запазват и четат цялото съдържание на документа в {b текстов} файл с произволен формат. ### Задача 11 diff --git a/src/teaching/oop-2023/week12/index.du b/src/teaching/oop-2023/week12/index.du index 537e03b..a7129e3 100644 --- a/src/teaching/oop-2023/week12/index.du +++ b/src/teaching/oop-2023/week12/index.du @@ -1,97 +1,100 @@ -# Задачи - ООП, Седмица 12, 09.05.2024 +'def title Задачи - ООП, Седмица 12, 09.05.2024 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/o7hNz1pr classroom.github.com/a/o7hNz1pr] +GitHub classroom: {url classroom.github.com/a/o7hNz1pr;https://classroom.github.com/a/o7hNz1pr} ### Задача 1 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week12/Exercise1 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week12/Exercise1} .comment Multiple inheritance -Реализирайте клас [`Publication`], който пази: +Реализирайте клас {` Publication}, който пази: .bulleted - низ от максимална дължина 1023, съхраняващ автори и - втори низ с максимална дължина от 255, съхраняващ име на (научно) списание. -Реализирайте клас [`TextDocument`], който пази неоразмеряем низ с текстово съдържание и неговия размер. +Реализирайте клас {` TextDocument}, който пази неоразмеряем низ с текстово съдържание и неговия размер. -Реализирайте наследник на двата класа [`ScientificPaper`], който допълнително пази и низ от максимално 511 знака, съдържащ име на научна дисциплина. +Реализирайте наследник на двата класа {` ScientificPaper}, който допълнително пази и низ от максимално 511 знака, съдържащ име на научна дисциплина. За всички класове реазлизирайте оператор <<. ### Задача 2 -[*Не говорим за нея, условието беше толкова сбъркано, че се наложи да я сваля*] +{i Не говорим за нея, условието беше толкова сбъркано, че се наложи да я сваля} ### Задача 3 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week12/Exercise3 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week12/Exercise3} -Реализирайте абстрактен клас [`MobileDevice`], който запазва: +Реализирайте абстрактен клас {` MobileDevice}, който запазва: .bulleted - телефонен номер като цяло неотрицателно число и - масив с максимална дължина от 511 знака за текстово съобщение. Допълнително нека: .bulleted -- класът да задължава имплементацията на метод [`Show`], -- да има член-функция [`CanAccept`], която по подадено "хиперсъобщение" връща дали неговия номер съвпада с този на класа.\n +- класът да задължава имплементацията на метод {` Show}, +- да има член-функция {` CanAccept}, която по подадено "хиперсъобщение" връща дали неговия номер съвпада с този на класа.\n Под "хиперсъобщение" имаме предвид низ, който започва с телефонния номер, след това има шпация и след това е самото съобщение. -- да има член-функция [`Accept`], която по подадено "хиперсъобщение" запазва текстовото съобщение. +- да има член-функция {` Accept}, която по подадено "хиперсъобщение" запазва текстовото съобщение. Ако номерът не съответства тогава хвърля грешка. -Реализирайте негов наследник [`Telephone`], за който [`Show`] изкарва съобщението на екрана. +Реализирайте негов наследник {` Telephone}, за който {` Show} изкарва съобщението на екрана. 'footnote pager От времето без мобилни телефони, хората са си купували пейджъри, които ти пращат нотификация ако някой ти звънне и не вдигнеш. Пейджърите са "заключени" за определени региони, тоест някой ти се обажда, не вдигаш, и всички телекомуникционни кули в региона изпращат съобщение "на теб ти звънна този", и пейджъра като засече сигнала ти писука. Мисля че също можеш да пращаш кратки съобщения. Не е било хич сигурна система, все още се ползва от болници в някои държави. -Реализирайте втори негов наследник [`Pager`] [$pager], който съхранява име на файл (като динамично-заделен низ) и [`Show`] изкарва съобщението в съответния файл. +Реализирайте втори негов наследник {` Pager} {pager}, който съхранява име на файл (като динамично-заделен низ) и {` Show} изкарва съобщението в съответния файл. Разбира се, имплементирайте голяма петица. -Реализирайте клас [`TelecommunicationCompany`], който съхранява динамично-заделен и оразмеряем масив от (указатели към) [`MobileDevice`]. +Реализирайте клас {` TelecommunicationCompany}, който съхранява динамично-заделен и оразмеряем масив от (указатели към) {` MobileDevice}. Имплементирайте всичко от голяма петица. ### Задача 4 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week12/Exercise4 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week12/Exercise4} .comment Multiple inheritance with mixed class types, polymorphic container, and copying -Реализирайте клас [`Employee`], който запазва: +Реализирайте клас {` Employee}, който запазва: .bulleted - заплата като число с плаваща запетая и - производителост също като число с плаваща запетая. Производителността е множител на заплатата, тоест ако има производителност 0.5 значи работи като човек на който му плащат с половината заплата. -Реализирайте абстрактен клас [`Person`], който запазва: +Реализирайте абстрактен клас {` Person}, който запазва: .bulleted - име като низ с произволна дължина и - възраст като цяло неотрицателно число -Допълнително задължава реализацията на член-функция [`Workload`], връщаща стойност с плаваща запетая. +Допълнително задължава реализацията на член-функция {` Workload}, връщаща стойност с плаваща запетая. Разбира се имплементирайте голяма петица. -Реализирайте наследник на двата класа на име [`Developer`], който допълнително запазва: +Реализирайте наследник на двата класа на име {` Developer}, който допълнително запазва: .bulleted - цяло неотрицателно число - брой проекти в които участва, и - второ което е брой проекти на които ще се пуска нова версия. -Реализирайте оператори [`++`] и [`--`], като префиксните променят броя проекти на които ще се пуска нова версия, докато постфиксните променя броя проекти в които участва.\n -За него [`Workload`] се определя като 1.1 по всеки проект и допълнително по 2.3 за всеки проект на който ще се пуска нова версия. +Реализирайте оператори {` ++} и {` --}, като префиксните променят броя проекти на които ще се пуска нова версия, докато постфиксните променя броя проекти в които участва.\n +За него {` Workload} се определя като 1.1 по всеки проект и допълнително по 2.3 за всеки проект на който ще се пуска нова версия. -Реализирайте наследник на двата класа на име [`Manager`], който допълнително запазва динамично-заделен и оразмеряем масив от [`Person`], които менижира. +Реализирайте наследник на двата класа на име {` Manager}, който допълнително запазва динамично-заделен и оразмеряем масив от {` Person}, които менижира. Имплементирайте голяма петица и: .bulleted -- оператори [`==`] и [`!=`], сравняващи хора по име -- член-функция [`StartManaging`], която приема [`Person`] и го запазва, и -- член-функция [`StopManaging`], която приема [`Person`] и го премахва от масива ако съществува в него. +- оператори {` ==} и {` !=}, сравняващи хора по име +- член-функция {` StartManaging}, която приема {` Person} и го запазва, и +- член-функция {` StopManaging}, която приема {` Person} и го премахва от масива ако съществува в него. -[`Workload`] се определя като 0.6 на човек който менижира. +{` Workload} се определя като 0.6 на човек който менижира. -Финално реализирайте клас [`Company`], който запазва масив от 128 указателя [`Person`] в компанията. +Финално реализирайте клас {` Company}, който запазва масив от 128 указателя {` Person} в компанията. Имплементирайте негова член-функция: .bulleted -- [`PaymentDifference`], която връща с колко платената заплата на всички служители се отличава с тази според тяхната производителност +- {` PaymentDifference}, която връща с колко платената заплата на всички служители се отличава с тази според тяхната производителност diff --git a/src/teaching/oop-2023/week13/index.du b/src/teaching/oop-2023/week13/index.du index 5bd0904..913d783 100644 --- a/src/teaching/oop-2023/week13/index.du +++ b/src/teaching/oop-2023/week13/index.du @@ -1,8 +1,11 @@ -# Задачи - ООП, Седмица 13, 16.05.2024 +'def title Задачи - ООП, Седмица 13, 16.05.2024 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/GvV1wrC1 classroom.github.com/a/GvV1wrC1] +GitHub classroom: {url classroom.github.com/a/GvV1wrC1;https://classroom.github.com/a/GvV1wrC1} .warn Навсякъде, където е нужно, реализирайте голяма петица. @@ -10,71 +13,71 @@ GitHub classroom: [url https://classroom.github.com/a/GvV1wrC1 classroom.github. ### Задача 1 - Множествено наследяване -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week13/Exercise1 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week13/Exercise1} -Реализирайте клас [`String`], който запазва динамичен низ с фиксиран размер. +Реализирайте клас {` String}, който запазва динамичен низ с фиксиран размер. -Реализирайте клас [`IndexArray`], който запазва динамичен масив с фиксиран размер от цели числа - индекси. +Реализирайте клас {` IndexArray}, който запазва динамичен масив с фиксиран размер от цели числа - индекси. -.warn [=Не=] правете общ родител, който имплементира динамичен масив! +.warn {b Не} правете общ родител, който имплементира динамичен масив! -Реализирайте наследник на двата класа, [`WordsString`], при който индексите определят началото на всяка дума от запазения низ. +Реализирайте наследник на двата класа, {` WordsString}, при който индексите определят началото на всяка дума от запазения низ. Индексите се дефинират при конструктора. ## Лесни ### Задача 2 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week13/Exercise2 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week13/Exercise2} .comment Диамант -Реализирайте шаблонен клас [`Container`], който съхранява масив с фиксиран размер от елементи с подаден тип. -[=Не=] трябва да реализирате нищо повече от задължителните компоненти (голяма петица). +Реализирайте шаблонен клас {` Container}, който съхранява масив с фиксиран размер от елементи с подаден тип. +{b Не} трябва да реализирате нищо повече от задължителните компоненти (голяма петица). -Реализирайте негов наследник [`Indexable`], който реализира оператор[]. +Реализирайте негов наследник {` Indexable}, който реализира оператор[]. -Реализирайте втори негов наследник [`Resizeable`], който реализира член-функция [`InsertAt`], приемаща елемент и индекс, и която вмъква елемента на даден индекс. +Реализирайте втори негов наследник {` Resizeable}, който реализира член-функция {` InsertAt}, приемаща елемент и индекс, и която вмъква елемента на даден индекс. Разбира се, може да се наложи оразмеряване на масива. -Реализирайте наследник [`Vector`] на [`Indexable`] и [`Resizeable`], който реализира оператор[] и член-функции: +Реализирайте наследник {` Vector} на {` Indexable} и {` Resizeable}, който реализира оператор[] и член-функции: .bulleted -- [`pop_back`], премахваща последния елемент -- [`pop_front`], премахваща първия елемент -- [`push_back`], приемаща елемент който се вкарва в края на масив -- [`push_front`], приемаща елемент който се вкарва в началото на масив +- {` pop_back}, премахваща последния елемент +- {` pop_front}, премахваща първия елемент +- {` push_back}, приемаща елемент който се вкарва в края на масив +- {` push_front}, приемаща елемент който се вкарва в началото на масив .important Не забравяйте за диамантния проблем! ### Задача 3 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week13/Exercise3 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week13/Exercise3} .comment Диамант -Реализирайте клас [`User`], който запазва потребителско име и парола като низове с произволна дължина, заедно с булев флаг [`banned`], определящ дали акаунтът може да прави действия. +Реализирайте клас {` User}, който запазва потребителско име и парола като низове с произволна дължина, заедно с булев флаг {` banned}, определящ дали акаунтът може да прави действия. Потребителско име не може да съдържа шпации. -Реализирайте клас [`Thread`], който запазва масив с произволна дължина, от низове с произволна дължина. +Реализирайте клас {` Thread}, който запазва масив с произволна дължина, от низове с произволна дължина. Имплементирайте член-функция: .bulleted -- [`PostMessage`], която приема потребител и негово съобщение и добавя съобщението с потребителското име като един низ. - Ако потребителя е [`banned`], тогава хвърлете грешка. +- {` PostMessage}, която приема потребител и негово съобщение и добавя съобщението с потребителското име като един низ. + Ако потребителя е {` banned}, тогава хвърлете грешка. -Реализирайте наследник [`ThreadModerator`] на [`User`], който може да променя [`Thread`] обекти, без да се нуждае от публични член-функции в [`Thread`]. +Реализирайте наследник {` ThreadModerator} на {` User}, който може да променя {` Thread} обекти, без да се нуждае от публични член-функции в {` Thread}. Имплементирайте методи: .bulleted -- [`RemoveMessage`], който приема [`Thread`] и индекс на съобщение и премахва съответното съобщение -- [`RemoveByUser`], който приема [`Thread`] и потребител, и премахва всички съобщения, направени от дадения потребител +- {` RemoveMessage}, който приема {` Thread} и индекс на съобщение и премахва съответното съобщение +- {` RemoveByUser}, който приема {` Thread} и потребител, и премахва всички съобщения, направени от дадения потребител -Реализирайте наследник [`UserModerator`] на [`User`], който може да променя [`User`] обекти, без да се нуждае от публични член-функции в [`User`]. +Реализирайте наследник {` UserModerator} на {` User}, който може да променя {` User} обекти, без да се нуждае от публични член-функции в {` User}. Имплементирайте методите: .bulleted -- [`BanUser`], който приема потребител и вдига [`banned`] флага -- [`UnbanUser`], който приема потребител и сваля [`banned`] флага +- {` BanUser}, който приема потребител и вдига {` banned} флага +- {` UnbanUser}, който приема потребител и сваля {` banned} флага -Реализирайте наследник [`Administrator`] на [`ThreadModerator`] и [`UserModerator`], който може да прави всичко, което и родителите могат. +Реализирайте наследник {` Administrator} на {` ThreadModerator} и {` UserModerator}, който може да прави всичко, което и родителите могат. .important Не забравяйте за диамантния проблем! @@ -82,7 +85,7 @@ GitHub classroom: [url https://classroom.github.com/a/GvV1wrC1 classroom.github. ### Задача 4 -Реализирайте абстрактен клас [`ShopLocation`], който съхранява член-данни: +Реализирайте абстрактен клас {` ShopLocation}, който съхранява член-данни: .bulleted - адрес като низ с максимална дължина от 511 знака. Всеки адрес съдържа произволни символи и задължително завършва на число, определящо неговия район. @@ -90,24 +93,24 @@ GitHub classroom: [url https://classroom.github.com/a/GvV1wrC1 classroom.github. Имплементирате методи: .bulleted -- [`IsOpen`], който връща по подаден час дали локацията е отворена -- [`InCenter`], който връща дали локацията се намира в центъра на града. +- {` IsOpen}, който връща по подаден час дали локацията е отворена +- {` InCenter}, който връща дали локацията се намира в центъра на града. Всички адреси с регион, по-малък от 11, се намират в центъра. -Реализирайте шаблонен клас [`Inventory`], който съхранява [=фиксиран=] брой елементи и техните неотрицателни бройки (количества). +Реализирайте шаблонен клас {` Inventory}, който съхранява {b фиксиран} брой елементи и техните неотрицателни бройки (количества). Имплементирайте член-функции: .bulleted - оператор[], който връща елемент на дадения индекс - оператор(), който връща бройка на елемент на дадения индекс -- [`Stock`], приемащ индекс на елемент и бройка (положителна/отрицателна) с която бройката на дадения елемент се променя. +- {` Stock}, приемащ индекс на елемент и бройка (положителна/отрицателна) с която бройката на дадения елемент се променя. Бройката може да бъде най-малко 0. -- [`List`], който връща всички елементи и техните индекси +- {` List}, който връща всички елементи и техните индекси -Реализирайте абстрактен шаблонен наследник [`DeliverableInventory`] на [`Inventory`], който е инвентар с максимум 2048 елемента и допълнително задължава имплементацията на: +Реализирайте абстрактен шаблонен наследник {` DeliverableInventory} на {` Inventory}, който е инвентар с максимум 2048 елемента и допълнително задължава имплементацията на: .bulleted -- [`ShippingDelay`], който приема адрес и връща времето в което ще може да се достави обекта +- {` ShippingDelay}, който приема адрес и връща времето в което ще може да се достави обекта -Реализирайте наследник на [`DeliverableInventory`], склад [`Warehouse`], който допълнително запазва разстояние от града в километри и имплементира [`ShippingDelay`] по следната логика: +Реализирайте наследник на {` DeliverableInventory}, склад {` Warehouse}, който допълнително запазва разстояние от града в километри и имплементира {` ShippingDelay} по следната логика: .bulleted - доставки в центъра отнемат един ден + регионът в който се доставя - доставки извън центъра отнемат толкова време, колкото е нужно да се стигне до града ако пътува с 80 километра в час + времето което ще отнеме да се измине номер на региона на брой километри при скорост от 20 километра в час @@ -115,27 +118,27 @@ GitHub classroom: [url https://classroom.github.com/a/GvV1wrC1 classroom.github. Доставка не може да се случи преди 9 сутринта и след 18 вечерта. Ако попадне в този диапазон, тогава се отлага за най-скорошния следващ възможен час. -Реализирайте шаблонен наследник магазин [`Shop`] на [`ShopLocation`] и [`Inventory`], който е инвентар с максимум 256 елемента, запазващ: +Реализирайте шаблонен наследник магазин {` Shop} на {` ShopLocation} и {` Inventory}, който е инвентар с максимум 256 елемента, запазващ: .bulleted -- [=оразмеряем=] масив от низове с произволен размер, всеки низ който е "отчет на продажба" +- {b оразмеряем} масив от низове с произволен размер, всеки низ който е "отчет на продажба" - общо бройка продажби и който имплементира методи: .bulleted -- [`SellItems`], който приема масив от идентификатори на обекти, намалява бройката на всеки от тях и създава нов отчет. +- {` SellItems}, който приема масив от идентификатори на обекти, намалява бройката на всеки от тях и създава нов отчет. Отчета е в произволен формат, но трябва да съдържа идентификаторите и бройките на всеки обект. Ако за някой обект няма достатъчно бройки или изобщо не се пази, хвърлете грешка. -Реализирайте шаблонен клас [`WebStore`], който запазва оразмеряеми масиви от [`Shop`] и [`Warehouse`]. +Реализирайте шаблонен клас {` WebStore}, който запазва оразмеряеми масиви от {` Shop} и {` Warehouse}. Имплементирайте: .bulleted - оператор<<, който изкарва всички уникални (unique) обекти от всички магазини и складове, с индекс до тях -- [`GetEstimate`], който приема индекс на уникален обект от всички магазини и складове, сегашно време и адрес, и изкарва на екрана всички магазини които са отворени в дадения час и кое е най-скорошното време в което може обектът да се достави от склад. +- {` GetEstimate}, който приема индекс на уникален обект от всички магазини и складове, сегашно време и адрес, и изкарва на екрана всички магазини които са отворени в дадения час и кое е най-скорошното време в което може обектът да се достави от склад. Ако няма отворени магазини, ако няма магазин с наличност и так. нат. изкарайте съответно съобщение. -Последно реализирайте клас [`Book`], който запазва заглавие на книга и име на автор като низове с максимална дължина от 127 знака. +Последно реализирайте клас {` Book}, който запазва заглавие на книга и име на автор като низове с максимална дължина от 127 знака. Имплементирайте оператор<<, който изкарва съответната книга в произволен формат. -В главната функция реализирайте [`WebStore`] от книги, заедно с набор от книги, магазини и складове по ваш избор. +В главната функция реализирайте {` WebStore} от книги, заедно с набор от книги, магазини и складове по ваш избор. Нека в началото на програмата да приемате от потребителя сегашното време и адрес, след това изкарайте на екрана всички ункални книги с индекси. Накрая потребителя може да въведе индекс на книга и да получи информация кои отворени сега магазини имат съответната книга и кога най-скоро може да бъде доставена от склад. diff --git a/src/teaching/oop-2023/week14/index.du b/src/teaching/oop-2023/week14/index.du index d9c827a..0885c58 100644 --- a/src/teaching/oop-2023/week14/index.du +++ b/src/teaching/oop-2023/week14/index.du @@ -1,8 +1,11 @@ -# Задачи - ООП, Седмица 14, 23.05.2024 +'def title Задачи - ООП, Седмица 14, 23.05.2024 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/K0XomKEP classroom.github.com/a/K0XomKEP] +GitHub classroom: {url classroom.github.com/a/K0XomKEP;https://classroom.github.com/a/K0XomKEP} ## Задача @@ -37,7 +40,7 @@ GitHub classroom: [url https://classroom.github.com/a/K0XomKEP classroom.github. и имплементира метод: .bulleted -- [`NewSemester`], който приема учебна година и тип, и връща нов обект от семестър с попълнени данни +- {` NewSemester}, който приема учебна година и тип, и връща нов обект от семестър с попълнени данни Имаме потребители, като всеки си има роля, определяща неговите способности в системата. Ролята може да бъде студент, преподавател или администратор, като при конкретизиране в условието на някои от тях трябва да се извършат съответните проверки. diff --git a/src/teaching/oop-2023/week15/index.du b/src/teaching/oop-2023/week15/index.du index 55ee303..d23e7bd 100644 --- a/src/teaching/oop-2023/week15/index.du +++ b/src/teaching/oop-2023/week15/index.du @@ -1,8 +1,11 @@ -# Задачи - ООП, Седмица 15, 30.05.2024 +'def title Задачи - ООП, Седмица 15, 30.05.2024 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/z2QadyEE classroom.github.com/a/z2QadyEE] +GitHub classroom: {url classroom.github.com/a/z2QadyEE;https://classroom.github.com/a/z2QadyEE} ## Задача @@ -19,7 +22,7 @@ GitHub classroom: [url https://classroom.github.com/a/z2QadyEE classroom.github. - линк (хипервръзка) като текст и (уеб) адрес - време: дата и час -Всеки тип трябва да имплементира [`Print`] член-функция, която изкарва текстово съдържание на съобщението. +Всеки тип трябва да имплементира {` Print} член-функция, която изкарва текстово съдържание на съобщението. За текстово съобщение това е самия текст, за локация това е низ във формата "[ДЪРЖАВА] ГРАД(ОБЛАСТ) УЛИЦА NoНОМЕР НА УЛИЦА", за линк е самия текст и за време е "ЧАС:МИНУТИ ДЕН.МЕСЕЦ.ГОДИНА". Реализирайте потребители, като за всеки потребител имаме потребителско име и парола. diff --git a/src/teaching/oop-2023/week16/index.du b/src/teaching/oop-2023/week16/index.du index 604c746..bc142e2 100644 --- a/src/teaching/oop-2023/week16/index.du +++ b/src/teaching/oop-2023/week16/index.du @@ -1,8 +1,11 @@ -# Задачи - ООП, Седмица 16, 06.06.2024 +'def title Задачи - ООП, Седмица 16, 06.06.2024 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/BWjw2dUC classroom.github.com/a/BWjw2dUC] +GitHub classroom: {url classroom.github.com/a/BWjw2dUC;https://classroom.github.com/a/BWjw2dUC} ## Задача @@ -13,7 +16,7 @@ GitHub classroom: [url https://classroom.github.com/a/BWjw2dUC classroom.github. Разбира се, отдолу няма истински файлове които се запазват в харддиск (примерно), просто ОС превежда всички тези операции върху файлове със съответни действия към устройството. Реализирайте подобна система. -Първо трябва ни обща схема за файлове, за всеки файл имаме [`Read`] и [`Write`] методи, и пазим името на файла. +Първо трябва ни обща схема за файлове, за всеки файл имаме {` Read} и {` Write} методи, и пазим името на файла. За всяко устройство само по себе си знаем, че трябва да използваме определен драйвър (по име) и че то има малко информация за себе си: марка като низ и модел като цяло число. По-конкретно разглежаме два основни типа устройства: индексируемо и поточно (streamable). diff --git a/src/teaching/oop-2023/week2/index.du b/src/teaching/oop-2023/week2/index.du index ade800c..9cecfd6 100644 --- a/src/teaching/oop-2023/week2/index.du +++ b/src/teaching/oop-2023/week2/index.du @@ -1,14 +1,17 @@ -# Задачи - ООП, Седмица 2, 29.02.2024 +'def title Задачи - ООП, Седмица 2, 29.02.2024 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/3qPsfyyI classroom.github.com/a/3qPsfyyI] +GitHub classroom: {url classroom.github.com/a/3qPsfyyI;https://classroom.github.com/a/3qPsfyyI} ## Задача 0 - Преговорна -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise0.cpp Решения] +.solution-link {url Решения;https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise0.cpp} -Ще работим върху N-мерен [url https://en.wikipedia.org/wiki/Tic-tac-toe морски шах], тоест ще имаме дъска за морски шах, която може да е по-голяма от 3 на 3 (примерно 5 на 5, 7 на 7 и т.н.). +Ще работим върху N-мерен {url морски шах;https://en.wikipedia.org/wiki/Tic-tac-toe}, тоест ще имаме дъска за морски шах, която може да е по-голяма от 3 на 3 (примерно 5 на 5, 7 на 7 и т.н.). Няма да се занимаваме с проверки дали (и кой) е спечелил след даден ход, интересуваме се само от запазването на данни. Основната логика е следната, като във всяка подточка правила по имплементацията са зададени. @@ -23,9 +26,10 @@ GitHub classroom: [url https://classroom.github.com/a/3qPsfyyI classroom.github. За всеки играч трябва съответно да изкарате общия брой X-ове или броя O-та в цялата дъска, както и дължината на най-дългата последователност от Х-ове или О-та в един реда на дъската (примерно за първия играч, търсим реда с най-много последователни X-ове, и изкарваме тяхната бройка). -[=Пример:=] +{b Пример:} -:table_2 +:table +:2 |= Вход |= Изход @@ -46,54 +50,55 @@ Emil Petkov: Total - 13, Longest - 4 BoburaBG: Total - 12, Longest - 3 + ### а) без структури -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise0.cpp#L3-L83 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise0.cpp#L3-L83} -.important Решете подточката [=без=] структури, тоест без знания по ООП +.important Решете подточката {b без} структури, тоест без знания по ООП -Имплементирайте [=функция=] [`boardCounts`], която приема дъската и връща по някакъв начин нужните бройки: общ брой X-ове, общ брой O-та, брой X-ове в най-дългата последователност от X-ове в ред, брой O-та в най-дългата последователност от O-та в ред. +Имплементирайте {b функция} {` boardCounts}, която приема дъската и връща по някакъв начин нужните бройки: общ брой X-ове, общ брой O-та, брой X-ове в най-дългата последователност от X-ове в ред, брой O-та в най-дългата последователност от O-та в ред. -След това имплементирайте фукция [`printResult`], която приема имената на двата играча, както и бройките, върнати от [`boardCounts`], и изкарва на екрана съобщенията във формата от примера. +След това имплементирайте фукция {` printResult}, която приема имената на двата играча, както и бройките, върнати от {` boardCounts}, и изкарва на екрана съобщенията във формата от примера. ### б) структура за board -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise0.cpp#L85-L166 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise0.cpp#L85-L166} "Слепете" в една съвкупност (структура) указателя към самата дъска за морски шах, както и нейния размер N. -Нека името на структурата да бъде [`GameBoard`]. +Нека името на структурата да бъде {` GameBoard}. -Обновете [`boardCounts`], така че вместо да приема дъската и размера ѝ чрез две променливи, да ги приема чрез една променлива от тип [`GameBoard`]. +Обновете {` boardCounts}, така че вместо да приема дъската и размера ѝ чрез две променливи, да ги приема чрез една променлива от тип {` GameBoard}. ### в) структура за числата -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise0.cpp#L168-L255 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise0.cpp#L168-L255} -"Слепете" в една съвкупност (структура) на име [`BoardCounts`] четирите променливи, които [`boardCounts`] връща. +"Слепете" в една съвкупност (структура) на име {` BoardCounts} четирите променливи, които {` boardCounts} връща. -Обновете [`boardCounts`] да връща една стойност от тип [`BoardCounts`], вместо да връща четирите бройки като отделни числа. -Обновете [`printResult`] да приема стойност от тип [`BoardCounts`], вместо да приема четирите бройки като отделни числа. +Обновете {` boardCounts} да връща една стойност от тип {` BoardCounts}, вместо да връща четирите бройки като отделни числа. +Обновете {` printResult} да приема стойност от тип {` BoardCounts}, вместо да приема четирите бройки като отделни числа. ### г) структура за цялата игра -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise0.cpp#L257-L300 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise0.cpp#L257-L300} -Сега "слепете" предходните две структури, заедно с имената на нашите играчи, в една голяма обща структура за цялата игра на име [`Game`]. -Тоест, всичките ни данни: дъската, бройките и имената на играчите, да се намират в [`Game`]. +Сега "слепете" предходните две структури, заедно с имената на нашите играчи, в една голяма обща структура за цялата игра на име {` Game}. +Тоест, всичките ни данни: дъската, бройките и имената на играчите, да се намират в {` Game}. -.important Искам да [*композирате*], тоест искам да използвате [`GameBoard`] и [`BoardCounts`] структурите в [`Game`] структурата. +.important Искам да {i композирате}, тоест искам да използвате {` GameBoard} и {` BoardCounts} структурите в {` Game} структурата. -Обновете [`boardCounts`] и [`printResult`], така че да използват тази структура. +Обновете {` boardCounts} и {` printResult}, така че да използват тази структура. ## Задача 1 - Основи от материала -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise1.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise1.cpp} Работите върху система за инвентар на книжарница. -.warn Не е задължително, но е препоръчително да си направите и една структура [`String`] с конструктор и деструктор +.warn Не е задължително, но е препоръчително да си направите и една структура {` String} с конструктор и деструктор -Създайте структура [`Book`] със скрити (private) данни за: +Създайте структура {` Book} със скрити (private) данни за: .bulleted - заглавие, като един низ - автори, като масив от низове @@ -108,60 +113,60 @@ Set-ърите трябва да записват стойности в данн - годината на публикация не може да надвишава 2024, не може да е по-малка от -2100 (2100 п.н.е.) и не може да бъде нула - цената не може да е отрицателна -Всеки от мутаторите трябва да връща булева стойност, [`true`] ако проверките са изпълнени (и запазването на данни е извършено) и [`false`] ако съответната проверка не е изпълнена (и няма промяна в данните). +Всеки от мутаторите трябва да връща булева стойност, {` true} ако проверките са изпълнени (и запазването на данни е извършено) и {` false} ако съответната проверка не е изпълнена (и няма промяна в данните). Създайте съответните конструктори и деструктори. -След това направете структура [`Library`], която държи масив от книги и бройката за всяка книга (отново като скрити данни). +След това направете структура {` Library}, която държи масив от книги и бройката за всяка книга (отново като скрити данни). Най-лесния вариант е да имате втори масив, като за всеки индекс в масива с книги, на същия индекс в масива за бройки се намира съответната бройка. -Можете и да го направите чрез структура [`Pair`] и да имате един масив. +Можете и да го направите чрез структура {` Pair} и да имате един масив. -Като публични методи на [`Library`] имплементирайте [`AddBook`], която вмъква нова книга в масива, и [`RemoveBook`] която съответно "премахва" книга по заглавие и година. -Допълнително направете член-функция [`StockBook`], която приема заглавие на книга, годината ѝ, и цяло число с което наличната бройка се увеличава. -Аналогично направете и [`SellBook`]. +Като публични методи на {` Library} имплементирайте {` AddBook}, която вмъква нова книга в масива, и {` RemoveBook} която съответно "премахва" книга по заглавие и година. +Допълнително направете член-функция {` StockBook}, която приема заглавие на книга, годината ѝ, и цяло число с което наличната бройка се увеличава. +Аналогично направете и {` SellBook}. За всики тези методи трябва да имате съответните проверки: .bulleted -- ако напълно идентична книга вече съществува, [`AddBook`] не трябва да я добавя на ново -- [`RemoveBook`] не трябва да "гърми" ако книгата не съществува -- бройката на добавени/продадени книги, подадени на [`SellBook`] и [`StockBook`], трябва да бъдат положителни, както и книгите да съществуват +- ако напълно идентична книга вече съществува, {` AddBook} не трябва да я добавя на ново +- {` RemoveBook} не трябва да "гърми" ако книгата не съществува +- бройката на добавени/продадени книги, подадени на {` SellBook} и {` StockBook}, трябва да бъдат положителни, както и книгите да съществуват -Аналогично като при [`Book`], тези функции трябва да връщат булева стойност, дали проверките са изпълнени. +Аналогично като при {` Book}, тези функции трябва да връщат булева стойност, дали проверките са изпълнени. Не забравяйте за конструктор и деструктор! .question Можете ли да си улесните работата, ако използвате скрити член-функции? -Не е нужно да правите потребителски вход/изход, но тествайте ръчно кода си в [`main`]. +Не е нужно да правите потребителски вход/изход, но тествайте ръчно кода си в {` main}. ## Задача 2 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise2.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise2.cpp} Работите върху система за Excel-ски таблици. Една клетка може да съдържа някаква числена стойност, или проста формула която определя тази стойност. -Създайте структура [`Cell`], която запазва (скрито) целочислена стойност, знак, който определя опреацията във формулата, и два указателя на [`Cell`] към двете страни на оператора. -Оператора (знака) може да бъде [`+`], [`-`], [`*`] или [`/`]. +Създайте структура {` Cell}, която запазва (скрито) целочислена стойност, знак, който определя опреацията във формулата, и два указателя на {` Cell} към двете страни на оператора. +Оператора (знака) може да бъде {` +}, {` -}, {` *} или {` /}. Идеята е, че ако клетката само запазва стойност, тогава оператора ще бъде нещо празно (терминираща нула например). Обаче ако се определя от формула, тогава оператора и указателите също ще са попълнени, а запазената стойност ще действа като кеш, тоест вместо всеки път да преизчисляваме стойността когато я искаме, преизчислили сме я веднъж и я запазваме. -За тази цел имплементирайте публична член-функция [`evaluate`], ако не е запазена формула, тя не прави нищо, ако е, прави съответното изчисление и запазва резултата. -Разбира се, направете и мутатори [`setValue`] и [`setFormula`], със съответните проверки. +За тази цел имплементирайте публична член-функция {` evaluate}, ако не е запазена формула, тя не прави нищо, ако е, прави съответното изчисление и запазва резултата. +Разбира се, направете и мутатори {` setValue} и {` setFormula}, със съответните проверки. Не забравяйте за конструктор и деструктор. -Сега направете структура [`Table`], която пази (скрито) двумерен масив от клетки. -Имплементирайте селектор [`getCell`], който връща указател на клетка по координати и мутатор [`setCell`], който приема клетка и координати в масива. +Сега направете структура {` Table}, която пази (скрито) двумерен масив от клетки. +Имплементирайте селектор {` getCell}, който връща указател на клетка по координати и мутатор {` setCell}, който приема клетка и координати в масива. .question Какъв ще е типа на подадената клетка и стойностите в масива? -Направете метод [`updateCell`], чрез която стойностите на клетка по координати могат да бъдат променени, и след това всички клетки в таблицата се преизчисляват. +Направете метод {` updateCell}, чрез която стойностите на клетка по координати могат да бъдат променени, и след това всички клетки в таблицата се преизчисляват. -Последно, имплементирайте и член-функция [`printTable`], която изкарва на екрана цялата таблица, като клетката на индекси 0,0 се намира в горния ляв ъгъл, всички клетки са разделени с [`|`]. +Последно, имплементирайте и член-функция {` printTable}, която изкарва на екрана цялата таблица, като клетката на индекси 0,0 се намира в горния ляв ъгъл, всички клетки са разделени с {` |}. -Не е нужно да правите потребителски вход/изход, но тествайте ръчно кода си в [`main`]. +Не е нужно да правите потребителски вход/изход, но тествайте ръчно кода си в {` main}. ## Задача 3 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise3.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise3.cpp} Изграждате "симулация" за трафик върху секция от магистрала. @@ -185,7 +190,7 @@ Set-ърите трябва да записват стойности в данн Ако една кола успешно "излиза" от участака на магистралата, тоест тя се опитва да се придвижи някъде след края ѝ, зачитаме че успешно е минала пътя и спираме да я разглеждаме. Сами определете как ще изглеждат структурите за колата и магистралата, както и нужните методи. -Имайте предвид, че трябва цялата логика да присъства в тези структури, тоест в [`main`] трябва да присъства само някакъв инициализиращ код. +Имайте предвид, че трябва цялата логика да присъства в тези структури, тоест в {` main} трябва да присъства само някакъв инициализиращ код. .important Не е позволено магистралата да бъде двумерна матрица, координатите на всяка кола се пазят в самата кола. @@ -194,7 +199,7 @@ Set-ърите трябва да записват стойности в данн ## Задача 4 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise4.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise4.cpp} Имате фабрика, цялата ѝ структура се разглежда като един конвейер, тоест като една редица машини, всяка от които приема някакъв материал и връща този материал преобразуван. @@ -207,7 +212,7 @@ Set-ърите трябва да записват стойности в данн Типовете на материалите са отделни стойности от идентификационните номера, тоест като е подаден материал, той се превръща в крайния тип, и трябва да намерите на кой материал точва число е началния тип. Всички тези данни трябва да са скрити, трябва за съответните структури да присъстват конструктори и деструктори. -Допълнително при машините трябва да има член-функция [`convertMaterial`], която получава идентификационен номер на материал и бройка, и връща колко от резултатния материал е успяла да създаде (спрямо ефикасността, закръглена надолу, и дали се нуждае от ремонт по средата на работата). +Допълнително при машините трябва да има член-функция {` convertMaterial}, която получава идентификационен номер на материал и бройка, и връща колко от резултатния материал е успяла да създаде (спрямо ефикасността, закръглена надолу, и дали се нуждае от ремонт по средата на работата). Ще получите данни за всички материали и машини, както и задачи, тоест идентификационни номера на начален и краен материал, както и бройката на началния материал. Трябва да намерите редицата от машини, които ще създадат възможно най-много краен материал. diff --git a/src/teaching/oop-2023/week3/index.du b/src/teaching/oop-2023/week3/index.du index 9617d36..663b70b 100644 --- a/src/teaching/oop-2023/week3/index.du +++ b/src/teaching/oop-2023/week3/index.du @@ -1,16 +1,19 @@ -# Задачи - ООП, Седмица 3, 07.03.2024 +'def title Задачи - ООП, Седмица 3, 07.03.2024 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/KPMqXsFp classroom.github.com/a/KPMqXsFp] +GitHub classroom: {url classroom.github.com/a/KPMqXsFp;https://classroom.github.com/a/KPMqXsFp} ## Преговорни ### Задача 1 - Структури -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week03/Exercise1.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week03/Exercise1.cpp} -Имплементирайте структура [`Lightbulb`], която запазва идентифициращите данни за една крушка: +Имплементирайте структура {` Lightbulb}, която запазва идентифициращите данни за една крушка: .bulleted - диаметър и дължина: и двете са целочислени стойности - тип: низ с максимална дължина от 100 знака @@ -18,9 +21,9 @@ GitHub classroom: [url https://classroom.github.com/a/KPMqXsFp classroom.github. ### Задача 2 - Капсулация -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week03/Exercise2.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week03/Exercise2.cpp} -Имплементирайте структура [`Alarm`], която съдържа следните [=скрити=] данни: +Имплементирайте структура {` Alarm}, която съдържа следните {b скрити} данни: .bulleted - име на модел: низ с максимална дължина от 1024 знака - пин код: целочислено число @@ -38,57 +41,57 @@ GitHub classroom: [url https://classroom.github.com/a/KPMqXsFp classroom.github. ### Задача 3 - Капсулация с динамична памет -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week03/Exercise3.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week03/Exercise3.cpp} -Имплементирайте структура [`Person`], която запазва двете имена на човек, възраст като целочислено число и неговия имейл. +Имплементирайте структура {` Person}, която запазва двете имена на човек, възраст като целочислено число и неговия имейл. Имената и имейла са низвое с произволна дължина. -Направете конструктор, който приема възрастта и тези три низа, и [=копира=] стойностите им в динамичната памет. +Направете конструктор, който приема възрастта и тези три низа, и {b копира} стойностите им в динамичната памет. Също напишете и деструктор, който коректно трие нужните данни. ### Задача 4 - Динамично-заделени структури в други структури -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week03/Exercise4.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week03/Exercise4.cpp} -Имплементирайте структура [`Bus`], която публично запазва капацитета хора и километража на един автобус. +Имплементирайте структура {` Bus}, която публично запазва капацитета хора и километража на един автобус. -Имплементирайте структура [`BusWarehouse`], която запазва динамично-заделен масив от автобуси. -В конструктора се въвежда максималния брой автобуси, който може един [`BusWarehouse`] да съдържа. +Имплементирайте структура {` BusWarehouse}, която запазва динамично-заделен масив от автобуси. +В конструктора се въвежда максималния брой автобуси, който може един {` BusWarehouse} да съдържа. Имплементирайте конструктор, който само инициализира нужните данни, и деструктор който трие каквото трябва. -Имплементирайте член-функция [`AddBus`], която добавя автобус в инстанция на [`BusWarehouse`], ако има място за него. +Имплементирайте член-функция {` AddBus}, която добавя автобус в инстанция на {` BusWarehouse}, ако има място за него. ## Лесни задачи ### Задача 5 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week03/Exercise5.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week03/Exercise5.cpp} -Имплементирайте структура [`Car`], всяка кола пази скрито своя модел като низ с произволна дължина, брой врати и брой седалки като целочислени числа. +Имплементирайте структура {` Car}, всяка кола пази скрито своя модел като низ с произволна дължина, брой врати и брой седалки като целочислени числа. Направете съответните get-ъри, set-ъри, конструктор и деструктор. -Имплементирайте структура [`TrafficJam`], която пази произволно дълга редица коли в задръстване. -Направете и член-функция [`AddCar`], която вмъква кола в края на редицата. +Имплементирайте структура {` TrafficJam}, която пази произволно дълга редица коли в задръстване. +Направете и член-функция {` AddCar}, която вмъква кола в края на редицата. Тази функция може да се извиква произволен брой пъти, затова имплементирайте и оразмеряване на вътрешната редица. -[`TrafficJam`] трябва да има конструктор, деструктор и тази член-функция. +{` TrafficJam} трябва да има конструктор, деструктор и тази член-функция. ### Задача 6 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week03/Exercise6.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week03/Exercise6.cpp} Ще работите с N-мерна шахматна дъска. -Направете структура [`ChessPiece`], която запазва цвета и типа на фигурата от шах, като първото е целочислена стойност, второто е буква. +Направете структура {` ChessPiece}, която запазва цвета и типа на фигурата от шах, като първото е целочислена стойност, второто е буква. -Направете структура [`ChessBoard`], която по подадено N в конструктора създава шахматна дъска с размер NxN с [=указатели=] към съответните фигури на дъската. +Направете структура {` ChessBoard}, която по подадено N в конструктора създава шахматна дъска с размер NxN с {b указатели} към съответните фигури на дъската. Разбира се, някои от тези указатели трябва да сочат към някакви създадени шахматни фигури. При създаване на дъската, трябва да подредите фигурите. На най-долните два реда присъстват белите фигури, на най-горните два - черните. За дъска 8х8, фигурите са подредени както нормално: -[image https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/The_chess_board_from_Chess.jpg/1024px-The_chess_board_from_Chess.jpg?20210610045654] +{img https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/The_chess_board_from_Chess.jpg/1024px-The_chess_board_from_Chess.jpg?20210610045654} При по-големи дъски започвате да повтаряте редиците, докато при по-малките ги режете, от дясната страна. Тоест в дъска 10x10 първите 8 колони изглеждат като на картинката, на 9та колона (отгоре-надолу) имате черен топ, черна пешка, 6 празни места, бяла пешка, бял топ и на последната колона са черен кон, черна пешка, 6 празни места, бяла пешка, бял кон. @@ -98,22 +101,22 @@ GitHub classroom: [url https://classroom.github.com/a/KPMqXsFp classroom.github. ### Задача 7 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week03/Exercise7.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week03/Exercise7.cpp} Имате затворени интервали от целочислени числа. Разглеждаме смесване на интервали: .bulleted -- смеската на допиращи се интервали е тяхното слепване, тоест смеската на [`[0, 3]`] и [`[3, 5]`] е [`[0, 5]`] -- смеската на препокриващи се интервали е тяхното обединение, тоест смеската на [`[0, 5]`] и [`[3, 8]`] е [`[0, 8]`] +- смеската на допиращи се интервали е тяхното слепване, тоест смеската на {` [0, 3]} и {` [3, 5]} е {` [0, 5]} +- смеската на препокриващи се интервали е тяхното обединение, тоест смеската на {` [0, 5]} и {` [3, 8]} е {` [0, 8]} -В противен случай не можем да смесим интервалите (примерно не можем да смесим [`[0, 3]`] и [`[4, 8]`]). +В противен случай не можем да смесим интервалите (примерно не можем да смесим {` [0, 3]} и {` [4, 8]}). Започвайки от някакво множество с интервали, смесете колкото се може повече от тях и изкарайте всичките резултатни интервали, които не могат повече да се смесят. Използвайте структури и член-функции. ### Задача 8 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week03/Exercise8.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week03/Exercise8.cpp} "Моделирайте" (тоест сами се сетете за типовете данни и нужните структури) един град със следните харакетристики. @@ -125,7 +128,7 @@ GitHub classroom: [url https://classroom.github.com/a/KPMqXsFp classroom.github. Градът трябва да пази всички отделни сгради, като допълнително за всяка жилищна трябва да съхранява общата бройка жители, a за всяка търговска - общата бройка отворени магазини. Освен това трябва да се съхрани и нещо като карта на всичките сгради: допускаме Старозагоско/Манхатънско подреждане на сградите, тоест всички сгради се намират върху някаква "решетка". -.question Познавате ли структурата [`Pair`]? +.question Познавате ли структурата {` Pair}? Имплементирайте възможност за построяване и събаряне на сгради. Направете нужните проверки на всички данни: цената да не е отрицателна, бройката жители да не надвишава капацитета на сградата и так. нат. @@ -153,25 +156,25 @@ GitHub classroom: [url https://classroom.github.com/a/KPMqXsFp classroom.github. Винаги започваме с една празна начална директория. Двете функции, за създаване и изтриване, трябва да приемат масив от низове, който определя път от директории към желания файл, започвайки от началния файл. -Тоест, ако бяха подадени низовете [`Documents`], [`Personal`], [`Health`], [`receipt.txt`], тогава от началния файл намираме името [`Documents`] и "влизаме" в директорията със съответния идентификационен номер, в нея намираме името [`Personal`] и так. нат. +Тоест, ако бяха подадени низовете {` Documents}, {` Personal}, {` Health}, {` receipt.txt}, тогава от началния файл намираме името {` Documents} и "влизаме" в директорията със съответния идентификационен номер, в нея намираме името {` Personal} и так. нат. ### Задача 10 -Намираме се в равнината, при която всички (двуизмерни) координати са [=целочислени=]. +Намираме се в равнината, при която всички (двуизмерни) координати са {b целочислени}. В нея имаме стъклени панели (прави отсечки), дефинирани с координатите на двете им крайни точки. Допълнително всеки панел си има свой цвят (като проценти, между 0 и 1, от цветовете червено, зелено и синьо) и прозрачност (като процент, между 0 и 1). Също имаме и един лъч, той се характеризира с началния си координат и единичен двуизмерен вектор, определящ неговата посока на движение. -Този лъч не се пречупва и винаги се движи напред (преместването на лъча се извършва чрез [`позиция = позиция + посока`]). +Този лъч не се пречупва и винаги се движи напред (преместването на лъча се извършва чрез {` позиция = позиция + посока}). Чрез този лъч трябва да изкарате композитния цвят, след като лъча е минал през всички стъклени панели пред него. Нека също композитния цвят винаги да има 100% прозрачност. -Примерно, ако лъча премине през един панел с цветови проценти [`0,1,0`] и прозрачност [`0.5`] и още един панел с цветови проценти [`0,1,1`] и прозрачност [`0.5`], тогава композитния цвят е [`0,1,0.5`]. +Примерно, ако лъча премине през един панел с цветови проценти {` 0,1,0} и прозрачност {` 0.5} и още един панел с цветови проценти {` 0,1,1} и прозрачност {` 0.5}, тогава композитния цвят е {` 0,1,0.5}. .question Колко структури ще ви трябват? ## Признания -Изображението на шахматната дъска от chess.com, направено от Hfjhjoiijklij4 за [url https://commons.wikimedia.org/w/index.php?curid=106440749 Уикипедия] под лиценз CC BY-SA 4.0 +Изображението на шахматната дъска от chess.com, направено от Hfjhjoiijklij4 за {url Уикипедия;https://commons.wikimedia.org/w/index.php?curid=106440749} под лиценз CC BY-SA 4.0 diff --git a/src/teaching/oop-2023/week4/index.du b/src/teaching/oop-2023/week4/index.du index 3b2c19f..d25085a 100644 --- a/src/teaching/oop-2023/week4/index.du +++ b/src/teaching/oop-2023/week4/index.du @@ -1,16 +1,19 @@ -# Задачи - ООП, Седмица 4, 14.03.2024 +'def title Задачи - ООП, Седмица 4, 14.03.2024 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/qa_FfWeG classroom.github.com/a/qa_FfWeG] +GitHub classroom: {url classroom.github.com/a/qa_FfWeG;https://classroom.github.com/a/qa_FfWeG} ## Преговорни ### Задача 1 - Капсулация -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week04/Exercise1.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week04/Exercise1.cpp} -Имплементирайте структура [`Smartphone`], която запазва [=скрито=]: +Имплементирайте структура {` Smartphone}, която запазва {b скрито}: .bulleted - марка, низ с максимална дължина от 128 знака - модел, низ с максимална дължина от 512 знака @@ -27,11 +30,11 @@ GitHub classroom: [url https://classroom.github.com/a/qa_FfWeG classroom.github. ### Задача 2 - Капсулация с динамична памет -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week04/Exercise2.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week04/Exercise2.cpp} -Имплементирайте структура [`Bee`], която запазва възрастта на пчела чрез число с плаваща запетая и типа пчела с буква. +Имплементирайте структура {` Bee}, която запазва възрастта на пчела чрез число с плаваща запетая и типа пчела с буква. -Имплементирайте структура [`BeeHive`], която запазва динамично-заделен масив с всички реещи се пчели и друг динамично-заделен масив с всички яйца в кошера. +Имплементирайте структура {` BeeHive}, която запазва динамично-заделен масив с всички реещи се пчели и друг динамично-заделен масив с всички яйца в кошера. Размерите на двата масива се подават на конструктора. Имплементирайте нужните конструктор и деструктор. @@ -39,47 +42,47 @@ GitHub classroom: [url https://classroom.github.com/a/qa_FfWeG classroom.github. ### Задача 3 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week04/Exercise3.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week04/Exercise3.cpp} -Имплементирайте структура [`Paper`], която запазва своето текстово съдържание като низ от максимум 1024 знака и положително цяло число, определящо номера на страницата. +Имплементирайте структура {` Paper}, която запазва своето текстово съдържание като низ от максимум 1024 знака и положително цяло число, определящо номера на страницата. -От входа получавате на един ред цялото текстото съдържание за един обект от тип [`Paper`] и на следващия ред - бройките копия [`N`] на дадения обект. +От входа получавате на един ред цялото текстото съдържание за един обект от тип {` Paper} и на следващия ред - бройките копия {` N} на дадения обект. -Създайте [`Paper`] обект със съответното съдържание и номер на страницата [`1`]. -Създайте динамично-заделен масив от [`Paper`] с размер [`N`], като първия му елемент е новосъздадения обект, докато останалите са [=копия=] на първия обект. +Създайте {` Paper} обект със съответното съдържание и номер на страницата {` 1}. +Създайте динамично-заделен масив от {` Paper} с размер {` N}, като първия му елемент е новосъздадения обект, докато останалите са {b копия} на първия обект. При всяко копие, трябва да увеличите номера на страницата. Имплементирейте логиката чрез копиращ конструктор. ### Задача 4 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week04/Exercise4.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week04/Exercise4.cpp} -Създайте структура [`DynamicString`], чиито конструктор приема низ с терминираща нула, заделя точно толкова динамична памет, колкото е нужно да се запази целия низ и копира буквите на низа в тази памет. +Създайте структура {` DynamicString}, чиито конструктор приема низ с терминираща нула, заделя точно толкова динамична памет, колкото е нужно да се запази целия низ и копира буквите на низа в тази памет. Имплементирайте оператор равно. -.question Какви данни трябва [`DynamicString`] да запазва скрито? +.question Какви данни трябва {` DynamicString} да запазва скрито? :question -Какво трябва оператор равно да направи, ако записваме в [`DynamicString`] с вече заделена памет?\n +Какво трябва оператор равно да направи, ако записваме в {` DynamicString} с вече заделена памет?\n Тоест ако имахме:\n -[`DynamicString s1("Hello"); DynamicString s2("World"); s2 = s1;`] +{` DynamicString s1("Hello"); DynamicString s2("World"); s2 = s1;} ### Задача 5 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week04/Exercise5.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week04/Exercise5.cpp} -Имплементирайте структура [`TVProgram`], която запазва името на предаването като низ от максимум 1024 знака, начало на излъчване и край на излъчване като неотрицателни целочислени числа (като примерно 1347 е един часа и 47 минути следобед). +Имплементирайте структура {` TVProgram}, която запазва името на предаването като низ от максимум 1024 знака, начало на излъчване и край на излъчване като неотрицателни целочислени числа (като примерно 1347 е един часа и 47 минути следобед). Имплементирайте конструктор, деструктор, оператор равно и копиращ конструктор. -Имплементирайте структура [`TVChannel`], която запазва динамично заделен масив от [`TVProgram`], размера на динамично заделената памет и броя "ненулеви" елементи (програми, добавени с [`AddProgram`]). +Имплементирайте структура {` TVChannel}, която запазва динамично заделен масив от {` TVProgram}, размера на динамично заделената памет и броя "ненулеви" елементи (програми, добавени с {` AddProgram}). -Имплементирайте нейн метод [`AddProgram`], който приема [`TVProgram`] [=по копие=] и го вмъква на последната свободна позиция в масива. +Имплементирайте нейн метод {` AddProgram}, който приема {` TVProgram} {b по копие} и го вмъква на последната свободна позиция в масива. Ако масива е пълен, трябва да го "оразмерите" (да направите нов, по-голям масив, да копирате данните от стария в новия, да изтриете стария и да обновите указателя да сочи към новия). -.question Кога използвате копиращия конструктор на [`TVProgram`] и кога използвате оператор равно? +.question Кога използвате копиращия конструктор на {` TVProgram} и кога използвате оператор равно? ## Трудни задачи @@ -92,9 +95,9 @@ GitHub classroom: [url https://classroom.github.com/a/qa_FfWeG classroom.github. Гравитационното привличане на звезда в своя център се определя от ъгъла θ<sub>max</sub> (в градуси). Планетата се върти около една звезда, използвайки стандартната матрица за ротация: -[image ./img/Rotation_matrix.png] +{img ./img/Rotation_matrix.png} -Ъгълът на въртене θ, спрямо разстоянието до една звезда, се определя чрез [url https://en.wikipedia.org/wiki/Inverse-square_law закона на обратните квадрати], тоест в зависимост от разстоянието [`d`] между центъра на звездата и центъра на планетата, то истинският ъгъл на завъртане е θ = θ<sub>max</sub> * 1 / d^2. +Ъгълът на въртене θ, спрямо разстоянието до една звезда, се определя чрез {url закона на обратните квадрати;https://en.wikipedia.org/wiki/Inverse-square_law}, тоест в зависимост от разстоянието {` d} между центъра на звездата и центъра на планетата, то истинският ъгъл на завъртане е θ = θ<sub>max</sub> * 1 / d^2. Допълнително, ако имаме повече от една звезда, тогава ще използваме θ' = max(θ<sub>i</sub> - average(θ<sub>1</sub>, ..., θ<sub>n</sub>)), където θ<sub>i</sub> е намереният ъгъл θ за i-тата звезда и имаме n на брой звезди. @@ -105,11 +108,11 @@ GitHub classroom: [url https://classroom.github.com/a/qa_FfWeG classroom.github. Имплементирайте структури: .bulleted -- [`Matrix2x2`] и [`Matrix2x1`], чиито стойности са числа с плаваща запетая, и с член функции за събиране и умножение (не оператор+, оператор\*) -- [`Coordinate`], която запазва ([=не наследява=]) точките в пространството като [`Matrix2x1`] и имплементира събиране, умножение и разстояние между координати и матрици -- [`Star`], запазваща координатата на своя център ([`Matrix2x1`]) и ъгълът θ<sub>max</sub> като число с плаваща запетая. +- {` Matrix2x2} и {` Matrix2x1}, чиито стойности са числа с плаваща запетая, и с член функции за събиране и умножение (не оператор+, оператор\*) +- {` Coordinate}, която запазва ({b не наследява}) точките в пространството като {` Matrix2x1} и имплементира събиране, умножение и разстояние между координати и матрици +- {` Star}, запазваща координатата на своя център ({` Matrix2x1}) и ъгълът θ<sub>max</sub> като число с плаваща запетая. Имплементирайте и метод, който приема планета и връща ъгълът θ. -- [`Planet`], запазваща своите координати ([`Matrix2x1`]) и изминалото време (тоест колко пъти се е движела от началото на симулацията). - Имплементирайте метод [`OrbitPlanet`], която приема планета и ъгъл θ', и се завърта около нея. -- [`Universe`], запазваща всички звездите и планетата. - Имплементирайте метод [`FullOrbit`], която връща звездата около която планетата е успяла да извърши пълна ротация и времето за което това се е случило. +- {` Planet}, запазваща своите координати ({` Matrix2x1}) и изминалото време (тоест колко пъти се е движела от началото на симулацията). + Имплементирайте метод {` OrbitPlanet}, която приема планета и ъгъл θ', и се завърта около нея. +- {` Universe}, запазваща всички звездите и планетата. + Имплементирайте метод {` FullOrbit}, която връща звездата около която планетата е успяла да извърши пълна ротация и времето за което това се е случило. diff --git a/src/teaching/oop-2023/week5/index.du b/src/teaching/oop-2023/week5/index.du index 265e4f7..2ee73ba 100644 --- a/src/teaching/oop-2023/week5/index.du +++ b/src/teaching/oop-2023/week5/index.du @@ -1,37 +1,40 @@ -# Задачи - ООП, Седмица 5, 21.03.2024 +'def title Задачи - ООП, Седмица 5, 21.03.2024 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/42ZZ56Mg classroom.github.com/a/42ZZ56Mg] +GitHub classroom: {url classroom.github.com/a/42ZZ56Mg;https://classroom.github.com/a/42ZZ56Mg} ## Преговорни ### 1 задача - Капсулация с динамична памет -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week05/Exercise1.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week05/Exercise1.cpp} Пациент в болница се характеризира с идентификационен номер (неотрицателно целочислено число) и име (низ от максимум 1024 знака). Една болница има максимален капацититет на болни, които може да държи (максимален брой легла за тях). Конструктора за болницата приема максималния капацитет, като структурата за болницата пази всичките си пациенти. -Имплементирайте методи [`AddPatient`], който добавя нов пациент и [`RemovePatient`], който го премахва от болницата. +Имплементирайте методи {` AddPatient}, който добавя нов пациент и {` RemovePatient}, който го премахва от болницата. Не е нужно данните за пациентите да са скрити, но данните в болницата трябва да са. ### 2 задача - Копиращ конструктор и оператор= -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week05/Exercise2.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week05/Exercise2.cpp} -Имплементирайте структура [`FloatArray`], която запазва динамично-заделен масив от [`float`] стойности. +Имплементирайте структура {` FloatArray}, която запазва динамично-заделен масив от {` float} стойности. Размерът на масива се подава в конструктора. -Имплементирайте копиращ конструктор, оператор= и get-ър/set-ър за елемент на индекс [`i`]. +Имплементирайте копиращ конструктор, оператор= и get-ър/set-ър за елемент на индекс {` i}. ## Лесни задачи ### 3 задача -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week05/Exercise3.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week05/Exercise3.cpp} Имейл се характеризира с две стойности: адресът от който е изпратен (низ с максимална дължина от 128 знака) и съдържание (низ с неограничен размер). Съобщението се подава като указател към знак, и трябва да заделите точно толкова динамична памет, колкото ви трябва за целия текст. @@ -40,7 +43,7 @@ GitHub classroom: [url https://classroom.github.com/a/42ZZ56Mg classroom.github. ### 4 задача -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week05/Exercise4.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week05/Exercise4.cpp} Имплементирайте структура за касов бон, която запазва скрит динамично-заделен масив от цени (числа с плаваща запетая). Можете да добавяте неограничен брой цени в края на касовия бон (ако масива е пълен, създавате по-голям и пренасяте стойностите). @@ -51,7 +54,7 @@ GitHub classroom: [url https://classroom.github.com/a/42ZZ56Mg classroom.github. ### 5 задача -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week05/Exercise5.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week05/Exercise5.cpp} Един контролен списък (checklist) пази няколко неща: булева стойност, дали е избран или не, текстово съдържание (низ с "произволна" дължина) и масив от контролни списъци (всеки списък от този масив ще наричам "подсписък" за удобство). Нека текстовото съдържание да не може да се редактира (задава се в конструктора и няма set-ър). @@ -61,31 +64,31 @@ GitHub classroom: [url https://classroom.github.com/a/42ZZ56Mg classroom.github. ### 6 задача -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week05/Exercise6.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week05/Exercise6.cpp} Имате телефонен указател, който запазва масив от имена (низове). В началото винаги започва празен. Имплементирайте голяма четворка. -Имплементирайте метод [`InsertPerson`], който вмъква ново име в указателя, като вмъкването запазва сортировка по азбучен ред. -Тоест ако указателя беше [`{ "Atanas", "Yavor" }`], тогава след вмъкване на [`Boris`] ще имаме [`{ "Atanas", "Boris", "Yavor" }`]. +Имплементирайте метод {` InsertPerson}, който вмъква ново име в указателя, като вмъкването запазва сортировка по азбучен ред. +Тоест ако указателя беше {` { "Atanas", "Yavor" }}, тогава след вмъкване на {` Boris} ще имаме {` { "Atanas", "Boris", "Yavor" }}. .important Имплементирайте вмъкване, запазващо "сортираност" без функция за сортиране! ### 7 задача -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week05/Exercise7.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week05/Exercise7.cpp} Имплементирайте структура водомер, която скрито запазва отчетеното количество вода (double). -Има [=единствено=] конструктор по подразбиране, при който отчетеното количество е нула, метод [`AddWater`], който увеличава брояча с подаденото количество вода и метод [`Print`], който изкарва стойността на брояча на екрана. +Има {b единствено} конструктор по подразбиране, при който отчетеното количество е нула, метод {` AddWater}, който увеличава брояча с подаденото количество вода и метод {` Print}, който изкарва стойността на брояча на екрана. Имплементирайте голяма четворка (когато е нужно). Имплементирайте структура сграда, която има инсталирани подаден брой водомери. -Имплементирайте метод [`SimulateDay`], който "симулира" ден в сградата - към всички датчици се добавят между 0 и 0.42 вода (разглеждаме само числа с максимум 3 цифри след запетаята). +Имплементирайте метод {` SimulateDay}, който "симулира" ден в сградата - към всички датчици се добавят между 0 и 0.42 вода (разглеждаме само числа с максимум 3 цифри след запетаята). Количеството е случайно за всеки ден. -Имплементирайте метод [`SimulateMonth`], който "симулира" 30 дена в сградата, като на всеки 5 дена се прави "отчет" - всичките водомери се [=копират=] и запазват във вътрешен масив. +Имплементирайте метод {` SimulateMonth}, който "симулира" 30 дена в сградата, като на всеки 5 дена се прави "отчет" - всичките водомери се {b копират} и запазват във вътрешен масив. На края на месеца изкарайте на екрана, на един ред, всичките водомери от първите дни (първи ден на първи отчет, първи ден на втори отчет, ...), вторите дни, ... ### 8 задача @@ -93,15 +96,15 @@ GitHub classroom: [url https://classroom.github.com/a/42ZZ56Mg classroom.github. Една интернет заявка се характеризира с тип (низ от максимум 4 знака), версия на протокола (положително число с плаваща запетая) и идентификатор (буква). Нека тези данни да са скрити, като единствено могат да се set-нат от конструктора (тоест няма set-ъри, но има get-ъри) и е имлементирана голяма четворка (когато е нужно). -Интернет сървър обработва интернет заявки, като всяка получена заявка я запазва в нормалните логове (динамично-заделен масив със заявки) [=и=] в логовете за грешки (друг динамично-заделен масив със заявки). +Интернет сървър обработва интернет заявки, като всяка получена заявка я запазва в нормалните логове (динамично-заделен масив със заявки) {b и} в логовете за грешки (друг динамично-заделен масив със заявки). -Разглеждаме четири типа заявки: [`GET`], [`HEAD`], [`POST`] и [`PUT`]. +Разглеждаме четири типа заявки: {` GET}, {` HEAD}, {` POST} и {` PUT}. За всяка сървърът съдържа динамично-заделен масив от низове. Имплементирайте методи за добавяне на низ към всеки тип. Ако съответния масив от низове е пълен, тогава трябва да го уголемите. -Имплементирайте метод [`HandleRequest`], който приема интернет заявка [=по копие=], запазва я в нормалните логове и връща първия низ от масива на съответния тип, който започва с идентификатор-буквата. -Ако такъв низ не съществува, тогава връща низа "Bad request" и добавя заявката [=и=] в логовете за грешки. +Имплементирайте метод {` HandleRequest}, който приема интернет заявка {b по копие}, запазва я в нормалните логове и връща първия низ от масива на съответния тип, който започва с идентификатор-буквата. +Ако такъв низ не съществува, тогава връща низа "Bad request" и добавя заявката {b и} в логовете за грешки. Размерите на логовете се подават на конструктора. По принцип добавяте нови заявки в края на лога. diff --git a/src/teaching/oop-2023/week6/index.du b/src/teaching/oop-2023/week6/index.du index 2662f2c..5eee7f9 100644 --- a/src/teaching/oop-2023/week6/index.du +++ b/src/teaching/oop-2023/week6/index.du @@ -1,8 +1,11 @@ -# Задачи - ООП, Седмица 6, 28.03.2024 +'def title Задачи - ООП, Седмица 6, 28.03.2024 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/rzSTn5pu classroom.github.com/a/rzSTn5pu] +GitHub classroom: {url classroom.github.com/a/rzSTn5pu;https://classroom.github.com/a/rzSTn5pu} .warn В задачите за файлове имплементирайте всички нужни проверки и затваряния @@ -10,17 +13,17 @@ GitHub classroom: [url https://classroom.github.com/a/rzSTn5pu classroom.github. ### 1 задача - Копиращ конструктор и оператор= -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week06/Exercise01.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week06/Exercise01.cpp} -Имплементирайте структура [`WoodenPlank`], която скрито запазва ширина, дължина и височина на дъската (целочислено), цената ѝ (число с плаваща запетая) и типа дърво (низ с максимум 1024 знака). +Имплементирайте структура {` WoodenPlank}, която скрито запазва ширина, дължина и височина на дъската (целочислено), цената ѝ (число с плаваща запетая) и типа дърво (низ с максимум 1024 знака). Имплементирайте get-ъри, set-ъри, копиращ конструктор, оператор= ### 2 задача - Голяма четворка -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week06/Exercise02.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week06/Exercise02.cpp} -Имплементирайте структура [`DynamicString`], която скрито запазва указател към низ (в динамичната памет) и неговия размер. +Имплементирайте структура {` DynamicString}, която скрито запазва указател към низ (в динамичната памет) и неговия размер. Имплементирайте голяма четворка. @@ -28,37 +31,37 @@ GitHub classroom: [url https://classroom.github.com/a/rzSTn5pu classroom.github. ### 3 задача -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week06/Exercise03.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week06/Exercise03.cpp} Имплементирайте програма, която отваря файл (създава го, ако вече не е създаден) и вкарва текста "Hello World!" във файла. Името на файла се подава от стандартния вход на един ред. ### 4 задача -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week06/Exercise04.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week06/Exercise04.cpp} Имплементирайте програма, която приема име на файл от стандартния вход. Изкарайте последния ред от файла. -Редовете са разделени със знака [`\\n`]. +Редовете са разделени със знака {` \\n}. ### 5 задача -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week06/Exercise05.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week06/Exercise05.cpp} Имплементирайте програма, която приема име на файл от стандартния вход. Изкарайте броя редове и броя думи във файла. ### 6 задача -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week06/Exercise06.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week06/Exercise06.cpp} От стандартния вход получавате, на два отделни реда, две имена на файлове. Вмъкнете съдържанието на втория файл по средата на първия файл. ### 7 задача -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week06/Exercise07.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week06/Exercise07.cpp} От стандартния вход получавате числата m и n, както и името на файл (на свой си ред). Изкарайте на екрана от m-тата до n-тата буква (включително) от всеки ред във файла. @@ -66,9 +69,9 @@ GitHub classroom: [url https://classroom.github.com/a/rzSTn5pu classroom.github. ### 8 задача -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week06/Exercise08.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week06/Exercise08.cpp} -Имплементирайте структура [`FileBuffer`], която в конструктора си приема име на файл, отваря го и запазва (копира) цялото му съдържание в динамичната памет (с указател член-данна). +Имплементирайте структура {` FileBuffer}, която в конструктора си приема име на файл, отваря го и запазва (копира) цялото му съдържание в динамичната памет (с указател член-данна). .question Кога трябва да затворим файла? @@ -76,29 +79,29 @@ GitHub classroom: [url https://classroom.github.com/a/rzSTn5pu classroom.github. ### 9 задача -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week06/Exercise09.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week06/Exercise09.cpp} -Имплементирайте структура [`Person`], която приема име на човек (низ с максимална дължина от 1024 знака) и неговата възраст (целочислена стойност). -Имплементирайте методи [`Save`] и [`Load`], които съответно запазват/прочитат данните в (двоичен) файл с подадено име. +Имплементирайте структура {` Person}, която приема име на човек (низ с максимална дължина от 1024 знака) и неговата възраст (целочислена стойност). +Имплементирайте методи {` Save} и {` Load}, които съответно запазват/прочитат данните в (двоичен) файл с подадено име. ## Трудни задачи ### 10 задача -Имплементирайте структура [`Table`], която запазва произволен брой колони и редове с низови стойности. +Имплементирайте структура {` Table}, която запазва произволен брой колони и редове с низови стойности. Броя редове/колони може да се уразмерява по време на изпълнение. Имплементирайте голяма четворка. -Имплементирайте методи [`AddRow`] и [`AddColumn`], които вмъкват подадените стойности като нов ред/колона на дадения индекс. -Аналогично имплементирайте методи [`RemoveRow`] и [`RemoveColumn`]. -[=Чрез всички тези=] имплементирайте метода [`ModifyValue`], който променя стойността на клетката на дадените индекси. +Имплементирайте методи {` AddRow} и {` AddColumn}, които вмъкват подадените стойности като нов ред/колона на дадения индекс. +Аналогично имплементирайте методи {` RemoveRow} и {` RemoveColumn}. +{b Чрез всички тези} имплементирайте метода {` ModifyValue}, който променя стойността на клетката на дадените индекси. -Имплементирайте методи [`Save`] и [`Load`], които запазват/зреждат таблицата в/от файл с подадено име, в текстовия CSV формат (всеки ред в таблицата е ред във файла, всички стойности в реда от таблицата са разделени със запетая в реда във файла). +Имплементирайте методи {` Save} и {` Load}, които запазват/зреждат таблицата в/от файл с подадено име, в текстовия CSV формат (всеки ред в таблицата е ред във файла, всички стойности в реда от таблицата са разделени със запетая в реда във файла). ### 11 задача -Имплементирайте структура [`City`], която запазва името на даден град (низ с максимална дължина от 1024 знака) и масив от указатели към други градове, които са негови съседи. -Имплементирайте методи [`AddNeighbour`] и [`RemoveNeighbour`] (броя съседи може да се променя), както и голяма четворка. +Имплементирайте структура {` City}, която запазва името на даден град (низ с максимална дължина от 1024 знака) и масив от указатели към други градове, които са негови съседи. +Имплементирайте методи {` AddNeighbour} и {` RemoveNeighbour} (броя съседи може да се променя), както и голяма четворка. -Имплементирайте методи [`Save`] и [`Load`], които запазват/зреждат всичките достижими градове от сегашния в/от (бинарен) файл с подадено име. +Имплементирайте методи {` Save} и {` Load}, които запазват/зреждат всичките достижими градове от сегашния в/от (бинарен) файл с подадено име. Подсказвам, че не можете да запазите указателите ей-така. diff --git a/src/teaching/oop-2023/week7/index.du b/src/teaching/oop-2023/week7/index.du index e3b1044..f64265a 100644 --- a/src/teaching/oop-2023/week7/index.du +++ b/src/teaching/oop-2023/week7/index.du @@ -1,23 +1,26 @@ -# Задачи - ООП, Седмица 7, 04.04.2024 +'def title Задачи - ООП, Седмица 7, 04.04.2024 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/vvZENbkX classroom.github.com/a/vvZENbkX] +GitHub classroom: {url classroom.github.com/a/vvZENbkX;https://classroom.github.com/a/vvZENbkX} ## Преговорни ### Задача 1 - Голяма петица -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week07/Exercise1.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week07/Exercise1.cpp} Една съставка е композирана от низ (с максимална дължина от 511 знака) определящ името ѝ и грамаж (число с плаваща запетая). -Създайте клас [`Recipe`], към който могат да се прибавят и премахват произволен брой съставки. +Създайте клас {` Recipe}, към който могат да се прибавят и премахват произволен брой съставки. Имплементирайте голяма петица (голяма четворка плюс move семантики) за него. ### Задача 2 - Работа с файлове -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week07/Exercise2.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week07/Exercise2.cpp} От един ред на входа получавате името на текстови файл. Изкарайте на екрана средната една трета от файла, като буквите са в обратен ред. @@ -26,25 +29,25 @@ GitHub classroom: [url https://classroom.github.com/a/vvZENbkX classroom.github. ### Задача 3 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week07/Exercise3.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week07/Exercise3.cpp} -Имплементирайте клас [`Thermometer`], който запазва максималната и минималната възможна температура за измерване, както и сегашната температура, всичките които са цели неотрицателни числа. +Имплементирайте клас {` Thermometer}, който запазва максималната и минималната възможна температура за измерване, както и сегашната температура, всичките които са цели неотрицателни числа. -Имплементирайте методи [`SaveText`] и [`LoadText`], които съответно записват и четат (тоест член-данните стават равни на тези от файла) данните си в/от [=текстови=] файл с подадено име. -Аналогично имплементирайте [`SaveBinary`] и [`LoadBinary`], които работят с [=двоични=] файлове. +Имплементирайте методи {` SaveText} и {` LoadText}, които съответно записват и четат (тоест член-данните стават равни на тези от файла) данните си в/от {b текстови} файл с подадено име. +Аналогично имплементирайте {` SaveBinary} и {` LoadBinary}, които работят с {b двоични} файлове. ### Задача 4 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week07/Exercise4.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week07/Exercise4.cpp} -Имплементирайте клас [`Street`], който запазва скрито името на улицата като низ с произволна дължина и номер като цяло число. +Имплементирайте клас {` Street}, който запазва скрито името на улицата като низ с произволна дължина и номер като цяло число. Имплементирайте голяма петица. -Имплементирайте методите [`SaveText`], [`LoadText`], [`SaveBinary`], [`LoadBinary`]. +Имплементирайте методите {` SaveText}, {` LoadText}, {` SaveBinary}, {` LoadBinary}. ### Задача 5 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week07/Exercise5.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week07/Exercise5.cpp} За един транспортен билет е нужно скрито да пазим началната и крайната дестинация като динамично-заделени низове с произволна дължина, неговата цена като число с плаваща запетая и идентификационен номер като цяло неотрицателно число. @@ -52,17 +55,17 @@ GitHub classroom: [url https://classroom.github.com/a/vvZENbkX classroom.github. ### Задача 6 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week07/Exercise6.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week07/Exercise6.cpp} -Имплементирайте клас [`Matrix`], който запазва стойностите на матрица 2 на 2. +Имплементирайте клас {` Matrix}, който запазва стойностите на матрица 2 на 2. Предефинирайте операторите за инкрементиране, декрементиране, събиране, изваждане, умножение и вход/изход от/към поток. Имплементирайте четирите функции за записване и четене от файлове. ### Задача 7 -Имплементирайте клас [`Paragraph`], който съдържа текст с много редове в него. -Текстът се запазва като низ с произволна дължина, а редовете се разделят със знака [`'\\n'`]. +Имплементирайте клас {` Paragraph}, който съдържа текст с много редове в него. +Текстът се запазва като низ с произволна дължина, а редовете се разделят със знака {` '\\n'}. Имплементирайте голяма петица. Имплементирайте четирите функции за записване и четене от файлове. @@ -73,7 +76,7 @@ GitHub classroom: [url https://classroom.github.com/a/vvZENbkX classroom.github. ### Задача 8 -Имплементирайте клас [`MatrixNМ`], който запазва стойностите на матрица с N реда и M колони (подадени на конструктор). +Имплементирайте клас {` MatrixNМ}, който запазва стойностите на матрица с N реда и M колони (подадени на конструктор). Имплементирайте голяма петица. Имплементирайте четирите функции за записване и четене от файлове. diff --git a/src/teaching/oop-2023/week8/index.du b/src/teaching/oop-2023/week8/index.du index 4e2270d..c8fc94f 100644 --- a/src/teaching/oop-2023/week8/index.du +++ b/src/teaching/oop-2023/week8/index.du @@ -1,43 +1,46 @@ -# Задачи - ООП, Седмица 8, 11.04.2024 +'def title Задачи - ООП, Седмица 8, 11.04.2024 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/7d0MBjcK classroom.github.com/a/7d0MBjcK] +GitHub classroom: {url classroom.github.com/a/7d0MBjcK;https://classroom.github.com/a/7d0MBjcK} ## Преговорни ### Задача 1 - Голяма петица -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week08/Exercise1.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week08/Exercise1.cpp} -Имплементирайте клас [`StreetList`], който запазва имената на улици (низове с произволна дължина) в динамичен масив. +Имплементирайте клас {` StreetList}, който запазва имената на улици (низове с произволна дължина) в динамичен масив. Може да се добавят нови имена в края на списъка, като съответния (вътрешен) масив трябва да се уголеми. Имплементирайте голяма петица за класа. ### Задача 2 - Файлове и класове -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week08/Exercise2.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week08/Exercise2.cpp} -Имплементирайте клас [`Person`], който запазва трите имена (низове с произволна дължина) и идентификационния номер (цяло неотрицателно число) на човек. +Имплементирайте клас {` Person}, който запазва трите имена (низове с произволна дължина) и идентификационния номер (цяло неотрицателно число) на човек. Имплементирайте голяма петица. -Имплементирайте методи [`SaveText`] и [`LoadText`], които съответно записват и четат (тоест член-данните стават равни на тези от файла) данните си в/от [=текстови=] файл с подадено име. -Аналогично имплементирайте [`SaveBinary`] и [`LoadBinary`], които работят с [=двоични=] файлове. +Имплементирайте методи {` SaveText} и {` LoadText}, които съответно записват и четат (тоест член-данните стават равни на тези от файла) данните си в/от {b текстови} файл с подадено име. +Аналогично имплементирайте {` SaveBinary} и {` LoadBinary}, които работят с {b двоични} файлове. ## Лесни ### Задача 3 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week08/Exercise3.hpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week08/Exercise3.hpp} -Имплементирайте шаблонната структура [`Pair`], която приема два типа и запазва по една стойност от всеки тип. +Имплементирайте шаблонната структура {` Pair}, която приема два типа и запазва по една стойност от всеки тип. ### Задача 4 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week08/Exercise4.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week08/Exercise4.cpp} -Имплементирайте клас [`FloatArray`], който съдържа списък с числа с плаваща запетая. +Имплементирайте клас {` FloatArray}, който съдържа списък с числа с плаваща запетая. Може да добавяте нови числа в края на този списък. Имплементирйате голяма петица. @@ -53,16 +56,16 @@ GitHub classroom: [url https://classroom.github.com/a/7d0MBjcK classroom.github. ### Задача 5 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week08/Exercise5.hpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week08/Exercise5.hpp} -Имплементирайте класът и неговите оператори от предходната задача като темплейтен (шаблонен) клас с име [`DynamicArray`]. +Имплементирайте класът и неговите оператори от предходната задача като темплейтен (шаблонен) клас с име {` DynamicArray}. Очевидно шаблонния тип определя типа на списъка с елементи. ### Задача 6 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week08/Exercise6.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week08/Exercise6.cpp} -Имплементирайте клас [`NumberInput`], който запазва целочислена стойност. +Имплементирайте клас {` NumberInput}, който запазва целочислена стойност. В конструктора се подава минимална и максимална възможна стойност, след това (все още в конструктора) се изкарва на екрана съответно съобщение и се приема потребителски вход. Ако той не е валиден или е извън подадения обхват, трябва да хвърлите грешка. @@ -72,26 +75,26 @@ GitHub classroom: [url https://classroom.github.com/a/7d0MBjcK classroom.github. ### Задача 7 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week08/Exercise7.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week08/Exercise7.cpp} -Имплементирайте клас [`UserError`], чиято употреба е да се хвърля като грешка. +Имплементирайте клас {` UserError}, чиято употреба е да се хвърля като грешка. За тази цел нека да запазва два низа, които се приемат в конструктора: името на клас и името на член-данната. Имплементирайте голяма петица и оператор<<, който изкарва съобщение с информация за класа и член-данната в подадения поток. -Следете бройката на създадени [`UserError`] инстанции в самия клас (статична променлива) и имплементирате нужната (статична) член-функция, която връща този брой. +Следете бройката на създадени {` UserError} инстанции в самия клас (статична променлива) и имплементирате нужната (статична) член-функция, която връща този брой. Преобразувайте последната задача, така че да хвърля грешка от този клас. -В края на програмата изкарайте колко грешки са се хвърлили [=използвайки статичните членове на UserError=]. +В края на програмата изкарайте колко грешки са се хвърлили {b използвайки статичните членове на UserError}. ## Трудни задачи ### Задача 8 -Имплементирайте шаблонен клас [`UserInput`], който запазва стойност от подадения тип. +Имплементирайте шаблонен клас {` UserInput}, който запазва стойност от подадения тип. Ако типа е указател, тогава заделяте динамична памет за един такъв елемент. -За проверка на типа използвайте [url https://en.cppreference.com/w/cpp/language/partial_specialization partial template specialization]. +За проверка на типа използвайте {url partial template specialization;https://en.cppreference.com/w/cpp/language/partial_specialization}. -В шаблона ([`template <...>`]) се приема указател към валидираща функция, която приема стойността от съответния тип и връща булева стойност. +В шаблона ({` template <...>}) се приема указател към валидираща функция, която приема стойността от съответния тип и връща булева стойност. В конструктора се приема от входа нужната стойност и ако стойността е неуспешно приета или валидиращата функция върне false, тогава хвърляте грешка. Ако типа е указател, не забравяйте да освободите паметта. @@ -101,7 +104,7 @@ GitHub classroom: [url https://classroom.github.com/a/7d0MBjcK classroom.github. .important В тази задача се изикват помощни класове, прочетете цялото условие преди имплементиране! -Имплементирайте шаблонен клас [`Dictionary`], който запазва два динамично-заделени масива: първия е със стойност от подадения тип, втория е с низове. +Имплементирайте шаблонен клас {` Dictionary}, който запазва два динамично-заделени масива: първия е със стойност от подадения тип, втория е с низове. Низовете ще се използват за индексиране, вместо числа. Разбира се, очаквайте да може да се уразмерява. Имплементирайте голяма петица. @@ -109,12 +112,12 @@ GitHub classroom: [url https://classroom.github.com/a/7d0MBjcK classroom.github. Имплементирайте оператор: :bulleted -- <<=, който вмъква всички стойности от десния [`Dictionary`] в левия +- <<=, който вмъква всички стойности от десния {` Dictionary} в левия - [], който приема низ и връща референция "към" стойността. Ако няма записана стойност на съответния индекс, тогава връщате референция в която може да се запише стойност. - [], който приема число, което се конвертира до низ и работи както предходния оператор - [], който приема низове (или числа), разделени със запетая и връща "масив" само с тези стойности -- delete, който приема стойност, върната от оператор[] и "премахва" съответната стойност от [`Dictionary`] +- delete, който приема стойност, върната от оператор[] и "премахва" съответната стойност от {` Dictionary} - префиксен++, префиксен+ и префиксен-, които ще се използват за итериране. .bulleted - ++ връща инкрементира индекса на сегашната стойност. @@ -124,14 +127,14 @@ GitHub classroom: [url https://classroom.github.com/a/7d0MBjcK classroom.github. - + връща референция към стойността на сегашния индекс - - връща сегашния (низов) индекс -- ->, такъв че можем да правим [`a->(&func1)->(&func2)`] и [`a->[&func3]->[&func4]`].\n +- ->, такъв че можем да правим {` a->(&func1)->(&func2)} и {` a->[&func3]->[&func4]}.\n Върху всяка двойка индекс-стойност се прилагат &func1 и &func2 (приемат индекс и стойност като параметри), които връщат нова стойност, заместваща сегашната.\n &func3, &func4 аналогично приемат индекс и стойност, но връщат нов индекс. В края на задачата трябва да можете да правите: -:code_c++ +````cpp int doubleUp(const char* index, int value) { return value * 2; } diff --git a/src/teaching/oop-2023/week9/index.du b/src/teaching/oop-2023/week9/index.du index ac7892b..ed125c6 100644 --- a/src/teaching/oop-2023/week9/index.du +++ b/src/teaching/oop-2023/week9/index.du @@ -1,37 +1,40 @@ -# Задачи - ООП, Седмица 9, 18.04.2024 +'def title Задачи - ООП, Седмица 9, 18.04.2024 +'def desc Условия на задачите за упражнение + +# {title} \n -На днешното упражнение ще решаваме [url https://learn.fmi.uni-sofia.bg/mod/resource/view.php?id=311448 задачата от Контролно 1], затова задачите ще са в същия дух (макар и да не включват най-новия материал). +На днешното упражнение ще решаваме {url задачата от Контролно 1;https://learn.fmi.uni-sofia.bg/mod/resource/view.php?id=311448}, затова задачите ще са в същия дух (макар и да не включват най-новия материал). -Решението, което писахме по време на практикума, с някои разширения и коментари, може да намерите [url https://github.com/Syndamia/oop-2023-solutions/tree/main/week09/Exam1 тук]. +Решението, което писахме по време на практикума, с някои разширения и коментари, може да намерите {url тук;https://github.com/Syndamia/oop-2023-solutions/tree/main/week09/Exam1}. -GitHub classroom: [url https://classroom.github.com/a/wlL1oUg2 classroom.github.com/a/wlL1oUg2] +GitHub classroom: {url classroom.github.com/a/wlL1oUg2;https://classroom.github.com/a/wlL1oUg2} ## Преговорни ### Задача 1 - Голяма петица -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week09/Exercise1 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week09/Exercise1} Реализирайте клас Printer, който съдържа модел като низ с произволна дължина и брой принтирани страници като неотрицателно цяло число. Имплементирайте голяма петица. ### Задача 2 - Файлове и класове -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week09/Exercise2 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week09/Exercise2} Реализирайте клас Date, който съдържа номера на деня, месеца и годината в три отделни целочислени член-данни. -Имплементирайте член-методи [`storeText`], [`storeBinary`], които съответно запазват данните в текстов файл (във формата "YEAR MONTH DAY") и в двоичен файл с подадени имена. -Аналогично имплементирайте [`loadText`] и [`loadBinary`], които презаписват член-данните с тези от подадените (имена на) файлове. +Имплементирайте член-методи {` storeText}, {` storeBinary}, които съответно запазват данните в текстов файл (във формата "YEAR MONTH DAY") и в двоичен файл с подадени имена. +Аналогично имплементирайте {` loadText} и {` loadBinary}, които презаписват член-данните с тези от подадените (имена на) файлове. -В главната функция създайте 5 дати, запазете всяка в [=един и същ текстов файл=], след това прочетете датите в [=нови=] 5 променливи и изкарайте датите в обратен ред. +В главната функция създайте 5 дати, запазете всяка в {b един и същ текстов файл}, след това прочетете датите в {b нови} 5 променливи и изкарайте датите в обратен ред. ## Лесни ### Задача 3 -.solution-link [url https://github.com/Syndamia/oop-2023-solutions/blob/main/week09/Exercise3 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2023-solutions/blob/main/week09/Exercise3} Реализирайте клас Train, който съдържа: .bulleted @@ -45,10 +48,10 @@ GitHub classroom: [url https://classroom.github.com/a/wlL1oUg2 classroom.github. Имплементирайте методите: .bulleted - от голямата петица -- [`TransferNextRegion`], който променя сегашната локация на следващата по ред в текстовия файл (чието име е подадено в конструктор). +- {` TransferNextRegion}, който променя сегашната локация на следващата по ред в текстовия файл (чието име е подадено в конструктор). Ако няма следващо по ред, тогава локацията да си остане същата и да се хвърли грешка. Ако се срещнат проблеми с файла, хвърлете грешка. -- [`SwitchRailLine`], който приема идентификационен номер на релсовата линия и име на текстов файл, и променя вътрешните стойности. +- {` SwitchRailLine}, който приема идентификационен номер на релсовата линия и име на текстов файл, и променя вътрешните стойности. Съответно локацията трябва да бъде първата в подадения файл. Ако се срещнат проблеми с файла, хвърлете грешка. @@ -59,19 +62,19 @@ GitHub classroom: [url https://classroom.github.com/a/wlL1oUg2 classroom.github. За този клас имплементирайте методите: .bulleted -- [`HaveCollided`], който приема индекс на два влака и връща дали са се блъснали. +- {` HaveCollided}, който приема индекс на два влака и връща дали са се блъснали. Това се случва ако в една и съща релсова линия и един и същи регион, когато регионът не е последния възможен. -- [`RunTrains`], който придвижва напред всички влакове, докато не стигнат финалната си възможна дестинация. +- {` RunTrains}, който придвижва напред всички влакове, докато не стигнат финалната си възможна дестинация. Влакове които са се ударили не се придвижват напред. Връщате броя ударили се влакове. Да се имплементира главна функция, в която приемате име на двоичен файл от потребителя. В този файл имате някакъв брой редици с идентификационен номер на релсова линия, брой локации върху съответната линия и всички локации като нормални низове, разделени с нови редове. -Допълнително в главната функция приемайте от потребителя влаковете, като имената на текстовите файлове се избират от програмата ([=НЕ=] от потребителя) според идентификационния номер на релсовата линия и информацията във файла с редиците. -[=Не може да променяте Train класа!=] +Допълнително в главната функция приемайте от потребителя влаковете, като имената на текстовите файлове се избират от програмата ({b НЕ} от потребителя) според идентификационния номер на релсовата линия и информацията във файла с редиците. +{b Не може да променяте Train класа!} -Последно в главната функция създайте обект от тип TrainNetwork и изкарайте резултата от [`RunTrains`] на екрана. +Последно в главната функция създайте обект от тип TrainNetwork и изкарайте резултата от {` RunTrains} на екрана. ## Трудни @@ -87,11 +90,11 @@ GitHub classroom: [url https://classroom.github.com/a/wlL1oUg2 classroom.github. Имплементирайте методи: .bulleted - от голямата петица -- [`AddPassenger`], който добавя нов човек на дадения индекс на седалка -- [`RemovePassenger`], който премахва човека от дадения индекс -- [`TotalHunger`], който връща общото количество гладност в колата -- [`StoreData`], който запазва всички данни от колата в [=двоичен=] файл с подадено име -- [`LoadData`], който презаписва всички данни с тези от подадения по име [=двоичен=] файл +- {` AddPassenger}, който добавя нов човек на дадения индекс на седалка +- {` RemovePassenger}, който премахва човека от дадения индекс +- {` TotalHunger}, който връща общото количество гладност в колата +- {` StoreData}, който запазва всички данни от колата в {b двоичен} файл с подадено име +- {` LoadData}, който презаписва всички данни с тези от подадения по име {b двоичен} файл Реализирайте клас DriveThrough, в който се запазват: .bulleted @@ -101,14 +104,14 @@ GitHub classroom: [url https://classroom.github.com/a/wlL1oUg2 classroom.github. Имплементирайте методи: .bulleted - от голяма петица -- [`QueueUp`], който приема кола и я вкарва в края на опашката. +- {` QueueUp}, който приема кола и я вкарва в края на опашката. Разбира се, масивът се уголемява ако е нужно. -- [`Serve`], който изпълнява поръчката на най-предната кола в опашката. +- {` Serve}, който изпълнява поръчката на най-предната кола в опашката. За единица глад, ресторанта може да сготви достатъчно храна (за да нахрани клиента с "единица" храна) за единици време между половината от дължината на името на ресторанта и три пъти дължината на името на ресторанта време.\n Максималното възможно количество време за изпълнение на поръчката варира и според броя коли в опашка: ако са под 6 на брой, тогава тогава се увеличава с 10%, а ако са над 10 тогава се намалява с по 5% за всяка кола след десетата. -- [`EfficiencyService`], който изпълнява поръчките на всички коли в опашката и връща средно колко време е отнело на поръчка. -- [`StoreData`], който запазва всички данни в [=текстов=] файл с подадено име -- [`LoadData`], който презаписва всички данни с тези от подадения по име [=текстов=] файл +- {` EfficiencyService}, който изпълнява поръчките на всички коли в опашката и връща средно колко време е отнело на поръчка. +- {` StoreData}, който запазва всички данни в {b текстов} файл с подадено име +- {` LoadData}, който презаписва всички данни с тези от подадения по име {b текстов} файл Имплементирайте главна функция, в която от потребителския вход приемате име на текстов файл. -Създайте обект от тип DriveThrough, който да запълни своите стойности с тези от подадения файл и изкарайте на екрана стойността от [`EfficiencyService`]. +Създайте обект от тип DriveThrough, който да запълни своите стойности с тези от подадения файл и изкарайте на екрана стойността от {` EfficiencyService}. diff --git a/src/teaching/oop-2025/index.du b/src/teaching/oop-2025/index.du index 6ca7131..5933359 100644 --- a/src/teaching/oop-2025/index.du +++ b/src/teaching/oop-2025/index.du @@ -1,21 +1,25 @@ -# Обектно-ориентирано програмиране - практикум, Компютърни науки, 5 група +'def title Обектно-ориентирано програмиране - практикум, Компютърни науки, 5 група +'def desc Материали на проведените през 2025/2026 практикуми по Обектно-ориентирано програмиране на Компютърни науки (2 поток), 5 група. + +# {title} Материали на проведените през 2025/2026 практикуми по Увод в програмирането на Компютърни науки (2 поток), 5 група. -[=Зала:=] ФМИ 309 [$dbarsep] -[=Време:=] 10:00 - 12:00 [$dbarsep] -[=Ден:=] Сряда +{b Зала:} ФМИ 309 {dbarsep} +{b Време:} 10:00 - 12:00 {dbarsep} +{b Ден:} Сряда -[=Директни връзки:=] -[url ../upp-2025/week01/introduction.html?a#section-3 Контакт с мен] -| [url https://github.com/Syndamia/oop-2025-solutions Решения на задачи] -| [url https://github.com/18ivan18/ObjectOrientedProgramming2026 Материали от семинари] -| [url https://learn.fmi.uni-sofia.bg/course/view.php?id=12155 Курс в мудъл] +{b Директни връзки:} +{url Контакт с мен;../upp-2025/week01/introduction.html?a#section-3} +| {url Решения на задачи;https://github.com/Syndamia/oop-2025-solutions} +| {url Материали от семинари;https://github.com/18ivan18/ObjectOrientedProgramming2026} +| {url Курс в мудъл;https://learn.fmi.uni-sofia.bg/course/view.php?id=12155} -[=Допълнителни ресурси:=] -[url ./oop-notes Бележки по ООП при C++] +{b Допълнителни ресурси:} +{url Бележки по ООП при C++;./oop-notes} -:table_3 +:table +:3 |= № |= Дата |= Материали @@ -27,13 +31,13 @@ |: |: |: -[url ./week01/intro.html?a Уводни бележки] +{url Уводни бележки;./week01/intro.html?a} |: |: |: -[url ./week01 Задачи] -|| [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week01 Решения] +{url Задачи;./week01} +|| {url Решения;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week01} |: 2 |: 25.02.2026 @@ -42,8 +46,8 @@ |: |: |: -[url ./week02 Задачи] -|| [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week02 Решения] +{url Задачи;./week02} +|| {url Решения;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week02} |: 3 |: 04.03.2026 @@ -52,8 +56,8 @@ |: |: |: -[url ./week03 Задачи] -|| [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week03 Решения] +{url Задачи;./week03} +|| {url Решения;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week03} |: 4 |: 11.03.2026 @@ -62,8 +66,8 @@ |: |: |: -[url ./week04 Задачи] -|| [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week04 Решения] +{url Задачи;./week04} +|| {url Решения;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week04} |: 5 |: 18.03.2026 @@ -72,8 +76,8 @@ |: |: |: -[url ./week05 Задачи] -|| [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week05 Решения] +{url Задачи;./week05} +|| {url Решения;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week05} |: 6 |: 25.03.2026 @@ -82,8 +86,8 @@ |: |: |: -[url ./week06 Задачи] -|| [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06 Решения] +{url Задачи;./week06} +|| {url Решения;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06} |: 7 |: 01.04.2026 @@ -92,8 +96,8 @@ |: |: |: -[url ./week07 Задачи] -|| [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week07 Решения] +{url Задачи;./week07} +|| {url Решения;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week07} |: 8 |: 08.04.2026 @@ -102,8 +106,8 @@ |: |: |: -[url ./week08 Задачи] -|| [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week08 Решения] +{url Задачи;./week08} +|| {url Решения;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week08} |: 9 |: 15.04.2026 @@ -112,8 +116,8 @@ |: |: |: -[url ./week09 Задачи] -|| [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09 Решения] +{url Задачи;./week09} +|| {url Решения;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09} |: 10 |: 22.04.2026 @@ -122,8 +126,8 @@ |: |: |: -[url ./week10 Задачи] -|| [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week10 Решения] +{url Задачи;./week10} +|| {url Решения;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week10} |: 11 |: 29.04.2026 @@ -132,8 +136,8 @@ |: |: |: -[url ./week11 Задачи] -|| [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week11 Решения] +{url Задачи;./week11} +|| {url Решения;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week11} |: 12 |: 13.05.2026 @@ -142,7 +146,7 @@ |: |: |: -[url ./week12 Задачи] +{url Задачи;./week12} |: 13 |: 20.05.2026 @@ -151,7 +155,7 @@ |: |: |: -[url ./week13 Задачи] +{url Задачи;./week13} |: 14 |: 27.05.2026 @@ -160,7 +164,7 @@ |: |: |: -[url ./week14 Задачи] +{url Задачи;./week14} |: 15 |: 03.06.2026 @@ -169,4 +173,4 @@ |: |: |: -[url ./week15 Задачи] +{url Задачи;./week15} diff --git a/src/teaching/oop-2025/oop-notes/index.du b/src/teaching/oop-2025/oop-notes/index.du index c3641fa..4b11a5d 100644 --- a/src/teaching/oop-2025/oop-notes/index.du +++ b/src/teaching/oop-2025/oop-notes/index.du @@ -1,48 +1,48 @@ -# Бележки по ООП при C++ - ООП, КН, 2025-2026 +'def title Бележки по ООП при C++ - ООП, КН, 2025-2026 +'def desc Полезна информация и детайли относно обектно-ориентираното програмиране при C++ -'define expected-reading 2 min -'define created 18 March 2026 -'define edited 18 March 2026 -[$pagenav] +# {title} + +{pagenav 2 min;18 March 2026;18 March 2026} Този документ съдържа редица полезна информация и детайли относно обектно-ориентираното програмиране при C++. ## Голяма петица формат -```c++ -'include ./RuleOfFive.cpp +```cpp +'snippet 1 $ ./RuleOfFive.cpp -## [`&&A`], rvalue и rvalue reference +## {` &&A}, rvalue и rvalue reference -[`lvalue`] е всяка стойност, която има "име". +{` lvalue} е всяка стойност, която има "име". Това са аргументи на функции, променливи, ... -[`rvalue`] е всяка стойност за която нямаме "име". +{` rvalue} е всяка стойност за която нямаме "име". Най-често срещаните са върнатите стойноти от функция/оператор. -Тези стойности са временни и идеята е че ще бъдат изтрити (и на практика, данните им ще бъдат копирани/пренесени в нещо с име, [`lvalue`]). +Тези стойности са временни и идеята е че ще бъдат изтрити (и на практика, данните им ще бъдат копирани/пренесени в нещо с име, {` lvalue}). -Можем да правим референции върху [`rvalue`]: -```c++ +Можем да правим референции върху {` rvalue}: +```cpp A&& rvalueRef = functionWhichReturnsA(); -Обаче, тези референции дават (временно) име към [`rvalue`]-то. -Това означава, че те самите стават [`lvalue`]. +Обаче, тези референции дават (временно) име към {` rvalue}-то. +Това означава, че те самите стават {` lvalue}. -Поради тази прична не можем да имаме повече от една [`rvalue`] референция към едно [`rvalue`]: -```c++ +Поради тази прична не можем да имаме повече от една {` rvalue} референция към едно {` rvalue}: +```cpp A&& ref1 = functionWhichReturnsA(); A&& ref2 = ref1; // Грешка! -И не можем да подаваме аргумент [`rvalue`] на друга функция: -```c++ +И не можем да подаваме аргумент {` rvalue} на друга функция: +```cpp void foo(A&& ref1) { - ... + \... } void bar(A&& ref2) { foo(ref2); // Грешка! } \n\n -[*Съпътстващи ресурси:*] +{i Съпътстващи ресурси:} .bulleted -- [url https://web.archive.org/web/20200627194253/https://thbecker.net/articles/rvalue_references/section_05.html https://thbecker.net/articles/rvalue_references/section_05.html] +- {url https://thbecker.net/articles/rvalue_references/section_05.html;https://web.archive.org/web/20200627194253/https://thbecker.net/articles/rvalue_references/section_05.html} diff --git a/src/teaching/oop-2025/week01/index.du b/src/teaching/oop-2025/week01/index.du index 8279b83..10d9b08 100644 --- a/src/teaching/oop-2025/week01/index.du +++ b/src/teaching/oop-2025/week01/index.du @@ -1,23 +1,23 @@ -# Задачи - ООП, Седмица 1, 18.02.2026 +'def title Задачи - ООП, Седмица 1, 18.02.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 2 min -'define created 17 February 2026 -'define edited 22 February 2026 -[$pagenav] +# {title} -.warn Както винаги, [=НЕ=] може да използвате външни библиотеки и (почти) всичко от стандартната библиотека! +{pagenav 2 min;17 February 2026;22 February 2026} -.important [*(22.02.2026)*] По-подробни условия, оправени някои грешки в условията. +.warn Както винаги, {b НЕ} може да използвате външни библиотеки и (почти) всичко от стандартната библиотека! + +.important {i (22.02.2026)} По-подробни условия, оправени някои грешки в условията. ## За решаване ### Задача 1 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week01/Exercise01 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week01/Exercise01} Реализирайте следните функции: -```c++ +```cpp // Създава нова динамично-заделена матрица int** newMatrix(unsigned rows, unsigned cols); // Изтрива динамично-заделена матрица @@ -25,13 +25,14 @@ void deleteMatrix(int**& matrix, unsigned rows); // Запишете nullptr в // Връща сумата на всички елементи в матрицата int sumMatrix(const int** matrix, unsigned rows, unsigned cols); -Поставете техните имплементации във файл [`matrix.cpp`] и техните дефиниции в [`matrix.h`]. -Естествено, главната функция [=трябва да се намира извън [`matrix.cpp`]!=] +Поставете техните имплементации във файл {` matrix.cpp} и техните дефиниции в {` matrix.h}. +Естествено, главната функция {b трябва да се намира извън {` matrix.cpp}!} От входа получавате размерите и стойностите на две матрици с цели числа. Изкарайте разликата, между сумата на елементите на първата матрица и на втората матрица. -:table_2 +:table +:2 |= Вход |= Изход @@ -52,13 +53,14 @@ int sumMatrix(const int** matrix, unsigned rows, unsigned cols); .comment 45 - 163 = -118 + ### Задача 2 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week01/Exercise02 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week01/Exercise02} Реализирайте следните функции: -```c++ +```cpp // Сума на стойностите в elements int sum(const int* elements, unsigned length); // Средно аритметично на стойностите в elements @@ -70,17 +72,18 @@ int smallest(const int* elements, unsigned length); // Връща индекса на първото срещане на elementToSearch unsigned findIndex(const int* elements, unsigned length, int elementToSearch); -Поставете техните имплементации в [`arrmath.cpp`] и техните дефиниции в [`arrmath.h`]. +Поставете техните имплементации в {` arrmath.cpp} и техните дефиниции в {` arrmath.h}. Направете всички нужни проверки за коректност на аргументите на функциите! -От входа получавате цяло неотрицателно число [`N`] и след това [`N`] на брой цели числа. +От входа получавате цяло неотрицателно число {` N} и след това {` N} на брой цели числа. -Трябва да изкарате средното аритметично на всички елементи [*между*] най-малкия и най-големия (включително). +Трябва да изкарате средното аритметично на всички елементи {i между} най-малкия и най-големия (включително). Ако най-големия и/или най-малкия се среща повече от един път, използвайте неговото първо срещане. -Използвайте максимално функциите от [`arrmath`]! +Използвайте максимално функциите от {` arrmath}! -:table_2 +:table +:2 |= Вход |= Изход @@ -94,13 +97,14 @@ unsigned findIndex(const int* elements, unsigned length, int elementToSearch); |: 2.8 + ### Задача 3 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week01/Exercise03 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week01/Exercise03} -Реализирайте следните функции във файлове [`stringHelpers.cpp`] и [`stringHelpers.h`]: +Реализирайте следните функции във файлове {` stringHelpers.cpp} и {` stringHelpers.h}: -```c++ +```cpp // Създава динамично-заделен низ по подадената дължина char* newString(unsigned length); // Създава динамично-заделен низ, копие на подадения низ @@ -111,9 +115,9 @@ char* concatStrings(const char* first, const char* second, const char* separator // Освобождава паметта на динамичо-заделен низ void deleteString(char*& string); // Запишете nullptr в string! -Реализирайте следните функции във файлове [`ioHelpers.cpp`] и [`ioHelpers.h`]: +Реализирайте следните функции във файлове {` ioHelpers.cpp} и {` ioHelpers.h}: -```c++ +```cpp // Прочита от потребителския вход цяло число между min и max включително, // като предоставя prompt преди въведената стойност // При невалидна стойност, пита пак за вход @@ -127,44 +131,44 @@ double readDouble(const char* prompt, double min, double max); // При невалидна стойност, пита пак за вход char* readString(const char* prompt); -За реализацията им използвайте [`stringHelpers`]! +За реализацията им използвайте {` stringHelpers}! Реализирате система за запазване на ученици. -Всеки ученик има две имена и оценка (по шестобалната система, между [`2.0`] и [`6.0`]). +Всеки ученик има две имена и оценка (по шестобалната система, между {` 2.0} и {` 6.0}). -Използвайки [`ioHelpers`], поискайте от потребителя брой ученици. +Използвайки {` ioHelpers}, поискайте от потребителя брой ученици. След това, за всеки ученик, поискайте неговото име, фамилия и оценка (поотделно). -За всеки ученик запазаете името му като един низ във формата [`"<ИМЕ> <ФАМИЛИЯ>"`]. +За всеки ученик запазаете името му като един низ във формата {` "<ИМЕ> <ФАМИЛИЯ>"}. Не запазвайте име и фамилия като отделни стойности! Накрая изкарайте данните за всички ученици. -[=Смесен вход/изход:=] [*(удебеления текст е изкаран от програмата, останалото е въведено от потребителя)*] +{b Смесен вход/изход:} {i (удебеления текст е изкаран от програмата, останалото е въведено от потребителя)} ``` -[=Number of students:=] 4 -[=First name:=] Ivan -[=Last name:=] Koprivan -[=Grade:=] 5.5 -[=First name:=] Dimitar -[=Last name:=] Stoianov -[=Grade:=] 3.15 -[=First name:=] Hari -[=Last name:=] Seldon -[=Grade:=] 6 -[=First name:=] Richard -[=Last name:=] Stallman -[=Grade:=] 4.53 -[=Ivan Koprivan has grade 5.5=] -[=Dimitar Stoianov has grade 3.15=] -[=Hari Seldon has grade 6=] -[=Richard Stallman has grade 4.53=] +{b Number of students:} 4 +{b First name:} Ivan +{b Last name:} Koprivan +{b Grade:} 5.5 +{b First name:} Dimitar +{b Last name:} Stoianov +{b Grade:} 3.15 +{b First name:} Hari +{b Last name:} Seldon +{b Grade:} 6 +{b First name:} Richard +{b Last name:} Stallman +{b Grade:} 4.53 +{b Ivan Koprivan has grade 5.5} +{b Dimitar Stoianov has grade 3.15} +{b Hari Seldon has grade 6} +{b Richard Stallman has grade 4.53} ## За самоподготовка -Пререшете следните задачи от УП [=без да гледате решенията=]: +Пререшете следните задачи от УП {b без да гледате решенията}: .bulleted -- [url ../../upp-2025/week13/#-21 Седмица 13, Задача 21] -- [url ../../upp-2025/week10/#-7 Седмица 10, Задача 7] -- [url ../../upp-2025/week12/#-6 Седмица 12, Задача 6] +- {url Седмица 13, Задача 21;../../upp-2025/week13/#-21} +- {url Седмица 10, Задача 7;../../upp-2025/week10/#-7} +- {url Седмица 12, Задача 6;../../upp-2025/week12/#-6} diff --git a/src/teaching/oop-2025/week01/intro.du b/src/teaching/oop-2025/week01/intro.du index 474ffb2..4b3bc6c 100644 --- a/src/teaching/oop-2025/week01/intro.du +++ b/src/teaching/oop-2025/week01/intro.du @@ -1,11 +1,11 @@ -# Уводни бележки - ООП, Седмица 1, 18.02.2026 +'def title Уводни бележки - ООП, Седмица 1, 18.02.2026 +'def desc Бележки относно практикума и курса. -'define expected-reading 1 min -'define created 17 February 2026 -'define edited 17 February 2026 -[$pagenav] +# {title} -[$presentation-controller] +{pagenav 1 min;17 February 2026;17 February 2026} + +{presentation-controller} :title_slide35 @@ -16,11 +16,11 @@ ## Уроци от УП -[$br2] +{br2} :unordered -- [=Решавайте задачи!=] +- {b Решавайте задачи!} .unordered - По УП са давани >200 задачи (да, много не бяха доизпипани) - Решения ca качвани на >150 задачи @@ -34,7 +34,7 @@ ## Относно ООП практикум -[$br3] +{br3} :unordered @@ -42,7 +42,7 @@ .unordered - Дори да не го направите, пак си идвайте -- Ще го караме по същата схема: задачи и [=решаваме=] на живо +- Ще го караме по същата схема: задачи и {b решаваме} на живо .unordered - Ако искате друго, слушам, ще го обсъдим @@ -52,13 +52,13 @@ ## Специфики на ООП в C++ -[$br1] +{br1} :unordered -- ООП не е безплатно! Дори да сте учили [`Java`]/[`C#`]/... +- ООП не е безплатно! Дори да сте учили {` Java}/{` C#}/... -- [`C++`] има много рядко-срещани обектни свойства, като: +- {` C++} има много рядко-срещани обектни свойства, като: :ordered @@ -66,7 +66,7 @@ 2. Множествено наследяване - наследяване на повече от един клас - 3. Шаблони - значително по-силни от generics ([url https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern статичен полиморфизъм], [url https://en.wikipedia.org/wiki/Template_metaprogramming#Compile-time_class_generation compile-time рекурсия], ...) + 3. Шаблони - значително по-силни от generics ({url статичен полиморфизъм;https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern}, {url compile-time рекурсия;https://en.wikipedia.org/wiki/Template_metaprogramming#Compile-time_class_generation}, ...) diff --git a/src/teaching/oop-2025/week02/index.du b/src/teaching/oop-2025/week02/index.du index f33a2fc..5b4d35f 100644 --- a/src/teaching/oop-2025/week02/index.du +++ b/src/teaching/oop-2025/week02/index.du @@ -1,25 +1,26 @@ -# Задачи - ООП, Седмица 2, 25.02.2026 +'def title Задачи - ООП, Седмица 2, 25.02.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 7 min -'define created 24 February 2026 -'define edited 28 February 2026 -[$pagenav] +# {title} + +{pagenav 7 min;24 February 2026;28 February 2026} ## За решаване ### Задача 1 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week02/Exercise01 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week02/Exercise01} -Реализирайте структура [`Date`], която съдържа целочислени, неотрицателни полета за ден, месец и година. +Реализирайте структура {` Date}, която съдържа целочислени, неотрицателни полета за ден, месец и година. -Реализирайте функция [`printDate`], която приема обект от тип [`Date`] и изкарва датата във формат "<ДЕН>/<МЕСЕЦ>/<ГОДИНА>", където "<МЕСЕЦ>" е краткото име на месеца (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec). +Реализирайте функция {` printDate}, която приема обект от тип {` Date} и изкарва датата във формат "<ДЕН>/<МЕСЕЦ>/<ГОДИНА>", където "<МЕСЕЦ>" е краткото име на месеца (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec). -Реализирайте функция [`readDate`], която приема от входа три целочислени числа (ден, месец, година), създава обект от тип [`Date`] и връща неговата стойност. +Реализирайте функция {` readDate}, която приема от входа три целочислени числа (ден, месец, година), създава обект от тип {` Date} и връща неговата стойност. -Използвайки [`printDate`] и [`readDate`], прочетете от входа 3 дати и изкарайте всяка от тях. +Използвайки {` printDate} и {` readDate}, прочетете от входа 3 дати и изкарайте всяка от тях. -:table_2 +:table +:2 |= Вход |= Изход @@ -27,22 +28,24 @@ |: 1/Jan/2000 30/Aug/3105 13/Jun/1909 + ### Задача 2 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week02/Exercise02 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week02/Exercise02} -Реализирайте структура [`Temperature`], която съхранява температура по Целзии, Келвин и Фаренхайт (числа с плаваща запетая). +Реализирайте структура {` Temperature}, която съхранява температура по Целзии, Келвин и Фаренхайт (числа с плаваща запетая). -Реализирайте член-функции [`fromCelsius`], [`fromKelvin`] и [`fromFahrenheit`], където всяка обновява трите температури спрямо подадената температура. -Припомняме, че [`°F = (°C * 1.8) + 32`] и [`°K = °C + 273.15`]. +Реализирайте член-функции {` fromCelsius}, {` fromKelvin} и {` fromFahrenheit}, където всяка обновява трите температури спрямо подадената температура. +Припомняме, че {` °F = (°C * 1.8) + 32} и {` °K = °C + 273.15}. -Реализирайте член-функция [`Sum`], която приема втори обект от тип [`Temperature`] и връща обект от тип [`Temperature`], който е сумата на температурите по целзии (и съответната стойност във Фаренхайт и Келвин) на текущия и подадения обект. +Реализирайте член-функция {` Sum}, която приема втори обект от тип {` Temperature} и връща обект от тип {` Temperature}, който е сумата на температурите по целзии (и съответната стойност във Фаренхайт и Келвин) на текущия и подадения обект. -От входа получавате число с плаваща запетая (температура) и след това буква, обозначаваща типа на температурата - [`K`], [`C`] или [`F`]. +От входа получавате число с плаваща запетая (температура) и след това буква, обозначаваща типа на температурата - {` K}, {` C} или {` F}. След това получавате втора такава двойка стойности. -Изкарайте сумата на двете температури (чрез [`Sum`]) във всички температурни формати. +Изкарайте сумата на двете температури (чрез {` Sum}) във всички температурни формати. -:table_2 +:table +:2 |= Вход |= Изход @@ -53,27 +56,29 @@ |: −73.15 C -99.67 F 200 K + ### Задача 3 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week02/Exercise03 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week02/Exercise03} -Реализирайте структура [`IntArray`], която съдържа целочислен неотрицателен размер на масив и указател към динамично-заделен масив от цели числа. +Реализирайте структура {` IntArray}, която съдържа целочислен неотрицателен размер на масив и указател към динамично-заделен масив от цели числа. Реализирайте: .bulleted -- функция [`newIntArray`], която инициализира обект от типа [`IntArray`] по подаден размер. -- член-функция [`deleteSelf`], която освобождава паметта на масива и занулява размера. -- функция [`deleteIntArray`], която използва [`deleteSelf`], за да "деинициализира" обекта. -- член-функция [`sum`], която връща сумата на всички елементи в масива. +- функция {` newIntArray}, която инициализира обект от типа {` IntArray} по подаден размер. +- член-функция {` deleteSelf}, която освобождава паметта на масива и занулява размера. +- функция {` deleteIntArray}, която използва {` deleteSelf}, за да "деинициализира" обекта. +- член-функция {` sum}, която връща сумата на всички елементи в масива. От входа получавате размер на масив от цели числа и след това толкова на брой цели числа. Изкарайте средното аритметично на елементите в масива. Възползвайте се максимално от реализираните функции! -.important [*(28.02.2026)*] Оправени примери +.important {i (28.02.2026)} Оправени примери -:table_2 +:table +:2 |= Вход |= Изход @@ -87,11 +92,12 @@ |: 5.5 + ### Задача 4 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week02/Exercise04 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week02/Exercise04} -Реализирайте структура [`Product`], която съдържа целочислено неотрицателно ID, низово име и целочислена неотрицателна бройка стока. +Реализирайте структура {` Product}, която съдържа целочислено неотрицателно ID, низово име и целочислена неотрицателна бройка стока. От входа получавате бройка продукти. След това, за всеки продукт, ще получите ID и (едноредово) име. @@ -99,7 +105,7 @@ Накрая трябва да изкарате, за всеки продукт, неговото име и бройка. -[=Смесен вход/изход:=] [*(удебеления текст е изкаран от програмата, останалото е въведено от потребителя)*] +{b Смесен вход/изход:} {i (удебеления текст е изкаран от програмата, останалото е въведено от потребителя)} ``` 4 92 Apple @@ -110,30 +116,31 @@ 92 49 77 10 20 34 -[=Apple: 49=] -[=Whole Wheat Bread: 34=] -[=Apricot: 30=] -[=Natural Honey: 10=] +{b Apple: 49} +{b Whole Wheat Bread: 34} +{b Apricot: 30} +{b Natural Honey: 10} ### Задача 5 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week02/Exercise05 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week02/Exercise05} -Реализирайте структура [`Package`] (пакет), която съдържа 10-буквен идентификационен код и число с плаваща запетая - тежест. -Реализирайте функция, която по подаден идентификационен код и тежест от стандартния вход, връща обект от типа [`Package`]. +Реализирайте структура {` Package} (пакет), която съдържа 10-буквен идентификационен код и число с плаваща запетая - тежест. +Реализирайте функция, която по подаден идентификационен код и тежест от стандартния вход, връща обект от типа {` Package}. -Реализирайте структура [`Warehouse`] (склад), която има еднобуквен идентификатор, динамично-заделен масив с [`Package`] обекти, бройка съхранени пакети и капацитет. +Реализирайте структура {` Warehouse} (склад), която има еднобуквен идентификатор, динамично-заделен масив с {` Package} обекти, бройка съхранени пакети и капацитет. -Реализирайте член-функция [`storePackage`], която запазва подадения пакет в текущия склад, ако има място. -Нека функцията да връща [`bool`]: [`true`] ако пакета е успешно съхранен, [`false`] иначе. +Реализирайте член-функция {` storePackage}, която запазва подадения пакет в текущия склад, ако има място. +Нека функцията да връща {` bool}: {` true} ако пакета е успешно съхранен, {` false} иначе. От входа получавате бройка складове и след това, за всеки склад, неговото еднобуквено име и капацитет. След това получавате бройка пакети и за всеки пакет, неговия идентификационен код, тежест и склад в който трябва да се добави. Накрая изкарайте, за всеки склад, неговия еднобуквен идентификатор, колко пакети са съхранени (от максималния капацитет) и след това идентификационните кодове на всички съхранени пакети. -:table_2 +:table +:2 |= Вход |= Изход @@ -162,61 +169,62 @@ KLI18M8401 F 0/20 + ## За самоподготовка ### Задача 6 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week02/Exercise06 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week02/Exercise06} -Реализирайте структура [`Time`], която съхранява целочислени неотрицателни час, минути и секунди. +Реализирайте структура {` Time}, която съхранява целочислени неотрицателни час, минути и секунди. -Реализирайте функция, която по подаден брой милисекунди от 00:00:00 часа създава обект от тип [`Time`], който съхранява съответното време. +Реализирайте функция, която по подаден брой милисекунди от 00:00:00 часа създава обект от тип {` Time}, който съхранява съответното време. Припомняме, че 1000 милисекунди са равни на 1 секунда. Закръгляйте времето надолу (тоест 999 милисекунди да съответстват на 00:00:00 часа, 1000 милисекунди на 00:00:01). -Реализирайте член-функция [`Advance`] на [`Time`], която приема обект от тип [`Time`] и добавя към текущия обект времето от подадения обект. +Реализирайте член-функция {` Advance} на {` Time}, която приема обект от тип {` Time} и добавя към текущия обект времето от подадения обект. ### Задача 7 -Реализирайте структура [`IntMatrix`], която съдържа указател към динамично-заделена матрица от числа с плаваща запетая и нейните размери. +Реализирайте структура {` IntMatrix}, която съдържа указател към динамично-заделена матрица от числа с плаваща запетая и нейните размери. -Реализирайте член-функция [`Multiply`], която приема (друга) [`IntMatrix`], прави умоножение на двете матрици (ред по стълб) и връща резултатната матрица. +Реализирайте член-функция {` Multiply}, която приема (друга) {` IntMatrix}, прави умоножение на двете матрици (ред по стълб) и връща резултатната матрица. Ако това умножение не е възможно, да върне занулена матрица (нулеви размери, нулев указател). ### Задача 8 -Реализирайте структура [`BankAccount`], която съдържа целочислен неотрицателен идентификационен код (ID) и число с плаваща запетая - баланс на сметката. +Реализирайте структура {` BankAccount}, която съдържа целочислен неотрицателен идентификационен код (ID) и число с плаваща запетая - баланс на сметката. -Към структурата реализирайте член-функции [`Withdraw`] и [`Deposit`], които съответно позволяват потребител да изтегли и депозира количество пари към сметката си. +Към структурата реализирайте член-функции {` Withdraw} и {` Deposit}, които съответно позволяват потребител да изтегли и депозира количество пари към сметката си. Имплементирайте нужните проверки (не се изтегля повече отколкото е налично, не се депозира отрицателно количество сума, так. нат.). От входа получавате буква, спрямо която трябва да се извърши някакво действие: .bulleted -- [`c`] - създава акаунт с някакво ID (програмата го избира) и нулев баланс. +- {` c} - създава акаунт с някакво ID (програмата го избира) и нулев баланс. Изкарва се на екрана ID-то на акаунта. -- [`w`] - изтегляне на сума от банкова сметка. +- {` w} - изтегляне на сума от банкова сметка. Трябва допълнително да се въведат ID и сума за теглене. При грешни стойности, да се изкара съобщение за грешка и да не се продължи с действието. -- [`d`] - депозиране на сума в банкова сметка. +- {` d} - депозиране на сума в банкова сметка. Трябва допълнително да се въведат ID и сума за теглене. При грешни стойности, да се изкара съобщение за грешка и да не се продължи с действието. -[=Смесен вход/изход:=] [*(удебеления текст е изкаран от програмата, останалото е въведено от потребителя)*] +{b Смесен вход/изход:} {i (удебеления текст е изкаран от програмата, останалото е въведено от потребителя)} ``` c -[=100=] +{b 100} d 100 500 c -[=101=] +{b 101} d 100 13.5 w 101 0.2 -[=Error: withdraw amount is larger than account balance=] +{b Error: withdraw amount is larger than account balance} w 101 -0.2 -[=Error: cannot withdraw a negative amount=] +{b Error: cannot withdraw a negative amount} d 100 -2 -[=Error: cannot deposit a negative amount=] +{b Error: cannot deposit a negative amount} diff --git a/src/teaching/oop-2025/week03/index.du b/src/teaching/oop-2025/week03/index.du index 2686623..7c0006b 100644 --- a/src/teaching/oop-2025/week03/index.du +++ b/src/teaching/oop-2025/week03/index.du @@ -1,15 +1,15 @@ -# Задачи - ООП, Седмица 3, 04.03.2026 +'def title Задачи - ООП, Седмица 3, 04.03.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 4 min -'define created 03 March 2026 -'define edited 03 March 2026 -[$pagenav] +# {title} + +{pagenav 4 min;03 March 2026;03 March 2026} ## За решаване ### Задача 1 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week03/Exercise01 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week03/Exercise01} Реализирайте система за онлайн магазин. Трябва да имате потребители, администратори и продукти. @@ -17,7 +17,7 @@ Всеки потребител (и администратор) си има потребителско име и парола. Чрез вход и изход, трябва да може потребител да се регистрира, да влезе в акаунта си и да "купи" продукти. -Администраторски акаунти, [=допълнително=], могат да променят дали акаунти са администраторски и да добавят продукти. +Администраторски акаунти, {b допълнително}, могат да променят дали акаунти са администраторски и да добавят продукти. Всеки продукт си има име, бройка и цена. Имената и пароли на потребители, както и имена на продукти не съдържат шпации. @@ -27,115 +27,115 @@ От входа първо се получава буква, която обозначава команда/действие в платформата. Когато няма "логнат" потребител, имаме следните команди налични: .bulleted -- [`l`] - влизане в потребителски акаунт, поискват се потребителско име и парола. +- {` l} - влизане в потребителски акаунт, поискват се потребителско име и парола. Ако не съвпадат на някой регистриран потребител, изкарва се съответното съобщение и процеса се анулира -- [`r`] - регистриране на потребител, поискват се потребителско име и парола. +- {` r} - регистриране на потребител, поискват се потребителско име и парола. Ако потребителско имеа се повтаря с този на вече регистриран потребител, изкарва се съответното съобщение -- [`p`] - изкарване на всички продукти и техните цени. +- {` p} - изкарване на всички продукти и техните цени. Ако няма въведени продукти, тогава да се изкара съответното съобщение. Когато потребител влезе в акаунта си, има достъп към следните команди: .bulleted -- [`p`] - изкарване на всички продукти и техните цени. +- {` p} - изкарване на всички продукти и техните цени. Ако няма въведени продукти, тогава да се изкара съответното съобщение. -- [`e`] - излизане от акаунта си -- [`b`] - купуване на продукти, първо потребителя казва колко (различни) продукта ще си купи и след това въвежда за всеки продукт, неговото име и бройка. +- {` e} - излизане от акаунта си +- {` b} - купуване на продукти, първо потребителя казва колко (различни) продукта ще си купи и след това въвежда за всеки продукт, неговото име и бройка. Ако името е грешно или няма достатъчно количество, изкарва се съответното съобщение и процеса се анулира. При успешно купуване се изкарва общата цена на продуктите и тяхната обща бройка е намалена. Когато администратор влезе в акаунта си, той има всички команди които и нормалния потребител има, заедно с: .bulleted -- [`a`] - променя дали потребител е администратор (прави администратор на нормален или нормален на администратор) -- [`s`] - въвежда име на продукт, бройка и цена. +- {` a} - променя дали потребител е администратор (прави администратор на нормален или нормален на администратор) +- {` s} - въвежда име на продукт, бройка и цена. Ако продукта не съществува, тогава го създава. Ако съществува (със същото име), тогава го обновява: бройката се добавя към текущата и ценята се заменя. -[=Смесен вход/изход:=] [*(удебеления текст е въведен от потребителя, останалото е изкарано от програмата)*] +{b Смесен вход/изход:} {i (удебеления текст е въведен от потребителя, останалото е изкарано от програмата)} ``` -[=r=] -Username: [=gg=] -Password: [=ez=] +{b r} +Username: {b gg} +Password: {b ez} Successfully registered user 'gg'! -[=l=] -Username: [=gogo=] +{b l} +Username: {b gogo} User 'gogo' does not exist! -[=l=] -Username: [=gg=] -Password: [=pie=] +{b l} +Username: {b gg} +Password: {b pie} Incorrect password! -[=l=] -Username: [=gg=] -Password: [=ez=] +{b l} +Username: {b gg} +Password: {b ez} Successful login! -[=p=] +{b p} No products! -[=s=] +{b s} No permissions! -[=e=] +{b e} Logged out! -[=l=] -Username: [=admin=] -Password: [=admin=] +{b l} +Username: {b admin} +Password: {b admin} Successful login! -[=s=] -Name: [=Apple=] -Quantity: [=50=] -Price: [=0.5=] -[=s=] -Name: [=Bread=] -Quantity: [=20=] -Price: [=1.15=] -[=s=] -Name: [=Apple=] -Quantity: [=10=] -Price: [=0.5=] -[=s=] -Name: [=Bread=] -Quantity: [=0=] -Price: [=2=] -[=p=] +{b s} +Name: {b Apple} +Quantity: {b 50} +Price: {b 0.5} +{b s} +Name: {b Bread} +Quantity: {b 20} +Price: {b 1.15} +{b s} +Name: {b Apple} +Quantity: {b 10} +Price: {b 0.5} +{b s} +Name: {b Bread} +Quantity: {b 0} +Price: {b 2} +{b p} Apple 60 0.5 Bread 20 2 -[=b=] -Number of products: [=2=] -Name: [=Apple=] -Quantity: [=100=] +{b b} +Number of products: {b 2} +Name: {b Apple} +Quantity: {b 100} Invalid quantity! -[=b=] -Number of products: [=3=] +{b b} +Number of products: {b 3} Invalid number of products! -[=b=] -Number of products: [=2=] -Name: [=Apple=] -Quantity: [=5=] -Name: [=Bread=] -Quantity: [=1=] +{b b} +Number of products: {b 2} +Name: {b Apple} +Quantity: {b 5} +Name: {b Bread} +Quantity: {b 1} Purchase successful! Total cost: 4.5 -[=p=] +{b p} Apple 55 0.5 Bread 19 2 -[=a=] -Username: [=gogo=] +{b a} +Username: {b gogo} User 'gogo' does not exist! -[=a=] -Username: [=gg=] +{b a} +Username: {b gg} Made user 'gg' into an administrator. -[=e=] +{b e} Logged out! -[=l=] -Username: [=gg=] -Password: [=ez=] +{b l} +Username: {b gg} +Password: {b ez} Successful login! -[=s=] -Name: [=Apple=] -Quantity: [=0=] -Price: [=0.75=] -[=b=] -Number of products: [=1=] -Name: [=Apple=] -Quantity: [=3=] +{b s} +Name: {b Apple} +Quantity: {b 0} +Price: {b 0.75} +{b b} +Number of products: {b 1} +Name: {b Apple} +Quantity: {b 3} Purchase successful! Total cost: 2.25 -[=p=] +{b p} Apple 52 0.75 Bread 19 2 @@ -154,102 +154,102 @@ Bread 19 2 От входа първо се получава буква, която обозначава команда/действие в платформата. Когато няма "логнат" потребител, имаме следните команди налични: .bulleted -- [`l`] - влизане в потребителски акаунт, поискват се потребителско име и парола. +- {` l} - влизане в потребителски акаунт, поискват се потребителско име и парола. Ако не съвпадат на някой регистриран потребител, изкарва се съответното съобщение и процеса се анулира -- [`r`] - регистриране на потребител, поискват се потребителско име и парола. +- {` r} - регистриране на потребител, поискват се потребителско име и парола. Ако потребителско имеа се повтаря с този на вече регистриран потребител, изкарва се съответното съобщение Когато потребител влезе в акаунта си, има достъп към следните команди: .bulleted -- [`e`] - излизане от акаунта -- [`u`] - изреждане на имената на всички регистрирани потребители (включително себе си) -- [`m`] - изпращане на съобщение, поискват се име на потребител и след това самото съобщение -- [`i`] - изкарване на съобщения, изпратени към текущо влезли потребител. +- {` e} - излизане от акаунта +- {` u} - изреждане на имената на всички регистрирани потребители (включително себе си) +- {` m} - изпращане на съобщение, поискват се име на потребител и след това самото съобщение +- {` i} - изкарване на съобщения, изпратени към текущо влезли потребител. Поисква се бройка и след това се изкарват последните толкова на брой съобщения, които са изпратени към нас. Ако се поискат повече съобщения отколкото има, тогава се изкарват всичките. -- [`h`] - изкарва се разговора между нас и даден потребител. +- {` h} - изкарва се разговора между нас и даден потребител. Поисква се име на потребител и след това се изкарват съобщенията които той е изпратил и които ние сме изпратили, в коректен ред. -[=Смесен вход/изход:=] [*(удебеления текст е въведен от потребителя, останалото е изкарано от програмата)*] +{b Смесен вход/изход:} {i (удебеления текст е въведен от потребителя, останалото е изкарано от програмата)} ``` -[=r=] -Username: [=barry=] -Password: [=1234=] +{b r} +Username: {b barry} +Password: {b 1234} Successfully registered user 'barry'! -[=r=] -Username: [=map=] -Password: [=1234=] +{b r} +Username: {b map} +Password: {b 1234} Successfully registered user 'map'! -[=r=] -Username: [=joe=] -Password: [=1234=] +{b r} +Username: {b joe} +Password: {b 1234} Successfully registered user 'joe'! -[=l=] -Username: [=map=] -Password: [=1234=] +{b l} +Username: {b map} +Password: {b 1234} Successful login! -[=u=] +{b u} barry map joe -[=m=] -Username: [=dd=] +{b m} +Username: {b dd} User 'dd' does not exist! -[=m=] -Username: [=barry=] -Message: [=Hello barry!=] -[=m=] -Username: [=barry=] -Message: [=How are you?=] -[=e=] +{b m} +Username: {b barry} +Message: {b Hello barry!} +{b m} +Username: {b barry} +Message: {b How are you?} +{b e} Logged out! -[=l=] -Username: [=joe=] -Password: [=1234=] +{b l} +Username: {b joe} +Password: {b 1234} Successful login! -[=m=] -Username: [=barry=] -Message: [=Are you there?=] -[=e=] +{b m} +Username: {b barry} +Message: {b Are you there?} +{b e} Logged out! -[=l=] -Username: [=barry=] -Password: [=1234=] +{b l} +Username: {b barry} +Password: {b 1234} Successful login! -[=m=] -Username: [=map=] -Message: [=I'm fine=] -[=i=] -Number of messages: [=10=] +{b m} +Username: {b map} +Message: {b I'm fine} +{b i} +Number of messages: {b 10} map: Hello barry! map: How are you? joe: Are you there? -[=e=] +{b e} Logged out! -[=l=] -Username: [=map=] -Password: [=1234=] +{b l} +Username: {b map} +Password: {b 1234} Successful login! -[=m=] -Username: [=barry=] -Message: [=Good to hear!=] -[=e=] +{b m} +Username: {b barry} +Message: {b Good to hear!} +{b e} Logged out! -[=l=] -Username: [=barry=] -Password: [=1234=] +{b l} +Username: {b barry} +Password: {b 1234} Successful login! -[=h=] -Username: [=map=] +{b h} +Username: {b map} map: Hello barry! map: How are you? barry: I'm fine map: Good to hear! -[=m=] -Username: [=barry=] -Message: [=Note to self: do not talk to map=] -[=i=] -Number of messages: [=3=] +{b m} +Username: {b barry} +Message: {b Note to self: do not talk to map} +{b i} +Number of messages: {b 3} joe: Are you there? map: Good to hear! barry: Note to self: do not talk to map diff --git a/src/teaching/oop-2025/week04/index.du b/src/teaching/oop-2025/week04/index.du index 67f083e..5c7e7f5 100644 --- a/src/teaching/oop-2025/week04/index.du +++ b/src/teaching/oop-2025/week04/index.du @@ -1,65 +1,65 @@ -# Задачи - ООП, Седмица 4, 11.03.2026 +'def title Задачи - ООП, Седмица 4, 11.03.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 3 min -'define created 11 March 2026 -'define edited 11 March 2026 -[$pagenav] +# {title} -.warn За всеки клас имплементирайте [=голяма четворка!=] +{pagenav 3 min;11 March 2026;11 March 2026} + +.warn За всеки клас имплементирайте {b голяма четворка!} ## За решаване ### Задача 1 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week04/Exercise01 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week04/Exercise01} -Реализирайте клас [`Train`], който съдържа брой вагони, брой места за пътници, брой приети пътници, брой спирки които е минал, брой спирки които му остават, цена на билет и печалба от билети. +Реализирайте клас {` Train}, който съдържа брой вагони, брой места за пътници, брой приети пътници, брой спирки които е минал, брой спирки които му остават, цена на билет и печалба от билети. -Реализирайте селектори на всички тези параметри, конструктор с подадени стойности и публична член-функция [`ArriveAtStation`], която приема брой слизащи пътници и брой качващи се пътници. -Освен това реализирайте публична член-функция [`Print`], която изкарва всички стойности на класа. +Реализирайте селектори на всички тези параметри, конструктор с подадени стойности и публична член-функция {` ArriveAtStation}, която приема брой слизащи пътници и брой качващи се пътници. +Освен това реализирайте публична член-функция {` Print}, която изкарва всички стойности на класа. ### Задача 2 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week04/Exercise02 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week04/Exercise02} -Реализирайте клас [`IntArray`], който съдържа указател към масив от [`int`] елементи и капацитет. +Реализирайте клас {` IntArray}, който съдържа указател към масив от {` int} елементи и капацитет. Реализирайте публични член-функции: .unordered -- [`At`] която връща стойността по подаден индекс, -- [`Resize`] която променя размера на масива по подаден такъв. -- [`Concat`] която приема [`IntArray`] обект и слепява всички негови елементи след тези в текущия +- {` At} която връща стойността по подаден индекс, +- {` Resize} която променя размера на масива по подаден такъв. +- {` Concat} която приема {` IntArray} обект и слепява всички негови елементи след тези в текущия ### Задача 3 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week04/Exercise03 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week04/Exercise03} -Реализирайте клас [`String`], който съдържа низ [`char*`] и размер. +Реализирайте клас {` String}, който съдържа низ {` char*} и размер. Напомняме, че низа пак трябва да завършва на терминираща нула! Реализирайте конструктори: .unordered -- по подразбиране, в който се запазва низа [`""`] -- приемащ [`const char*`] -- приемащ [`String`] +- по подразбиране, в който се запазва низа {` ""} +- приемащ {` const char*} +- приемащ {` String} Реализирайте публични член-функции: .unordered -- селектор [`GetLength`], който връща размера на низа -- константен селектор [`GetStr`], който връща константен указател към низа -- [`Substring`] който връща нов [`String`] обект със съдържание, което е под-низ по подадените индекси -- [`Concat`] който връща нов [`String`] обект със съдържание, което е слепения (конкатениран) низ между текущия и подадения [`String`] +- селектор {` GetLength}, който връща размера на низа +- константен селектор {` GetStr}, който връща константен указател към низа +- {` Substring} който връща нов {` String} обект със съдържание, което е под-низ по подадените индекси +- {` Concat} който връща нов {` String} обект със съдържание, което е слепения (конкатениран) низ между текущия и подадения {` String} ### Задача 4 -Реализирайте клас [`Matrix`], който съдържа матрица от реални числа и нейния размер. +Реализирайте клас {` Matrix}, който съдържа матрица от реални числа и нейния размер. Реализирайте конструктор, който приема размери и масив и попълва матрицата от ляво на дясно, от горе на долу. Реализирайте член-функции: .unordered -- [`InsertRow`], която приема индекс и масив от реални числа и вмъква елементите като нов ред в матрицата -- [`InsertCol`], което приема индекс и масив от реални числа и вмъква елементите като нова колона в матрицата -- [`Sum`], която приема втора матрица и връща [`Matrix`] обект, който е сумата на текущата и подадената матрица -- [`Multiply`], която приема втора матрица и връща [`Matrix`] обект, който е умножението на текущата и подадената матрица (ред по стълб) -- [`Transpose`], която връща [`Matrix`] обект, който е транспонираната матрица на текущата +- {` InsertRow}, която приема индекс и масив от реални числа и вмъква елементите като нов ред в матрицата +- {` InsertCol}, което приема индекс и масив от реални числа и вмъква елементите като нова колона в матрицата +- {` Sum}, която приема втора матрица и връща {` Matrix} обект, който е сумата на текущата и подадената матрица +- {` Multiply}, която приема втора матрица и връща {` Matrix} обект, който е умножението на текущата и подадената матрица (ред по стълб) +- {` Transpose}, която връща {` Matrix} обект, който е транспонираната матрица на текущата diff --git a/src/teaching/oop-2025/week05/index.du b/src/teaching/oop-2025/week05/index.du index 0469fe4..e7de9e3 100644 --- a/src/teaching/oop-2025/week05/index.du +++ b/src/teaching/oop-2025/week05/index.du @@ -1,116 +1,116 @@ -# Задачи - ООП, Седмица 5, 18.03.2026 +'def title Задачи - ООП, Седмица 5, 18.03.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 6 min -'define created 18 March 2026 -'define edited 18 March 2026 -[$pagenav] +# {title} -.warn За всеки клас имплементирайте [=голяма петица!=] Това включва "move" семантики! +{pagenav 6 min;18 March 2026;18 March 2026} + +.warn За всеки клас имплементирайте {b голяма петица!} Това включва "move" семантики! ## За решаване ### Задача 1 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week05/Exercise01 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week05/Exercise01} -Реализирайте клас [`NumSeries`], който съхранява динамично-заделен масив от числа с плаваща запетая, техния размер и индекса на последния елемент. +Реализирайте клас {` NumSeries}, който съхранява динамично-заделен масив от числа с плаваща запетая, техния размер и индекса на последния елемент. -Класа трябва да има публични методи, [=достъпни и за константни обекти=]: +Класа трябва да има публични методи, {b достъпни и за константни обекти}: .unordered -- [`Push`], който слага подадения елемент на последната позиция. +- {` Push}, който слага подадения елемент на последната позиция. Това е единствения начин да се добавят елементи. Ако цялата заделена памет е запълнена, масива да се уголеми. -- [`At`], който по подаден индекс връща елемент. - Да има проверка дали индекса е валиден (дали елемент на този индекс е бил [`Push`]-нат). - При невалиден индекс върнете [url https://en.cppreference.com/w/cpp/numeric/math/NAN.html NaN]. -- [`Length`], който връща броя [`Push`]-нати елементи +- {` At}, който по подаден индекс връща елемент. + Да има проверка дали индекса е валиден (дали елемент на този индекс е бил {` Push}-нат). + При невалиден индекс върнете {url NaN;https://en.cppreference.com/w/cpp/numeric/math/NAN.html}. +- {` Length}, който връща броя {` Push}-нати елементи ### Задача 2 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week05/Exercise02 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week05/Exercise02} -Реализирайте клас [`String`], който съхранява динамично-заделен низ. +Реализирайте клас {` String}, който съхранява динамично-заделен низ. -Допълнително, реализирайте конструктор, приемащ [`const char*`] и публичи методи, [=достъпни за константни обекти=] (когато смислено): +Допълнително, реализирайте конструктор, приемащ {` const char*} и публичи методи, {b достъпни за константни обекти} (когато смислено): .unordered -- [`Substring`], който връща нов низ, който е под-низ на текущия. +- {` Substring}, който връща нов низ, който е под-низ на текущия. Като аргументи приема начален индекс и дължина. -- [`Concat`], който приема низ и го "слепва" в края на текущия низ. +- {` Concat}, който приема низ и го "слепва" в края на текущия низ. -Реализирайте клас [`Text`], който съхранява динамично-заделена последователност от редове текст ([`String`]-ове). -Реализирайте публични методи, [=достъпни за константни обекти=] (когато смислено): +Реализирайте клас {` Text}, който съхранява динамично-заделена последователност от редове текст ({` String}-ове). +Реализирайте публични методи, {b достъпни за константни обекти} (когато смислено): .unordered -- [`LineCount`], който връща броя редове в текста -- [`WordCount`], който връща броя думи в текста. +- {` LineCount}, който връща броя редове в текста +- {` WordCount}, който връща броя думи в текста. Дума за нашите цели е всяка последователност от букви, която не съдържа шпация. -- [`SubText`], който по подадени начален и краен ред, и начална и крайна колона, връща [`Text`], съдържащ само тези (части от) низове +- {` SubText}, който по подадени начален и краен ред, и начална и крайна колона, връща {` Text}, съдържащ само тези (части от) низове ### Задача 3 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week05/Exercise03 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week05/Exercise03} -Реализирайте клас [`Person`], който съхранява трите имена, телефонен номер, имейл, година на раждане и ЕГН (personal number) на човек. -Препоръчително е да използвате [`String`] клас, подобен на този от предходната задача ([=но имплементиран от Вас=]). +Реализирайте клас {` Person}, който съхранява трите имена, телефонен номер, имейл, година на раждане и ЕГН (personal number) на човек. +Препоръчително е да използвате {` String} клас, подобен на този от предходната задача ({b но имплементиран от Вас}). Реализирайте конструктор, който приема тези данни. -Реализирайте клас [`TaxReport`], който съхранява ЕГН, година, сума приходи и процент данък от приходите. +Реализирайте клас {` TaxReport}, който съхранява ЕГН, година, сума приходи и процент данък от приходите. Реализирайте конструктор, който приема тези данни. -Реализирайте клас [`TaxDatabase`], който съхранява динамичо-заделени количества от [`Person`] и [`TaxReport`] обекти. -Реализирайте публични методи, [=достъпни за константни обекти=] (когато смислено): +Реализирайте клас {` TaxDatabase}, който съхранява динамичо-заделени количества от {` Person} и {` TaxReport} обекти. +Реализирайте публични методи, {b достъпни за константни обекти} (когато смислено): .unordered -- [`RegisterPerson`], който добавя човек. - Нека да връща [`bool`], дали успешно е добавен човек. +- {` RegisterPerson}, който добавя човек. + Нека да връща {` bool}, дали успешно е добавен човек. ЕГН-тата, имейлите и телефонните номера трябва да са различни между всички потребители. Количеството хора е неограничено, вътрешната памет трябва да се реоразмерява. -- [`LogTagReport`], който добавя данъчна декларация. - Нека да връща [`bool`], дали е успешно добавена. +- {` LogTagReport}, който добавя данъчна декларация. + Нека да връща {` bool}, дали е успешно добавена. Всяка декларация се различава по комбинацията от ЕГН и година. Количеството декларации е неограничено, вътрешната памет трябва да се реоразмерява. -- [`PersonalReports`], който по подадено ЕГН изкарва на екрана всички данни за човека и всички данни за всички негови данъчни декларации -- [`YearlyReports`], който по подадена година изкарва на екрана всички данъчни декларации през подадената година. +- {` PersonalReports}, който по подадено ЕГН изкарва на екрана всички данни за човека и всички данни за всички негови данъчни декларации +- {` YearlyReports}, който по подадена година изкарва на екрана всички данъчни декларации през подадената година. За всяка декларация изкарайте вместо ЕГН, първото име, фамилия и възраст на съответния човек. -- [`YearlyAvgIncome`], който по подадена година връща средния приход на всички потребители -- [`YearlyTaxedIncome`], който по подадена година връща общия приход от данъци на всички потребители -- [`GetReport`], който по подадено ЕГН и година връща съответната декларация -- [`GetReportByAge`], който по подадено ЕГН и възраст връща съответната декларация -- [`GetReports`], който по подадено ЕГН, начална година и крайна година връща [*последователност*] от данъчни декларации. +- {` YearlyAvgIncome}, който по подадена година връща средния приход на всички потребители +- {` YearlyTaxedIncome}, който по подадена година връща общия приход от данъци на всички потребители +- {` GetReport}, който по подадено ЕГН и година връща съответната декларация +- {` GetReportByAge}, който по подадено ЕГН и възраст връща съответната декларация +- {` GetReports}, който по подадено ЕГН, начална година и крайна година връща {i последователност} от данъчни декларации. Ще е нужно да имплементирате помощен клас. -- [`GetReportsByAge`], който по подадено ЕГН, начална възраст и крайна възраст връща [*последователност*] от данъчни декларации +- {` GetReportsByAge}, който по подадено ЕГН, начална възраст и крайна възраст връща {i последователност} от данъчни декларации ## За самоподготовка ### Задача 4 -Реализирайте клас [`User`], който съхранява ЕГН, имейл и парола на потребител. +Реализирайте клас {` User}, който съхранява ЕГН, имейл и парола на потребител. Реализирайте конструктор с всички тези параметри. -Реализирайте клас [`BankAccount`], който съхранява [`AccountId`] и последователност от транзакции. +Реализирайте клас {` BankAccount}, който съхранява {` AccountId} и последователност от транзакции. Всяка транзакция съдържа промяна по баланса (положително число за вложена сума и отрицателна за изтеглена) и дата (ден, месец, година, час, минути, секунди). Реализирайте нужните помощни класове/структури. -Реализирайте публични методи, [=достъпни за константни обекти=] (когато смислено): +Реализирайте публични методи, {b достъпни за константни обекти} (когато смислено): .unordered -- [`Balance`], който връща текущия баланс в акаунта -- [`Balance`], който по подадена дата и час връща баланса към този момент от времето -- [`AddTransaction`], който добавя транзакция към акаунта +- {` Balance}, който връща текущия баланс в акаунта +- {` Balance}, който по подадена дата и час връща баланса към този момент от времето +- {` AddTransaction}, който добавя транзакция към акаунта -Реализирайте структура [`UserBankAccount`], която съхранява ЕГН и [`AccountId`]. +Реализирайте структура {` UserBankAccount}, която съхранява ЕГН и {` AccountId}. -Реализирайте клас [`BankingSystem`], който съхранява последователности от [`User`]-и, [`BankAccount`]-и и [`UserBankAccount`]-и. -[`UserBankAccount`]-ите свързват [`User`]-ите и [`BankAccount`]-ите. +Реализирайте клас {` BankingSystem}, който съхранява последователности от {` User}-и, {` BankAccount}-и и {` UserBankAccount}-и. +{` UserBankAccount}-ите свързват {` User}-ите и {` BankAccount}-ите. -Реализирайте публични методи, [=достъпни за константни обекти=] (когато смислено): +Реализирайте публични методи, {b достъпни за константни обекти} (когато смислено): .unordered -- [`RegisterBankAccount`], който по подадени данни добавя потребител и неговия [`BankAccount`] (сметка). +- {` RegisterBankAccount}, който по подадени данни добавя потребител и неговия {` BankAccount} (сметка). Ако се подаде нов потребител, неговите данни да се запазят. - Ако потребителя вече е записан, единствено да се запише новия [`BankAccount`] (и връзката му с потребителя; един потребител може да има много сметки). -- [`RegisterTransaction`], която по подадено ЕГН, [`AccountId`], сума и време запазва съответната транзакция в акаунта на потребителя -- [`TotalBalance`], която по подадено ЕГН връща общия баланс на всички сметки на потребителя -- [`NegativeBalances`], която по подадено ЕГН и време връща броя сметки, които са имали отрицателен общ баланс към подаденото време -- [`CanBeDeleted`], която по подадено ЕГН връща последователност от [`AccountId`]-та на сметки, които имат баланс 0 (и следователно могат да бъдат изтрити). + Ако потребителя вече е записан, единствено да се запише новия {` BankAccount} (и връзката му с потребителя; един потребител може да има много сметки). +- {` RegisterTransaction}, която по подадено ЕГН, {` AccountId}, сума и време запазва съответната транзакция в акаунта на потребителя +- {` TotalBalance}, която по подадено ЕГН връща общия баланс на всички сметки на потребителя +- {` NegativeBalances}, която по подадено ЕГН и време връща броя сметки, които са имали отрицателен общ баланс към подаденото време +- {` CanBeDeleted}, която по подадено ЕГН връща последователност от {` AccountId}-та на сметки, които имат баланс 0 (и следователно могат да бъдат изтрити). Ще е нужно да имплементирате помощен клас. -- [`SuspiciousAccounts`], която връща всички имейли и [`AccountId`]-та на сметки, които изглеждат съмнителни. +- {` SuspiciousAccounts}, която връща всички имейли и {` AccountId}-та на сметки, които изглеждат съмнителни. Съмнителни са тези сметки, чиито най-скорошни 20 транзакции са се случили за по-малко от минута. Може да е нужно да разширите имплементацията на някой клас. -- [`Debtors`], която връща първо име, фамилия и имейл на всички на всички потребители, чиито сметки имат отрицателен баланс. +- {` Debtors}, която връща първо име, фамилия и имейл на всички на всички потребители, чиито сметки имат отрицателен баланс. Ще е нужно да имплементирате помощен клас. diff --git a/src/teaching/oop-2025/week06/index.du b/src/teaching/oop-2025/week06/index.du index e3cb3b3..01fcbc3 100644 --- a/src/teaching/oop-2025/week06/index.du +++ b/src/teaching/oop-2025/week06/index.du @@ -1,41 +1,41 @@ -# Задачи - ООП, Седмица 6, 25.03.2026 +'def title Задачи - ООП, Седмица 6, 25.03.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 3 min -'define created 24 March 2026 -'define edited 24 March 2026 -[$pagenav] +# {title} + +{pagenav 3 min;24 March 2026;24 March 2026} ## За решаване ### Задача 1 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise01.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise01.cpp} -Реализирайте програма, която създава [=текстов=] файл "HelloWorld.txt" и записва в него низа [`Hello World!`]. +Реализирайте програма, която създава {b текстов} файл "HelloWorld.txt" и записва в него низа {` Hello World!}. Уверете се че файла се създава и това е неговото съдържание. ### Задача 2 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise02.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise02.cpp} -От входа получавате име на [=текстов=] файл. +От входа получавате име на {b текстов} файл. След това трябва да принтирате съдържанието на този файл. ### Задача 3 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise03.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise03.cpp} Реализирайте програма, която приема на първия ред име на файл и след това текст. -Този текст може да е на няколко реда, като [=няма ограничение в дължината на редовете=]! -Знака [`@`] обозначава край на входния текст (и съответно, край на програмата). +Този текст може да е на няколко реда, като {b няма ограничение в дължината на редовете}! +Знака {` @} обозначава край на входния текст (и съответно, край на програмата). -Трябва като резултат да е създаден [=текстов=] файл с подаденото име и съдържание. +Трябва като резултат да е създаден {b текстов} файл с подаденото име и съдържание. ### Задача 4 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise04.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise04.cpp} -От входа получавате име на [=текстов=] файл. +От входа получавате име на {b текстов} файл. Трябва да изкарате всички редове във файла, в обратен ред (последния ред става първи, пред-последния втори и так. нат.). .important @@ -43,60 +43,62 @@ ### Задача 5 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise05.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise05.cpp} От входа получавате на един ред име на файл. -След това неотрицателно цяло число [`N`] и накрая [`N`] на брой 64-битови числа с плаваща запетая. +След това неотрицателно цяло число {` N} и накрая {` N} на брой 64-битови числа с плаваща запетая. -Трябва да запазите всички тези числа в [=двоичен=] файл с подаденото име. +Трябва да запазите всички тези числа в {b двоичен} файл с подаденото име. .question -Каква е разликата между [`<<`] и [`write`]? +Каква е разликата между {` <<} и {` write}? Кое е по-удачно тук? ### Задача 6 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise06.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise06.cpp} -От входа получавате на един ред име на [=двоичен=] файл. +От входа получавате на един ред име на {b двоичен} файл. Този файл съдържа 64-битови числа с плаваща запетая. Изкарайте на екрана всички числа от файла. Изтеглете следните файлове и проверете дали вашата програма изкарва коректен изход: -.table_2 +.table +.2 |= Файл |= Изход -|: [url ./simple.dat simple.dat] +|: {url simple.dat;./simple.dat} |: 1.1 2.2 3.3 4.4 5.5 -|: [url ./empty.dat empty.dat] -|: [*нищо, файла е празен*] -|: [url ./constants.dat constants.dat] +|: {url empty.dat;./empty.dat} +|: {i нищо, файла е празен} +|: {url constants.dat;./constants.dat} |: 2.71828 3.14159 1.61803 0.57721 ### Задача 7 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise07.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise07.cpp} -Реализирайте структура [`Smartphone`], която съдържа цяло 16-битово число за номер на версията на операционната система, неотрицателно 64-битово число за сериен номер, 32-битово число с плаваща запетая за [url https://www.gsmarena.com/glossary.php3?term=sar SAR] и буква за ревизия на хардуера, [=в този ред=]. +Реализирайте структура {` Smartphone}, която съдържа цяло 16-битово число за номер на версията на операционната система, неотрицателно 64-битово число за сериен номер, 32-битово число с плаваща запетая за {url SAR;https://www.gsmarena.com/glossary.php3?term=sar} и буква за ревизия на хардуера, {b в този ред}. -От входа получавате неотрицателно цяло число [`N`] и след това данни за [`N`] на брой смартфона. -Трябва да запишете всички тези стойности в [=двоичен=] файл. +От входа получавате неотрицателно цяло число {` N} и след това данни за {` N} на брой смартфона. +Трябва да запишете всички тези стойности в {b двоичен} файл. ### Задача 8 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise08.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week06/Exercise08.cpp} -Реализирайте структура [`Smartphone`] със същите полета като в предходната задача. +Реализирайте структура {` Smartphone} със същите полета като в предходната задача. -От входа получавате на един ред името на [=двоичен=] файл. +От входа получавате на един ред името на {b двоичен} файл. Трябва да изкарате на екрана (стойностите на) всички смартофони във файла. Изтеглете следните файлове и проверете дали вашата програма изкарва коректен изход: -.table_2 +.table +.2 |= Файл |= Изход -|: [url ./galaxyS26Ultra.dat galaxyS26Ultra.dat] +|: {url galaxyS26Ultra.dat;./galaxyS26Ultra.dat} |: 16 83001852 1.09 B -|: [url ./oneplus15.dat oneplus15.dat] +|: {url oneplus15.dat;./oneplus15.dat} |: 16 55929 1.17 A\n16 95200 1.17 T\n16 110999 1.08 R diff --git a/src/teaching/oop-2025/week07/index.du b/src/teaching/oop-2025/week07/index.du index 86fc97b..3314b0c 100644 --- a/src/teaching/oop-2025/week07/index.du +++ b/src/teaching/oop-2025/week07/index.du @@ -1,17 +1,17 @@ -# Задачи - ООП, Седмица 7, 01.04.2026 +'def title Задачи - ООП, Седмица 7, 01.04.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 4 min -'define created 01 April 2026 -'define edited 01 April 2026 -[$pagenav] +# {title} -.warn За всеки клас имплементирайте [=голяма петица!=] +{pagenav 4 min;01 April 2026;01 April 2026} + +.warn За всеки клас имплементирайте {b голяма петица!} ## За решаване ### Задача 1 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week07/Exercise01 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week07/Exercise01} Реализирайте система за менажиране на онлайн книги. @@ -21,9 +21,9 @@ - библиотекари, които могат да добавят и махат книги, както и да променят цената им - банкови служители, които одобряват или отказват транзакции -[=Книгите=] имат заглавие, автор, година на издаване, (многоредово) текстово съдържание и цена. +{b Книгите} имат заглавие, автор, година на издаване, (многоредово) текстово съдържание и цена. -[=Потребителите=] имат имейл и парола с които влизат, своя библиотека от книги които могат да достъпват и номер на банкова карта. +{b Потребителите} имат имейл и парола с които влизат, своя библиотека от книги които могат да достъпват и номер на банкова карта. Всеки потребител има възможността да смени своята парола или номер на банкова карта. Номер "0" на банкова карта обозначава, че няма свързана банкова карта (и потребителя може да купува само безплатни книги). @@ -35,9 +35,9 @@ Потребителите могат да виждат всички свои транзакции и техния статус: чакащ одобрение, одобрен, отхвърлен. Допълнително, могат да изкарат справка за купени книги, която е текстов файл, съдържащ всяка (одобрена) транзакция, заглавието и цената на закупената книга. -[=Библиотекарите=] имат библиотекарски номер и парола с които влизат. +{b Библиотекарите} имат библиотекарски номер и парола с които влизат. Те могат да добавят нови книги, където на един ред се въвежда заглавието на книгата, на втори се въвежда автора, на трети година на издаване, на четвърти цената и след това се въвежда съдържанието на книгата. -Това съдържание свършва, когато се въведе знака точка [`.`] на самостоятелен ред. +Това съдържание свършва, когато се въведе знака точка {` .} на самостоятелен ред. За вече съществуващи книги, могат да се редактират заглавието, автора, и цената. Да се има впредвид, че тези всички тези промени, освен върху цената, се разпространяват на потребителите. @@ -50,8 +50,8 @@ Това обозначава дали потребител може да си я купи или не (и дали излиза в списъка с налични книги за купуване; но не променя нищо ако е вече закупена). По подразбиране всяка нова книга е налична и трябва експлитно да бъде "свалена". -[=Банковите служители=] влизат със служителски номер, динамична парола и статична парола. -Статичната парола е текстова, докато динамичната парола е положително число, което трябва да изпълнява тъждеството [`(служителски_номер * динамича_парола) mod 8581 = 0`]. +{b Банковите служители} влизат със служителски номер, динамична парола и статична парола. +Статичната парола е текстова, докато динамичната парола е положително число, което трябва да изпълнява тъждеството {` (служителски_номер * динамича_парола) mod 8581 = 0}. Допълнително, нито служителския номер, нито статичната парола, могат да бъдат числата 0, 1 или 8581. Примери за такива двойки числа са: 27 17162, 572 51486, 901 42905. diff --git a/src/teaching/oop-2025/week08/index.du b/src/teaching/oop-2025/week08/index.du index a57845c..7286af7 100644 --- a/src/teaching/oop-2025/week08/index.du +++ b/src/teaching/oop-2025/week08/index.du @@ -1,26 +1,26 @@ -# Задачи - ООП, Седмица 8, 08.04.2026 +'def title Задачи - ООП, Седмица 8, 08.04.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 3 min -'define created 07 April 2026 -'define edited 08 April 2026 -[$pagenav] +# {title} + +{pagenav 3 min;07 April 2026;08 April 2026} ## За решаване ### Задача 1 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week08/Exercise01 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week08/Exercise01} .warn -За всеки клас имплементирайте [=голяма петица!=] +За всеки клас имплементирайте {b голяма петица!} Всички методи трябва да достъпни и за константни обекти, когато е възможно. Реализирайте система за менажиране на многостепенни ракети. След изтрелване на ракетата, най-долната "степен" се активира. При изразходване на горивото, тя се откача от другите степени и следващата степен се активира. -[image https://upload.wikimedia.org/wikipedia/commons/d/d6/Black_Brant.jpg]\n -[*В тази ракета, степените са оцветени по различен начин: бяло, червено и черно.*] +{img https://upload.wikimedia.org/wikipedia/commons/d/d6/Black_Brant.jpg}<br/> +{i В тази ракета, степените са оцветени по различен начин: бяло, червено и черно.} Всяка степен си има: .bulleted @@ -34,16 +34,16 @@ Може да зачитаме праволинейно ускорение и да не изчисляваме промяната на количеството гориво. Това означава, че можем да използваме следните формули за дадена степен: -[image ./img/formulas.png] +{img ./img/formulas.png} Където: .bulleted -- [`a`] е ускорението, -- [`v[_0_]`] е началната скорост, +- {` a} е ускорението, +- {` v{_ 0}} е началната скорост, за първата степен тя ще е 0, за втората тя ще е скоростта на първата степен, на третата ще е скоростта на втората степен и так. нат. -- [`x`] е разстояние в метри. +- {` x} е разстояние в метри. Степените се комбинират в ракета. Всяка ракета си има име и неограничен брой степени. @@ -56,10 +56,10 @@ - общото разстояние което ракетата може да измине, в километри - общото време в което ракетата ще гори -Допълнително, имплементирайте методи [`Export`] и [`Import`], чрез които всички данни на една ракета се запазват или вземат в/от двоичен файл. +Допълнително, имплементирайте методи {` Export} и {` Import}, чрез които всички данни на една ракета се запазват или вземат в/от двоичен файл. Неограничено количество ракети и необвързани степени се съхраняват в хангари. -Имплементирайте методи за добавяне на степени в хангара и [*преместване*] на степени в ракети. +Имплементирайте методи за добавяне на степени в хангара и {i преместване} на степени в ракети. Освен това имаме площадки от които ракети могат да се изтрелват. Всяка площадка съдържа: @@ -73,11 +73,11 @@ Реализирайте конзолен интерфейс, който поддържа командите: .bulleted -- [`exit`], която приключва програмата -- [`new_hangar`], която по подадени данни добавя нов хангар -- [`new_launch_site`], която по подадени данни добавя нова площадка -- [`new_rocket_stage`], която по подадени данни добавя нова степен в избран хангар. +- {` exit}, която приключва програмата +- {` new_hangar}, която по подадени данни добавя нов хангар +- {` new_launch_site}, която по подадени данни добавя нова площадка +- {` new_rocket_stage}, която по подадени данни добавя нова степен в избран хангар. Ако такъв не съществува, да се добави в последния добавен хангар. -- [`new_rocket`], която по подадени данни добавя нова ракета в хангар. - Степените ѝ трябва да са "пренесени" от хангар(и), [=не=] да се създадат наново. -- [`can_launch`], която по подадени данни за площадка и ракета, връща дали ракетата може да бъде изтреляна от площадката +- {` new_rocket}, която по подадени данни добавя нова ракета в хангар. + Степените ѝ трябва да са "пренесени" от хангар(и), {b не} да се създадат наново. +- {` can_launch}, която по подадени данни за площадка и ракета, връща дали ракетата може да бъде изтреляна от площадката diff --git a/src/teaching/oop-2025/week09/index.du b/src/teaching/oop-2025/week09/index.du index df7eb1e..d7bd858 100644 --- a/src/teaching/oop-2025/week09/index.du +++ b/src/teaching/oop-2025/week09/index.du @@ -1,20 +1,20 @@ -# Задачи - ООП, Седмица 9, 15.04.2026 +'def title Задачи - ООП, Седмица 9, 15.04.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 5 min -'define created 14 April 2026 -'define edited 26 April 2026 -[$pagenav] +# {title} + +{pagenav 5 min;14 April 2026;26 April 2026} ## За решаване ### Задача 1 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09/Exercise01 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09/Exercise01} .note -[*(26.04.2026)*] Променено от "дата на производство" в "година на производство" +{i (26.04.2026)} Променено от "дата на производство" в "година на производство" -Реализирайте клас [`Locomotive`], който съдържа: +Реализирайте клас {` Locomotive}, който съдържа: .bulleted - идентификационен номер - име на производител @@ -22,7 +22,7 @@ - година на производство - дължина в милиметри - брой цилиндри в двигателя -- дали поддържа връзка с втори локомотив, така че и двата да се управляват от един машинист (так. нар. [url https://en.wikipedia.org/wiki/Multiple_working multiple working]) +- дали поддържа връзка с втори локомотив, така че и двата да се управляват от един машинист (так. нар. {url multiple working;https://en.wikipedia.org/wiki/Multiple_working}) За него реализирайте нужните селектори и мутатори. @@ -40,77 +40,77 @@ Train #9999 ### Задача 2 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09/Exercise02 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09/Exercise02} -Реализирайте клас [`Vector`], който съхранява неограничено количество от числа с плаваща запетая. +Реализирайте клас {` Vector}, който съхранява неограничено количество от числа с плаваща запетая. Реализирайте оператори: .bulleted -- [`+`], който покомпонентно събира елементи -- [`-`], който покомпонентно изважда елементи -- [`&`], който връща евклидовата дължина на вектора -- [`*`], който връща умножение на вектор и скалар -- [`*`], който връща точковото (покомпонентно) умножение на два вектора -- [`^`], който връща векторнотно умножение на векторите -- [`||`], който връща дали двата вектора са паралелни -- [`==`], който връща дали двата вектора са равни -- [`!=`], който връща дали двата вектора са различни +- {` +}, който покомпонентно събира елементи +- {` -}, който покомпонентно изважда елементи +- {` &}, който връща евклидовата дължина на вектора +- {` *}, който връща умножение на вектор и скалар +- {` *}, който връща точковото (покомпонентно) умножение на два вектора +- {` ^}, който връща векторнотно умножение на векторите +- {` ||}, който връща дали двата вектора са паралелни +- {` ==}, който връща дали двата вектора са равни +- {` !=}, който връща дали двата вектора са различни -За всички тези оператори реализирайте съотвените оператори за присвояване ([`+=`], [`-=`], ...). +За всички тези оператори реализирайте съотвените оператори за присвояване ({` +=}, {` -=}, ...). Ако единия вектор има повече елементи, нека те да се игнорират/оставят. ### Задача 3 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09/Exercise03 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09/Exercise03} -Реализирайте клас [`String`], който съхранява низ с неограничен размер. +Реализирайте клас {` String}, който съхранява низ с неограничен размер. Имплементирайте следните оператори: .bulleted -- [`+`], конкатенира (слепва) втория низ в края на първия -- [`==`], [`!=`], [`>`], [`>=`], [`<`], [`<=`], които сравняват двата низа (както [`strcmp`] ги сравнява) -- [`[]`], който връща буква по подаден индекс -- [`[]`], който връща подниза между два индекса (вкл.), разделени със запетая. - Тоест [`text[X(3), 5]`] трябва да върне подниз с начало и край индекси 3 и 5. - [`X`] е помощен клас, наименуван по ваш начин. -- [`<<`], който връща дали левия низ завършва със съдържанието на десния низ -- [`>>`], който връща дали десния низ започва със съдържанието на левия низ +- {` +}, конкатенира (слепва) втория низ в края на първия +- {` ==}, {` !=}, {` >}, {` >=}, {` <}, {` <=}, които сравняват двата низа (както {` strcmp} ги сравнява) +- {` []}, който връща буква по подаден индекс +- {` []}, който връща подниза между два индекса (вкл.), разделени със запетая. + Тоест {` text[X(3), 5]} трябва да върне подниз с начало и край индекси 3 и 5. + {` X} е помощен клас, наименуван по ваш начин. +- {` <<}, който връща дали левия низ завършва със съдържанието на десния низ +- {` >>}, който връща дали десния низ започва със съдържанието на левия низ ### Задача 4 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09/Exercise04 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09/Exercise04} -Реализирайте клас [`Rover`], който съхранява координатите на движещ се роувър. -В началото роувъра започва в координати [`(0,0)`] и сочи напред (към [`(0,1)`]) +Реализирайте клас {` Rover}, който съхранява координатите на движещ се роувър. +В началото роувъра започва в координати {` (0,0)} и сочи напред (към {` (0,1)}) Реализирайте следните оператори: .bulleted -- [`<`], роувъра от дясната страна на оператора се придвижва наляво с лявата страна на брой единици -- [`>`], роувъра от лявата страна на оператора се придвижва надясно с дясната страна на брой единици -- [`^`], роувъра от лявата страна на оператора се придвижва напред с дясната страна на брой единици -- [`<<`], роувъра от дясната страна на оператора се завърта обратно на часовниковата стрелка с лявата страна на брой градуси -- [`>>`], роувъра от лявата страна на оператора се завърта по часовниковата стрелка с дясната страна на брой градуси +- {` <}, роувъра от дясната страна на оператора се придвижва наляво с лявата страна на брой единици +- {` >}, роувъра от лявата страна на оператора се придвижва надясно с дясната страна на брой единици +- {` ^}, роувъра от лявата страна на оператора се придвижва напред с дясната страна на брой единици +- {` <<}, роувъра от дясната страна на оператора се завърта обратно на часовниковата стрелка с лявата страна на брой градуси +- {` >>}, роувъра от лявата страна на оператора се завърта по часовниковата стрелка с дясната страна на брой градуси Реализирайте и съответните оператори за вход/изход от/към поток. ### Задача 5 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09/Exercise05 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week09/Exercise05} -Реализирайте клас [`StringArray`], който съхранява неограничено (и оразмеряемо) количество низове. +Реализирайте клас {` StringArray}, който съхранява неограничено (и оразмеряемо) количество низове. Реализирайте нужните оператори и помощни класове, чрез които следния код е валиден: .note -[*(26.04.2026)*] +{i (26.04.2026)} Обновени конвертирания, така че примера да работи. Променени първите три размери. -```c++ +```cpp StringArray s; s[ Z(7) +++ Z(4) +++ Z(3) ] ("") (X("Hello")|"World") [ Z(4) +++ Z(5) +++ Z(1) ] ("!") [ Z(2) ] (X("Code")|"A"|"B"); -В квадратните скоби се изреждат максимални размери на очаквани низове, разделени с [`+++`]. -В кръглите скоби се подават низове, разделени с [`|`]. -Класовете [`Z`] и [`X`] са класове, наименувани по ваш начин. +В квадратните скоби се изреждат максимални размери на очаквани низове, разделени с {` +++}. +В кръглите скоби се подават низове, разделени с {` |}. +Класовете {` Z} и {` X} са класове, наименувани по ваш начин. .question Защо ни трябва експлицитното конвертиране? @@ -126,7 +126,7 @@ s[ Z(7) +++ Z(4) +++ Z(3) ] ("") (X("Hello")|"World") [ Z(4) +++ Z(5) +++ Z(1) ] - след това допълнително очакваме един низ с размер 2 - след това ни се подават три низа, с размери 4, 1 и 1 -Финално, в [`s`] трябва да имаме низовете [`"", "Hell", "Wor", "!", "Code", "A", "B"`]. +Финално, в {` s} трябва да имаме низовете {` "", "Hell", "Wor", "!", "Code", "A", "B"}. Ако ни се подаде низ с по-голям размер от очаквания, трябва да съхраним само броя знаци, които очакваме. Ако ни се подаде низ, който не очакваме, трябва да го игнорираме. diff --git a/src/teaching/oop-2025/week10/index.du b/src/teaching/oop-2025/week10/index.du index ca1825c..e99f572 100644 --- a/src/teaching/oop-2025/week10/index.du +++ b/src/teaching/oop-2025/week10/index.du @@ -1,71 +1,71 @@ -# Задачи - ООП, Седмица 10, 22.04.2026 +'def title Задачи - ООП, Седмица 10, 22.04.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 3 min -'define created 22 April 2026 -'define edited 29 April 2026 -[$pagenav] +# {title} + +{pagenav 3 min;22 April 2026;29 April 2026} ## За решаване ### Задача 1 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week10/Exercise01 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week10/Exercise01} -Реализирайте клас [`User`], който съдържа полета за: +Реализирайте клас {` User}, който съдържа полета за: .bulleted - идентификационен код - име - парола - година на създаване на акаунта -И публичен метод [`LogIn`], който по подаден идентификационен код и парола връща дали данните са коректни (и потребителя може да влезе в акаунта си). +И публичен метод {` LogIn}, който по подаден идентификационен код и парола връща дали данните са коректни (и потребителя може да влезе в акаунта си). -Реализирайте наследник [`Student`] на [`User`], който допълнително съдържа полета: +Реализирайте наследник {` Student} на {` User}, който допълнително съдържа полета: .bulleted - дали е завършил или не - година на випуск -И публичен метод [`Graduate`], с който се записва че е завършил. +И публичен метод {` Graduate}, с който се записва че е завършил. -Реализирайте наследник [`Teacher`] на [`User`], който допълнително съдържа полета: +Реализирайте наследник {` Teacher} на {` User}, който допълнително съдържа полета: .bulleted - име на предмет който преподава - брой ученици на които преподава -И публичен метод [`ChangeStudents`], с който се променя бройката студенти на които преподава. +И публичен метод {` ChangeStudents}, с който се променя бройката студенти на които преподава. ### Задача 3 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week10/Exercise03 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week10/Exercise03} -Реализирайте клас [`Inventory`], който съдържа неограничено количество продукти. +Реализирайте клас {` Inventory}, който съдържа неограничено количество продукти. За всеки продукт съхранете име и количество. -Реализирайте наследник [`Shop`] на [`Inventory`], който допълнително съхранява неограничено количество продажби. +Реализирайте наследник {` Shop} на {` Inventory}, който допълнително съхранява неограничено количество продажби. Всяка продажба съдържа име на продукт, купено количество и дата (ден, месец, година). -Реализирайте негов метод [`Purchase`], който по подадени данни съхранява нова продажба и намалява инвентарното наличество. +Реализирайте негов метод {` Purchase}, който по подадени данни съхранява нова продажба и намалява инвентарното наличество. -Реализирайте наследник [`Warehouse`] на [`Inventory`], който допълнително съхранява неограничено количество доставки. +Реализирайте наследник {` Warehouse} на {` Inventory}, който допълнително съхранява неограничено количество доставки. Всяка доставка съдържа най-много 8 продукта, датата на доставката (ден, месец, година) и номер за проследяване. -Реализирайте негов метод [`Receive`], който по подадени данни съхранява нова доставката и увеличава инвентарното количество. +Реализирайте негов метод {` Receive}, който по подадени данни съхранява нова доставката и увеличава инвентарното количество. .warn Всички неограничени количества трябва да са имплементирани в самия клас. -Не може да имплементирате [`ProductArray`], който да е член-данна в [`Inventory`] например. +Не може да имплементирате {` ProductArray}, който да е член-данна в {` Inventory} например. ## За любознателните ### Задача 2 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week10/Exercise02 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week10/Exercise02} .warn -[*(29.04.2026)*] +{i (29.04.2026)} Тази задача избързва с материала, затова е преместена тук. -Реализирайте клас [`Vehicle`], който съдържа полета за: +Реализирайте клас {` Vehicle}, който съдържа полета за: .bulleted - модел - година на производство @@ -74,21 +74,20 @@ - тежест в килограми - конски сили -Реализирайте наследник [`CombustionVehicle`] на [`Vehicle`], който съдържа полета за: +Реализирайте наследник {` CombustionVehicle} на {` Vehicle}, който съдържа полета за: .bulleted - брой цилиндри в двигателя - обем на двигателя в литри -Реализирайте наследник [`ElectricVehicle`] на [`Vehicle`], който съдържа полета за: +Реализирайте наследник {` ElectricVehicle} на {` Vehicle}, който съдържа полета за: .bulleted - капацитет на батерия в киловатчаса - пробег в километри - количество поддържано захранване в киловатове -За всички класове реализирайте нужните селектори и мутатори, както и [`operator<<`] и [`operator>>`]. +За всички класове реализирайте нужните селектори и мутатори, както и {` operator<<} и {` operator>>}. От входа получавате цяло неотрицателно число: бройка превозни средства. -След това, за всяко превозно средство получавате буква определяща типа му ([`c`] за [`CombustionVehicle`] и [`e`] за [`ElectricVehicle`]) и след това всички нужни стойности (първо тези от [`Vehicle`], модел, година на производство, ... и след това тези за съответния автомобил). - -Запазете всички превозни средства в [=един=] масив. +След това, за всяко превозно средство получавате буква определяща типа му ({` c} за {` CombustionVehicle} и {` e} за {` ElectricVehicle}) и след това всички нужни стойности (първо тези от {` Vehicle}, модел, година на производство, ... и след това тези за съответния автомобил). +Запазете всички превозни средства в {b един} масив. diff --git a/src/teaching/oop-2025/week11/index.du b/src/teaching/oop-2025/week11/index.du index 7acd8cd..ac154b6 100644 --- a/src/teaching/oop-2025/week11/index.du +++ b/src/teaching/oop-2025/week11/index.du @@ -1,63 +1,63 @@ -# Задачи - ООП, Седмица 11, 29.04.2026 +'def title Задачи - ООП, Седмица 11, 29.04.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 4 min -'define created 28 April 2026 -'define edited 29 April 2026 -[$pagenav] +# {title} + +{pagenav 4 min;28 April 2026;29 April 2026} ## За решаване ### Задача 1 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week11/Exercise01 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week11/Exercise01} -Реализирайте шаблонен клас [`Pair`], който пази две стойности от типове [`T`] и [`U`]. +Реализирайте шаблонен клас {` Pair}, който пази две стойности от типове {` T} и {` U}. Реализирайте съотвените мутатори и селектори за константни и неконстантни обекти. ### Задача 2 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week11/Exercise02 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week11/Exercise02} -Реализирайте шаблонен клас [`Option`], който съхранява стойност от тип [`T`]. +Реализирайте шаблонен клас {` Option}, който съхранява стойност от тип {` T}. -Нека конструкторите да [=не=] са публични. -За създаване на обект, имплементирайте статични методи [`Some`] и [`None`], първия от които приема стойност, а втория не приема нищо. +Нека конструкторите да {b не} са публични. +За създаване на обект, имплементирайте статични методи {` Some} и {` None}, първия от които приема стойност, а втория не приема нищо. -Целта е следната: ако един [`Option`] е създаден чрез [`None`], тогава обозначаваме че няма стойност, а чрез [`Some`] показваме че има стойност. -Идеята е аналогична на това когато един указател е [`nullptr`] или не, но работи в по-общи случаи. +Целта е следната: ако един {` Option} е създаден чрез {` None}, тогава обозначаваме че няма стойност, а чрез {` Some} показваме че има стойност. +Идеята е аналогична на това когато един указател е {` nullptr} или не, но работи в по-общи случаи. Имплементирайте методи: .bulleted -- [`IsSome`], връща дали има стойност -- [`IsNone`], връща дали няма стойност -- [`Unwrap`], връща запазената стойност +- {` IsSome}, връща дали има стойност +- {` IsNone}, връща дали няма стойност +- {` Unwrap}, връща запазената стойност ### Задача 3 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week11/Exercise03 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week11/Exercise03} -Реализирайте шаблонен клас [`SharedPointer`], който пази динамично-заделен указател към тип [`T`]. -Допълнително, класа следи за бройката свои [*инстанции*]. +Реализирайте шаблонен клас {` SharedPointer}, който пази динамично-заделен указател към тип {` T}. +Допълнително, класа следи за бройката свои {i инстанции}. С други думи, при всяко копиране на създадения обект, увеличаваме бройката, и при всяко унищожаване (извикване на деструктор) намаляваме бройката. Изтриването на паметта (указателя) се случва тогава, и само тогава когато бройката стигне нула. .note -Това е вид [url https://en.wikipedia.org/wiki/Smart_pointer "smart pointer"]: динамично-заделен указател който сам освобождава паметта си, без ние да пишем експлицитен [`delete`]!\n -В C++ има и други видове smart pointer-и, като "unique pointer" (който е описан в [url #-6 Задача 6]). +Това е вид {url "smart pointer";https://en.wikipedia.org/wiki/Smart_pointer}: динамично-заделен указател който сам освобождава паметта си, без ние да пишем експлицитен {` delete}!\n +В C++ има и други видове smart pointer-и, като "unique pointer" (който е описан в {url Задача 6;#-6}). -Добър въведителен ресурс по темата е [url https://courses.cs.washington.edu/courses/cse333/24au/lectures/16-c++-smartptr.pdf този]. +Добър въведителен ресурс по темата е {url този;https://courses.cs.washington.edu/courses/cse333/24au/lectures/16-c++-smartptr.pdf}. -Реализирайте [`operator*`] и [`operator->`], които съответстват на операциите върху запазения указател. -Тоест, [`*x`] трябва да има един и същ ефект върху [`int*`] и върху [`SharedPointer`] от [`int*`]. +Реализирайте {` operator*} и {` operator->}, които съответстват на операциите върху запазения указател. +Тоест, {` *x} трябва да има един и същ ефект върху {` int*} и върху {` SharedPointer} от {` int*}. .question -Как работи [`operator->`]? +Как работи {` operator->}? -Имплементирайте също метод [`RefCount`], който връща броя копия. +Имплементирайте също метод {` RefCount}, който връща броя копия. Примерна употреба: -```c++ +```cpp void inc(SharedPointer<int> val) { // val е копие на y, бройката е 3 *val++; } // val се унищожава, бройката става 2 @@ -72,36 +72,36 @@ int main() { ### Задача 4 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week11/Exercise04 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week11/Exercise04} -Реализирайте шаблонен клас [`Vector`], който съхранява неограничено и оразмеряемо количество от обекти [`T`]. +Реализирайте шаблонен клас {` Vector}, който съхранява неограничено и оразмеряемо количество от обекти {` T}. Освен голяма петица, реализирайте член-функции: .bulleted -- [`Count`], която връща броя елементи -- [`PushBack`], която добавя елемент в края на последователността. +- {` Count}, която връща броя елементи +- {` PushBack}, която добавя елемент в края на последователността. Ако е нужно, уголемява заделеното количество памет. -- [`operator[]`], който връща референция към обекта на подаден индекс. +- {` operator[]}, който връща референция към обекта на подаден индекс. Да бъде наличен при константни и не-константни обекти. -- [`operator+`] който създава нов [`Vector`] с елементите от първия и след това елементите от втория [`Vector`] -- [`operator+=`], които добавя елементите на десния [`Vector`] в края на левия +- {` operator+} който създава нов {` Vector} с елементите от първия и след това елементите от втория {` Vector} +- {` operator+=}, които добавя елементите на десния {` Vector} в края на левия ## За самоподготовка ### Задача 5 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week11/Exercise05 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week11/Exercise05} -Реализирайте клас [`DoubleVector`], който съхранява две неограничени и оразмеряеми количества от обекти, съответно от типове [`T`] и [`U`]. +Реализирайте клас {` DoubleVector}, който съхранява две неограничени и оразмеряеми количества от обекти, съответно от типове {` T} и {` U}. -Имплементирайте голяма петица и член-функциите от [url #-4 Задача 4], обаче всяка трябва да е налична и за двете последователности от обекти. +Имплементирайте голяма петица и член-функциите от {url Задача 4;#-4}, обаче всяка трябва да е налична и за двете последователности от обекти. ### Задача 6 -.solution-link [url https://github.com/Syndamia/oop-2025-solutions/tree/main/Week11/Exercise06 Решение] +.solution-link {url Решение;https://github.com/Syndamia/oop-2025-solutions/tree/main/Week11/Exercise06} -Реализирайте шаблонен клас [`UniquePointer`], който пази указател към тип [`T`]. +Реализирайте шаблонен клас {` UniquePointer}, който пази указател към тип {` T}. Класа трябва да осигури, че само един обект има този указател. -С други думи, [=не може да има копия=]! +С други думи, {b не може да има копия}! -Реализирайте [`operator*`] и [`operator->`], които съответстват на операциите върху запазения указател (т.е. [`*x`] трябва да има същия ефект, без значение дали работим с [`int*`] или [`SharedPointer`], който съхранява [`int*`]). +Реализирайте {` operator*} и {` operator->}, които съответстват на операциите върху запазения указател (т.е. {` *x} трябва да има същия ефект, без значение дали работим с {` int*} или {` SharedPointer}, който съхранява {` int*}). diff --git a/src/teaching/oop-2025/week12/index.du b/src/teaching/oop-2025/week12/index.du index 4f34d9c..243ee93 100644 --- a/src/teaching/oop-2025/week12/index.du +++ b/src/teaching/oop-2025/week12/index.du @@ -1,9 +1,9 @@ -# Задачи - ООП, Седмица 12, 13.05.2026 +'def title Задачи - ООП, Седмица 12, 13.05.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 2 min -'define created 13 May 2026 -'define edited 13 May 2026 -[$pagenav] +# {title} + +{pagenav 2 min;13 May 2026;13 May 2026} ## За решаване diff --git a/src/teaching/oop-2025/week13/index.du b/src/teaching/oop-2025/week13/index.du index 77479ed..5ea3f64 100644 --- a/src/teaching/oop-2025/week13/index.du +++ b/src/teaching/oop-2025/week13/index.du @@ -1,66 +1,66 @@ -# Задачи - ООП, Седмица 13, 20.05.2026 +'def title Задачи - ООП, Седмица 13, 20.05.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 3 min -'define created 20 May 2026 -'define edited 20 May 2026 -[$pagenav] +# {title} + +{pagenav 3 min;20 May 2026;20 May 2026} ## За решаване ### Задача 1 -Реализирайте абстрактен клас [`Numeric`], който съдържа чисто виртуални функции: +Реализирайте абстрактен клас {` Numeric}, който съдържа чисто виртуални функции: .bulleted -- [`operator+`] -- унарен [`operator-`] -- бинарен [`operator-`] -- [`operator+=`] -- [`operator-=`] +- {` operator+} +- унарен {` operator-} +- бинарен {` operator-} +- {` operator+=} +- {` operator-=} -Реализирайте негови наследници [`Integer`] и [`Float`], които съответно имплементират операции върху [`int`] и [`float`] стойности. +Реализирайте негови наследници {` Integer} и {` Float}, които съответно имплементират операции върху {` int} и {` float} стойности. ### Задача 2 -Реализирайте клас [`User`], който съхранява идентификационен номер и входен ПИН код. -Имплементирайте (виртуална) член-функция [`LogIn`], която връща дали подадения ѝ ПИН код съответства на запазения. +Реализирайте клас {` User}, който съхранява идентификационен номер и входен ПИН код. +Имплементирайте (виртуална) член-функция {` LogIn}, която връща дали подадения ѝ ПИН код съответства на запазения. -Реализирайте наследник [`Citizen`], който разширява функцията [`LogIn`], така че винаги да отказва числа, които имат повече от 4 цифри. +Реализирайте наследник {` Citizen}, който разширява функцията {` LogIn}, така че винаги да отказва числа, които имат повече от 4 цифри. -Реализирайте наследник (на [`User`]) [`Clerk`], който допълнително съхранява статичен код. -[`LogIn`] в този случай е успешен, когато [`((ВХОДЕН_ПИН + СЪХРАНЕН_ПИН) * СТАТИЧЕН_КОД) % 115249 = 347`]. +Реализирайте наследник (на {` User}) {` Clerk}, който допълнително съхранява статичен код. +{` LogIn} в този случай е успешен, когато {` ((ВХОДЕН_ПИН + СЪХРАНЕН_ПИН) * СТАТИЧЕН_КОД) % 115249 = 347}. Пример за валидни стойности са 700 за съхранен пин, 3141 за входен пин и 47978 за статичен код. -Реализирайте наследник (на [`User`]) [`System`], при който [`LogIn`] е валидно, когато подадения пин е точен квадрат на съхранения пин. +Реализирайте наследник (на {` User}) {` System}, при който {` LogIn} е валидно, когато подадения пин е точен квадрат на съхранения пин. -От входа получавате неотрицателно цяло число [`N`] и след това данни за [`N`] на брой потребителя. -При всеки потребител се поисква буква, определяща неговия тип: [`c`] за [`Citizen`], [`l`] за [`Clerk`] и [`s`] за [`System`]. -Трябва да съхраните всички потребители в [=полиморфен=] масив с елементи от тип [`User*`]. +От входа получавате неотрицателно цяло число {` N} и след това данни за {` N} на брой потребителя. +При всеки потребител се поисква буква, определяща неговия тип: {` c} за {` Citizen}, {` l} за {` Clerk} и {` s} за {` System}. +Трябва да съхраните всички потребители в {b полиморфен} масив с елементи от тип {` User*}. След това от входа ще получавате идентификационен номер и пин код, и трябва да върнете дали подадените данни са валидни за влизане в акаунта. ### Задача 3 -Реализирайте клас [`String`], който съхранява динамично-задлен низ. +Реализирайте клас {` String}, който съхранява динамично-задлен низ. Освен голяма петица, имплементирайте виртуален мутатор и константен селектор към низа. -Реализирайте клас [`Username`], наследник на [`String`], чиито мутатор приема единствено низове, които съдържат само главни и малки латински букви. +Реализирайте клас {` Username}, наследник на {` String}, чиито мутатор приема единствено низове, които съдържат само главни и малки латински букви. -Реализирайте клас [`Match`], наследник на [`String`], който съхранява допълнителен динамично-заделен низ [`pattern`] и бройка [`matches`]. -За [`pattern`] има друг селектор и мутатор. -При всяка промяна на [`pattern`] и оригиналния низ, [`matches`] се обновява с бройката (потенциално препокриващи се) срещания на [`pattern`] в низа. +Реализирайте клас {` Match}, наследник на {` String}, който съхранява допълнителен динамично-заделен низ {` pattern} и бройка {` matches}. +За {` pattern} има друг селектор и мутатор. +При всяка промяна на {` pattern} и оригиналния низ, {` matches} се обновява с бройката (потенциално препокриващи се) срещания на {` pattern} в низа. ### Задача 4 -Реализирайте шаблонен клас [`Indexable`], който съхранява чисто-виртуален не-константен [`operator[]`], и имплементира константен [`operator[]`], базиран на не-константния. +Реализирайте шаблонен клас {` Indexable}, който съхранява чисто-виртуален не-константен {` operator[]}, и имплементира константен {` operator[]}, базиран на не-константния. -Реализирайте клас [`Compareable`], който съхранява чисто-виртуални [`operator<`] и [`operator==`], и имплементира останалите оператори за сравнение ([`<=`], [`>`], [`>=`], [`!=`]), използвайки чисто-виртуалните. +Реализирайте клас {` Compareable}, който съхранява чисто-виртуални {` operator<} и {` operator==}, и имплементира останалите оператори за сравнение ({` <=}, {` >}, {` >=}, {` !=}), използвайки чисто-виртуалните. -Реализирайте клас [`Dynamic`], който въхранява чисто-виртуални не-публични методи [`free`], [`copyFrom`] и [`init`], и имплементира компонентите от голямата петица, използвайки тези методи. +Реализирайте клас {` Dynamic}, който въхранява чисто-виртуални не-публични методи {` free}, {` copyFrom} и {` init}, и имплементира компонентите от голямата петица, използвайки тези методи. -Реализирайте клас [`Vector`], който съхранява динамично-заделен масив от елементи и е наследник и на трите класа. +Реализирайте клас {` Vector}, който съхранява динамично-заделен масив от елементи и е наследник и на трите класа. Сравненията между вектори са спрямо бройката елементи. -Реализирайте клас [`Integer`], който съхранява динамично-заделен [`int`] и наследява [`Compareable`] и [`Dynamic`]. +Реализирайте клас {` Integer}, който съхранява динамично-заделен {` int} и наследява {` Compareable} и {` Dynamic}. -Реализирайте шаблонен клас [`Array`], който съхранява статично-заделен масив, чиито елементи и тяхна бройка се подават като част от типа, и който наследява [`Indexable`] и [`Compareable`]. +Реализирайте шаблонен клас {` Array}, който съхранява статично-заделен масив, чиито елементи и тяхна бройка се подават като част от типа, и който наследява {` Indexable} и {` Compareable}. Сравненията между масиви са спрямо бройката елементи. diff --git a/src/teaching/oop-2025/week14/index.du b/src/teaching/oop-2025/week14/index.du index c01f3b8..bcf8220 100644 --- a/src/teaching/oop-2025/week14/index.du +++ b/src/teaching/oop-2025/week14/index.du @@ -1,27 +1,27 @@ -# Задачи - ООП, Седмица 14, 27.05.2026 +'def title Задачи - ООП, Седмица 14, 27.05.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 2 min -'define created 27 May 2026 -'define edited 27 May 2026 -[$pagenav] +# {title} + +{pagenav 2 min;27 May 2026;27 May 2026} ## За решаване ### Задача -Реализирайте клас [`Sensor`], който съхранява целочислен неотрицателен сериен номер и число с плаваща запетая за напрежение на захранване. +Реализирайте клас {` Sensor}, който съхранява целочислен неотрицателен сериен номер и число с плаваща запетая за напрежение на захранване. Също имплементирайте методи, налични във всички наследници: .bulleted -- [`GetType`], който връща типа на сензора (най-десните 2 цифри от серийния номер). -- [`EnoughSupply`], който приема напрежение, което се подава на сензора и връща дали е достатъчно или не +- {` GetType}, който връща типа на сензора (най-десните 2 цифри от серийния номер). +- {` EnoughSupply}, който приема напрежение, което се подава на сензора и връща дали е достатъчно или не -Реализирайте негови наследници [`CameraSensor`] и [`GyroSensor`]. +Реализирайте негови наследници {` CameraSensor} и {` GyroSensor}. -[`CameraSensor`] съхранява резолюция (височина и ширина) и брой взети снимки. -При класа имплементирайте метод [`TakeSnapshot`], който инкрементира бройката взети снимки. +{` CameraSensor} съхранява резолюция (височина и ширина) и брой взети снимки. +При класа имплементирайте метод {` TakeSnapshot}, който инкрементира бройката взети снимки. -[`GyroSensor`] съхранява скорост на измерване в [`dps`] (ъгли в секунда). -Имплементирайте негов метод [`Rotate`], който по получен ъгъл връща най-малкото количество от време, което е нужно за да може сензора да измере въртенето. +{` GyroSensor} съхранява скорост на измерване в {` dps} (ъгли в секунда). +Имплементирайте негов метод {` Rotate}, който по получен ъгъл връща най-малкото количество от време, което е нужно за да може сензора да измере въртенето. -Реализирайте наследник [`DSLR`] на [`CameraSensor`] и [`GyroSensor`], който допълнително съхранява изходна резолюция (височина и ширина) и скорост на вземане на кадър. -Имплементирайте член-функция [`CorrectedCapture`], която по подаден ъгъл, прави снимка и връща колко кадъра ще отнемат докато въртенето е напълно измерено. +Реализирайте наследник {` DSLR} на {` CameraSensor} и {` GyroSensor}, който допълнително съхранява изходна резолюция (височина и ширина) и скорост на вземане на кадър. +Имплементирайте член-функция {` CorrectedCapture}, която по подаден ъгъл, прави снимка и връща колко кадъра ще отнемат докато въртенето е напълно измерено. diff --git a/src/teaching/oop-2025/week15/index.du b/src/teaching/oop-2025/week15/index.du index 09e7a90..eececaa 100644 --- a/src/teaching/oop-2025/week15/index.du +++ b/src/teaching/oop-2025/week15/index.du @@ -1,9 +1,9 @@ -# Задачи - ООП, Седмица 15, 03.06.2026 +'def title Задачи - ООП, Седмица 15, 03.06.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 3 min -'define created 03 June 2026 -'define edited 03 June 2026 -[$pagenav] +# {title} + +{pagenav 3 min;03 June 2026;03 June 2026} ## За решаване @@ -11,35 +11,35 @@ Ще създадем система за създаване на постове от потребители, нещо подобно на Facebook/Reddit/... -Реализирайте шаблонен клас [`Database`], който съхранява неограничено количество от обекти от тип [`T`] с идентификатор от тип [`K`]. -На всеки обект може да съответства един [*уникален*] идентификатор. -За тип [`K`] можем да допуснем единствено, че поддържа [`operator==`]. +Реализирайте шаблонен клас {` Database}, който съхранява неограничено количество от обекти от тип {` T} с идентификатор от тип {` K}. +На всеки обект може да съответства един {i уникален} идентификатор. +За тип {` K} можем да допуснем единствено, че поддържа {` operator==}. -В [`Database`] трябва да може да се добавят и премахват елементи, спрямо даден идентификатор. -Нека тези член-функции да връщат [`bool`], спрямо това дали операцията е успешна. +В {` Database} трябва да може да се добавят и премахват елементи, спрямо даден идентификатор. +Нека тези член-функции да връщат {` bool}, спрямо това дали операцията е успешна. -Реализирайте клас [`User`], който въхранява имейл, потребителско име и парола. +Реализирайте клас {` User}, който въхранява имейл, потребителско име и парола. .bulleted -- Имейла трябва да е в [url https://en.wikipedia.org/wiki/Email_address#Syntax коректен формат] (не е нужно 100% покритие на всички изисквания, но поне по-значимите ограничения да се проверяват). +- Имейла трябва да е в {url коректен формат;https://en.wikipedia.org/wiki/Email_address#Syntax} (не е нужно 100% покритие на всички изисквания, но поне по-значимите ограничения да се проверяват). - Потребителското име може да съдържа латински бувки, цифри, тире и долна черта, като не може да започва с тире или цифра. - Паролата трябва да бъде поне 8 знака и да съдържа поне една цифра, една буква и един специален знак (нито цифра, нито буква) -Реализирайте клас [`Post`], който съхранява идентификатор на потребител (какъв е типа на този идентификатор ще бъде описано по-късно), текстово съдържание с неограничен размер и контейнер с идентификатори на всички потребители, които са харесали поста. +Реализирайте клас {` Post}, който съхранява идентификатор на потребител (какъв е типа на този идентификатор ще бъде описано по-късно), текстово съдържание с неограничен размер и контейнер с идентификатори на всички потребители, които са харесали поста. -Реализирайте клас [`PostSystem`], който съхранява колекции от потребители и постове (използвайки [`Database`]), като е шаблонен спрямо типа на идентификатора на потребителя. +Реализирайте клас {` PostSystem}, който съхранява колекции от потребители и постове (използвайки {` Database}), като е шаблонен спрямо типа на идентификатора на потребителя. Трябва да поддържа методи за регистриране на нов потребител, изтриване на акаунт, влизане в акаунт и излизане от акаунт. -При влизане в акаунт, системата връща "токен" от тип [`A`], който се използва за всички операции, където е нужна информация на съществуващ потребител. -Разбира се, всеки токен се пази в [`PostSystem`] и при потребителска операция се прави сравнение дали токена съответства на потребителя. +При влизане в акаунт, системата връща "токен" от тип {` A}, който се използва за всички операции, където е нужна информация на съществуващ потребител. +Разбира се, всеки токен се пази в {` PostSystem} и при потребителска операция се прави сравнение дали токена съответства на потребителя. При влизане в акаунт се проверява дали генерирания токен съществува, и ако да, тогава влизането се отказва. -За тип [`A`] единствено можем да допуснем, че поддържа [`operator==`]. +За тип {` A} единствено можем да допуснем, че поддържа {` operator==}. Понеже не знаем типа и следователно не знаем как да се генерира токена, член-функцията за генериране не може да има реализация. Освен тези операции, влязъл потребител може да създаде пост, да изтрие пост и да маркира/отмаркира пост като харесан. -Реализирайте наследник [`SecureForum`], където потребителските идентификатори и токени са целочислени неотрицателни поне 16-битови числа. +Реализирайте наследник {` SecureForum}, където потребителските идентификатори и токени са целочислени неотрицателни поне 16-битови числа. Всеки потребител си има единствен токен след влизане в акаунта (т.е. може да влезе в акаунта само ако е излязъл). -Реализирайте наследник [`StandardForum`], където потребителския идентификатор е целочислено неотрицателно число и токена е низ. +Реализирайте наследник {` StandardForum}, където потребителския идентификатор е целочислено неотрицателно число и токена е низ. Има неограничено количество токени за всеки потребител 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 Пробвате се да я запазите, използвайки и двете таблици, но ако Б вече е запълнена, добавяте я като компресирана стойност в таблица А. Ако и А е запълнена, изкарвате съобщение за запълнена база данни и не запазвате стойността. diff --git a/src/teaching/upp-2023/additional2/index.du b/src/teaching/upp-2023/additional2/index.du index 953288a..4a4121d 100644 --- a/src/teaching/upp-2023/additional2/index.du +++ b/src/teaching/upp-2023/additional2/index.du @@ -1,8 +1,11 @@ -# Допълнително упражнение 2 - УПП, 04.12.2023 +'def title Допълнително упражнение 2 - УПП, 04.12.2023 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/CrerXpf6 classroom.github.com/a/CrerXpf6] +GitHub classroom: {url classroom.github.com/a/CrerXpf6;https://classroom.github.com/a/CrerXpf6} .important Следете внимателно дали триете всичката си динамична памет коректно на всяка подточка! @@ -12,7 +15,7 @@ GitHub classroom: [url https://classroom.github.com/a/CrerXpf6 classroom.github. Ще направим един прост текстов редактор. От входа ще получавате редове текст, в общия случай редовете ще бъдат някакво текстово съдъражение, което ще трябва да запазите в паметта. -Определени редове ще имат команди, чрез които ще [*редактирате*] вече въведения текст. +Определени редове ще имат команди, чрез които ще {i редактирате} вече въведения текст. Задачата е сравнително голяма, затова е разделена на подточки, като всяка надгражда предходната. @@ -26,12 +29,13 @@ GitHub classroom: [url https://classroom.github.com/a/CrerXpf6 classroom.github. Използвайте многомерен масив за запазване на редовете, вместо всичко да се запазва в един голям низ. Това е нужно за бъдещи подточки. -[*Само за тестване*], набързо имплементирайте проверка, ако първата буква от реда е [`Q`], тогава програмата да спре да приема вход, да изкара въведения текст до сега и да приключи. +{i Само за тестване}, набързо имплементирайте проверка, ако първата буква от реда е {` Q}, тогава програмата да спре да приема вход, да изкара въведения текст до сега и да приключи. -[=Пример:=] -[*Смесен вход/изход*] +{b Пример:} +{i Смесен вход/изход} -```terminal +'def LANG terminal +``` DAY HAD DAWNED COLD AND GRAY WHEN the man turned aside from the main Yukon trail. He climbed the high earth-bank where a little-traveled trail led east through the pine for- @@ -44,7 +48,7 @@ est. It was a high bank, and he paused to breathe at the top. ### б) функция за извеждане на команди -Команда е един ред текст, като първата буква, различна от шпация, е [`:`]. +Команда е един ред текст, като първата буква, различна от шпация, е {` :}. След нея има нула или повече шпации и още една буква, тази буква определя коя команда искаме да използваме. В зависимост от командата, може да имаме параметри, поставени след буквата за командата. Параметрите не съдържат шпации и параметрите са разделени помежду си с поне една шпация. @@ -55,7 +59,7 @@ est. It was a high bank, and he paused to breathe at the top. Командите не се запазват като част от текста. -Имплементирайте функция [`extractCommand`], която приема низ. +Имплементирайте функция {` extractCommand}, която приема низ. Ако низът е команда, тогава връща масив от низове, първия от които съдържа буквата, определяща командата, докато останалите низове са параметрите. Ако низът не е команда, тогава връща празен масив. @@ -65,13 +69,15 @@ est. It was a high bank, and he paused to breathe at the top. .question Как ще върнем масив? Нужно ли е да връщаме бройката елементи? -[*Само за тестване*], след всеки въведен ред, ако е команда, изкарайте извлечените стойности от [`extractCommand`], със запетайки след всяка. -Като при [url #section подточка a)], ако редът започва с [`Q`], спирате приемане на вход и изкарвате запазения текст. +{i Само за тестване}, след всеки въведен ред, ако е команда, изкарайте извлечените стойности от {` extractCommand}, със запетайки след всяка. +Като при {url подточка a);#section}, ако редът започва с {` Q}, спирате приемане на вход и изкарвате запазения текст. -[=Пример:=] -[*Смесен вход/изход*] +{b Пример:} +{i Смесен вход/изход} -```terminal +'def LANG terminal +``` +'emplace DAY HAD DAWNED COLD AND GRAY WHEN :A bcd 012 345 A,bcd,012,345, @@ -91,57 +97,63 @@ DAY HAD DAWNED COLD AND GRAY WHEN the man turned aside from the main Yukon trail. He climbed the high earth-bank where a little-traveled trail led east through the pine for- est. It was a high bank, and he paused to breathe at the top. +'endemplace ### в) команда print -Имплементирайте функция [`print`], която приема масив, съдържащ целия запазен текст, и го изкарва на екрана, като преди всеки ред изкарва неговия номер (първи ред има номер 1, втори има номер 2, так. нат.) с [=вмъкнати водещи нули=] (така че всяко число да бъде съставено от един и същ брой знаци). +Имплементирайте функция {` print}, която приема масив, съдържащ целия запазен текст, и го изкарва на екрана, като преди всеки ред изкарва неговия номер (първи ред има номер 1, втори има номер 2, так. нат.) с {b вмъкнати водещи нули} (така че всяко число да бъде съставено от един и същ брой знаци). Ако текстът е празен, не изкарва нищо. -Тоест, ако сме въвели текст от 7 реда, [`print`] ще изкара: +Тоест, ако сме въвели текст от 7 реда, {` print} ще изкара: -```terminal +'def LANG terminal +``` 1 First line 2 Second line -... +\... 7 Last line Ако сме въвели 23 реда: -```terminal +'def LANG terminal +``` 01 First line 02 Second line -... +\... 09 Ninth line 10 Tenth line 11 Eleventh line -... +\... 23 Last line Ако сме въвели 130 реда: -```terminal +'def LANG terminal +``` 001 First line -... +\... 009 Ninth line 010 Tenth line -... +\... 099 99th line 100 100th line -... +\... 130 Last line -Командата, която използва тази функция, се определя с главната буква [`P`] и няма параметри. +Командата, която използва тази функция, се определя с главната буква {` P} и няма параметри. -За всички команди (за момента само [`P`]): +За всички команди (за момента само {` P}): .bulleted - Обновете програмата, така че при валидна команда, да изпълни съответната и функция и да продължи изпълнение. - Ако срещнете недефинирана команда, трябва да изкарате на екрана "; Not an editor command" и изпълнението на програмата да продължи. - Ако срещнете допълнителни/излишни параметри, трябва да изкарате "; Excess parameters", но функцията да се изпълни с коректния брой параметри. -[=Пример:=] -[*Смесен вход/изход*] +{b Пример:} +{i Смесен вход/изход} -```terminal +'def LANG terminal +``` +'emplace DAY HAD DAWNED COLD AND GRAY WHEN :P 1 DAY HAD DAWNED COLD AND GRAY WHEN @@ -160,41 +172,48 @@ DAY HAD DAWNED COLD AND GRAY WHEN the man turned aside from the main Yukon trail. He climbed the high earth-bank where a little-traveled trail led east through the pine for- est. It was a high bank, and he paused to breathe at the top. +'endemplace ### г) команда quit -Вече може да премахнете временната функционалност, където ако реда започва с [`Q`] програмата спира и изкарва целия текст. -Добавете командата [`Q`], която изкарва на екрана целия текст (без номера на редове) и спира програмата. +Вече може да премахнете временната функционалност, където ако реда започва с {` Q} програмата спира и изкарва целия текст. +Добавете командата {` Q}, която изкарва на екрана целия текст (без номера на редове) и спира програмата. -[=Примери:=] -[*Смесен вход/изход*] +{b Примери:} +{i Смесен вход/изход} -```terminal +'def LANG terminal +``` +'emplace DAY HAD DAWNED COLD AND GRAY WHEN the man turned aside from the main Yukon trail. He climbed the high :Q DAY HAD DAWNED COLD AND GRAY WHEN the man turned aside from the main Yukon trail. He climbed the high +'endemplace -```terminal +'def LANG terminal +``` +'emplace DAY HAD DAWNED COLD AND GRAY WHEN the man turned aside from the main Yukon trail. He climbed the high :Q 1 2 3 ; Excess parameters DAY HAD DAWNED COLD AND GRAY WHEN the man turned aside from the main Yukon trail. He climbed the high +'endemplace ### д) команда delete -Имплементирайте функцията [`deleteRow`], която получава целия текст, въведен до сега, и номер на реда (редовете се индексират от 1 до N). +Имплементирайте функцията {` deleteRow}, която получава целия текст, въведен до сега, и номер на реда (редовете се индексират от 1 до N). Тя променя текста, като премахва реда на дадения номер. -.important Не забравяйте да промените размера на масива с низове! Не е решение просто да промените указателя към дадения ред на [`nullptr`], не искаме да използваме излишна памет. +.important Не забравяйте да промените размера на масива с низове! Не е решение просто да промените указателя към дадения ред на {` nullptr}, не искаме да използваме излишна памет. .question Какъв ще бъде типа на аргумента, който приема целия текст? -Добавете командата [`D`], която приема един параметър - цяло положително число, и го прилага върху функцията [`deleteRow`]. +Добавете командата {` D}, която приема един параметър - цяло положително число, и го прилага върху функцията {` deleteRow}. Ако номера на реда е невалиден, трябва да изкарате съобщение "; Invalid row number". Имплементирайте следните функционалности за всички команди: @@ -203,10 +222,12 @@ the man turned aside from the main Yukon trail. He climbed the high - Ако даден параметър на команда е от невалиден тип (подадени букви, когато се иска число, примерно), изкарайте "; Invalid parameter type". Единствените типове на параметри са цели числа и произволни низове (без шпации). -[=Пример:=] -[*Смесен вход/изход*] +{b Пример:} +{i Смесен вход/изход} -```terminal +'def LANG terminal +``` +'emplace dAY HAD DAWNED COLD AND GRAY WHEN :P 1 dAY HAD DAWNED COLD AND GRAY WHEN @@ -237,21 +258,24 @@ est. It was a high bank, and he paused to breathe at the top. DAY HAD DAWNED COLD AND GRAY WHEN the man turned aside from the main Yukon trail. He climbed the high earth-bank where a little-traveled trail led east through the pine for- +'endemplace ### e) команда insert -Имплементирайте функция [`insertRow`], която приема целия текст, низ и номер на реда. -Функцията вмъква низа в целия текст като ред [=над=] този на подадения номер. +Имплементирайте функция {` insertRow}, която приема целия текст, низ и номер на реда. +Функцията вмъква низа в целия текст като ред {b над} този на подадения номер. Ако номерът е над броя въведени редове до сега, редът се вмъква като последен. -Добавете команда [`O`], която приема един параметър - неотрицателен ред. -Следващия написан ред ще се вмъкне преди реда на дадения номер, използвайки функцията [`insertRow`]. +Добавете команда {` O}, която приема един параметър - неотрицателен ред. +Следващия написан ред ще се вмъкне преди реда на дадения номер, използвайки функцията {` insertRow}. Ако номера е невалиден изкарва "; Invalid row number". -[=Пример:=] -[*Смесен вход/изход*] +{b Пример:} +{i Смесен вход/изход} -```terminal +'def LANG terminal +``` +'emplace the man turned aside from the main Yukon trail. He climbed the high :P 1 the man turned aside from the main Yukon trail. He climbed the high @@ -282,24 +306,27 @@ He excused 3 earth-bank where a little-traveled trail led east through the pine for- 4 est. It was a high bank, and he paused to breathe at the top. 5 He excused +'endemplace ### ж) команда join -Имплементирайте функция [`joinRows`], която приема текстът, въведен до сега, и номер на ред N. +Имплементирайте функция {` joinRows}, която приема текстът, въведен до сега, и номер на ред N. Функцията вмъква текста от ред N+1 в края на ред N, като ги разделя с една шпация. Ред N+1 се изтрива. Ако N е 0 или номера на последния ред, не прави нищо. -.important Не забравяйте да промените размера на масива с низове! Не е решение просто да промените указателя към дадения ред на [`nullptr`], не искаме да използваме излишна памет. +.important Не забравяйте да промените размера на масива с низове! Не е решение просто да промените указателя към дадения ред на {` nullptr}, не искаме да използваме излишна памет. -Добавете команда [`J`], която приема номер на ред - положително число. -Следващия ред ще се вмъкне в края на сегашния, с една шпация между тях, използвайки функцията [`joinRows`]. +Добавете команда {` J}, която приема номер на ред - положително число. +Следващия ред ще се вмъкне в края на сегашния, с една шпация между тях, използвайки функцията {` joinRows}. При подаден невалиден ред изкарвате "; Invalid row number". -[=Пример:=] -[*Смесен вход/изход*] +{b Пример:} +{i Смесен вход/изход} -```terminal +'def LANG terminal +``` +'emplace DAY HAD DAWNED COLD AND GRAY WHEN @@ -325,21 +352,24 @@ the man turned aside from the main Yukon trail. He climbed the high :Q DAY HAD DAWNED COLD AND GRAY WHEN the man turned aside from the main Yukon trail. He climbed the high +'endemplace ### з) команда word info -Имплементирайте функция [`wordOccurrences`], която приема целия текст и дума (низ без шпации). +Имплементирайте функция {` wordOccurrences}, която приема целия текст и дума (низ без шпации). Тя изкарва на екрана броя на срещания на дадената дума в целия текст, като изхода е във формата "; N occurrences" (където N е броя на срещания). -[*Подсказвам, че за следващата подточка ще е полезно ако първо имплементирате функция, която връща броя срещания на дума в един ред.*] +{i Подсказвам, че за следващата подточка ще е полезно ако първо имплементирате функция, която връща броя срещания на дума в един ред.} -Добавете команда [`n`], която приема един аргумент - низ беш шпации. -Използвайки [`wordOccurrences`] изкарва броя срещания на дадена дума в целия текст. +Добавете команда {` n}, която приема един аргумент - низ беш шпации. +Използвайки {` wordOccurrences} изкарва броя срещания на дадена дума в целия текст. -[=Пример:=] -[*Смесен вход/изход*] +{b Пример:} +{i Смесен вход/изход} -```terminal +'def LANG terminal +``` +'emplace DAY HAD DAWNED COLD AND GRAY WHEN the man turned aside from the main Yukon trail. He climbed the high earth-bank where a little-traveled trail led east through the pine for- @@ -357,18 +387,21 @@ DAY HAD DAWNED COLD AND GRAY WHEN the man turned aside from the main Yukon trail. He climbed the high earth-bank where a little-traveled trail led east through the pine for- est. It was a high bank, and he paused to breathe at the top. +'endemplace ### и) команда word substitute -Имплементирайте функция [`substituteWord`], която приема целия текст и две думи (низове без шпации). +Имплементирайте функция {` substituteWord}, която приема целия текст и две думи (низове без шпации). В текстът, всяко срещане на първата дума е заменено с втората дума. .question Какво ще стане с размера на един ред, ако някоя дума/някои думи трябва да се заменят? -Добавете команда [`s`], която приема две думи - низове без шпации. -Използвайки функцията [`substituteWord`] замества всяко срещане на първата дума с втората. +Добавете команда {` s}, която приема две думи - низове без шпации. +Използвайки функцията {` substituteWord} замества всяко срещане на първата дума с втората. -```terminal +'def LANG terminal +``` +'emplace DAY HAD DAWNED COLD AND GRAY WHEN the man turned aside from the main Yukon trail. He climbed the high earth-bank where a little-traveled trail led east through the pine for- @@ -394,26 +427,29 @@ DAY HAD DAWNED COLD AND GRAY WHEN the man turned aside from the main Yukon trail. He climbed the high earth-bank where a little-traveled trail led east through the pine for- est. It was a high bank, and he paused to breathe at the top. +'endemplace ### й) команда word delete -Имплементирайте функция [`deleteWord`], която приема целия текст и дума (низ без шпации). -В текстът, всяко срещане на думата, заедно с [*излишните*] шпации около нея, са премахнати. +Имплементирайте функция {` deleteWord}, която приема целия текст и дума (низ без шпации). +В текстът, всяко срещане на думата, заедно с {i излишните} шпации около нея, са премахнати. Ето в кои случаи шпации са излишни (където "WORD" е подадената дума, която ще изтрием, а "\_" е някаква буква, която не е шпация): .bulleted -- [`WORD _`] (WORD е в началото на реда или има знаци преди нея) - шпацията след думата е излишна, трябва да стане [`_`]. - Отбелязвам, че шпациите в ляво се запазват: [` WORD _`] става [` _`]. -- [`_ WORD`] (WORD е в края на реда или има знаци след нея) - шпацията преди думата е излишна, трябва да стане [`_`]. -- [`_ WORD _`] - шпацията, която следва думата, е излишна, тоест трябва да стане [`_ _`]. - Трябва да отбележа, че шпациите в ляво се запазват така както са: [`_ WORD _`] става [`_ _`]. +- {` WORD _} (WORD е в началото на реда или има знаци преди нея) - шпацията след думата е излишна, трябва да стане {` _}. + Отбелязвам, че шпациите в ляво се запазват: {` WORD _} става {` _}. +- {` _ WORD} (WORD е в края на реда или има знаци след нея) - шпацията преди думата е излишна, трябва да стане {` _}. +- {` _ WORD _} - шпацията, която следва думата, е излишна, тоест трябва да стане {` _ _}. + Трябва да отбележа, че шпациите в ляво се запазват така както са: {` _ WORD _} става {` _ _}. Във всичките случаи, като имам предвид "шпацията е излишна", означава че тази шпация, заедно с всички съседни. -Тоест, [`WORD _`] трябва да стане [`_`], а не [` _`]. +Тоест, {` WORD _} трябва да стане {` _}, а не {` _}. -Добавете команда [`d`], която приема един параметър - дума, низ без шпации. -Използвайки функцията [`deleteWord`] премахва самата дума и излишните шпации. +Добавете команда {` d}, която приема един параметър - дума, низ без шпации. +Използвайки функцията {` deleteWord} премахва самата дума и излишните шпации. -```terminal +'def LANG terminal +``` +'emplace DAY HAD DAWNED COLD AND GRAY WHEN the man turned aside from the main Yukon trail. He climbed the high earth-bank where a little-traveled trail led east through the pine for- @@ -424,3 +460,4 @@ DAY HAD DAWNED COLD AND GRAY WHEN man turned aside from main Yukon trail. He climbed high earth-bank where a little-traveled trail led east through pine for- est. It was a high bank, and he paused to brea at top. +'endemplace diff --git a/src/teaching/upp-2023/index.du b/src/teaching/upp-2023/index.du index 50ced66..4614528 100644 --- a/src/teaching/upp-2023/index.du +++ b/src/teaching/upp-2023/index.du @@ -1,4 +1,7 @@ -# Увод в програмирането - практикум, Компютърни науки, 8 група +'def title Увод в програмирането - практикум, Компютърни науки, 8 група +'def desc Материали на проведените през 2023/2024 практикуми по Увод в програмирането на Компютърни науки (2 поток), 8 група. + +# {title} Материали на проведените през 2023/2024 практикуми по Увод в програмирането на Компютърни науки (2 поток), 8 група. @@ -6,81 +9,82 @@ От сега нататък ще може да продължите да предавате решения след крайния срок в classroom. Не мога да гарантирам кога ще погледна предадени решения след срока, но ще ги погледна! -[=Зала:=] ФМИ 309 || -[=Време:=] 10:15 - 12:00 || -[=Ден:=] Петък -\n -[=Директни връзки:=] -[url ./week1/welcome.html?a#section-4 Контакт с мен] | -[url https://github.com/Syndamia/upp-2023-solutions Решения на задачи] | -[url https://github.com/ivanahristova/introduction-to-programming-2023-2024 Материали от семинари] | -[url https://learn.fmi.uni-sofia.bg/course/view.php?id=9567 Курс в мудъл] +{b Зала:} ФМИ 309 || +{b Време:} 10:15 - 12:00 || +{b Ден:} Петък +<br/> +{b Директни връзки:} +{url Контакт с мен;./week1/welcome.html?a#section-4} | +{url Решения на задачи;https://github.com/Syndamia/upp-2023-solutions} | +{url Материали от семинари;https://github.com/ivanahristova/introduction-to-programming-2023-2024} | +{url Курс в мудъл;https://learn.fmi.uni-sofia.bg/course/view.php?id=9567} -:table_3 +:table +:3 |= № |= Дата |= Материали |: 1 |: 06.10.2023 -|: [url ./week1/welcome.html Добре дошли] \|\| [url ./week1/setup.html?a Конфигуриране на GitHub classroom и Visual Studio] \|\| [url ./week1/?a Задачи] \|\| [url https://github.com/Syndamia/upp-2023-solutions/tree/main/week01 Решения] +|: {url Добре дошли;./week1/welcome.html} || {url Конфигуриране на GitHub classroom и Visual Studio;./week1/setup.html?a} || {url Задачи;./week1/?a} || {url Решения;https://github.com/Syndamia/upp-2023-solutions/tree/main/week01} |: 2 |: 13.10.2023 -|: [url ./week2/revision.html?a Преговор] \|\| [url ./week2 Задачи] \|\| [url https://github.com/Syndamia/upp-2023-solutions/tree/main/week02 Решения] +|: {url Преговор;./week2/revision.html?a} || {url Задачи;./week2} || {url Решения;https://github.com/Syndamia/upp-2023-solutions/tree/main/week02} |: 3 |: 20.10.2023 -|: [url ./week3/revision.html?a Преговор] \|\| [url ./week3 Задачи] \|\| [url https://github.com/Syndamia/upp-2023-solutions/tree/main/week03 Решения] +|: {url Преговор;./week3/revision.html?a} || {url Задачи;./week3} || {url Решения;https://github.com/Syndamia/upp-2023-solutions/tree/main/week03} |: 4 |: 27.10.2023 -|: [url ./week4/revision.html?a Преговор] \|\| [url ./week4 Задачи] \|\| [url https://classroom.github.com/a/jqKaO1ny GitHub classroom] \|\| [url https://github.com/Syndamia/upp-2023-solutions/tree/main/week04 Решения (само 1ва)] +|: {url Преговор;./week4/revision.html?a} || {url Задачи;./week4} || {url GitHub classroom;https://classroom.github.com/a/jqKaO1ny} || {url Решения (само 1ва);https://github.com/Syndamia/upp-2023-solutions/tree/main/week04} |: 5 |: 03.11.2023 -|: [url ./week5/revision.html Преговор] \|\| [url ./week5 Задачи] \|\| [url https://classroom.github.com/a/3KoIQ71H GitHub classroom] \|\| [url https://github.com/Syndamia/upp-2023-solutions/tree/main/week05 Решения] +|: {url Преговор;./week5/revision.html} || {url Задачи;./week5} || {url GitHub classroom;https://classroom.github.com/a/3KoIQ71H} || {url Решения;https://github.com/Syndamia/upp-2023-solutions/tree/main/week05} |: |: 04.11.2023 -|: [url ./additional1/ Допълнително упражнение 1] \|\| [url https://classroom.github.com/a/nlFuKALw GitHub classroom] \|\| [url https://github.com/Syndamia/upp-2023-solutions/blob/main/additional1/exercise.cpp Решение] +|: {url Допълнително упражнение 1;./additional1/} || {url GitHub classroom;https://classroom.github.com/a/nlFuKALw} || {url Решение;https://github.com/Syndamia/upp-2023-solutions/blob/main/additional1/exercise.cpp} |: 6 |: 10.11.2023 -|: [url ./week6 Задачи] \|\| [url https://github.com/Syndamia/upp-2023-solutions/tree/main/week06 Решения] \|\| [url https://classroom.github.com/a/BBLlWMOy GitHub classroom] +|: {url Задачи;./week6} || {url Решения;https://github.com/Syndamia/upp-2023-solutions/tree/main/week06} || {url GitHub classroom;https://classroom.github.com/a/BBLlWMOy} |: 7 |: 17.11.2023 -|: [url ./week7 Задачи] \|\| [url https://github.com/Syndamia/upp-2023-solutions/tree/main/week07 Решения] \|\| [url https://classroom.github.com/a/m5M2_CWD GitHub classroom] +|: {url Задачи;./week7} || {url Решения;https://github.com/Syndamia/upp-2023-solutions/tree/main/week07} || {url GitHub classroom;https://classroom.github.com/a/m5M2_CWD} |: 8 |: 24.11.2023 -|: [url ./week8 Задачи] \|\| [url https://github.com/Syndamia/upp-2023-solutions/tree/main/week08 Решения] \|\| [url https://classroom.github.com/a/Big7FRUG GitHub classroom] +|: {url Задачи;./week8} || {url Решения;https://github.com/Syndamia/upp-2023-solutions/tree/main/week08} || {url GitHub classroom;https://classroom.github.com/a/Big7FRUG} |: 9 |: 01.12.2023 -|: [url ./week9 Задачи] \|\| [url https://github.com/Syndamia/upp-2023-solutions/tree/main/week09 Решения] \|\| [url https://classroom.github.com/a/lGXxCRZO GitHub classroom] +|: {url Задачи;./week9} || {url Решения;https://github.com/Syndamia/upp-2023-solutions/tree/main/week09} || {url GitHub classroom;https://classroom.github.com/a/lGXxCRZO} |: |: 04.12.2023 -|: [url ./additional2/ Допълнително упражнение 2] \|\| [url https://github.com/Syndamia/upp-2023-solutions/tree/main/additional2 Решения] \|\| [url https://classroom.github.com/a/CrerXpf6 GitHub classroom] +|: {url Допълнително упражнение 2;./additional2/} || {url Решения;https://github.com/Syndamia/upp-2023-solutions/tree/main/additional2} || {url GitHub classroom;https://classroom.github.com/a/CrerXpf6} |: 10 |: 15.12.2023 -|: [url ./week10 Задачи] \|\| [url https://github.com/Syndamia/upp-2023-solutions/tree/main/week10 Решения] \|\| [url https://classroom.github.com/a/EJcTQRz4 GitHub classroom] +|: {url Задачи;./week10} || {url Решения;https://github.com/Syndamia/upp-2023-solutions/tree/main/week10} || {url GitHub classroom;https://classroom.github.com/a/EJcTQRz4} |: 11 |: 22.12.2023 -|: [url ./week11 Задачи] \|\| [url https://github.com/Syndamia/upp-2023-solutions/tree/main/week11 Решения] \|\| [url https://classroom.github.com/a/cZRnZj9y GitHub classroom] +|: {url Задачи;./week11} || {url Решения;https://github.com/Syndamia/upp-2023-solutions/tree/main/week11} || {url GitHub classroom;https://classroom.github.com/a/cZRnZj9y} |: 12 |: 05.01.2024 -|: [url ./week12 Задачи] \|\| [url https://github.com/Syndamia/upp-2023-solutions/tree/main/week12 Решения] \|\| [url https://classroom.github.com/a/KEDSxDjl GitHub classroom] +|: {url Задачи;./week12} || {url Решения;https://github.com/Syndamia/upp-2023-solutions/tree/main/week12} || {url GitHub classroom;https://classroom.github.com/a/KEDSxDjl} |: 13 |: 12.01.2024 -|: [url ./week13 Задачи] \|\| [url https://classroom.github.com/a/bgiFD6SB GitHub classroom] +|: {url Задачи;./week13} || {url GitHub classroom;https://classroom.github.com/a/bgiFD6SB} |: 14 |: 19.01.2024 -|: [url ./week14 Задачи] \|\| [url https://classroom.github.com/a/B08TtnnW GitHub classroom] +|: {url Задачи;./week14} || {url GitHub classroom;https://classroom.github.com/a/B08TtnnW} diff --git a/src/teaching/upp-2023/week1/index.du b/src/teaching/upp-2023/week1/index.du index e41a297..0a16843 100644 --- a/src/teaching/upp-2023/week1/index.du +++ b/src/teaching/upp-2023/week1/index.du @@ -1,16 +1,19 @@ -# Задачи - УПП, Седмица 1, 06.10.2023 +'def title Задачи - УПП, Седмица 1, 06.10.2023 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/W7hZDMgC classroom.github.com/a/W7hZDMgC] +GitHub classroom: {url classroom.github.com/a/W7hZDMgC;https://classroom.github.com/a/W7hZDMgC} -Решения: [url https://github.com/Syndamia/upp-2023-solutions/tree/main/week01 GitHub] +Решения: {url GitHub;https://github.com/Syndamia/upp-2023-solutions/tree/main/week01} ### 1 задача - Hello, World! Още от "древни" времена програмистите са си измисляли малки програмки, с които да тестват дали всичко работи. -Традиция в модерното време е да изкараш на екрана съобщението [url https://en.wikipedia.org/wiki/%22Hello,_World!%22_program#History "Hello, World!"]. -Това е главно популяризирано от книгата [url https://en.wikipedia.org/wiki/The_C_Programming_Language The C Programming Language], централния материал върху езика С (един от най-значимите езици за програмиране някога). +Традиция в модерното време е да изкараш на екрана съобщението {url "Hello, World!";https://en.wikipedia.org/wiki/%22Hello,_World!%22_program#History}. +Това е главно популяризирано от книгата {url The C Programming Language;https://en.wikipedia.org/wiki/The_C_Programming_Language}, централния материал върху езика С (един от най-значимите езици за програмиране някога). Изкарайте на екрана съобщението "Hello, World!". @@ -18,9 +21,10 @@ GitHub classroom: [url https://classroom.github.com/a/W7hZDMgC classroom.github. Във входа получавате цифра, трябва да върнете нейната числена стойност, умножена по две. -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход @@ -31,7 +35,8 @@ GitHub classroom: [url https://classroom.github.com/a/W7hZDMgC classroom.github. |: 16 -[=Упътване:=] + +{b Упътване:} Цифрата е просто знак, и за да извършите коректно умножението трябва да превърнете знака в число. ### 3 задача - От Фаренхайт в Целзий @@ -43,9 +48,10 @@ GitHub classroom: [url https://classroom.github.com/a/W7hZDMgC classroom.github. ``` C = (F - 32) * 5/9 -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход diff --git a/src/teaching/upp-2023/week1/setup.du b/src/teaching/upp-2023/week1/setup.du index 6b22df6..e1d2f30 100644 --- a/src/teaching/upp-2023/week1/setup.du +++ b/src/teaching/upp-2023/week1/setup.du @@ -1,8 +1,11 @@ -# Конфигуриране на GitHub classroom и Visual Studio - УПП, Седмица 1, 06.10.2023 +'def title Конфигуриране на GitHub classroom и Visual Studio - УПП, Седмица 1, 06.10.2023 +'def desc Постъпково упътване към настройване на всичко нужно за практикума + +# {title} \n -[$presentation-controller] +{presentation-controller} :title_slide @@ -30,20 +33,20 @@ ### Git -[$br1] +{br1} .p -git е програма (система) за [url https://en.wikipedia.org/wiki/Distributed_version_control контрол на версиите]. -В един проект, git пази [=списък от всички commit-и=]. -Един commit в себе си [=съдържа какви са точно промените=], кой ги е направил, кога са направени, защо са направени и так. нат. -Този списък, заедно с още неща за които не е нужно да мислите, се нарича [=repository=]. +git е програма (система) за {url контрол на версиите;https://en.wikipedia.org/wiki/Distributed_version_control}. +В един проект, git пази {b списък от всички commit-и}. +Един commit в себе си {b съдържа какви са точно промените}, кой ги е направил, кога са направени, защо са направени и так. нат. +Този списък, заедно с още неща за които не е нужно да мислите, се нарича {b repository}. .p -Обаче, [=commit-ове не се правят автоматично=], не е като историята с промени в един Word файл. -[=Commit се прави от разработчика=], и то за предпочитане на всеки няколко (свързани) промени. +Обаче, {b commit-ове не се правят автоматично}, не е като историята с промени в един Word файл. +{b Commit се прави от разработчика}, и то за предпочитане на всеки няколко (свързани) промени. .p -Така, когато смесваме кода от многото разработчици, ще можем да засечем [=какви точно са различията=] между работата на двама човека.\n +Така, когато смесваме кода от многото разработчици, ще можем да засечем {b какви точно са различията} между работата на двама човека.\n Често промените не си "противоречат" и могат да бъдат смесени директно, понякога се налага ръчно да решим какво точно да се случи с тези парчета код. @@ -51,11 +54,11 @@ git е програма (система) за [url https://en.wikipedia.org/wiki ### GitHub -[$br5] +{br5} .p Всички repository-та трябва да се пазят някъде и да може лесно да се споделят и гледат. -Има много сайтове за тази цел, най-популярния се нарича [url https://github.com GitHub]. +Има много сайтове за тази цел, най-популярния се нарича {url GitHub;https://github.com}. .p Напомням, че git и GitHub са напълно отделни неща, направени от различни хора с различни функционалности. @@ -67,9 +70,9 @@ git е програма (система) за [url https://en.wikipedia.org/wiki ## Сега всички трябва да си направят GitHub акаунти .p -Отивате на [url https://github.com/signup github.com/signup], въвеждате си данните една по една и се регистрирате +Отивате на {url github.com/signup;https://github.com/signup}, въвеждате си данните една по една и се регистрирате -.p [image ./img/github-signup.gif] +.p {img ./img/github-signup.gif} :middle_slide @@ -77,7 +80,7 @@ git е програма (система) за [url https://en.wikipedia.org/wiki .p След това, като влезете в акаунтите си (което става автоматично след регистрация), на заглавната страница ще имате нещо такова: -.width75% [image ./img/github-index.gif] +.width75% {img ./img/github-index.gif} .p В горния десен ъгъл, където е иконката с квадрати на бял фон, след натискане получавате sidebar. @@ -94,24 +97,24 @@ git е програма (система) за [url https://en.wikipedia.org/wiki .p Най-простия начин, който намерих, е да отворите -[url https://support.github.com/contact/reinstatement support.github.com/contact/reinstatement]\n +{url support.github.com/contact/reinstatement;https://support.github.com/contact/reinstatement}\n Ако отгоре пише "Your account has been flagged", тогава имаме проблем. .p -[image ./img/github-support-flagged.gif] +{img ./img/github-support-flagged.gif} :slide ## GitHub classroom -[$br3] +{br3} .p За всеки практикум ще ви направя линк, чрез който след малко кликане ще се създаде ново лично repository за всеки от вас. .p -До 12:20 трябва да сте качили работата си [=по време=] на упражнението в това repository. +До 12:20 трябва да сте качили работата си {b по време} на упражнението в това repository. GitHub предоставя лесни начини да правите промени по файлове директно чрез браузъра, така че за незаинтересуваните, може да го ползвате като усложнен Google Drive. .p @@ -126,14 +129,14 @@ GitHub предоставя лесни начини да правите пром .p За всяко упражнение ще има отделен линк.\n -Този за днеска е: [url https://classroom.github.com/a/W7hZDMgC classroom.github.com/a/W7hZDMgC] +Този за днеска е: {url classroom.github.com/a/W7hZDMgC;https://classroom.github.com/a/W7hZDMgC} -[$br1] +{br1} :row .p След като го отворите, ще видите съобщение за разрешение, авторизирайте го. -.p [image ./img/github-classroom-authorize.gif] +.p {img ./img/github-classroom-authorize.gif} @@ -141,7 +144,7 @@ GitHub предоставя лесни начини да правите пром :row -.width60% [image ./img/join-the-classroom.gif] +.width60% {img ./img/join-the-classroom.gif} :column @@ -158,12 +161,12 @@ GitHub предоставя лесни начини да правите пром .p След това, би трябвало да видите страницата за "Приемане на заданието". -.width40% [image ./img/accept-assignment.gif] +.width40% {img ./img/accept-assignment.gif} .p След като го приемете, на новата страница, изчакайте няколко секунди и презаредете. Трябва да видите това: -.width40% [image ./img/ready-to-go.gif] +.width40% {img ./img/ready-to-go.gif} :middle_slide @@ -188,24 +191,24 @@ GitHub предоставя лесни начини да правите пром Целта е да видя какво правите и да ви помогна, моля проверявайте какво съм ви писал, по подразбиране би трябвало да получавате известия на имейл-а. .centered -.width80% [image ./img/feedback.gif] +.width80% {img ./img/feedback.gif} :slide ## Къде пишем код? -[$br2] +{br2} .p -[=Кодът е чисто и просто текст=], компилаторът е специалната програма, която превръща този текст в нещо, което може компютъра да изпълни. +{b Кодът е чисто и просто текст}, компилаторът е специалната програма, която превръща този текст в нещо, което може компютъра да изпълни. .p -За писане и редактиране на текст ползваме [=текстови редактори=]. +За писане и редактиране на текст ползваме {b текстови редактори}. Програмистите са искали да улеснят работата си, затова модерните текстови редактори поддържат много помощни функционалности: показване на грешки на точния ред, автоматично форматиране, ... .p -За някои и това не е било достатъчно удобно, затова са създадени [=Integrated Development Environment=] (IDE), програми които съдържат в себе си всичко нужно за разработка на код. +За някои и това не е било достатъчно удобно, затова са създадени {b Integrated Development Environment} (IDE), програми които съдържат в себе си всичко нужно за разработка на код. Тоест, те са текстови редактори, но "вградено" могат да компилират код, да менижират сегашното repository, ... @@ -232,20 +235,20 @@ GitHub предоставя лесни начини да правите пром ### Инсталация -[$br1] +{br1} .p Намираме се в компютърна зала, така че всички предоставени компютри би трябвало вече да са налични на предоставените компютри. За ваши лични машини, ще минем набързо през информацията тук. .p -За Visual Studio Code, отивате на [url https://code.visualstudio.com/Download code.visualstudio.com/Download], избирате своята операционна система (за Уиндоус, ако не сте сигурни, изберете "System Installer x64") и инсталирате. +За Visual Studio Code, отивате на {url code.visualstudio.com/Download;https://code.visualstudio.com/Download}, избирате своята операционна система (за Уиндоус, ако не сте сигурни, изберете "System Installer x64") и инсталирате. .p -За Visual Studio, отивате на [url https://visualstudio.microsoft.com/ visualstudio.microsoft.com], скролвате малко надолу, избирате "Download Visual Studio" и след това "Community 2022". +За Visual Studio, отивате на {url visualstudio.microsoft.com;https://visualstudio.microsoft.com/}, скролвате малко надолу, избирате "Download Visual Studio" и след това "Community 2022". .bulleted 'footnote vs-2022-old-win Може би има трикове с които да инсталирате 2022 версията, но те не са официални и затова няма да го преподам -- Ако искате да ползвате по-стара ОС, като Windows 8.1 или Windows 7 ще трябва да използвате "Community 2019"[$vs-2022-old-win], разликата между версиите не е съществена, затова не се притеснявайте. +- Ако искате да ползвате по-стара ОС, като Windows 8.1 или Windows 7 ще трябва да използвате "Community 2019"{vs-2022-old-win}, разликата между версиите не е съществена, затова не се притеснявайте. :slide @@ -258,7 +261,7 @@ GitHub предоставя лесни начини да правите пром Би трябвало да заема към 11 GB памет и в моето тестване се инсталира за 10тина минути. .centered -.width80% [image ./img/vs-install.gif] +.width80% {img ./img/vs-install.gif} :slide @@ -274,9 +277,9 @@ GitHub предоставя лесни начини да правите пром :width75% :row -.p [image ./img/vs-signin.gif] +.p {img ./img/vs-signin.gif} -.p [image ./img/vs-start-env.gif] +.p {img ./img/vs-start-env.gif} @@ -291,7 +294,7 @@ GitHub предоставя лесни начини да правите пром В лявата колона имате скорошни проекти, в дясната имате начини да създадете нов проект. :centered -:width80% [image ./img/vs-open-recent.gif] +:width80% {img ./img/vs-open-recent.gif} @@ -304,7 +307,7 @@ GitHub предоставя лесни начини да правите пром В този курс ще работим само и единствено с "Console App", затова изберете него и кликнете "Next". :centered -:width75% [image ./img/vs-create-project.gif] +:width75% {img ./img/vs-create-project.gif} @@ -316,7 +319,7 @@ GitHub предоставя лесни начини да правите пром Тук единствено може да искате да промените Project Name и Location, другото не е важно. :centered -:width80% [image ./img/vs-configure-project.gif] +:width80% {img ./img/vs-configure-project.gif} @@ -348,7 +351,7 @@ GitHub предоставя лесни начини да правите пром :centered :width60% -.p [image ./img/vs-general.gif] +.p {img ./img/vs-general.gif} @@ -356,7 +359,7 @@ GitHub предоставя лесни начини да правите пром В Solution Explorer имате всички файлове от проекта (Visual Studio позволява да групирате няколко проекта в едно, наречено Solution, не е нужно да се занимавате). .p -Тук [=единственото важно за вас се намира в папката "Source Files"=]. +Тук {b единственото важно за вас се намира в папката "Source Files"}. В нея ще се намира вашия код, всичко останало са допълнителни неща, които са релевантни за по-големи проекти. @@ -369,7 +372,7 @@ GitHub предоставя лесни начини да правите пром :width50% :fright -.p [image ./img/vs-debug-menu.gif] +.p {img ./img/vs-debug-menu.gif} @@ -377,14 +380,14 @@ GitHub предоставя лесни начини да правите пром .p След малко чакане, би трябвало да излезе един прозорец, който изглежда горе-долу така: -.p [image ./img/vs-console.gif] +.p {img ./img/vs-console.gif} :slide ### Как да дебъгваме с Visual Studio -[$br1] +{br1} .p Bug е когато нещо непланирано се случи в кода. @@ -397,7 +400,7 @@ Visual Studio предоставя много функционалности, к .p При компилиране, ще получим съобщение за грешки по време на компилирането. -.p [image ./img/vs-build-errors.gif] +.p {img ./img/vs-build-errors.gif} :slide @@ -412,7 +415,7 @@ Visual Studio предоставя много функционалности, к Той се появява когато при компилиране получим грешки и изчезва когато няма. :centered -:width70% [image ./img/vs-errors.gif] +:width70% {img ./img/vs-errors.gif} @@ -430,9 +433,9 @@ Visual Studio предоставя много функционалности, к Най-елементарния начин: копирате всичко, след това отивате на вашето GitHub repository, кликвате "Add", после "Create new file". .p -Отгоре на "Name your file..." пишете някакво име, което [=моля да завърша на [`.cpp`]!=] +Отгоре на "Name your file..." пишете някакво име, което {b моля да завърша на {` .cpp}!} Това показва, че файла съдържа код на C++. -Също, когато решавате много задачи и създавате много такива файлове, [=напомням че имената на файловете трябва да са различни.=] +Също, когато решавате много задачи и създавате много такива файлове, {b напомням че имената на файловете трябва да са различни.} .p В "Enter file contents here" пействате копирания код. @@ -441,4 +444,4 @@ Visual Studio предоставя много функционалности, к :middle_slide -## Вече имате достатъчно информация да пишете код сами, [url ./ време е за задачи] +## Вече имате достатъчно информация да пишете код сами, {url време е за задачи;./} diff --git a/src/teaching/upp-2023/week1/welcome.du b/src/teaching/upp-2023/week1/welcome.du index 6821e67..03a3eb4 100644 --- a/src/teaching/upp-2023/week1/welcome.du +++ b/src/teaching/upp-2023/week1/welcome.du @@ -1,15 +1,18 @@ -# Добре дошли - УПП, Седмица 1, 06.10.2023 +'def title Добре дошли - УПП, Седмица 1, 06.10.2023 +'def desc Въведителни думи за практикума и ФМИ + +# {title} \n -[$presentation-controller] +{presentation-controller} :title_slide35 # Добре дошли :width65% -[image_url https://upload.wikimedia.org/wikipedia/commons/3/3c/Chimpanzee_seated_at_typewriter.jpg https://en.wikipedia.org/wiki/Infinite_monkey_theorem] +{url {img https://upload.wikimedia.org/wikipedia/commons/3/3c/Chimpanzee_seated_at_typewriter.jpg};https://en.wikipedia.org/wiki/Infinite_monkey_theorem} @@ -17,17 +20,17 @@ ## Кой съм аз -[$br2] +{br2} :font35 Казвам се Камен (моля не ми говорете на Вие), в момента съм третокурсник в КН2.\n -[$br1] +{br1} Ще водя практикуми - давам ви задачи, вие ги решавате и на живо оправяме проблеми.\n -[$br1] +{br1} Също ще проверявам част от домашните и контролните през семестъра. @@ -39,7 +42,7 @@ Айде сега, ред по ред: -[$br3] +{br3} :font35 :bulleted @@ -61,14 +64,14 @@ ## Чисто организационно -[$br3] +{br3} :centered35 Задачи, презентации, ...\n -[url /teaching/upp-2023 syndamia.com/teaching/upp-2023] +{url syndamia.com/teaching/upp-2023;/teaching/upp-2023} -[$br3] +{br3} :unordered - Не сме в училище, ако трябва да излезете за разговор или до тоалетна, просто си излезте (за предпочитане по-тихичко). @@ -93,11 +96,11 @@ - Имейл: .bulleted - <a href="mailto:kamen.d.mladenov@protonmail.com">kamen.d.mladenov@protonmail.com</a> <a class="borderless" href="/files/publickey-kamen.d.mladenov@protonmail.com-62ca52e87475c874b9e6ebf3c4c9f716b6ce4c9d.asc"><img class="borderless unzoomable" src="/img/pgpkey.gif" alt="PGP key"></a> - - <a href="mailto:kamen@syndamia.com">kamen@syndamia.com</a> <a class="borderless" href="/files/publickey-kamen@syndamia.com-0x354C5F95.asc"><img class="borderless unzoomable" src="/img/pgpkey.gif" alt="PGP key"></a> [=(гледайте си спама!)=] - - [url mailto:kdmladenov@uni-sofia.bg kdmladenov@uni-sofia.bg] + - <a href="mailto:kamen@syndamia.com">kamen@syndamia.com</a> <a class="borderless" href="/files/publickey-kamen@syndamia.com-0x354C5F95.asc"><img class="borderless unzoomable" src="/img/pgpkey.gif" alt="PGP key"></a> {b (гледайте си спама!)} + - {url kdmladenov@uni-sofia.bg;mailto:kdmladenov@uni-sofia.bg} -Директни линкове към Facebook и Discord има на [url https://learn.fmi.uni-sofia.bg/user/profile.php?id=23229 профила ми в мудъл].\n +Директни линкове към Facebook и Discord има на {url профила ми в мудъл;https://learn.fmi.uni-sofia.bg/user/profile.php?id=23229}.\n @@ -112,10 +115,10 @@ - Ще гледам винаги да има задачи с връзка към реален софтуер. За любителите, където е възможно, ще добавям външни препратки. -- Давам ви [*много*] повече задачи, отколкото очаквам да решите на живо!\n +- Давам ви {i много} повече задачи, отколкото очаквам да решите на живо!\n Хубаво е да имате с какво още да се упражните след практикума, 2 часа писане на код седмично е малко! -- Ще качвам решения на задачите, заедно с подробно коментари върху тях, тук: [url https://github.com/Syndamia/upp-2023-solutions github.com/Syndamia/upp-2023-solutions]. +- Ще качвам решения на задачите, заедно с подробно коментари върху тях, тук: {url github.com/Syndamia/upp-2023-solutions;https://github.com/Syndamia/upp-2023-solutions}. Това ще се случва в началото на следващия практикум, тоест ще имате една седмица, от деня в който ви давам задачите, през която няма да имате решения. @@ -143,7 +146,7 @@ Ако задачите са трудни, зле направени, ако нещо не обяснявам като хората, изобщо ако нещо не е ок, свържете се с мен, ще го обсъдим. -[$br3] +{br3} ## Помагайте си! @@ -159,15 +162,15 @@ ## Няколко съвета в позицията ми на третокурсник -[$br2] +{br2} :font35 :unordered -- [=НЕ плагиатствайте!=] - [=НЕ си качвайте решенията на контролни или домашни онлайн!=] +- {b НЕ плагиатствайте!} + {b НЕ си качвайте решенията на контролни или домашни онлайн!} Формално плагиатството е незаконно, ако някой Ви направи доклад, възможно е да бъдете изключени. -- [=Следвайте материала, който ви се преподава!=] +- {b Следвайте материала, който ви се преподава!} За хората с опит, ще дойде време когато ще искате да приложите лични знания и практики. Ако не е казано някъде, не го правите и не го обмисляте! @@ -185,11 +188,11 @@ Или защо учим толкова много математика -[$br2] +{br2} :font22 Ще си позволя едно отклонение.\n -Искам да обясня как [=аз лично=] виждам\n +Искам да обясня как {b аз лично} виждам\n математиката в компютърния свят. @@ -200,7 +203,7 @@ :row -.width35% [image ./img/u4-mat-hard.gif] +.width35% {img ./img/u4-mat-hard.gif} :column .bulleted @@ -234,15 +237,15 @@ :row .font35 -[image https://upload.wikimedia.org/wikipedia/commons/9/99/ClaudeShannon_MFO3807.jpg?20190622223728 Claude Shannon] +{img Claude Shannon;https://upload.wikimedia.org/wikipedia/commons/9/99/ClaudeShannon_MFO3807.jpg?20190622223728} :column :unordered -- [=Булева алгебра=]: как работим с истина/лъжа, с 0/1 +- {b Булева алгебра}: как работим с истина/лъжа, с 0/1 .bulleted - - Доказана е [url https://en.wikipedia.org/wiki/A_Symbolic_Analysis_of_Relay_and_Switching_Circuits еквивалентност между ел. вериги и булевата алгебра]. + - Доказана е {url еквивалентност между ел. вериги и булевата алгебра;https://en.wikipedia.org/wiki/A_Symbolic_Analysis_of_Relay_and_Switching_Circuits}. - Много типове данни и математически операции могат да се сведат до булева алгебра и работа с памет. @@ -253,20 +256,20 @@ ### Дискретни структури (продължение) -[$br1] +{br1} :unordered -- [=Теория на множествата=]: множество е някаква съвкупност от обекти +- {b Теория на множествата}: множество е някаква съвкупност от обекти .bulleted - 'footnote importance-of-sets [url https://math.stackexchange.com/a/536172 https://math.stackexchange.com/a/536172] - - Позволява ни да третираме колекция от математически обекти като математически обект[$importance-of-sets]. + 'footnote importance-of-sets {url https://math.stackexchange.com/a/536172;https://math.stackexchange.com/a/536172} + - Позволява ни да третираме колекция от математически обекти като математически обект{importance-of-sets}. Използва се в основата на много математики; колкото са полезни те, толкова са и множествата. -[$br2] +{br2} -'footnote importance-of-combinatorics [url https://math.stackexchange.com/questions/2146051/where-do-combinatorics-play-a-role-in-computer-science https://math.stackexchange.com/questions/2146051/where-do-combinatorics-play-a-role-in-computer-science] -- [=Комбинаторика=] [$importance-of-combinatorics]: изследва бройки на неща +'footnote importance-of-combinatorics {url https://math.stackexchange.com/questions/2146051/where-do-combinatorics-play-a-role-in-computer-science;https://math.stackexchange.com/questions/2146051/where-do-combinatorics-play-a-role-in-computer-science} +- {b Комбинаторика} {importance-of-combinatorics}: изследва бройки на неща .bulleted - Често се ползва за анализ и дизайн на алгоритми и структури от данни @@ -279,13 +282,13 @@ ### Дискретни структури (продължение) -[$br5] +{br5} :unordered -- [=Теория на графите=]: граф е съвкупност от някакви обекти и връзки между тях. +- {b Теория на графите}: граф е съвкупност от някакви обекти и връзки между тях. .bulleted - Позволява моделиране на много естествени структури: интернет мрежите, географски карти (места и пътищата между тях), йерархии, биологически мрежи и так. нат. - - Използва се във важни структури от данни като [url https://en.wikipedia.org/wiki/Heap_%28data_structure%29 heap] (и интересната [url https://www.youtube.com/watch?v=6JxvKfSV9Ns fibonacci heap]) и [url https://en.wikipedia.org/wiki/Trie trie] + - Използва се във важни структури от данни като {url heap;https://en.wikipedia.org/wiki/Heap_%28data_structure%29} (и интересната {url fibonacci heap;https://www.youtube.com/watch?v=6JxvKfSV9Ns}) и {url trie;https://en.wikipedia.org/wiki/Trie} @@ -293,13 +296,13 @@ ### Езици, автомати и изчислимост -[$br5] +{br5} :row :font35 -.width85% [image https://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Kleene.jpg/421px-Kleene.jpg?20230630215747] +.width85% {img https://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Kleene.jpg/421px-Kleene.jpg?20230630215747} .p Stephen Kleene @@ -317,7 +320,7 @@ :slide -[$br1] +{br1} ### Алгебра 1 @@ -328,7 +331,7 @@ - Основоположна в компютърната графика - Много използвана в machine learning -[$br3] +{br3} ### Диференциално и интегрално смятане @@ -356,7 +359,7 @@ - ... .p -Математиката е [=неразделима=] част от софтуера!\n +Математиката е {b неразделима} част от софтуера!\n Друг е въпросът дали на вас лично ще ви се налага да я използвате... @@ -372,15 +375,15 @@ .p .bulleted -- Най-великият труд на тази дисциплина е постигнат чрез [=синхрон=] между тези три предмета +- Най-великият труд на тази дисциплина е постигнат чрез {b синхрон} между тези три предмета :centered :width60% :row -.p [image https://upload.wikimedia.org/wikipedia/commons/thumb/4/4f/Black_hole_-_Messier_87_crop_max_res.jpg/600px-Black_hole_-_Messier_87_crop_max_res.jpg] +.p {img https://upload.wikimedia.org/wikipedia/commons/thumb/4/4f/Black_hole_-_Messier_87_crop_max_res.jpg/600px-Black_hole_-_Messier_87_crop_max_res.jpg} -.p [image https://upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Internet_map_1024.jpg/600px-Internet_map_1024.jpg?20121030160606] +.p {img https://upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Internet_map_1024.jpg/600px-Internet_map_1024.jpg?20121030160606} @@ -396,13 +399,13 @@ :title_slide35 -# [url ./setup.html Достатъчно философия, сега ще конфигурираме всичко нужно за първото ни упражнение] +# {url Достатъчно философия, сега ще конфигурираме всичко нужно за първото ни упражнение;./setup.html} ### Употреба на изображения -Снимки на [url https://upload.wikimedia.org/wikipedia/commons/9/99/ClaudeShannon_MFO3807.jpg?20190622223728 Claude Shannon] и [url https://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Kleene.jpg/421px-Kleene.jpg?20230630215747 Stephen Cole Kleen], предоставени от Konrad Jacobs с авторско право от [url https://opc.mfo.de/ MFO], лицензирано с [url https://creativecommons.org/licenses/by-sa/2.0/de/deed.en CC BY-SA 2.0 DE] в Уикипедия. +Снимки на {url Claude Shannon;https://upload.wikimedia.org/wikipedia/commons/9/99/ClaudeShannon_MFO3807.jpg?20190622223728} и {url Stephen Cole Kleen;https://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Kleene.jpg/421px-Kleene.jpg?20230630215747}, предоставени от Konrad Jacobs с авторско право от {url MFO;https://opc.mfo.de/}, лицензирано с {url CC BY-SA 2.0 DE;https://creativecommons.org/licenses/by-sa/2.0/de/deed.en} в Уикипедия. -Снимка на черната дупка Messier 87, предоставена от [url https://www.eso.org/public/ ESO] с лиценз [url https://creativecommons.org/licenses/by/4.0/deed.en CC BY 4.0] в [url https://en.wikipedia.org/wiki/File:Black_hole_-_Messier_87_crop_max_res.jpg Уикипедия]. +Снимка на черната дупка Messier 87, предоставена от {url ESO;https://www.eso.org/public/} с лиценз {url CC BY 4.0;https://creativecommons.org/licenses/by/4.0/deed.en} в {url Уикипедия;https://en.wikipedia.org/wiki/File:Black_hole_-_Messier_87_crop_max_res.jpg}. -Изображение на интернет мрежата направено от [url https://en.wikipedia.org/wiki/User:Matt_Britt Matt Britt] с данни от [url https://www.opte.org/ The Opte Project], лицензирано с [url https://creativecommons.org/licenses/by/2.5/deed.en CC BY 2.5] в [url https://commons.wikimedia.org/wiki/File:Internet_map_1024.jpg Уикипедия]. +Изображение на интернет мрежата направено от {url Matt Britt;https://en.wikipedia.org/wiki/User:Matt_Britt} с данни от {url The Opte Project;https://www.opte.org/}, лицензирано с {url CC BY 2.5;https://creativecommons.org/licenses/by/2.5/deed.en} в {url Уикипедия;https://commons.wikimedia.org/wiki/File:Internet_map_1024.jpg}. diff --git a/src/teaching/upp-2023/week10/index.du b/src/teaching/upp-2023/week10/index.du index 746cacd..6a4bbe1 100644 --- a/src/teaching/upp-2023/week10/index.du +++ b/src/teaching/upp-2023/week10/index.du @@ -1,21 +1,25 @@ -# Задачи - УПП, Седмица 10, 15.12.2023 +'def title Задачи - УПП, Седмица 10, 15.12.2023 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/EJcTQRz4 classroom.github.com/a/EJcTQRz4] +GitHub classroom: {url classroom.github.com/a/EJcTQRz4;https://classroom.github.com/a/EJcTQRz4} -.important Във всички задачи [=трябва=] да използвате рекурсия! +.important Във всички задачи {b трябва} да използвате рекурсия! ## Задача 1 -Най-големия общ делител на числата [`a`] и [`b`] е най-голямото, число което ги дели без остатък. -Евклидовият алгоритъм се базира на факта, че за две положителни числа [`a`] и [`b`], като [`a > b`], НОД на [`a`] и [`b`] е същия като НОД на [`a - b`] и [`b`] и когато [`a = b`], тогава НОД на [`a`] и [`b`] е тяхната стойност. +Най-големия общ делител на числата {` a} и {` b} е най-голямото, число което ги дели без остатък. +Евклидовият алгоритъм се базира на факта, че за две положителни числа {` a} и {` b}, като {` a > b}, НОД на {` a} и {` b} е същия като НОД на {` a - b} и {` b} и когато {` a = b}, тогава НОД на {` a} и {` b} е тяхната стойност. -От входа получавате две цели положителни числа и трябва да изкарате техния НОД, чрез алгоритъма на Евклид [=имплементиран с рекурсия=]. +От входа получавате две цели положителни числа и трябва да изкарате техния НОД, чрез алгоритъма на Евклид {b имплементиран с рекурсия}. -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход @@ -26,13 +30,15 @@ GitHub classroom: [url https://classroom.github.com/a/EJcTQRz4 classroom.github. |: 6 + ## Задача 2 -От входа получавате неотрицателно число [`N`], което ще бъде някое число на Фибоначи. +От входа получавате неотрицателно число {` N}, което ще бъде някое число на Фибоначи. Трябва да върнете кое по ред е, като 0 е нулевото, 1 е първото, 2 е третото, 3 е четвъртото и так. нат. Напомням, че математически фибоначи се дефинира така: .comment +'emplace \begin{align*} F_n = \left\{ \begin{array}{ll} 0, & n=0 \\ @@ -40,12 +46,14 @@ F_n = \left\{ \begin{array}{ll} F_{n-1} + F_{n-2} & \text{иначе} \\ \end{array} \right. \end{align*} +'endemplace -[image ./img/fib.png F(0) = 0; F(1) = 1; F(n) = F(n-1) + F(n-2)] +{img F(0) = 0\; F(1) = 1\; F(n) = F(n-1) + F(n-2);./img/fib.png} -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход @@ -68,43 +76,52 @@ F_{n-1} + F_{n-2} & \text{иначе} \\ |: 24 + ## Задача 3 -От входа получавате положително число [`N`], трябва да изкарате на екрана "рисунка", показваща формата на пясъчен часовник с височина [`2N`] (вижте примерите). +От входа получавате положително число {` N}, трябва да изкарате на екрана "рисунка", показваща формата на пясъчен часовник с височина {` 2N} (вижте примерите). -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход |: 1 |: ``` +'emplace + # +'endemplace |: 2 |: ``` +'emplace +++ + # ### +'endemplace |: 3 |: ``` +'emplace +++++ +++ + # ### ##### +'endemplace |: 5 |: ``` +'emplace +++++++++ +++++++ +++++ @@ -115,16 +132,19 @@ F_{n-1} + F_{n-2} & \text{иначе} \\ ##### ####### ######### +'endemplace + ## Задача 4 -От входа получавате число [`N`], след това тябва да изкарате на нови редове, в нарастващ ред, всички двоични числа, които могат да се представят с [`N`]-бита. -Вкарвате и водещи нули, тоест всяко число е съставено от точно [`N`] букви ([`N`] нули и единици). +От входа получавате число {` N}, след това тябва да изкарате на нови редове, в нарастващ ред, всички двоични числа, които могат да се представят с {` N}-бита. +Вкарвате и водещи нули, тоест всяко число е съставено от точно {` N} букви ({` N} нули и единици). -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход @@ -159,26 +179,28 @@ F_{n-1} + F_{n-2} & \text{иначе} \\ ``` 0000 0001 -[*...*] +{i ...} 0111 1000 1001 -[*...*] +{i ...} 1101 1110 1111 + ## Задача 5 -Получавате един ред от терминала, в който ще имате скоби, знакът [`+`] и [`*`], шпации и числа. -Това е прост математически израз, трябва да изкарате резултата след неговото пресмятане, като винаги около [`число + число`] и [`число * число`] има скоби (тоест не е нужно да се притеснявате от приоритет и асоциативност). +Получавате един ред от терминала, в който ще имате скоби, знакът {` +} и {` *}, шпации и числа. +Това е прост математически израз, трябва да изкарате резултата след неговото пресмятане, като винаги около {` число + число} и {` число * число} има скоби (тоест не е нужно да се притеснявате от приоритет и асоциативност). -За удобство спокойно може да ползвате [`atoi`] за конверитране на числовите части от низа в числа. +За удобство спокойно може да ползвате {` atoi} за конверитране на числовите части от низа в числа. -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход diff --git a/src/teaching/upp-2023/week11/index.du b/src/teaching/upp-2023/week11/index.du index b0f5be1..3750b01 100644 --- a/src/teaching/upp-2023/week11/index.du +++ b/src/teaching/upp-2023/week11/index.du @@ -1,30 +1,34 @@ -# Задачи - УПП, Седмица 11, 22.12.2023 +'def title Задачи - УПП, Седмица 11, 22.12.2023 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/cZRnZj9y classroom.github.com/a/cZRnZj9y] +GitHub classroom: {url classroom.github.com/a/cZRnZj9y;https://classroom.github.com/a/cZRnZj9y} -.important Във всички задачи [=трябва=] да използвате рекурсия! +.important Във всички задачи {b трябва} да използвате рекурсия! .warn Някои задачи се повтарят с тези от миналия път, ако преди не сте ги решили, сега ги решете ## Алтернативни задачи -Считайте [url https://github.com/ivanahristova/introduction-to-programming-2023-2024/tree/main/sem11#%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8 задачите от семинара] като задачи преди тези. +Считайте {url задачите от семинара;https://github.com/ivanahristova/introduction-to-programming-2023-2024/tree/main/sem11#%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8} като задачи преди тези. Тоест, за хората които се затрудняват повечко, решете семинарните и след това се върнете тук. Разбира се, ще помагам и със семинарните задачи. ## Задача 1 -От входа получавате неотрицателно число [`N`], което ще бъде някое число на Фибоначи. +От входа получавате неотрицателно число {` N}, което ще бъде някое число на Фибоначи. Трябва да върнете кое по ред е, като 0 е нулевото, 1 е първото, 2 е третото, 3 е четвъртото и так. нат. Напомням, че нормално Фибоначи се дефинира като редица, която започва с числата 0 и 1, и всяко следващо е сумата на предходните две. -Тоест, нулевото число е 0, първото 1, второто е [`0 + 1 = 1`] (понеже 1 се повтаря, зачитаме го за първото число), третото е [`1 + 1 = 2`], четвъртото е [`1 + 2 = 3`] и так. нат. +Тоест, нулевото число е 0, първото 1, второто е {` 0 + 1 = 1} (понеже 1 се повтаря, зачитаме го за първото число), третото е {` 1 + 1 = 2}, четвъртото е {` 1 + 2 = 3} и так. нат. -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход @@ -47,17 +51,19 @@ GitHub classroom: [url https://classroom.github.com/a/cZRnZj9y classroom.github. |: 24 + ## Задача 2 -От входа получавате положително число [`N`], трябва да изкарате на екрана "рисунка" на триъгълници. +От входа получавате положително число {` N}, трябва да изкарате на екрана "рисунка" на триъгълници. ### a) горен триъгълник -Рисунката е един правоъгълен равнобедрен триъгълник от знака [`+`], като [`N`] определя размера на равнобедрените страни (вижте примерите). +Рисунката е един правоъгълен равнобедрен триъгълник от знака {` +}, като {` N} определя размера на равнобедрените страни (вижте примерите). -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход @@ -87,82 +93,101 @@ GitHub classroom: [url https://classroom.github.com/a/cZRnZj9y classroom.github. +++++ + ### б) долен триъгълник -Подобно на предходната подточка, обаче обърнат по хоризонтала, и със знака [`#`]. +Подобно на предходната подточка, обаче обърнат по хоризонтала, и със знака {` #}. -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход |: 1 |: ``` +'emplace # +'endemplace |: 2 |: ``` +'emplace ## # +'endemplace |: 3 |: ``` +'emplace ### ## # +'endemplace |: 5 |: ``` +'emplace ##### #### ### ## # +'endemplace + ### в) пълен триъгълник -[=Използвайки само една рекурсивна функция,=] сега трябва да изкарате първо горния триъгълник и след това долния. +{b Използвайки само една рекурсивна функция,} сега трябва да изкарате първо горния триъгълник и след това долния. Ако просто извикате предходните две функции една след друга, задачата се обезсмисля. -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход |: 1 |: ``` +'emplace + # +'endemplace |: 2 |: ``` +'emplace + ++ ## # +'endemplace |: 3 |: ``` +'emplace + ++ +++ ### ## # +'endemplace |: 5 |: ``` +'emplace + ++ +++ @@ -173,11 +198,13 @@ GitHub classroom: [url https://classroom.github.com/a/cZRnZj9y classroom.github. ### ## # +'endemplace + ## Задача 3 -Направете програма която разрешава проблема с [url https://en.wikipedia.org/wiki/Ages_of_Three_Children_puzzle възрастта на трите деца]. +Направете програма която разрешава проблема с {url възрастта на трите деца;https://en.wikipedia.org/wiki/Ages_of_Three_Children_puzzle}. Една жена има три деца за които знаем три неща: умножението на техните възрасти, сбора на техните възрасти и факта, че има едно дете, което е най-голямо. Трябва да намерите възрастта на всяко дете, само по тази информация. @@ -185,11 +212,12 @@ GitHub classroom: [url https://classroom.github.com/a/cZRnZj9y classroom.github. Разбира се, от входа получавате две числа, съответно умножението и сбора на възрастите им. Трябва на екрана да изкарате три числа - възрастите на трите деца. -[=Подсказка:=] най-лесното решение е да пробвате всички възможни възрасти, като избягвате техни пермутации +{b Подсказка:} най-лесното решение е да пробвате всички възможни възрасти, като избягвате техни пермутации -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход @@ -203,14 +231,16 @@ GitHub classroom: [url https://classroom.github.com/a/cZRnZj9y classroom.github. |: 2 5 35 + ## Задача 4 -От входа получавате число [`N`], след това трябва да изкарате на нови редове, в нарастващ ред, всички двоични числа, които могат да се представят с [`N`]-бита. -Вкарвате и водещи нули, тоест всяко число е съставено от точно [`N`] букви ([`N`] нули и единици). +От входа получавате число {` N}, след това трябва да изкарате на нови редове, в нарастващ ред, всички двоични числа, които могат да се представят с {` N}-бита. +Вкарвате и водещи нули, тоест всяко число е съставено от точно {` N} букви ({` N} нули и единици). -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход @@ -245,28 +275,30 @@ GitHub classroom: [url https://classroom.github.com/a/cZRnZj9y classroom.github. ``` 0000 0001 -[*...*] +{i ...} 0111 1000 1001 -[*...*] +{i ...} 1101 1110 1111 + ## Задача 5 -Направете програма която разрешава [url https://en.wikipedia.org/wiki/Takuzu Такузо пъзели]. +Направете програма която разрешава {url Такузо пъзели;https://en.wikipedia.org/wiki/Takuzu}. Започвате с дъска 4х4, в тази дъска може да имате само цифрите 0 и 1, като няколко клетки вече идват с попълнени стойности (но повечето са празни). Обаче, на всяка колона и ред трябва да има еднакъв брой 0ли и 1ци, и не трябва да има повече от две последователни еднакви цифри (в реда или колоната). От входа получавате дъската, като с -1 обозначаваме празна клетка. -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход diff --git a/src/teaching/upp-2023/week12/index.du b/src/teaching/upp-2023/week12/index.du index 3fa25ff..ed4dc89 100644 --- a/src/teaching/upp-2023/week12/index.du +++ b/src/teaching/upp-2023/week12/index.du @@ -1,14 +1,17 @@ -# Задачи - УПП, Седмица 12, 05.01.2024 +'def title Задачи - УПП, Седмица 12, 05.01.2024 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/KEDSxDjl classroom.github.com/a/KEDSxDjl] +GitHub classroom: {url classroom.github.com/a/KEDSxDjl;https://classroom.github.com/a/KEDSxDjl} -.important Във всички задачи [=трябва=] да използвате рекурсия! +.important Във всички задачи {b трябва} да използвате рекурсия! ## Алтернативни задачи -Считайте [url https://github.com/ivanahristova/introduction-to-programming-2023-2024/tree/main/sem12 задачите от семинара] и [url ../week11/ тези от миналия път] като част от днешните задачи. +Считайте {url задачите от семинара;https://github.com/ivanahristova/introduction-to-programming-2023-2024/tree/main/sem12} и {url тези от миналия път;../week11/} като част от днешните задачи. Тоест, за хората които се затрудняват повечко, решете ги и след това се върнете тук. Разбира се, ще помагам и с тях. @@ -21,9 +24,10 @@ GitHub classroom: [url https://classroom.github.com/a/KEDSxDjl classroom.github. Накрая получавате максималната обща тежест за раницата. Трябва да изкарате на екрана максималната възможна обща ценност. -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход @@ -62,11 +66,12 @@ GitHub classroom: [url https://classroom.github.com/a/KEDSxDjl classroom.github. .comment https://people.sc.fsu.edu/~jburkardt/datasets/knapsack_01/knapsack_01.html + ## Задача 2 Получавате N и M, съответно броя редове и колони в дъска. Всяка клетка от дъската е пълна или празна. -След това получавате NxM на брой символа за всяка клетка, като [`-`] означава празна клетка, докато [`#`] означава пълна. +След това получавате NxM на брой символа за всяка клетка, като {` -} означава празна клетка, докато {` #} означава пълна. Накрая получавате две числа - координати (започващи от нула, като 0,0 е горния-ляв ъгъл) в дъската. От подадените координати трябва да запълните "фигурата" в която се намира (фигурата която огражда) дадената плочка. @@ -74,11 +79,12 @@ GitHub classroom: [url https://classroom.github.com/a/KEDSxDjl classroom.github. Оцветяването да се случва само в 4те прави посоки (без диагонали). -[image https://upload.wikimedia.org/wikipedia/commons/7/7e/Recursive_Flood_Fill_4_%28aka%29.gif] +{img https://upload.wikimedia.org/wikipedia/commons/7/7e/Recursive_Flood_Fill_4_%28aka%29.gif} -[=Пример:=] +{b Пример:} -:table_2 +:table +:2 |= Вход |= Изход @@ -101,6 +107,7 @@ GitHub classroom: [url https://classroom.github.com/a/KEDSxDjl classroom.github. - - # # - - - - - - - + ## Задача 3 Имате шахматна дъска (8 на 8) и върху нея имате 8 царици. @@ -109,14 +116,15 @@ GitHub classroom: [url https://classroom.github.com/a/KEDSxDjl classroom.github. Интересуваме се от такова поставяне на всички царици, че нито една няма да вземе никоя друга царица в един ход. Пример: -[image https://upload.wikimedia.org/wikipedia/commons/6/69/Solution_A_for_8_Queen_Puzzles.png] +{img https://upload.wikimedia.org/wikipedia/commons/6/69/Solution_A_for_8_Queen_Puzzles.png} Напишете програма, която намира броя на възможните такива поставяния на цариците. От входа не получавате нищо. -[=Пример:=] +{b Пример:} -:table_2 +:table +:2 |= Вход |= Изход @@ -124,45 +132,47 @@ GitHub classroom: [url https://classroom.github.com/a/KEDSxDjl classroom.github. |: 92 -[=Бонус:=] направете програмата да изкарва всяко решение + +{b Бонус:} направете програмата да изкарва всяко решение ## Задача 4 .comment https://mathcenter.oxford.emory.edu/site/cs171/probSetUsingStacks/ -Нормално ние представяме математически операции чрез "инфиксен" запис, тоест операторът е по средата, между нещата върху които работи (пример: [`1 + 2`]). -Обаче, това не е задължително, по обратната полска нотация винаги слагаме оператът след нещата върху които работи (пример: [`1 2 +`]). +Нормално ние представяме математически операции чрез "инфиксен" запис, тоест операторът е по средата, между нещата върху които работи (пример: {` 1 + 2}). +Обаче, това не е задължително, по обратната полска нотация винаги слагаме оператът след нещата върху които работи (пример: {` 1 2 +}). Бонусът на това, е че не ни трябва скобуване и ред на операциите. -В инфиксния израз [`(2 + 3) * (2 ^^ 2)`], без скобите, сбора ще се извърши след умножението и степенуването ще се извърши след умножението. -Обаче, ако искаме да изразим това в обратен полски запис, просто правим [`2 3 + 2 2 ^^ *`]. -А ако искаме оригиналното действие, без скоби, записваме [`2 3 2 * 2 ^^ +`]. +В инфиксния израз {` (2 + 3) * (2 ^^ 2)}, без скобите, сбора ще се извърши след умножението и степенуването ще се извърши след умножението. +Обаче, ако искаме да изразим това в обратен полски запис, просто правим {` 2 3 + 2 2 ^^ *}. +А ако искаме оригиналното действие, без скоби, записваме {` 2 3 2 * 2 ^^ +}. Ако изглежда объркващо, идеята е че всеки оператор работи върху предходните две стойности, изчисляваме изразите от ляво надясно и заместваме веднага. -Тоест, при последния пример, пропускаме първите три числа, стигаме до [`*`], умножаваме последните две и заместваме трите неща ([`3 2 *`]) с резултата, следователно имаме [`2 6 2 ^^ +`], пропускаме две, стигаме до [`^^`] и так.нат. +Тоест, при последния пример, пропускаме първите три числа, стигаме до {` *}, умножаваме последните две и заместваме трите неща ({` 3 2 *}) с резултата, следователно имаме {` 2 6 2 ^^ +}, пропускаме две, стигаме до {` ^^} и так.нат. -Направете програма, която чисто рекурсивно изчислиява изрази в обратен полски запис, който поддържа цели числа и операциите събиране, умножение, деление, изваждане и степенуване (за степенуване ще използваме знакът [`^`]). +Направете програма, която чисто рекурсивно изчислиява изрази в обратен полски запис, който поддържа цели числа и операциите събиране, умножение, деление, изваждане и степенуване (за степенуване ще използваме знакът {` ^}). .important Обаче, за едно извикване на рекурсивната функция, може да пазите само един елемент на израза (число или оператор)! -Изразът винаги завършва на знака [`$`]. +Изразът винаги завършва на знака {` $}. :warn .p -Относно вход/изход, понеже няма как да знаем дали i-тата стойност е число или знак (операция), трябва да използваме функцията [`std::cin.fail()`], която връща булева стойност, която ни казва дали записването на входа е било успешно. +Относно вход/изход, понеже няма как да знаем дали i-тата стойност е число или знак (операция), трябва да използваме функцията {` std::cin.fail()}, която връща булева стойност, която ни казва дали записването на входа е било успешно. .p -Тоест, може винаги да запазвате входа в целочислен тип, когато стигнете до знак [`std::cin.fail()`] ще върне [`true`]. -След това трябва да "забравите" за грешката чрез [`std::cin.clear()`] и може втори път да запазите входа (провалените данни ще се препрочетат) в променлива от знаков тип. +Тоест, може винаги да запазвате входа в целочислен тип, когато стигнете до знак {` std::cin.fail()} ще върне {` true}. +След това трябва да "забравите" за грешката чрез {` std::cin.clear()} и може втори път да запазите входа (провалените данни ще се препрочетат) в променлива от знаков тип. .p -Но това поражда друг проблем, понеже записваме в целочислен тип, когато въведем [`+`] или [`-`], [`std::cin`] ще очаква това да е водещ знак на число, и ще продължи да чака входа докато не въведем друг знак, тоест [`+`] и [`-`] ще бъдат пропуснати. -Като компромисен вариант, просто пред тях винаги ще слагаме [`'`] и в кода ще го пропускаме. +Но това поражда друг проблем, понеже записваме в целочислен тип, когато въведем {` +} или {` -}, {` std::cin} ще очаква това да е водещ знак на число, и ще продължи да чака входа докато не въведем друг знак, тоест {` +} и {` -} ще бъдат пропуснати. +Като компромисен вариант, просто пред тях винаги ще слагаме {` '} и в кода ще го пропускаме. -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход @@ -173,8 +183,9 @@ GitHub classroom: [url https://classroom.github.com/a/KEDSxDjl classroom.github. |: 35 + ## Attribution .bulleted -- Анимация в [url #2 Задача 2] от André Karwath (Aka) на [url https://commons.wikimedia.org/w/index.php?curid=481651 Уикипедия] под лиценз CC BY-SA 2.5 -- Изображение на шахматна дъска в [url #3 Задача 3] от Encik Tekateki в [url https://commons.wikimedia.org/w/index.php?curid=77832290 Уикипедия] под лиценз CC BY-SA 4.0 +- Анимация в {url Задача 2;#2} от André Karwath (Aka) на {url Уикипедия;https://commons.wikimedia.org/w/index.php?curid=481651} под лиценз CC BY-SA 2.5 +- Изображение на шахматна дъска в {url Задача 3;#3} от Encik Tekateki в {url Уикипедия;https://commons.wikimedia.org/w/index.php?curid=77832290} под лиценз CC BY-SA 4.0 diff --git a/src/teaching/upp-2023/week13/index.du b/src/teaching/upp-2023/week13/index.du index c12c546..8c077db 100644 --- a/src/teaching/upp-2023/week13/index.du +++ b/src/teaching/upp-2023/week13/index.du @@ -1,12 +1,15 @@ -# Задачи - УПП, Седмица 13, 12.01.2024 +'def title Задачи - УПП, Седмица 13, 12.01.2024 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/bgiFD6SB classroom.github.com/a/bgiFD6SB] +GitHub classroom: {url classroom.github.com/a/bgiFD6SB;https://classroom.github.com/a/bgiFD6SB} ## Алтернативни задачи -Считайте [url https://github.com/ivanahristova/introduction-to-programming-2023-2024/tree/main/sem13 задачите от семинара] и [url ../week12/ тези от миналия път] като част от днешните задачи. +Считайте {url задачите от семинара;https://github.com/ivanahristova/introduction-to-programming-2023-2024/tree/main/sem13} и {url тези от миналия път;../week12/} като част от днешните задачи. Тоест, за хората които се затрудняват повечко, решете ги и след това се върнете тук. Разбира се, ще помагам и с тях. @@ -20,9 +23,10 @@ GitHub classroom: [url https://classroom.github.com/a/bgiFD6SB classroom.github. Всяка дума е на нов ред и е съставена от малки латински букви. Ако има няколко думи с еднаква "близкост", изкарайте последната от тях. -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход @@ -50,6 +54,7 @@ mask |: task + ## 2 задача В началото получавате неотрицателно цяло число N. @@ -59,14 +64,15 @@ mask Редовете са разбъркани, изкарайте първо име и фамилия на хората с най-много продадени продукти. Ако има няколко хора, които са продали най-много продукти, изкарайте имената им в азбучен ред, първо по фамилия, после по име. -Използвайте [=само една функция за сортиране!=] +Използвайте {b само една функция за сортиране!} Като подсказка, използвайте указатели към функции за да променяте как тя работи. .question Какво свойство трябва да е изпълнено за сортиращата функция? -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход @@ -86,6 +92,7 @@ Joseph Carmichael Antony Garcia + ## 3 задача Ще дефинираме обвито изречение, като редица от букви, за които са изпълнени следните правила: @@ -121,9 +128,10 @@ A . Изкарайте на конзолата всички обвити изречения в матрицата (редът им няма значение). -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход @@ -196,9 +204,10 @@ jumper Big jumper. + ## 4 задача -В префиксния (или полския) запис слагаме оператора за смятане пред (в ляво от) елементите върху които работи (нормален запис - [`1 + 2`], полски запис - [`+ 1 2`]). +В префиксния (или полския) запис слагаме оператора за смятане пред (в ляво от) елементите върху които работи (нормален запис - {` 1 + 2}, полски запис - {` + 1 2}). Ще разглеждаме "многоредови" изрази в полски запис, тоест изрази в които има няколко реда от целочислени стойности, така че трябва да се изчислят няколко израза с еднаква "форма", но различни стойности. Един такъв израз изглежда така: @@ -209,7 +218,7 @@ Big jumper. 5 6 . Точката на края на последния ред задава край на израза. -В този пример ще изчислим [`1 + 2`], [`3 + 4`] и [`5 + 6`], тоест ще "върне" три стойности: 3, 7 и 11. +В този пример ще изчислим {` 1 + 2}, {` 3 + 4} и {` 5 + 6}, тоест ще "върне" три стойности: 3, 7 и 11. Всяка колона в израза е от един и същи "тип", тоест в една колона винаги ще има числова стойност или някакъв знак. С изключение на точката, всеки знак може да се постави на произволен ред (обаче в една колона не може да има повече от един знак). @@ -220,10 +229,10 @@ Big jumper. + 3 4 7 7 5 6 * 8 9 . -Това ще изчисли [`1 + (2 - 2 * 63)`], [`3 + (4 - 7* 7)`] и [`5 + (6 - 8 * 9)`]. +Това ще изчисли {` 1 + (2 - 2 * 63)}, {` 3 + (4 - 7* 7)} и {` 5 + (6 - 8 * 9)}. Израза би направил същото нещо ако примерно всички знаци бяха на първия ред или на последния. -От входа получавате няколко такива израза, докато не получите знака [`$`]. +От входа получавате няколко такива израза, докато не получите знака {` $}. Може да достъпвате стойност от предходни изрази чрез синтаксиса "ИНДЕКС.ИНДЕКС", където индексите са от 0, първия определя номера на израза, докато втория определя коя стойност искаме. Примерно: @@ -238,11 +247,12 @@ Big jumper. Накрая трябва да изкарате всички стойности от последния израз. -.warn Погледнете пояснението за вход/изход от [url ../week12/#4 последната задача от миналия път]. +.warn Погледнете пояснението за вход/изход от {url последната задача от миналия път;../week12/#4}. -[=Пример:=] +{b Пример:} -:table_2 +:table +:2 |= Вход |= Изход diff --git a/src/teaching/upp-2023/week14/index.du b/src/teaching/upp-2023/week14/index.du index a0f9906..d06e169 100644 --- a/src/teaching/upp-2023/week14/index.du +++ b/src/teaching/upp-2023/week14/index.du @@ -1,11 +1,14 @@ -# Задачи - УПП, Седмица 14, 19.01.2024 +'def title Задачи - УПП, Седмица 14, 19.01.2024 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/B08TtnnW classroom.github.com/a/B08TtnnW] +GitHub classroom: {url classroom.github.com/a/B08TtnnW;https://classroom.github.com/a/B08TtnnW} Това е последния практикум, затова ви давам по-лесни и приятни задачи: имплементации на игри! -Всичките са взети от [url https://en.wikipedia.org/wiki/BASIC_Computer_Games 101 BASIC Computer Games] (книгата е налична в [url https://archive.org/details/bitsavers_decBooks10Mar75_26006648 archive.org]). +Всичките са взети от {url 101 BASIC Computer Games;https://en.wikipedia.org/wiki/BASIC_Computer_Games} (книгата е налична в {url archive.org;https://archive.org/details/bitsavers_decBooks10Mar75_26006648}). Разбира се, който иска, може да решава задачи от предходни практикуми, давал съм достатъчно задачи. @@ -20,7 +23,8 @@ GitHub classroom: [url https://classroom.github.com/a/B08TtnnW classroom.github. Компютъра автоматично (и случайно) генерира между 5 и 20 купчини с между 1 и 10 пръчки. Разбира се, трябва компютъра да съобщи за конкретните стойности: -```terminal +'def LANG terminal +``` X piles Y sticks in pile 1 Z sticks in pile 2 @@ -29,29 +33,34 @@ K sticks in pile X След това се редуват, първия играч, втория играч: -```terminal +'def LANG terminal +``` Player 1 turn Избирате купчина с пръчки: -```terminal +'def LANG terminal +``` Which pile do you want sticks from? _ където _ е мястото на курсора. След това броя пръчки от купчината: -```terminal +'def LANG terminal +``` How many sticks? _ Ако някоя стойност е невалидна, питате пак. След това идва редът на втория играч: -```terminal +'def LANG terminal +``` Player 2 turn Накрая, този който вземе последната пръчка печели играта и се пита дали искате наново да почнете играта: -```terminal +'def LANG terminal +``` Player X won. Do you want to play again? _ ## 2 задача - Хамураби @@ -64,7 +73,8 @@ Player X won. Do you want to play again? _ В началото вашия съветник казва: -```terminal +'def LANG terminal +``` Hamurabi, I beg to report to you In year X, Y people starved, Z came to the city. @@ -74,12 +84,14 @@ In year X, Y people starved, Z came to the city. След това имате 1/7 шанс чума да сполети вашия град. Ако се случи, съветника ви съобщава за това и загубвате половината си население: -```terminal +'def LANG terminal +``` A horrible plague struck! Half of the people died. След това съветника ви дава информация за града: -```terminal +'def LANG terminal +``` Population is now X. The city now owns X acres. You harvested Z bushels per acre. @@ -92,7 +104,8 @@ You now have L bushels in store. Иначе, сега съветника започва да ви дава информация и да ви пита за вашето действие: -```terminal +'def LANG terminal +``` Land is trading at X bushels per acre. How many acres do you wish to buy? _ @@ -100,7 +113,8 @@ How many acres do you wish to buy? _ Трябва да се въведе цяло число. В този случай, както и всеки други, ако то е отрицателно, съветника напуска и играта свършва: -```terminal +'def LANG terminal +``` Hamurabi, I cannot do what you wish, get yourself another steward!!!!! So long for now. @@ -108,44 +122,51 @@ So long for now. Ако нямате достатъчно бушели в резерв, за да купите всичката въведена земя, съветника ви казва: -```terminal +'def LANG terminal +``` Hamurabi, think again, you have only X bushels of grian. Now then, и същото съобщение за "Land is trading at [...] How many acres ..." се изписва и приемате нов вход. Ако сте въвели 0, значи искате да продавате земя и съветника ви пита: -```terminal +'def LANG terminal +``` How many acres do you wish to sell? _ Ако се въведе отрицателно число, случва се същото като при купуване на земя. Ако въведете повече земя, отколкото имате, съветника казва: -```terminal +'def LANG terminal +``` Hamurabi think again, you own only X acres. Now then, и пак пита "How many acres [...]". След като сте купили или продали земя, сега съветника ви пита колко бушели жито ще отделите за нахранване на населението: -```terminal +'def LANG terminal +``` How many bushels do you wish to feed your people? _ Ако се въведе твърде голямо число, съветника предупреждава и пита пак: -```terminal +'def LANG terminal +``` Hamurabi, think again, you have only X bushels of grain. Now then, How many bushels do you wish to feed your people? _ Остава последния въпрос от съветника за годината: -```terminal +'def LANG terminal +``` How many acres do you wish to plant with seed? _ Разбира се, ако се въведат повече акри отколкото има, съветника предупреждава и пита пак: -```terminal +'def LANG terminal +``` Hamurabi, think again, you own only X acres. Now then, How many acres do you wish to plant with seed? _ @@ -154,7 +175,8 @@ How many acres do you wish to plant with seed? _ Един бушел жито може да засее два акъра земя, ако няма достатъчно жито, съветника предупреждава и пита пак. Отнема 10 човека да се грижат за един акър земя, ако няма достатъчно хора, съветника предупреждава и пита пак: -```terminal +'def LANG terminal +``` But you have only X people to tend the fields. Now then, Това са въпросите на съветника, сега остава годината да се изиграе. @@ -163,13 +185,14 @@ But you have only X people to tend the fields. Now then, След това избирате друго произволно число между 1 и 6. Ако числото е по-голямо от 1, тогава плъховете ще изядат по толкова голяма дроб бушели жито от резерва (при числото 5, плъховете изяждат 1/5; тук бушелите жито се смятат преди жътва). -Сега населението расте, броя хора които са "дошли" в града се определя по формулата [`R * (20* АКРИ ЗЕМЯ + БУШЕЛИ ЖИТО) / БРОЙ ХОРА / 100 + 1`], където R е цяло число между 1 и 6. +Сега населението расте, броя хора които са "дошли" в града се определя по формулата {` R * (20* АКРИ ЗЕМЯ + БУШЕЛИ ЖИТО) / БРОЙ ХОРА / 100 + 1}, където R е цяло число между 1 и 6. Бушелите жито се смятат след жътва. Предпоследно, определя се колко хора са умрели от глад, като всеки човек консумира 20 бушели жито. Ако над 45% от населението са умрели от глад, останалите хора ви свалят от власт и играта свършва: -```terminal +'def LANG terminal +``` You starved X people in one year, due to this extreme mismanagement, you have not only been impeached and thrown out of office but you have also been declared national fink! @@ -179,27 +202,31 @@ So long for now. Ако успешно царувате 10 години, накрая съветника ви казва как сте се справили: -```terminal +'def LANG terminal +``` In your 10-year term of office, X percent of the population starved per year on average, I.E., a total of Y people died. Сега изчислявате пропорцията между земя и хора, съветника ви казва: -```terminal +'def LANG terminal +``` You started with 10 acres per person and ended with X acres per person. Ако средно над 33% от населението е умирало от глад всяка година или съотношението ви е под 7 акъра на човек, тогава се случва същото нещо, като когато над 45% от населението умира от глад. Ако средно над 10% (но под 34%) от населението е умирало от глад всяка година или съотношението ви е под 9 акъра на човек (но над 6), тогава оставате в историята като лош владетел: -```terminal +'def LANG terminal +``` Your heavy-handed performance smacks of Nero and Ivan IV. The people (remaining) find you an unpleasant ruler, and frankly, hate your guts. So long for now. Ако средно над 3% (но под 11%) от населението е умирало от глад всяка година или съотношението е между 9 и 10 акъра на човека, тогава оставате със средно впечатление: -```terminal +'def LANG terminal +``` Your performance could have been somewhat better but really wasn't too bad at all. X people would dearly like to see you assassinated but we all have our trivial problems. So long for now. @@ -208,7 +235,8 @@ So long for now. В противен случай, тоест средно под 4% от населението е умирало от глад всяка година или съотношението е над 10 акъра на човека, тогава хората ви харесват: -```terminal +'def LANG terminal +``` A fantastic performance!!! Charlemange, Disraeli and Jefferson combined could not have done better. So long for now. diff --git a/src/teaching/upp-2023/week2/index.du b/src/teaching/upp-2023/week2/index.du index 645f1c6..9ea5a69 100644 --- a/src/teaching/upp-2023/week2/index.du +++ b/src/teaching/upp-2023/week2/index.du @@ -1,18 +1,21 @@ -# Задачи - УПП, Седмица 2, 13.10.2023 +'def title Задачи - УПП, Седмица 2, 13.10.2023 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/Bi5dhwW7 classroom.github.com/a/Bi5dhwW7] +GitHub classroom: {url classroom.github.com/a/Bi5dhwW7;https://classroom.github.com/a/Bi5dhwW7} -Решения: [url https://github.com/Syndamia/upp-2023-solutions/tree/main/week02 GitHub] +Решения: {url GitHub;https://github.com/Syndamia/upp-2023-solutions/tree/main/week02} -## [=Важни бележки=] +## {b Важни бележки} .numbered -1. Не е добре да ползвате [`using namespace std;`] -2. Единствената библиотека, която (поне за сега) може да ползвате е [`iostream`] -3. За хората с текстови редактори и [`gcc`], моля да погледнете в Moodle и да използвате предоставените флагове, най-важния от които е [`-std=c++17`] -3. Като си качвате решенията в GitHub classroom, за предпочитане е имената на файловете да свършват на [`.cpp`]. +1. Не е добре да ползвате {` using namespace std;} +2. Единствената библиотека, която (поне за сега) може да ползвате е {` iostream} +3. За хората с текстови редактори и {` gcc}, моля да погледнете в Moodle и да използвате предоставените флагове, най-важния от които е {` -std=c++17} +3. Като си качвате решенията в GitHub classroom, за предпочитане е имената на файловете да свършват на {` .cpp}. Отново, не е задължително, но ми улеснява живота. ## Тема: конвертиране @@ -21,25 +24,26 @@ GitHub classroom: [url https://classroom.github.com/a/Bi5dhwW7 classroom.github. ### Задача 1 - Конвертирания от int -Получавате целочислено число (тип [`int`]), след това, за всеки тип от следния списък, трябва да изкарате на нов ред текст във формата "Със/без загуба тип стойност": +Получавате целочислено число (тип {` int}), след това, за всеки тип от следния списък, трябва да изкарате на нов ред текст във формата "Със/без загуба тип стойност": .bulleted -- [`bool`] -- [`long long int`] -- [`unsigned int`] -- [`char`] -- [`short int`] -- [`double`] -- [`long int`] -- [`unsigned char`] +- {` bool} +- {` long long int} +- {` unsigned int} +- {` char} +- {` short int} +- {` double} +- {` long int} +- {` unsigned char} Целта е да напишете един низ, който съдържа "Със/без загуба тип", и след това да изкарате (конвертираната) стойност. Не се иска да правите код, който намира тази информация автоматично, всичко това просто си го напишете ръчно (hardcoded). -[=Пример=] -  [*Нарочно са показани само първите два реда от изхода*] +{b Пример} +  {i Нарочно са показани само първите два реда от изхода} -:table_2 +:table +:2 |= Вход |= Изход @@ -47,6 +51,7 @@ GitHub classroom: [url https://classroom.github.com/a/Bi5dhwW7 classroom.github. |: Със загуба bool 1\nБез загуба long long int 5\n... + ## Тема: Побитови оператори \n @@ -55,9 +60,10 @@ GitHub classroom: [url https://classroom.github.com/a/Bi5dhwW7 classroom.github. Получавате положително цяло число, от него трябва да "запазите" само първите (най-десните) 6 бита и да изкарате получилото се число. -[=Примери=] +{b Примери} -:table_2 +:table +:2 |= Вход |= Изход @@ -68,15 +74,17 @@ GitHub classroom: [url https://classroom.github.com/a/Bi5dhwW7 classroom.github. |: 8 + ### Задача 3 - Деление и умножение -Получавате положително цяло число [`а`], трябва да изкарате две числа (разделени с празно пространство):\n -[`a`] (целочислено) разделено на 16 и [`а`] умножено по 8. -[=Трябва да използвате побитови оператори за това!=] +Получавате положително цяло число {` а}, трябва да изкарате две числа (разделени с празно пространство):\n +{` a} (целочислено) разделено на 16 и {` а} умножено по 8. +{b Трябва да използвате побитови оператори за това!} -[=Пример=] +{b Пример} -:table_2 +:table +:2 |= Вход |= Изход @@ -84,6 +92,7 @@ GitHub classroom: [url https://classroom.github.com/a/Bi5dhwW7 classroom.github. |: 4 584 + ### Задача 4 - IP адрес Разграничаваме устройствата, свързани към интернет, по техния IP адрес. @@ -105,13 +114,14 @@ GitHub classroom: [url https://classroom.github.com/a/Bi5dhwW7 classroom.github. ``` 128 128 128 128 -И накрая изкарания резултат трябва да бъде [`128.128.128.128`] +И накрая изкарания резултат трябва да бъде {` 128.128.128.128} На входа получавате цяло положително число, трябва да изкарате на екрана как би изглеждало с това представяне, с точките между осморки битове. -[=Примери=] +{b Примери} -:table_2 +:table +:2 |= Вход |= Изход @@ -125,20 +135,22 @@ GitHub classroom: [url https://classroom.github.com/a/Bi5dhwW7 classroom.github. |: 56.135.131.240 + ## Тема: Логически оператори \n ### Задача 5 - Дели ли се -От входа получавате две числа: [`а`] и [`n`]. -Трябва да върнете 0 ако [`a`] не се дели на [`n`] без остатък, и 1 иначе. +От входа получавате две числа: {` а} и {` n}. +Трябва да върнете 0 ако {` a} не се дели на {` n} без остатък, и 1 иначе. -[=Упътване:=] Булевата стойност [`false`] се изкарва като 0, а [`true`] се изкарва като 1, от [`std::cout`] +{b Упътване:} Булевата стойност {` false} се изкарва като 0, а {` true} се изкарва като 1, от {` std::cout} -[=Примери=] +{b Примери} -:table_2 +:table +:2 |= Вход |= Изход @@ -154,9 +166,10 @@ GitHub classroom: [url https://classroom.github.com/a/Bi5dhwW7 classroom.github. Получавате от входа буква, трябва да върнете 0 ако буквата не е цифра и 1 ако е. -[=Примери=] +{b Примери} -:table_2 +:table +:2 |= Вход |= Изход @@ -170,6 +183,7 @@ GitHub classroom: [url https://classroom.github.com/a/Bi5dhwW7 classroom.github. |: 0 + ## Тема: Условни конструкции \n @@ -178,9 +192,10 @@ GitHub classroom: [url https://classroom.github.com/a/Bi5dhwW7 classroom.github. На входа получавате три целочислени, трябва да ги изкарате в нарастващ ред. -[=Пример=] +{b Пример} -:table_2 +:table +:2 |= Вход |= Изход @@ -188,15 +203,17 @@ GitHub classroom: [url https://classroom.github.com/a/Bi5dhwW7 classroom.github. |: 3 5 8 + ### Задача 8 - Календар От входа получавате число от 1 до 12: номера на месеца. Трябва да изкарате името на месеца, където 1 съответства на "January", 2 на "February" и так. нат. -Моля използвате [`switch`] конструкция. +Моля използвате {` switch} конструкция. -[=Примери=] +{b Примери} -:table_2 +:table +:2 |= Вход |= Изход @@ -207,15 +224,17 @@ GitHub classroom: [url https://classroom.github.com/a/Bi5dhwW7 classroom.github. |: October + ### Задача 9 - Монети Получавате число с плаваща запетая, това ще бъде цената на даден продукт в лева. Искате да платите използвайки само монети, като целта е да използвате възможно най-големите стойности на монети, възможно най-много (тоест ситуацията в която трябва да носите един милион монети по една стотинка не трябва да е възможност). Изкарайте двойки "монета бройка", като работите с монети от по 50 стотинки, 20 стотинки, 10 стотинки, 5 стотинки, 1 стотинка. -[=Примери=] +{b Примери} -:table_2 +:table +:2 |= Вход |= Изход @@ -226,10 +245,11 @@ GitHub classroom: [url https://classroom.github.com/a/Bi5dhwW7 classroom.github. |: 0.5 6 0.2 1 0.1 1 0.05 1 0.01 2 + ### Задача 10 - ILS При кацане, един самолет се нужда от информация дали е точно приравнен със средата на пистата, особено когато видимостта е занижена. -Една система за тази цел се нарича [url https://www.pilotscafe.com/Understanding-ILS/ ILS], но ние ще разгледаме нейния компонент, [url https://en.wikipedia.org/wiki/Instrument_landing_system_localizer the localizer]: в края на пистата големи предаватели излъчват различни радио сигнали в двете половини на пистата. +Една система за тази цел се нарича {url ILS;https://www.pilotscafe.com/Understanding-ILS/}, но ние ще разгледаме нейния компонент, {url the localizer;https://en.wikipedia.org/wiki/Instrument_landing_system_localizer}: в края на пистата големи предаватели излъчват различни радио сигнали в двете половини на пистата. Ефектът е като на стерео тон колони, когато самолетът е в ляво от пистата, той приема сигнала от лявата част на пистата по-силно от този за дясната, както ако си доближиш ухото до лявата тон колона, ти ще чуваш нейния звук по-силно от дясната. @@ -238,9 +258,10 @@ GitHub classroom: [url https://classroom.github.com/a/Bi5dhwW7 classroom.github. Спрямо техните стойности, трябва да върнете "Turn right" ако самолетът е в ляво от пистата (ако XXX е по-голямо от YYY) и "Turn left" ако самолетът е в дясно. Допълнително, понеже не е нужно самолетът да се намира перфектно в средата на пистата, зачитаме че ако разликата между двата интензитета е по-малка от 4, тогава самолетът е правилно подравнен и връщаме "Follow heading". -[=Примери=] +{b Примери} -:table_2 +:table +:2 |= Вход |= Изход @@ -254,14 +275,15 @@ GitHub classroom: [url https://classroom.github.com/a/Bi5dhwW7 classroom.github. |: Follow heading + ### Задача 11 - GPS -[*В тази задача има много "теория", иначе самия код е малък и лесен.*] +{i В тази задача има много "теория", иначе самия код е малък и лесен.} Кондензирайки възможно най-много, ще обясня как работи GPS. На земята имаме специални методи, чрез които можем да определим позицията на всеки сателит, обаче обратното, определянето на позицията чрез сателит, става с помощта на супер прецизни часовници и малко математика. -Понеже радио комуникацията е със скоростта на светлината, можем лесно да определим разстояния между сателит и дадена точка, считайки колко време е отнело на сателита да върне отговор (припомням формулата [`s = v * t`], или [`разстояние = скорост * време`]). +Понеже радио комуникацията е със скоростта на светлината, можем лесно да определим разстояния между сателит и дадена точка, считайки колко време е отнело на сателита да върне отговор (припомням формулата {` s = v * t}, или {` разстояние = скорост * време}). Обаче, така получаваме само разстоянието, това не е достатъчно за да определим точната позиция, понеже има много възможни точки на земята, които да са на това разстояние. Решението на проблема, е че просто вземаш разстоянието от няколко сателита, твоята позиция се намира в общата точка между всички възможни области. @@ -274,7 +296,7 @@ GitHub classroom: [url https://classroom.github.com/a/Bi5dhwW7 classroom.github. От математика, ако знаем разстоянието на нашия приятел към трети различен човек, трите кръга върху картата ще се пресичат в само една точка, а именно позицията на нашия приятел. В три измерения, правим същото, обаче със сфери, и ни трябват четири сателита. -Понеже математиката в две и три измерения е малко множко, ще разгледаме всичко едноизмерно, в [url https://en.wikipedia.org/wiki/Flatland Lineland]. +Понеже математиката в две и три измерения е малко множко, ще разгледаме всичко едноизмерно, в {url Lineland;https://en.wikipedia.org/wiki/Flatland}. \n @@ -287,9 +309,10 @@ GitHub classroom: [url https://classroom.github.com/a/Bi5dhwW7 classroom.github. Накрая получавате още две числа, пак координата и време, но за втория сателит. Изкарайте къде се намираме ние, като нека скоростта на светлината да бъде 29 метра в милисекунда. -[=Пример=] +{b Пример} -:table_2 +:table +:2 |= Вход |= Изход diff --git a/src/teaching/upp-2023/week2/revision.du b/src/teaching/upp-2023/week2/revision.du index f2d771d..bd9cb2a 100644 --- a/src/teaching/upp-2023/week2/revision.du +++ b/src/teaching/upp-2023/week2/revision.du @@ -1,8 +1,11 @@ -# Преговор - УПП, Седмица 2, 13.10.2023 +'def title Преговор - УПП, Седмица 2, 13.10.2023 +'def desc Преговор на материала + +# {title} \n -[$presentation-controller] +{presentation-controller} :title_slide @@ -13,7 +16,7 @@ ## Конвертиране на данни -[$br3] +{br3} :unordered - Неявно (скрито, експлицитно): компилаторът сам се досеща да промени типа @@ -32,7 +35,7 @@ :slide -[$br5] +{br5} :unordered - Със загуба на информация (от по-голям тип в по-малък) @@ -55,15 +58,15 @@ .p Първо ще ги погледнем чисто теоретично. -.p [=Внимавайте, те са различни от логическите оператори!=] +.p {b Внимавайте, те са различни от логическите оператори!} -.p [=Означавам побитовите числа с водеща буква "b"!=] -Тоест, числото [`b1001`] е двоичното число [`1001`], което е десетичното число [`9`]. +.p {b Означавам побитовите числа с водеща буква "b"!} +Тоест, числото {` b1001} е двоичното число {` 1001}, което е десетичното число {` 9}. -[$br3] +{br3} :unordered -- Отрицание/негация, [`~`]: обръща 0 в 1 и 1 в 0 +- Отрицание/негация, {` ~}: обръща 0 в 1 и 1 в 0 ``` ~ b0010 = b1101 @@ -72,19 +75,19 @@ :slide :unordered -- Побитово "и", [`&`]: за два бита, ако и двете са 1, връща 1, иначе връща 0 +- Побитово "и", {` &}: за два бита, ако и двете са 1, връща 1, иначе връща 0 ``` 3 & 5 = 1 b0011 & b0101 = b0001 -- Побитово "или", [`|`]: за два бита, ако и двете са 0, връща 0, иначе връща 1 +- Побитово "или", {` |}: за два бита, ако и двете са 0, връща 0, иначе връща 1 ``` 3 | 5 = 7 b0011 | b0101 = b0111 -- Изключващо "или", [`^`]: ако само един от двата бита е 1, връща 1, иначе връща 0 +- Изключващо "или", {` ^}: ако само един от двата бита е 1, връща 1, иначе връща 0 ``` 3 ^ 5 = 6 @@ -94,7 +97,7 @@ :middle_slide27 :unordered -- Побитово отместване на ляво, [`<<`]: отмества всеки бит с n позиции на ляво\n +- Побитово отместване на ляво, {` <<}: отмества всеки бит с n позиции на ляво\n Винаги "запълва" с нули (няма разлика между логическо и аритметично ляво отместване) ``` @@ -103,7 +106,7 @@ (приемаме, че типа данни съхранява само 4 бита данни) -- Побитово отместване на дясно, [`>>`]: отмества всеки бит с n позиции на дясно\n +- Побитово отместване на дясно, {` >>}: отмества всеки бит с n позиции на дясно\n При аритметичното отместване, дупките се запълват с предходната стойност на старшия бит\n При логическото отместване, винаги запълваме с 0\n В C++ има един оператор, дали е аритметическо или логическо се определя от типа @@ -118,7 +121,7 @@ Примери с код: -:code_cpp +````cpp int a = 3, b = 5; int n1 = ~ a; // -4 @@ -139,6 +142,7 @@ int r5 = (unsigned int)-b >> 1; // 2147483645 + :slide ## Логически оператори @@ -146,10 +150,10 @@ int r5 = (unsigned int)-b >> 1; // 2147483645 .p Много приличат на побитовите, обаче побитовите работят върху битове, докато логическите работят върху bool. -[$br4] +{br4} :unordered -- [`!`]: обръща [`true`] във [`false`] и обратно +- {` !}: обръща {` true} във {` false} и обратно ```cpp ! true // false @@ -159,14 +163,14 @@ int r5 = (unsigned int)-b >> 1; // 2147483645 :middle_slide :unordered -- [`&&`]: "логическо и", ако и двете стойности са [`true`], тогава и резултатът е [`true`] +- {` &&}: "логическо и", ако и двете стойности са {` true}, тогава и резултатът е {` true} ```cpp true && true // true false && true // false false && false // false -- [`||`]: "логическо или", само ако и двете са [`false`], тогава е [`false`] +- {` ||}: "логическо или", само ако и двете са {` false}, тогава е {` false} ```cpp true || true // true @@ -180,7 +184,7 @@ int r5 = (unsigned int)-b >> 1; // 2147483645 ## Условни конструкции :unordered -- [`if`]: приема булева стойност, ако е [`true`], изпълнява кода в къдравите скоби, ако е [`false`] ги пропуска +- {` if}: приема булева стойност, ако е {` true}, изпълнява кода в къдравите скоби, ако е {` false} ги пропуска ```cpp if (expression) { @@ -188,9 +192,9 @@ int r5 = (unsigned int)-b >> 1; // 2147483645 } dootherthing; - [`expression`] се конвертира към типа [`bool`]\n + {` expression} се конвертира към типа {` bool}\n - Ако в къдравите скоби имаме един израз (тоест е само един ред код, завършващ на [`;`]) можем да ги пропуснем. + Ако в къдравите скоби имаме един израз (тоест е само един ред код, завършващ на {` ;}) можем да ги пропуснем. ```cpp if (expression) dosomething; @@ -200,7 +204,7 @@ int r5 = (unsigned int)-b >> 1; // 2147483645 :middle_slide25 :unordered -- [`if-else`]: работи като [`if`], обаче след къдравите скоби добавяме [`else { ... }`]. +- {` if-else}: работи като {` if}, обаче след къдравите скоби добавяме {` else { ... }}. ```cpp if (expression) { @@ -212,10 +216,10 @@ int r5 = (unsigned int)-b >> 1; // 2147483645 dootherthing; .p - Ако [`expression`] е истина, [`dothing1`] се изпълнява и [`dothing2`] се пропуска изцяло. - Аналогично, ако [`expression`] е лъжа, [`dothing1`] се изпуска и [`dothing2`] се изпълнява. + Ако {` expression} е истина, {` dothing1} се изпълнява и {` dothing2} се пропуска изцяло. + Аналогично, ако {` expression} е лъжа, {` dothing1} се изпуска и {` dothing2} се изпълнява. - .p Както с [`if`], ако [`dothing2`] е само един израз, можем да пропуснем къдравите скоби + .p Както с {` if}, ако {` dothing2} е само един израз, можем да пропуснем къдравите скоби ```cpp if (expression) { @@ -237,7 +241,7 @@ int r5 = (unsigned int)-b >> 1; // 2147483645 else if (expression2) { doSometing2; } - ... + \... else { doSomethingN; } @@ -249,7 +253,7 @@ int r5 = (unsigned int)-b >> 1; // 2147483645 else { if (expression2) doSomething2; else { - ... + \... else doSomethingN; } } @@ -258,8 +262,8 @@ int r5 = (unsigned int)-b >> 1; // 2147483645 :slide :unordered -- [`expression`] винаги се конвертира до тип [`bool`] (ако е нужно)\n - [=Никога не правете такива неща:=] +- {` expression} винаги се конвертира до тип {` bool} (ако е нужно)\n + {b Никога не правете такива неща:} ```cpp bool a; @@ -270,14 +274,14 @@ int r5 = (unsigned int)-b >> 1; // 2147483645 bool a = false; if (expression) a = true; - Просто правите [`bool a = expression;`] + Просто правите {` bool a = expression;} ```cpp bool a; if (expression) a = false; else a = true; - Просто правите [`bool a = ! expression;`] + Просто правите {` bool a = ! expression;} @@ -288,7 +292,7 @@ int r5 = (unsigned int)-b >> 1; // 2147483645 ```cpp (expression) ? valueA : valueB - Ако [`expression`] е истина, връща се [`valueA`], иначе се връща [`valueB`] + Ако {` expression} е истина, връща се {` valueA}, иначе се връща {` valueB} ```cpp int grade; @@ -306,7 +310,7 @@ int r5 = (unsigned int)-b >> 1; // 2147483645 :middle_slide27 :unordered -- [`switch`]: приема стойност и изпълнява случая, при който стойността съвпада с определената +- {` switch}: приема стойност и изпълнява случая, при който стойността съвпада с определената ```cpp switch (value) { @@ -323,10 +327,10 @@ int r5 = (unsigned int)-b >> 1; // 2147483645 else if (value == valueC) doSomething3; .p - [`otherwise`] е като [`else`], това е случая когато не съвпада с никоя стойност. + {` otherwise} е като {` else}, това е случая когато не съвпада с никоя стойност. Може да бъде изпуснат. - .p Без [`break`] изпълнението продължава към следващия [`case`] + .p Без {` break} изпълнението продължава към следващия {` case} diff --git a/src/teaching/upp-2023/week3/index.du b/src/teaching/upp-2023/week3/index.du index 1b0f213..7669ca0 100644 --- a/src/teaching/upp-2023/week3/index.du +++ b/src/teaching/upp-2023/week3/index.du @@ -1,8 +1,11 @@ -# Задачи - УПП, Седмица 3, 20.10.2023 +'def title Задачи - УПП, Седмица 3, 20.10.2023 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/JgMSXuCf classroom.github.com/a/JgMSXuCf] +GitHub classroom: {url classroom.github.com/a/JgMSXuCf;https://classroom.github.com/a/JgMSXuCf} ## Тема: цикли @@ -10,11 +13,12 @@ GitHub classroom: [url https://classroom.github.com/a/JgMSXuCf classroom.github. ### Задача 1 - Степенуване -Получавате цяло число [`x`] и цяло положително число [`n`], трябва да върнете [`x`] на степен [`n`]-та. +Получавате цяло число {` x} и цяло положително число {` n}, трябва да върнете {` x} на степен {` n}-та. -[=Примери=] +{b Примери} -:table_2 +:table +:2 |= Вход |= Изход @@ -28,92 +32,112 @@ GitHub classroom: [url https://classroom.github.com/a/JgMSXuCf classroom.github. |: 4 + ### Задача 2 - Progress bar -Получавате цяло число [`x`], което е по-голямо или равно на 1, и на всеки ред трябва да изкарате един "progress bar", чиято дължина се увеличава с всеки изминал ред. -На практика, този "progress bar" трябва да бъде една права, съставена от знакът [`#`], която трябва с всеки изминал ред да се удължава с един знак. -В началото прогресът е 1 и продължава до [`x`] включително. +Получавате цяло число {` x}, което е по-голямо или равно на 1, и на всеки ред трябва да изкарате един "progress bar", чиято дължина се увеличава с всеки изминал ред. +На практика, този "progress bar" трябва да бъде една права, съставена от знакът {` #}, която трябва с всеки изминал ред да се удължава с един знак. +В началото прогресът е 1 и продължава до {` x} включително. -[=Примери=] +{b Примери} -:table_2 +:table +:2 |= Вход |= Изход |: 3 |: ``` +'emplace # ## ### +'endemplace |: 5 |: ``` +'emplace # ## ### #### ##### +'endemplace + #### Бонус -Направете дължината на този progress bar фиксирана на 10 знака, и въведеното [`x`] да определя след колко реда трябва да запълним progress bar-а. +Направете дължината на този progress bar фиксирана на 10 знака, и въведеното {` x} да определя след колко реда трябва да запълним progress bar-а. Този път, прогресът започва от 0. -[=Примери=] +{b Примери} -:table_2 +:table +:2 |= Вход |= Изход |: 1 |: ``` +'emplace ########## +'endemplace |: 2 |: ``` +'emplace ##### ########## +'endemplace |: 3 |: ``` +'emplace ### ###### ########## +'endemplace |: 10 |: ``` +'emplace # ## ### -[*...*] +'endemplace +{i ...} |: 20 |: ``` +'emplace # # ## ## ### -[*...*] +'endemplace +{i ...} + ### Задача 3 - Endless program with an end От входа получавате букви, не се знае колко. На нов ред, за всяка буква, трябва да върнете "letter" ако е латинска буква, "digit" ако е цифра и "other" ако не е нито едно от двете. -Обаче, буквата [`^`] има специално значение, когато я получим трябва програмата да свърши изпълнение. +Обаче, буквата {` ^} има специално значение, когато я получим трябва програмата да свърши изпълнение. -[=Примери=] +{b Примери} -:table_2 +:table +:2 |= Вход |= Изход @@ -126,17 +150,19 @@ other letter + ### Задача 4 - Premature end -Ще получите максимум 10 цели числа, трябва (целочислено) да разделите числото [`65536`] на всяко от въведените числа. +Ще получите максимум 10 цели числа, трябва (целочислено) да разделите числото {` 65536} на всяко от въведените числа. Но, когато получите числото 0, веднага трябва да спрете вземане на числа от входа. Финално, изкарайте резултата от всички тези деления. -[=Упътване:=] Използвайте [`break`]. +{b Упътване:} Използвайте {` break}. -[=Примери=] +{b Примери} -:table_2 +:table +:2 |= Вход |= Изход @@ -156,19 +182,20 @@ letter Получавате букви, незнайно колко. Трябва да броите колко от тях са малки букви, колко са главни и колко са цифри. -В момента в който получите [`$`] трябва да спрете приемане на букви и да изкарате +В момента в който получите {` $} трябва да спрете приемане на букви и да изкарате ``` Lowercase: X Uppercase: Y Digit: Z където X, Y и Z са съответните бройки. -Обаче, ако получите буква, която не е малка, главна, цифра или [`$`], трябва моментално да спрете изпълнението на програмата, без да отпечатвате нищо. +Обаче, ако получите буква, която не е малка, главна, цифра или {` $}, трябва моментално да спрете изпълнението на програмата, без да отпечатвате нищо. -[=Упътване:=] Използвайте [`return`]. +{b Упътване:} Използвайте {` return}. -[=Примери=] +{b Примери} -:table_2 +:table +:2 |= Вход |= Изход @@ -179,28 +206,30 @@ Lowercase: X Uppercase: Y Digit: Z |: + ### Задача 6 - Глупави сметки От входа получавате букви, това ще са "команди", като при всяка буква трябва да направите различно действие: .bulleted -- [`s`]: след като я получите, трябва да вземете цяло число от входа и да го запазите (първоначалната стойност на числото е 15) -- [`l`]: трябва побитово да отместите наляво запазеното число с един бит -- [`r`]: трябва побитово да отместите надясно запазеното число с един бит -- [`q`]: трябва да запазите сегашното число на втора степен -- [`c`]: трябва да запазите сегашното число на трета степен -- [`m`]: трябва да запазите сегашното число минус 351 -- [`p`]: трябва да запазите сегашното число плюс 94 -- [`&`]: прекратявате програмата +- {` s}: след като я получите, трябва да вземете цяло число от входа и да го запазите (първоначалната стойност на числото е 15) +- {` l}: трябва побитово да отместите наляво запазеното число с един бит +- {` r}: трябва побитово да отместите надясно запазеното число с един бит +- {` q}: трябва да запазите сегашното число на втора степен +- {` c}: трябва да запазите сегашното число на трета степен +- {` m}: трябва да запазите сегашното число минус 351 +- {` p}: трябва да запазите сегашното число плюс 94 +- {` &}: прекратявате програмата След всяка операция трябва да изкарате сегашната стойност на числото. -Обаче, ако се въведе буква, за която няма дефинирана операция (не е команда) трябва да изкарате "Invalid command!" и да [=не=] изкарвате сегашната стойност на числото. +Обаче, ако се въведе буква, за която няма дефинирана операция (не е команда) трябва да изкарате "Invalid command!" и да {b не} изкарвате сегашната стойност на числото. -[=Упътване:=] Използвайте [`switch`], [`default`] и [`continue`]. +{b Упътване:} Използвайте {` switch}, {` default} и {` continue}. -[=Примери=] +{b Примери} -:table_2 +:table +:2 |= Вход |= Изход @@ -224,6 +253,7 @@ Invalid command! 1 + ### Задача 7 - Безсмислена "тивност" Получавате от входа число с плаваща запетая. @@ -232,11 +262,12 @@ Invalid command! Първоначалната стойност на числото е 3.14159 и трябва в началото да изкарате "Positive". -[=Упътване:=] Използвайте [`do-while`]. +{b Упътване:} Използвайте {` do-while}. -[=Примери=] +{b Примери} -:table_2 +:table +:2 |= Вход |= Изход @@ -255,23 +286,24 @@ Negative Получавате букви (команди), като на всяка трябва да извършите някакво действие: :bulleted -- [`t`] - увеличавате минутите с единица (не забравяйте, че ако времето е било "0:59", трябва да стане "1:00") и изкарвате сегашното време -- [`c`] - в зависимост от предишни натискания, прави различни неща: +- {` t} - увеличавате минутите с единица (не забравяйте, че ако времето е било "0:59", трябва да стане "1:00") и изкарвате сегашното време +- {` c} - в зависимост от предишни натискания, прави различни неща: .bulleted - ако преди не е натиснат, влизаме в режим на промяна на часовете, от входа приемаме число което ще бъде новия час и изкарваме сегашното време - ако вече е натиснат, влизаме в режим на минутите, от входа приемаме число, което ще бъде новата стойност на минутите и изкарваме сегашното време - ако вече два пъти е бил натиснат, излизаме от режима - - ако сме в някой от първите два режима и получим [`t`] преди да излезем, не увеличаваме минутите + - ако сме в някой от първите два режима и получим {` t} преди да излезем, не увеличаваме минутите -- [`f`] - променяме изкараното време от 12 часов формат на 24 часов и обратно, като първоначално започваме с 24 часов, и изкарваме сегашното време +- {` f} - променяме изкараното време от 12 часов формат на 24 часов и обратно, като първоначално започваме с 24 часов, и изкарваме сегашното време .bulleted - - При 24 часов формат изкарваме "XX:YY", където [`XX`] е часа и [`YY`] са минутите + - При 24 часов формат изкарваме "XX:YY", където {` XX} е часа и {` YY} са минутите - При 12 часов формат е почти същото "XX:YY ZM" където ZM е PM или AM -[=Примери=] +{b Примери} -:table_2 +:table +:2 |= Вход |= Изход @@ -286,6 +318,7 @@ Negative 7:3 PM + ### Задача 9 - BASIC maze Това е една популярна тестова програма на (много стари) компютри, които са идвали с интерпретатор на езика BASIC: @@ -293,9 +326,9 @@ Negative ``` 10 PRINT CHR$(205.5+RND(1));:GOTO 10 -Задачата е да я пресъздадем, тоест на 20 реда трябва да има по 20 букви, като всяка буква е, на случаен принцип, [`/`] или [`\\`] . +Задачата е да я пресъздадем, тоест на 20 реда трябва да има по 20 букви, като всяка буква е, на случаен принцип, {` /} или {` \\} . -[=Упътване:=] Формално никога не се преподават или изискват случайни стойности, затова ги показвам сега: +{b Упътване:} Формално никога не се преподават или изискват случайни стойности, затова ги показвам сега: Най-отгоре на сорс-файла добавете нужната библиотека: @@ -303,21 +336,21 @@ Negative #include <stdlib.h> #include <ctime> -След това, в [`main`], преди да използвате случайни стойности, трябва да "инициализираме системата": +След това, в {` main}, преди да използвате случайни стойности, трябва да "инициализираме системата": ```cpp srand(time(NULL)); -С функцията [`rand()`] получавате случайна положителна стойност, може да я ограничите до две стойности с модулно деление, [`rand() % 2`]. +С функцията {` rand()} получавате случайна положителна стойност, може да я ограничите до две стойности с модулно деление, {` rand() % 2}. -[=Примерен изход=] [*Нямаме вход, вашия изход няма да изглежда напълно еднакъв*] +{b Примерен изход} {i Нямаме вход, вашия изход няма да изглежда напълно еднакъв} ``` -'include ./example_maze.txt +'snippet 1 $ ./example_maze.txt ### Задача 10 - Елка -[*Решението на тази задача е по-дълго!*] +{i Решението на тази задача е по-дълго!} Сега имплементирате кода на една елка. Елката запазва две числа, първото е "сегашното" число с което правим нормалните операции и "виждаме" на екрана, и второто е отделна памет, в която можем да добавяме и изваждаме числа. @@ -328,16 +361,17 @@ srand(time(NULL)); Буквата е команда, като може да бъде +,-,\*,/, които са обикновените операции с които променяме сегашното число, докато: .bulleted -- [`a`] - добавя сегашното число в отделната памет -- [`s`] - изважда сегашното число от тази памет -- [`c`] - занулява сегашното число -- [`m`] - занулява числото в отделната памет +- {` a} - добавя сегашното число в отделната памет +- {` s} - изважда сегашното число от тази памет +- {` c} - занулява сегашното число +- {` m} - занулява числото в отделната памет -След [`a`], [`s`] и [`m`] трябва да изкарате числото в отделната памет, докато след всички други команди трябва да изкарате сегашното число. +След {` a}, {` s} и {` m} трябва да изкарате числото в отделната памет, докато след всички други команди трябва да изкарате сегашното число. -[=Примери=] +{b Примери} -:table_2 +:table +:2 |= Вход |= Изход @@ -352,6 +386,7 @@ srand(time(NULL)); 0 + ## Тема: assert \n @@ -363,7 +398,7 @@ srand(time(NULL)); ``` int parseSensor(int s) { return ((((s=(s>>1)&(~0xF617A100))<0x54)?s|0xF01:s&0xCBFF)>>2)-21; } -Все още не сме учили функции, затова просто пльоснете горното нещо във вашия сорс код, [*над*] [`int main()`] и [*в*] [`main`] може да я използвате чрез [`parseSensor(inputValue)`]. +Все още не сме учили функции, затова просто пльоснете горното нещо във вашия сорс код, {i над} {` int main()} и {i в} {` main} може да я използвате чрез {` parseSensor(inputValue)}. Вашата задача е при определени градуси да връщате съобщение на екрана: @@ -376,7 +411,7 @@ int parseSensor(int s) { return ((((s=(s>>1)&(~0xF617A100))<0x54)?s|0xF01:s&0xCB Обаче, това не е всичко. Поглеждате функцията на вашия колега и не сте уверени в нея, обаче нямате документацията за обработка на входа. -Единственото нещо, което знаете, е че стойностите от функцията не трябва да са извън обхвата -20 и 40, затова използвайте [`assert`] и проверете/тествайте дали това винаги е вярно. +Единственото нещо, което знаете, е че стойностите от функцията не трябва да са извън обхвата -20 и 40, затова използвайте {` assert} и проверете/тествайте дали това винаги е вярно. Ето стойности с които може да тествате: @@ -391,9 +426,10 @@ int parseSensor(int s) { return ((((s=(s>>1)&(~0xF617A100))<0x54)?s|0xF01:s&0xCB На кои стойности функцията на колегата не работи? -[=Примери=] [*Входът е различен от горепосочените стойности (и при него функцията работи коректно)*] +{b Примери} {i Входът е различен от горепосочените стойности (и при него функцията работи коректно)} -:table_2 +:table +:2 |= Вход |= Изход diff --git a/src/teaching/upp-2023/week3/revision.du b/src/teaching/upp-2023/week3/revision.du index bcbdafa..99875e2 100644 --- a/src/teaching/upp-2023/week3/revision.du +++ b/src/teaching/upp-2023/week3/revision.du @@ -1,8 +1,11 @@ -# Преговор - УПП, Седмица 3, 20.10.2023 +'def title Преговор - УПП, Седмица 3, 20.10.2023 +'def desc Преговор на материала + +# {title} \n -[$presentation-controller] +{presentation-controller} :title_slide35 @@ -20,7 +23,7 @@ bool b; if (condition) b = true; - Грешно е, понеже [`condition`] сам по себе си е от тип bool, с този [`if`] буквално не правите нищо. + Грешно е, понеже {` condition} сам по себе си е от тип bool, с този {` if} буквално не правите нищо. Правилния вариант е: ```cpp @@ -48,7 +51,7 @@ .p Всяка буква действително съответства на определено число, дефинирано от ASCII стандарта. - Наистина '0' е 48 и '9' е 57, обаче от вас [=не=] се очаква да помните ASCII таблицата! + Наистина '0' е 48 и '9' е 57, обаче от вас {b не} се очаква да помните ASCII таблицата! Също, ако не знаеш наизуст кои буква са тези числа, този израз е много неясен. .p @@ -63,11 +66,11 @@ ## С/без загуба на данни -[$br3] +{br3} .p Получи се малко разногласие между това, което Ивана ви е казала и това което аз ви казах. -В края на деня, [=конвертиране от int към unsigned int не губи информация!=] +В края на деня, {b конвертиране от int към unsigned int не губи информация!} .p Цитирайки 4то издание на "The C++ Programming Language" глава 10.5: @@ -88,7 +91,7 @@ A conversion is value-preserving if you can convert a value and then convert the .p Как бихме ги използвали, за да представим отрицателните числа? -Най-лесния начин е да погледнем най-левия (старшия) бит, ако е 0 значи е положително, ако е 1 значи е отрицателно, тоест [`010`] е 2, докато [`110`] е -2. +Най-лесния начин е да погледнем най-левия (старшия) бит, ако е 0 значи е положително, ако е 1 значи е отрицателно, тоест {` 010} е 2, докато {` 110} е -2. Ако разпишем всичките ни числа: ``` @@ -175,17 +178,17 @@ A conversion is value-preserving if you can convert a value and then convert the Това е идеята на "complements", дефинираме отрицателни числа, така че да използваме едно и също събиране между положителни и отрицателни. .p -Още от много старите "калкулатори" ([url https://en.wikipedia.org/wiki/Adding_machine сумиращи машини]), изваждането се е свеждало до събиране на положително и отрицателно число. +Още от много старите "калкулатори" ({url сумиращи машини;https://en.wikipedia.org/wiki/Adding_machine}), изваждането се е свеждало до събиране на положително и отрицателно число. .p -И това е причината защо [`~ 2`] връща [`-3`]: +И това е причината защо {` ~ 2} връща {` -3}: ``` ~ 00000000000000000000000000000010 ────────────────────────────────── 11111111111111111111111111111101 -И затова при [`>>`] със знаков тип имаме аритметическо отместване: +И затова при {` >>} със знаков тип имаме аритметическо отместване: ``` 11111111111111111111111111111101 >> 1 @@ -197,17 +200,17 @@ A conversion is value-preserving if you can convert a value and then convert the ## Цикли -[$br4] +{br4} :unordered -- [`while`] цикъл +- {` while} цикъл ```cpp while (условие) { тяло } - "условие" е булева стойност, като ако е [`false`] цикъла спира, докато ако е [`true`] "тяло" се изпълнява и после пак се проверява условие + "условие" е булева стойност, като ако е {` false} цикъла спира, докато ако е {` true} "тяло" се изпълнява и после пак се проверява условие @@ -215,7 +218,7 @@ A conversion is value-preserving if you can convert a value and then convert the - Може да си го представите като - :code_cpp + ````cpp if (условие) { тяло } @@ -229,14 +232,15 @@ A conversion is value-preserving if you can convert a value and then convert the else { спри } - ... + \... + :slide :unordered -- [`do-while`] цикъл, като [`while`], но "тяло" се изпълнява поне един път +- {` do-while} цикъл, като {` while}, но "тяло" се изпълнява поне един път ```cpp do { @@ -245,7 +249,7 @@ A conversion is value-preserving if you can convert a value and then convert the Нашият аналог е: - :code_cpp + ````cpp тяло if (условие) { @@ -256,14 +260,15 @@ A conversion is value-preserving if you can convert a value and then convert the } if (условие) { - ... + \... + :middle_slide :unordered -- [`for`] цикъл +- {` for} цикъл ```cpp for (инициализация; условие; инкрементация) { @@ -271,7 +276,7 @@ A conversion is value-preserving if you can convert a value and then convert the } "инициализация" се изпълнява само веднъж, преди всичко останало в цикъла\n - "условие" се изпълнява преди всяка итерация, като ако е [`false`] цикъла спира, докато ако е [`true`] продължава\n + "условие" се изпълнява преди всяка итерация, като ако е {` false} цикъла спира, докато ако е {` true} продължава\n "инкрементация" се изпълнява след края на всяка итерация @@ -280,7 +285,7 @@ A conversion is value-preserving if you can convert a value and then convert the :unordered - Може да си представяте, че това на практика извършва: - :code_cpp + ````cpp инициализация if (условие) { @@ -298,14 +303,15 @@ A conversion is value-preserving if you can convert a value and then convert the else { спри } - ... + \... + :middle_slide :unordered -- или използвайки [`while`] цикъл: +- или използвайки {` while} цикъл: ```cpp инициализация @@ -320,18 +326,18 @@ A conversion is value-preserving if you can convert a value and then convert the ### Ключови думи -[$br3] +{br3} :unordered -- [`break`]: моментално прекратява изпълнението на цикъла +- {` break}: моментално прекратява изпълнението на цикъла - .p При [`for`] цикли инкрементацията не се изпълнява след [`break`] + .p При {` for} цикли инкрементацията не се изпълнява след {` break} -[$br2] +{br2} -- [`continue`]: продължи след края на сегашната итерация; тоест изпълнението на тяло се прекратява и започваме нова итерация +- {` continue}: продължи след края на сегашната итерация; тоест изпълнението на тяло се прекратява и започваме нова итерация - .p При [`for`] цикли директно отива на инкрементация + .p При {` for} цикли директно отива на инкрементация @@ -339,17 +345,18 @@ A conversion is value-preserving if you can convert a value and then convert the ## Assert -[$br3] +{br3} .p Понякога е полезно да тестваме нашия код вътре в самия код. Тоест, искаме на конкретно място в кода да проверим нещо. + ```cpp assert(condition); .p -Ако [`condition`] е [`true`], нищо не се случва, обаче ако е [`false`] програмата моментално прекратява изпълнение. +Ако {` condition} е {` true}, нищо не се случва, обаче ако е {` false} програмата моментално прекратява изпълнение. .p -Използва се повече като програмистки уред, тоест ако програмата спре заради [`assert`], това е защото има някаква програмистка грешка. +Използва се повече като програмистки уред, тоест ако програмата спре заради {` assert}, това е защото има някаква програмистка грешка. diff --git a/src/teaching/upp-2023/week4/index.du b/src/teaching/upp-2023/week4/index.du index 425ffbd..48b8c61 100644 --- a/src/teaching/upp-2023/week4/index.du +++ b/src/teaching/upp-2023/week4/index.du @@ -1,12 +1,15 @@ -# Задачи - УПП, Седмица 4, 27.10.2023 +'def title Задачи - УПП, Седмица 4, 27.10.2023 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/jqKaO1ny classroom.github.com/a/jqKaO1ny] +GitHub classroom: {url classroom.github.com/a/jqKaO1ny;https://classroom.github.com/a/jqKaO1ny} ## Задача 1 - Числен редактор -Получавате число [`N`], което ще е в обхвата от 1 до 10000000000000000000. +Получавате число {` N}, което ще е в обхвата от 1 до 10000000000000000000. Вашата програма трябва да поддържа няколко операции върху това число, включително копиране на редица от цифри в него и поставянето им в друга част на числото. Подробните операции ще получите по-късно, и не е нужно да валидирате вход или дали след дадена операция числото се побира в типа данни. @@ -16,7 +19,7 @@ GitHub classroom: [url https://classroom.github.com/a/jqKaO1ny classroom.github. Всичките операции трябва да бъдат отделени във функции. Затова, и за улеснение, задачата е разделена на стъпки: -[=ВАЖНО:=] В решението [=НЕ=] може да изполвате масиви, вектори, ..., както и каквито и да е функции, които не сте написали вие! +{b ВАЖНО:} В решението {b НЕ} може да изполвате масиви, вектори, ..., както и каквито и да е функции, които не сте написали вие! ### Подточка а) Примитивните функции @@ -25,69 +28,70 @@ GitHub classroom: [url https://classroom.github.com/a/jqKaO1ny classroom.github. Имплементирайте функциите: :unordered -- [`get`], която приема число, начален индекс и краен индекс (в този ред)\n +- {` get}, която приема число, начален индекс и краен индекс (в този ред)\n Тя връща подчислото, което започва от началния и завършва в крайния индекс. - .p Пример: [`get(481395, 2, 4)`] връща [`813`] + .p Пример: {` get(481395, 2, 4)} връща {` 813} -- [`remove`], която приема число, начален индекс и дължина (в този ред)\n +- {` remove}, която приема число, начален индекс и дължина (в този ред)\n Връща числото, без "дължина" на брой цифри от началния индекс - .p Пример: [`remove(481395, 3, 3)`] връща [`485`] + .p Пример: {` remove(481395, 3, 3)} връща {` 485} -- [`insert`], която приема число, начален индекс, дължина и число за вмъкване\n +- {` insert}, която приема число, начален индекс, дължина и число за вмъкване\n Връща числото, като на началния индекс намираме началото на вмъкнатото число с дължина "дължина"\n Ефектът, е че числото се вмъква на дадения индекс, обаче избутва цифрите в ляво от него, вместо тези от дясно. - .p Пример: [`insert(495, 2, 4, 1001)`] връща [`4100195`] + .p Пример: {` insert(495, 2, 4, 1001)} връща {` 4100195} ### Подточка б) Композитните функции Сега е време да имплементираме съществената логика в задачата. -Използвайки [=само=] примитивните функции, имплементирайте функциите: +Използвайки {b само} примитивните функции, имплементирайте функциите: :unordered -- [`copy`], която приема число, начален индекс, дължина и втори начален индекс\n +- {` copy}, която приема число, начален индекс, дължина и втори начален индекс\n Връща числото, като от втория начален индекс, следващите "дължина" на брой цифри съвпадат с "дължина" на брой цифри от първия начален индекс - .p Пример: [`copy(481395, 3, 4, 2)`] връща [`4139581395`] + .p Пример: {` copy(481395, 3, 4, 2)} връща {` 4139581395} -- [`cut`], която приема число, начален индекс, дължина и втори начален индекс\n +- {` cut}, която приема число, начален индекс, дължина и втори начален индекс\n Връща числото, като "дължина" на брой цифри от (стария) начален индекс са преместени във втория начален индекс - .p Пример: [`cut(481395, 3, 4, 2)`] връща [`413958`] + .p Пример: {` cut(481395, 3, 4, 2)} връща {` 413958} -- [`replace`], която приема число, начален индекс, дължина и число за замяна\n +- {` replace}, която приема число, начален индекс, дължина и число за замяна\n Връща числото, като "дължина" на брой цифри от начален индекс са заменени с числото за замяна\n - Заменените цифри и числото за замяна [=може да имат различни дължини=]! + Заменените цифри и числото за замяна {b може да имат различни дължини}! - .p Пример: [`replace(481395, 4, 2, 705)`] връща [`4817055`] + .p Пример: {` replace(481395, 4, 2, 705)} връща {` 4817055} -- [`prepend`], която приема две числа\n +- {` prepend}, която приема две числа\n Връща долепени второто и първото число - .p Пример: [`prepend(395, 81)`] връща [`81395`] + .p Пример: {` prepend(395, 81)} връща {` 81395} -- [`append`], която приема две числа\n +- {` append}, която приема две числа\n Връща долепени първото и второто число - .p Пример: [`append(395, 81)`] връща [`39581`] + .p Пример: {` append(395, 81)} връща {` 39581} ### Подточка в) Вход и изход Последно, време е да имплементираме интерфейса на програмата. -Както вече казахме, първия вход е числото [`N`] с което ще извършим операция. +Както вече казахме, първия вход е числото {` N} с което ще извършим операция. -След това приемаме буква, която определя нашата (композитна) функция, като за всички функции използваме първата буква в името им, освен за [`cut`], за която използваме [`x`]. -Тоест, [`c`] означава, че ще "copy"-ваме, [`p`] че ще "prepend"-ваме, [`x`] че ще "cut"-ваме и так. нат. +След това приемаме буква, която определя нашата (композитна) функция, като за всички функции използваме първата буква в името им, освен за {` cut}, за която използваме {` x}. +Тоест, {` c} означава, че ще "copy"-ваме, {` p} че ще "prepend"-ваме, {` x} че ще "cut"-ваме и так. нат. След като въведем буква, трябва да приемем съответния за дадената функция брой аргументи и да изкараме на екрана резултата от функцията. -[=Примери=] +{b Примери} -:table_2 +:table +:2 |= Вход |= Изход @@ -104,6 +108,7 @@ GitHub classroom: [url https://classroom.github.com/a/jqKaO1ny classroom.github. |: 86998385021843839 + ## Задача 2 - Умножение на полиноми Представяме полином чрез две числа, първото побитово определя дали x на конкретната степен съществува, докато второто определя коефициента (като цифра) пред всеки член, без значение дали съществува в полинома. @@ -111,7 +116,7 @@ GitHub classroom: [url https://classroom.github.com/a/jqKaO1ny classroom.github. Числото с коефициенти е между 1 и 10000000000000000000. Пример: първото число е 13, a второто е 3052. -Побитово [`13 = 1101`], тоест ще имаме +Побитово {` 13 = 1101}, тоест ще имаме ``` x³ * 1 + x² * 1 + x¹ * 0 + x⁰ * 1 @@ -121,15 +126,15 @@ x³ * 1 + x² * 1 + x¹ * 0 + x⁰ * 1 ``` 3 * x³* 1 + 0 * x² * 1 + 5 * x¹ * 0 + 2 * x⁰ * 1 -Финално, нашия полином, кодиран от числата 13 и 3052 е [`3x³ + 2`]. +Финално, нашия полином, кодиран от числата 13 и 3052 е {` 3x³ + 2}. От входа получавате два полинома, трябва да ги умножите и да изкарате получилия се полином (пак във формата с две числа). -[=ВАЖНО:=] В решението [=НЕ=] може да изполвате масиви, вектори, ..., както и каквито и да е функции, които не сте написали вие! +{b ВАЖНО:} В решението {b НЕ} може да изполвате масиви, вектори, ..., както и каквито и да е функции, които не сте написали вие! ## Задача 3 - Дъската на Зар -[*Името си го измислих, няма връзка с нещо :)*] +{i Името си го измислих, няма връзка с нещо :)} Дъската на Зар е една много проста игра. Имаме два играча, които играят върху квадратна дъска, като на всяка "клетка" има цифра (0 до 9). @@ -143,7 +148,7 @@ x³ * 1 + x² * 1 + x¹ * 0 + x⁰ * 1 Пример: ако играем с дъска 5х5, намираме се на реда "25486" и позицията на първия играч е първата, тогава ходът му изглежда така (с "V" показваме къде се намира): -:code +```` V 25486 Прочита цифрата 2, значи трябва да се премести с две клетки на дясно @@ -171,11 +176,11 @@ V Накрая на играта, трябва да сравните точките на първия и втория играч и да изкарате кой е победил (или дали никой не е). Един ред може да се представи като цяло число и обработваме ред по ред, без да се връщаме назад. -Тоест, първо от входа получавате число [`N`], което е размера на дъската. -След това ще получавате [`N`] числа, всяко с [`N`] цифри в десетичния си запис, като след получаване на едно число изпълнявате ходовете на всички играчи. +Тоест, първо от входа получавате число {` N}, което е размера на дъската. +След това ще получавате {` N} числа, всяко с {` N} цифри в десетичния си запис, като след получаване на едно число изпълнявате ходовете на всички играчи. -[=ВАЖНО:=] В решението [=НЕ=] може да изполвате масиви, вектори, ..., както и каквито и да е функции, които не сте написали вие! +{b ВАЖНО:} В решението {b НЕ} може да изполвате масиви, вектори, ..., както и каквито и да е функции, които не сте написали вие! -[=Упътване:=] +{b Упътване:} Лесно се получава, ако занулим цифрите които първия играч е посетил. Още по-лесно става ако използвате функции от първата задача. diff --git a/src/teaching/upp-2023/week4/revision.du b/src/teaching/upp-2023/week4/revision.du index 622df06..b659a05 100644 --- a/src/teaching/upp-2023/week4/revision.du +++ b/src/teaching/upp-2023/week4/revision.du @@ -1,6 +1,9 @@ -# Преговор - УПП, Седмица 4, 27.10.2023 +'def title Преговор - УПП, Седмица 4, 27.10.2023 +'def desc Преговор на материала -[$presentation-controller] +# {title} + +{presentation-controller} :title_slide35 @@ -20,9 +23,9 @@ - Ще изисквам добър стил при писане на код .bulleted - - Това означава добре подравнен код, празни символи около оператори [=и=] свестни имена на променливи + - Това означава добре подравнен код, празни символи около оператори {b и} свестни имена на променливи - Името на променлива не трябва да бъде 150 знака, но трябва да е разбираемо какво съдържа - - [=Без шльокавица!=] + - {b Без шльокавица!} - Преговорът ще бъде за вас да си го четете (освен ако не трябва да преподам нещо ново) - Ще може да предавате задания след срока!\n @@ -30,7 +33,7 @@ -[*Нещата за 2s compliment се намират и в [url ../week3/revision.html?a преговора на миналата седмица], ама го написах след като свърши часа, затова го копирам и тук.*] +{i Нещата за 2s compliment се намират и в {url преговора на миналата седмица;../week3/revision.html?a}, ама го написах след като свърши часа, затова го копирам и тук.} :slide @@ -42,7 +45,7 @@ .p Как бихме ги използвали, за да представим отрицателните числа? -Най-лесния начин е да погледнем най-левия (старшия) бит, ако е 0 значи е положително, ако е 1 значи е отрицателно, тоест [`010`] е 2, докато [`110`] е -2. +Най-лесния начин е да погледнем най-левия (старшия) бит, ако е 0 значи е положително, ако е 1 значи е отрицателно, тоест {` 010} е 2, докато {` 110} е -2. Ако разпишем всичките ни числа: ``` @@ -134,17 +137,17 @@ Това е идеята на "complements", дефинираме отрицателни числа, така че да използваме едно и също събиране между положителни и отрицателни. .p -Още от много старите "калкулатори" ([url https://en.wikipedia.org/wiki/Adding_machine сумиращи машини]), изваждането се е свеждало до събиране на положително и отрицателно число. +Още от много старите "калкулатори" ({url сумиращи машини;https://en.wikipedia.org/wiki/Adding_machine}), изваждането се е свеждало до събиране на положително и отрицателно число. .p -И това е причината защо [`~ 2`] връща [`-3`]: +И това е причината защо {` ~ 2} връща {` -3}: ``` ~ 00000000000000000000000000000010 ────────────────────────────────── 11111111111111111111111111111101 -И затова при [`>>`] със знаков тип имаме аритметическо отместване: +И затова при {` >>} със знаков тип имаме аритметическо отместване: ``` 11111111111111111111111111111101 >> 1 @@ -162,17 +165,17 @@ тяло } -Като [`<АРГУМЕНТИ>`] са двойки от типа [`ТИП ИМЕ`], разделени със запетаи. -Един вид, аргументите са променливи към [`тяло`], които задаваме извън функцията. +Като {` <АРГУМЕНТИ>} са двойки от типа {` ТИП ИМЕ}, разделени със запетаи. +Един вид, аргументите са променливи към {` тяло}, които задаваме извън функцията. -Извикваме функция чрез [`име(<СТОЙНОСТИ>)`], като [`<СТОЙНОСТИ>`] са разделени със запетая и всяка съответства на поредния тип в аргументите на функцията. -Там, където пишем [`име(<СТОЙНОСТИ>)`] се "замества" с върнатата стойност от функцията. +Извикваме функция чрез {` име(<СТОЙНОСТИ>)}, като {` <СТОЙНОСТИ>} са разделени със запетая и всяка съответства на поредния тип в аргументите на функцията. +Там, където пишем {` име(<СТОЙНОСТИ>)} се "замества" с върнатата стойност от функцията. -Връщаме стойност като напишем във функцията [`return СТОЙНОСТ;`]. +Връщаме стойност като напишем във функцията {` return СТОЙНОСТ;}. Една функция трябва да бъде декларирана преди да бъде използвана, тоест кода -:code_cpp +````cpp #include <iostream> int main() { @@ -180,7 +183,7 @@ int main() { } int doSomething() { - ... + \... } @@ -192,7 +195,7 @@ int doSomething() { Тоест горния пример ще работи ако имаме: -:code_cpp +````cpp #include <iostream> int doSomething(); @@ -202,5 +205,5 @@ int main() { } int doSomething() { - ... + \... } diff --git a/src/teaching/upp-2023/week5/index.du b/src/teaching/upp-2023/week5/index.du index 2673077..ba2c114 100644 --- a/src/teaching/upp-2023/week5/index.du +++ b/src/teaching/upp-2023/week5/index.du @@ -1,8 +1,11 @@ -# Задачи - УПП, Седмица 5, 03.11.2023 +'def title Задачи - УПП, Седмица 5, 03.11.2023 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/3KoIQ71H classroom.github.com/a/3KoIQ71H] +GitHub classroom: {url classroom.github.com/a/3KoIQ71H;https://classroom.github.com/a/3KoIQ71H} ## Задача 1 @@ -10,11 +13,12 @@ GitHub classroom: [url https://classroom.github.com/a/3KoIQ71H classroom.github. Направете функция, която получава два двуизмерни координата, покомпонентно ги сумира и връща резултатните координати. Няма как функцията да върне две стойности, затова добаваете оше два аргумента, които да са указатели към променливи в които да запазим сумираните координати. -От входа получавате два координата, след това връщате тяхната покомпонентна сума [=използвайки функцията=]. +От входа получавате два координата, след това връщате тяхната покомпонентна сума {b използвайки функцията}. -[=Пример:=] +{b Пример:} -:table_2 +:table +:2 |= Вход |= Изход @@ -22,20 +26,22 @@ GitHub classroom: [url https://classroom.github.com/a/3KoIQ71H classroom.github. |: 6.1 -99.241 + ## Задача 2 Използвайки масиви, имплементирайте 30-цифрени цели положителни числа. Трябва да поддържате операциите събиране и изваждане между две такива числа. Първо ще получите 30 цифри, които отговарят на първото числа, после още 30 цифри, които отговарят на втрото число и накрая ще получите знак. -Ако знака е [`+`], трябва да ги съберете и да изкарате резултата на екрана. -Ако знака е [`-`], трябва да ги извадите и да изкарате резултата на екрана. +Ако знака е {` +}, трябва да ги съберете и да изкарате резултата на екрана. +Ако знака е {` -}, трябва да ги извадите и да изкарате резултата на екрана. При изкарване трябва да следвате "нормалните" правила: цифрите са долепени и водещите нули не се пишат. -[=Пример:=] +{b Пример:} -:table_2 +:table +:2 |= Вход |= Изход @@ -72,24 +78,26 @@ GitHub classroom: [url https://classroom.github.com/a/3KoIQ71H classroom.github. |: 999999999999999999999999999999 + ## Задача 3 Получавате редица цифри. Ако имаме поне 3 повтарящи се цифри една след друга, можем да ги премахнем. -Тоест редицата [`0 3 1 2 2 2 4 7`] може да стане [`0 3 1 4 7`]. +Тоест редицата {` 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`]. +Тоест редицата {` 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ки. +Тоест в случая {` 8 1 3 4 4 4 5 5 5 5 4 4} не се очаква да предвидите, че ако първо премахнете 5-те, после ще може да премахнете всички 4ки. Премахвате първата валидна повтаряща се редица, връщате се малко назад, поглеждате дали някоя нова редица не се е появила, премахвате нея или отивате на следващата. -От входа първо получавате броя [`N`] на цифрите в редицата, като [`N`] е между 1 и 40. -След това получавате [`N`] на брой цифри и накрая връщате редицата с премахнати повтаряния. +От входа първо получавате броя {` N} на цифрите в редицата, като {` N} е между 1 и 40. +След това получавате {` N} на брой цифри и накрая връщате редицата с премахнати повтаряния. -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход @@ -108,21 +116,23 @@ GitHub classroom: [url https://classroom.github.com/a/3KoIQ71H classroom.github. |: 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, така че спираме да скачаме. +Започвайки от всяка цифра, проследяваме всички "скоци", тоест ако имаме {` 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) и накрая връщате при кой начален индекс имаме най-много скока и колко са тези скоци. +Получавате от входа брой {` N} на числата (индексите), като {` N} е между 1 и 30, след това получавате толкова на брой числа (между 0 и N-1) и накрая връщате при кой начален индекс имаме най-много скока и колко са тези скоци. -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход @@ -155,6 +165,7 @@ GitHub classroom: [url https://classroom.github.com/a/3KoIQ71H classroom.github. |: 0 2 + ## Задача 5 sim картите са типове smart-card, това означава че в себе си имат един миниатюрен компютър с миниатюрна памет. @@ -166,12 +177,12 @@ sim картите са типове smart-card, това означава че ### а) валидационни функции .bulleted -- [`isUnblockCode`], приема буква и връща дали е отблокиращ код\n +- {` isUnblockCode}, приема буква и връща дали е отблокиращ код\n Само главни, малки и цифри са валидни отблокиращи кодове -- [`isPhoneNumber`], приема число (10 цифрено) и поглежда най-левите 3 цифри\n +- {` isPhoneNumber}, приема число (10 цифрено) и поглежда най-левите 3 цифри\n Те трябва да са валиден код на държава. Нужно е да приемате поне кодовете за България (359) и за Франция (033). - Ако искате може и други да приемате, пълен списък има [url https://en.wikipedia.org/wiki/List_of_country_calling_codes#Alphabetical_order тук]. + Ако искате може и други да приемате, пълен списък има {url тук;https://en.wikipedia.org/wiki/List_of_country_calling_codes#Alphabetical_order}. ### б) вход и команди @@ -179,20 +190,20 @@ sim картите са типове smart-card, това означава че Ако отблокиращия е в невалиден формат, връщате съответно съобщение за грешка и спирате програмата. След това получавате команди, всяка команда се определя с букви и още някакви стойности. -[=Всяка команда трябва да бъде изкарана в отделна функция!=] +{b Всяка команда трябва да бъде изкарана в отделна функция!} .bulleted -- [`v`] - пробвате се да се "логнете" в сим картата. +- {` v} - пробвате се да се "логнете" в сим картата. След буквата получавате и едно число, което е въведения ПИН код. Ако е правилен, следващите 5 команди, които изискват упълномощение могат да се изпълнят. След 5те команди, упълномощението се "премахва" и трябва пак да се въведе ПИН код при упълномощени команди. Ако е грешен, общо има 3 опита, и след тях картата се блокира. -- [`u`] - отпблокиране на блокирана карта. +- {` u} - отпблокиране на блокирана карта. След буквата получавате отблокиращ код и нов ПИН код. Ако отблокиращия код е в грешен формат или е грешната стойност, премахваме един опит. При 10 неуспешни опита, изкарвате съобщение, че картата е перманентно блокирана и спирате програмата. Ако е успешно отблокирана, тогава променяте ПИН кода и сте се "логнали" автоматично. -- [`i`] - връща информация за СИМ картата, това са общо броя команди които са изпълнявани до сега +- {` i} - връща информация за СИМ картата, това са общо броя команди които са изпълнявани до сега ### в) команди с упълномощение @@ -202,15 +213,15 @@ sim картите са типове smart-card, това означава че Ако някоя търсена стойност е невалидна или не съществува, връщате съответната грешка. .bulleted -- [`c`] - променя ПИН код. +- {` c} - променя ПИН код. Получавате нов ПИН код и го променяте. -- [`a`] - добавя контакт в паметта, общо може да имаме 10 контакта. +- {` a} - добавя контакт в паметта, общо може да имаме 10 контакта. Всеки контакт се определя с буква, неговото "име", и 10-цифрен мобилен номер. Приема допълнително неговото име и тел. номер. Добавяме контакта в първото незаето място, а ако всички са заети, връщаме съобщение с грешка. -- [`r`] - приема и още една буква (име), връща телефонния номер на съответния контакт. +- {` r} - приема и още една буква (име), връща телефонния номер на съответния контакт. Ако той не съществува или телефонния номер е невалиден, връщаме съответно съобщение с грешка. -- [`d`] - приема и още една буква (име), изтрива съответния контакт. +- {` d} - приема и още една буква (име), изтрива съответния контакт. Ако той не съществува, връщаме съответно съобщение с грешка. -- [`o`] - променя контакт, приема допълнително две имена на контакти и телефонен номер. +- {` o} - променя контакт, приема допълнително две имена на контакти и телефонен номер. Променя контакта с първото име, като второто име и тел. номер стават новите му стойности. diff --git a/src/teaching/upp-2023/week5/revision.du b/src/teaching/upp-2023/week5/revision.du index 37c7c8d..c415f5a 100644 --- a/src/teaching/upp-2023/week5/revision.du +++ b/src/teaching/upp-2023/week5/revision.du @@ -1,4 +1,7 @@ -# Преговор - УПП, Седмица 5, 03.11.2023 +'def title Преговор - УПП, Седмица 5, 03.11.2023 +'def desc Преговор на материала + +# {title} ## Указатели @@ -6,22 +9,22 @@ За да можем да определим къде дадено нещо е запазено, всяка клетка в паметта си има "адрес". Адресът е едно цяло положително число. -Можем да вземем адреса на дадена променлива с оператора [`&`]: +Можем да вземем адреса на дадена променлива с оператора {` &}: ```cpp double a = 3.14159; std::cout << (&a) << std::endl; -Tази програма ще върне адресът на променлива [`a`]. +Tази програма ще върне адресът на променлива {` a}. След като имаме адрес, бихме искали да работим със стойността на този адрес. -Това го правим с дерефериращия оператор [`*`]: +Това го правим с дерефериращия оператор {` *}: ```cpp double a = 3.14159; std::cout << (*(&a)) << std::endl; -Тази програма връща стойността на адреса на променлива [`a`]. +Тази програма връща стойността на адреса на променлива {` a}. Променливи, които съдържат адреси се наричат указатели. Синтаксисът на един указател е: @@ -55,13 +58,13 @@ double *pointer2 = &a; <ТИП> <ИМЕ>[N] = { <СТОЙНОСТ> }; // дефинира всички N елементи със <СТОЙНОСТ> <ТИП> <ИМЕ>[N] = { <СТОЙНОСТ 1>, <СТОЙНОСТ 2>, ..., <СТОЙНОСТ M> }; // където M <= N -Самото [`<ИМЕ>`] е указател, така че може да достъпваме стойности чрез указателна аритметика: +Самото {` <ИМЕ>} е указател, така че може да достъпваме стойности чрез указателна аритметика: ```cpp int arr[2] = { 83, 18 }; std::cout << (*(arr + 1)) << std::endl; -Връща втория елемент, [`18`]. +Връща втория елемент, {` 18}. Или чрез по-приятния синтаксис с квадратни скоби: @@ -69,7 +72,7 @@ std::cout << (*(arr + 1)) << std::endl; int arr[2] = { 83, 18 }; std::cout << (arr[1]) << std::endl; -Двете неща са еквивалентни, тоест [`name[x]`] е еквивалентно на [`*(name + x)`]. +Двете неща са еквивалентни, тоест {` name[x]} е еквивалентно на {` *(name + x)}. Когато един масив съдържа букви, наричаме го "низ" (string). -За да не трябва да следим дължината на един низ в друга променлива и да трябва да я подаваме, винаги завършваме нашия низ на "терминаращата нула" - [`'\0'`]. +За да не трябва да следим дължината на един низ в друга променлива и да трябва да я подаваме, винаги завършваме нашия низ на "терминаращата нула" - {` '\0'}. diff --git a/src/teaching/upp-2023/week6/index.du b/src/teaching/upp-2023/week6/index.du index f9ff0b1..11cc5ee 100644 --- a/src/teaching/upp-2023/week6/index.du +++ b/src/teaching/upp-2023/week6/index.du @@ -1,8 +1,11 @@ -# Задачи - УПП, Седмица 6, 10.11.2023 +'def title Задачи - УПП, Седмица 6, 10.11.2023 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/BBLlWMOy classroom.github.com/a/BBLlWMOy] +GitHub classroom: {url classroom.github.com/a/BBLlWMOy;https://classroom.github.com/a/BBLlWMOy} ## Задача 1 @@ -12,9 +15,10 @@ GitHub classroom: [url https://classroom.github.com/a/BBLlWMOy classroom.github. N и M са между 1 и 60. -[=Пример:=] +{b Пример:} -:table_2 +:table +:2 |= Вход |= Изход @@ -42,16 +46,17 @@ N и M са между 1 и 60. Разглеждаме числатата от 0 до N. За всяко число знаем колко интервала го включват (покриват). -Тоест в [`0 1 1 0`] означава, че 0 интервала "покриват" числото 0, един интервал покрива числото 1, един интервал покрива числото 2 и 0 покриват числото 3. +Тоест в {` 0 1 1 0} означава, че 0 интервала "покриват" числото 0, един интервал покрива числото 1, един интервал покрива числото 2 и 0 покриват числото 3. Търси се колко различни интервала имаме. Не различаваме между два долепени интервала и един дълъг интервал. От входа получаввате N (от 1 до 30), и след това N на брой числа: броя покриващи интервали за всички числа от 0 до N-1. -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход @@ -84,6 +89,7 @@ N и M са между 1 и 60. |: 5 + ## Задача 3 Трябва да имплементирате дигитална версия на морски шах. @@ -95,17 +101,17 @@ N и M са между 1 и 60. В случай, че игралното поле се запълни и никой не е спечелил, след последното му изкарване трябва да върнете "Draw!" и да спрете програмата. -[=Пример:=] -[*Смесен вход/изход, вход е означен с "$ " преди него*] +{b Пример:} +{i Смесен вход/изход, вход е означен с "$ " преди него} ``` -'include ./ex3-io.txt +'snippet 1 $ ./ex3-io.txt -[=Бонус:=] направете го да работи с NxN брой клетки, като N е число между 1 и 50. +{b Бонус:} направете го да работи с NxN брой клетки, като N е число между 1 и 50. ## Задача 4 -Имплементирайте играта [url https://en.wikipedia.org/wiki/Chomp chomp]: представете си, че имаме един шоколад, разделен на NxM квадратчета. +Имплементирайте играта {url chomp;https://en.wikipedia.org/wiki/Chomp}: представете си, че имаме един шоколад, разделен на NxM квадратчета. Всеки играч избира квадратче (координати), след това изяжда всички парчета, които са в дясно или надолу от квадратчето. Играчът, който изяде квадратчето в горния ляв ъгъл губи играта. @@ -114,15 +120,15 @@ N и M са между 1 и 60. Редуват се първия и втория играч, като всеки въвежда две числа - координати в шоколада (между 1 и N за реда и 1 и M за колоната). Когато някой изяде парчето в горния ляв ъгъл, програмата изкарва "PLAYER wins!" (PLAYER е 1 или 2) и спира изпълнение. -[=Пример=] -[*Смесен вход/изход, вход е означен с "$ " преди него*] +{b Пример} +{i Смесен вход/изход, вход е означен с "$ " преди него} ``` -'include ex4-io.txt +'snippet 1 $ ex4-io.txt ## Задача 5 -[=Тази задача е много трудна, proceed with caution!=] +{b Тази задача е много трудна, proceed with caution!} Ще имплементираме програма, която "симулира" един елементарен компютър. Компютъра ни, като всеки друг, работи само и единствено с цели неотрицателни числа. @@ -133,34 +139,34 @@ N и M са между 1 и 60. Започваме изпълнение от началото на паметта, след като изпълним една инструкция, изпълняваме тази директно до нея, и така докато не стигнем инструкцията "EXT". В такъв случай, изкарваме стойността в регистър B и спираме програмата. -Това са командите, описани във формата "D - [`A B C`]", като D е число, съответстващо на инструкцията с име [`A`] (името го използваме за нас, в кода то не присъства) и аргументи след името [`B`] и [`C`]. -[`MEMORY`] е число, съответстващо на индекс (адрес) в паметта на компютъра (между 0 и 127), а [`VALUE`] е произволна числова стойност. +Това са командите, описани във формата "D - {` A B C}", като D е число, съответстващо на инструкцията с име {` A} (името го използваме за нас, в кода то не присъства) и аргументи след името {` B} и {` C}. +{` MEMORY} е число, съответстващо на индекс (адрес) в паметта на компютъра (между 0 и 127), а {` VALUE} е произволна числова стойност. :unordered -- 0 - [`EXT`] - край на изпълнението на програмата в симулирания компютър +- 0 - {` EXT} - край на изпълнението на програмата в симулирания компютър -- 1 - [`INC MEMORY`] - инкрементира стойността на индекс [`MEMORY`]\n - Пример: [`0 2`] - инкрементира стойността на индекс 2 +- 1 - {` INC MEMORY} - инкрементира стойността на индекс {` MEMORY}\n + Пример: {` 0 2} - инкрементира стойността на индекс 2 -- 2 - [`RIN VALUE MEMORY`] - инкрементира стойността на индекс [`VALUE + MEMORY`]\n - Пример: [`1 3 6`] - инкрементира стойността на адрес [`3 + 6 = 9`] +- 2 - {` RIN VALUE MEMORY} - инкрементира стойността на индекс {` VALUE + MEMORY}\n + Пример: {` 1 3 6} - инкрементира стойността на адрес {` 3 + 6 = 9} -- 3 - [`DEC MEMORY`] - декрементира стойността на индекс [`MEMORY`] +- 3 - {` DEC MEMORY} - декрементира стойността на индекс {` MEMORY} -- 4 - [`RDE VALUE MEMORY`] - декрементира стойността на индекс [`VALUE + MEMORY`] +- 4 - {` RDE VALUE MEMORY} - декрементира стойността на индекс {` VALUE + MEMORY} -- 5 - [`STA MEMORY`] - запазва стойността на индекс [`MEMORY`] в регистъра А\n - Пример: [`4 19`] - запазва стойността на индекс 19 в регистъра А +- 5 - {` STA MEMORY} - запазва стойността на индекс {` MEMORY} в регистъра А\n + Пример: {` 4 19} - запазва стойността на индекс 19 в регистъра А -- 6 - [`RST VALUE MEMORY`] - запазва стойността на адрес [`VALUE + MEMORY`] в регистър А\n - Пример: [`5 2 14`] - запазва стойността на индекс [`2 + 14 = 16`] в регистър А +- 6 - {` RST VALUE MEMORY} - запазва стойността на адрес {` VALUE + MEMORY} в регистър А\n + Пример: {` 5 2 14} - запазва стойността на индекс {` 2 + 14 = 16} в регистър А -- 7 - [`STB MEMORY`] - запазва стойността на индекс [`MEMORY`] в регистъра B +- 7 - {` STB MEMORY} - запазва стойността на индекс {` MEMORY} в регистъра B -- 8 - [`BEQ MEMORY`] - продължава изпълнение от индекс [`MEMORY`], ако стойността в регистъра А е нула\n - Пример: [`7 8`] - продължава изпълнение от индекс 8, ако стойността в регистър А е нула +- 8 - {` BEQ MEMORY} - продължава изпълнение от индекс {` MEMORY}, ако стойността в регистъра А е нула\n + Пример: {` 7 8} - продължава изпълнение от индекс 8, ако стойността в регистър А е нула -- 9 - [`BNE MEMORY`] - продължава изпълнение от индекс [`MEMORY`], ако стойността в регистъра А не е нула +- 9 - {` BNE MEMORY} - продължава изпълнение от индекс {` MEMORY}, ако стойността в регистъра А не е нула В началото получавате N, това са броя числа, които съставят цялата програма. @@ -169,11 +175,12 @@ N и M са между 1 и 60. Ако по време на изпълнение стигнете до инструкция, която не е дефинирана, изкарвате "Error: undefined instruction!" и спирате програмата. Ако някой аргумент е индекс в паметта, обаче стойността му е извън обхвата на паметта, изкарвате "Error: invalid memory address!" и спирате програмата. -Ако няма грешка и програмата успешно стигне до [`EXT`] инструкция, както беше казано, изкарваме на екрана стойността в регистъра B. +Ако няма грешка и програмата успешно стигне до {` EXT} инструкция, както беше казано, изкарваме на екрана стойността в регистъра B. -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход @@ -190,9 +197,10 @@ N и M са между 1 и 60. |: 863461 + .question Какво прави последната програма? -[=Бонус:=] направете програми за симулаторния компютър, които +{b Бонус:} направете програми за симулаторния компютър, които .ordered 1. умножават числата 87401 и 37 2. намира сумата на числата 87, 305, 2, 612, 222 diff --git a/src/teaching/upp-2023/week7/index.du b/src/teaching/upp-2023/week7/index.du index e8173b9..0a576d9 100644 --- a/src/teaching/upp-2023/week7/index.du +++ b/src/teaching/upp-2023/week7/index.du @@ -1,24 +1,28 @@ -# Задачи - УПП, Седмица 7, 17.11.2023 +'def title Задачи - УПП, Седмица 7, 17.11.2023 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/m5M2_CWD classroom.github.com/a/m5M2_CWD] +GitHub classroom: {url classroom.github.com/a/m5M2_CWD;https://classroom.github.com/a/m5M2_CWD} ## Задача 1 -[*Това е почти същата задача като през [url ../week5/#1 седмица 5]*] +{i Това е почти същата задача като през {url седмица 5;../week5/#1}} Дефинираме двуизмерен координат като две числа с плаваща запетая. Направете функция, която получава два двуизмерни координата, покомпонентно ги сумира и връща резултатните координати. Няма как функцията да върне две стойности, затова добаваете още два аргумента, които да са указатели към променливи в които да запазим сумираните координати. -.warn [=Трябва=] да използвате референции вместо указатели! +.warn {b Трябва} да използвате референции вместо указатели! -От входа получавате два координата, след това връщате тяхната покомпонентна сума [=използвайки функцията=]. +От входа получавате два координата, след това връщате тяхната покомпонентна сума {b използвайки функцията}. -[=Пример:=] +{b Пример:} -:table_2 +:table +:2 |= Вход |= Изход @@ -26,23 +30,25 @@ GitHub classroom: [url https://classroom.github.com/a/m5M2_CWD classroom.github. |: 6.1 -99.241 + ## Задача 2 -Един магазин продава три продукта, които ще бележим с [`a`], [`b`] и [`c`]. +Един магазин продава три продукта, които ще бележим с {` a}, {` b} и {` c}. Правим инвентарна система за тези продукти, като за всеки от тях пазим неговата бройка в склада. В началото имаме 0 от всеки продукт. -Получавате букви, докато не стигнете до буквата [`$`]. -Ако буквата е [`a`], [`b`] или [`c`], тогава този продукт става "сегашния" продукт. -Ако буквата е [`S`], тогава намаляте бройката на сегашния продукт с 1, а ако е [`R`] - увеличаваме с 10. +Получавате букви, докато не стигнете до буквата {` $}. +Ако буквата е {` a}, {` b} или {` c}, тогава този продукт става "сегашния" продукт. +Ако буквата е {` S}, тогава намаляте бройката на сегашния продукт с 1, а ако е {` R} - увеличаваме с 10. -.warn [=НЕ=] може да използвате масиви! [=Трябва=] действията на [`S`] и [`R`] да се изкарат във функции! +.warn {b НЕ} може да използвате масиви! {b Трябва} действията на {` S} и {` R} да се изкарат във функции! -Когато получите [`$`], изкарвате броя на всеки продукт и спирате програмата. +Когато получите {` $}, изкарвате броя на всеки продукт и спирате програмата. -[=Пример:=] +{b Пример:} -:table_2 +:table +:2 |= Вход |= Изход @@ -50,23 +56,25 @@ GitHub classroom: [url https://classroom.github.com/a/m5M2_CWD classroom.github. |: а: 23 b: 17 c: 9 + ## Задача 3 -В началото получавате буква - тя съответства на дадена [=функция=], след това получавате 5 числа с плаваща запетая. +В началото получавате буква - тя съответства на дадена {b функция}, след това получавате 5 числа с плаваща запетая. След всяко въведено трябва да изкарате резултата от съответната функция при подадено входното число. -.warn [=Трябва=] да използвате указател към функция! +.warn {b Трябва} да използвате указател към функция! Буквите съответстват на следните функции: .bulleted -- [`a`] - модул на стойност -- [`s`] - стойност на втора степен -- [`h`] - занулена частта след запетаята -- [`f`] - занулена частта преди (в ляво от) запетаята +- {` a} - модул на стойност +- {` s} - стойност на втора степен +- {` h} - занулена частта след запетаята +- {` f} - занулена частта преди (в ляво от) запетаята -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход @@ -83,6 +91,7 @@ GitHub classroom: [url https://classroom.github.com/a/m5M2_CWD classroom.github. |: 0.5 -0.3 0.994 0 -0.003 + ## Задача 4 Ще имлементираме система за задачи. @@ -95,25 +104,25 @@ GitHub classroom: [url https://classroom.github.com/a/m5M2_CWD classroom.github. ``` N. [C] TASK -Където [`N`] е нейния номер (индекс), [`C`] е шпация или буквата "x" (шпация когато не е изпълнена, и "х" когато е), [`TASK`] е самия низ на задачата. +Където {` N} е нейния номер (индекс), {` C} е шпация или буквата "x" (шпация когато не е изпълнена, и "х" когато е), {` TASK} е самия низ на задачата. -Програмата получава букви, докато не получи буквата [`$`]. +Програмата получава букви, докато не получи буквата {` $}. Всяка буква определя някакво действие: .bulleted -- при [`p`] изкарваме на екрана всички задачи -- при [`d`] изкарваме на екрана всички завършени задачи -- при [`t`] изкарваме на екрана всички незавършени задачи -- след [`a`] въвеждаме нова (незавършена) задача на последния свободен индекс\n +- при {` p} изкарваме на екрана всички задачи +- при {` d} изкарваме на екрана всички завършени задачи +- при {` t} изкарваме на екрана всички незавършени задачи +- след {` a} въвеждаме нова (незавършена) задача на последния свободен индекс\n Ако вече пазим 64 задачи, трябва да изкараме грешка на екрана и да продължим с програмата. -- след [`c`] въвеждаме номер на задача и обръщаме нейната изпълненост: ако е изпълнена, става неизпълнена, и ако е неизпълнена, става изпълнена +- след {` c} въвеждаме номер на задача и обръщаме нейната изпълненост: ако е изпълнена, става неизпълнена, и ако е неизпълнена, става изпълнена В началото на програмата нямаме никакви задачи. -[=Пример:=] -[*Смесен вход/изход, изход е отбелязан с "> ". Забележете, че има шпации в края на низове за задачи.*] +{b Пример:} +{i Смесен вход/изход, изход е отбелязан с "> ". Забележете, че има шпации в края на низове за задачи.} ``` -'include ex4-io.txt +'snippet 1 $ ex4-io.txt ## Задача 5 @@ -124,34 +133,34 @@ N. [C] TASK След това получавате произволен брой команди - букви с възможна последователност от стойности. Трябва да имплементирате следните команди: .bulleted -- [`s`] - изкарвате изображението на екрана -- [`r`] - завъртате изображението по часовниковата стрелка с 90 градуса -- [`l`] - завъртате изображението обратно на часовниковата стрелка с 90 градуса -- [`h`] - обръщате изображението по хоризонтала (първи и последен ред се разменят, след това втори и предпоследен и так. нат.) -- [`v`] - обръщате изображението по вертикалата (първа и последна колона се разменят, след това втора и предпоследна и так. нат.) -- [`f`] - след този знак получавате още 4 стойности - това са два координата върху изображението, и трябва да запълните с бяло правоъгълна област с горен ляв ъгъл в първата точка и с долен десен ъгъл във втората точка. +- {` s} - изкарвате изображението на екрана +- {` r} - завъртате изображението по часовниковата стрелка с 90 градуса +- {` l} - завъртате изображението обратно на часовниковата стрелка с 90 градуса +- {` h} - обръщате изображението по хоризонтала (първи и последен ред се разменят, след това втори и предпоследен и так. нат.) +- {` v} - обръщате изображението по вертикалата (първа и последна колона се разменят, след това втора и предпоследна и так. нат.) +- {` f} - след този знак получавате още 4 стойности - това са два координата върху изображението, и трябва да запълните с бяло правоъгълна област с горен ляв ъгъл в първата точка и с долен десен ъгъл във втората точка. В един координат първо посочваме реда и след това колоната, като координатите започват от 0, от горния ляв ъгъл. -- [`c`] - почти същото като [`f`], обаче запълвате с черно, не с бяло +- {` c} - почти същото като {` f}, обаче запълвате с черно, не с бяло -[=Пример:=] -[*Смесен вход/изход*] +{b Пример:} +{i Смесен вход/изход} ``` -'include ex5-io.txt +'snippet 1 $ ex5-io.txt ## Задача 6 -Ще имплементираме програма, която намира състоянието на един [url https://en.wikipedia.org/wiki/Elementary_cellular_automaton елементарен едноклетъчен автомат] след даден брой генерации и определено правило. +Ще имплементираме програма, която намира състоянието на един {url елементарен едноклетъчен автомат;https://en.wikipedia.org/wiki/Elementary_cellular_automaton} след даден брой генерации и определено правило. Задачата изглежда сложна, но не е толкова зле. За нашите цели, един "елементарен едноклетъчен автомат" е просто един голям булев масив. -Ще наричаме стойност [`true`] жива и стойност [`false`] мъртва. +Ще наричаме стойност {` true} жива и стойност {` false} мъртва. За всяка клетка в масива имаме правила, в зависимост от стойностите на клетката в ляво и в дясно променяме сегашната клетка. Направили сме една "генерация" след като обиколим всички клетки един път (от ляво на дясно) и обновим техните стойности. -Би трябвало това да ви напомня на [url https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life играта "Живот"] от [url https://en.wikipedia.org/wiki/John_Horton_Conway John Conway]. +Би трябвало това да ви напомня на {url играта "Живот";https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life} от {url John Conway;https://en.wikipedia.org/wiki/John_Horton_Conway}. -Конкретните правила са тези при [url https://en.wikipedia.org/wiki/Rule_30 "правило 30"].\n +Конкретните правила са тези при {url "правило 30";https://en.wikipedia.org/wiki/Rule_30}.\n Ако сегашната клетка е жива: .bulleted - става мъртва, ако тази в ляво е жива diff --git a/src/teaching/upp-2023/week8/index.du b/src/teaching/upp-2023/week8/index.du index 16a92c9..08318b6 100644 --- a/src/teaching/upp-2023/week8/index.du +++ b/src/teaching/upp-2023/week8/index.du @@ -1,10 +1,13 @@ -# Задачи - УПП, Седмица 8, 24.11.2023 +'def title Задачи - УПП, Седмица 8, 24.11.2023 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/Big7FRUG classroom.github.com/a/Big7FRUG] +GitHub classroom: {url classroom.github.com/a/Big7FRUG;https://classroom.github.com/a/Big7FRUG} -.warn [=Трябва=] да използвате възможно най-малко памет във всички задачи! +.warn {b Трябва} да използвате възможно най-малко памет във всички задачи! ## Задача 1 @@ -15,9 +18,10 @@ GitHub classroom: [url https://classroom.github.com/a/Big7FRUG classroom.github. Броим позициите на числата от 1, тоест в "8 5 9 7", 8 е на позиция 1, 5 е на позиция 2, 9 е на позиция 3 и 7 е на позиция 4. "Всяко второ число" са числата 5 и 7, докато "всяко трето" е само числото 9. -[=Пример:=] +{b Пример:} -:table_2 +:table +:2 |= Вход |= Изход @@ -32,6 +36,7 @@ GitHub classroom: [url https://classroom.github.com/a/Big7FRUG classroom.github. 2 54 + ## Задача 2 Получавате и запазвате цели числа, докато не получите числото 0. @@ -43,9 +48,10 @@ GitHub classroom: [url https://classroom.github.com/a/Big7FRUG classroom.github. След ротацията трябва да изкарате числата на екрана. -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход @@ -59,14 +65,16 @@ GitHub classroom: [url https://classroom.github.com/a/Big7FRUG classroom.github. |: 983 473 103 1 4 + ## Задача 3 Получавате цяло положително число N и след това получавате всички коефициенти в матрица NxN. Трябва да изкарате редицата числа, получена чрез умножаване на първия ред по всяка колона от същата матрица. -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход @@ -100,9 +108,10 @@ GitHub classroom: [url https://classroom.github.com/a/Big7FRUG classroom.github. Накрая трябва да изкарате получената редица стойности. При изкарване трябва да пропуснете незапълнени клетки. -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход @@ -116,11 +125,12 @@ GitHub classroom: [url https://classroom.github.com/a/Big7FRUG classroom.github. |: 96 56 96 90 33 15 43 73 17 + ## Задача 5 Получавате цели числа от входа, докато не получите числото 0. Представете си една права "по средата" на масива, вмъквате първото число в ляво от правата, второто в дясно, после пак в ляво и четвъртото в дясно и так. нат. -Пример: ако са въведени числата "1 2 3 4", и си представяме правата [`|`], при първото число правим [`1|`], при второто [`1|2`], при третото [`1 3|2`] и при четвъртото [`1 3|4 2`], тоест финалната редица е "1 3 4 2". +Пример: ако са въведени числата "1 2 3 4", и си представяме правата {` |}, при първото число правим {` 1|}, при второто {` 1|2}, при третото {` 1 3|2} и при четвъртото {` 1 3|4 2}, тоест финалната редица е "1 3 4 2". Друг начин по който да го разберем, е че първото число е на първа позиция, второто число е на последната, третото число е на втора позиция, четвъртото е на предпоследна и так. нат. Обаче ние не знаем финалния размер на масива, затова се нуждаем от логиката с чертата. @@ -130,9 +140,10 @@ GitHub classroom: [url https://classroom.github.com/a/Big7FRUG classroom.github. Напомням, че тази права само си я представяте. В началото масива е с размер 2. -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход @@ -143,9 +154,10 @@ GitHub classroom: [url https://classroom.github.com/a/Big7FRUG classroom.github. |: 85 26 45 48 11 56 78 18 41 38 43 + ## Задача 6 -Трябва да направите интерпретатор за програмния език [url https://en.wikipedia.org/wiki/Brainfuck brainfuck]. +Трябва да направите интерпретатор за програмния език {url brainfuck;https://en.wikipedia.org/wiki/Brainfuck}. В него имате 8 команди/инструкции, всяка от които се изразява с един знак. Запазвате в паметта няколко неща: вашата brainfuck програма, паметта на "машината", къде се намирате в програмата и къде се намирате в паметта на "машината". @@ -155,21 +167,22 @@ GitHub classroom: [url https://classroom.github.com/a/Big7FRUG classroom.github. Самите команди (знаци), които съставят една brainfuck програма са: .bulleted -- [`>`]: сегашната клетка (къде се намирате в паметта на "машината") става тази в дясно -- [`<`]: сегашната клетка става тази в ляво -- [`+`]: инкрементира стойността в сегашната клетка с едно -- [`-`]: декрементира стойността в сегашната клетка с едно -- [`.`]: изкарва стойността в сегашната клетка (като число) -- [`,`]: приема от входа едно число и го записва в сегашната клетка -- [`\[`]: ако стойността в сегашната клетка е 0, тогава програмата "скача" напред към знака след съответната [`\]`] -- [`\]`]: ако стойността в сегашната клетка не е 0, тогава програмата "скача" назад към знака след съответната [`\[`] +- {` >}: сегашната клетка (къде се намирате в паметта на "машината") става тази в дясно +- {` <}: сегашната клетка става тази в ляво +- {` +}: инкрементира стойността в сегашната клетка с едно +- {` -}: декрементира стойността в сегашната клетка с едно +- {` .}: изкарва стойността в сегашната клетка (като число) +- {` ,}: приема от входа едно число и го записва в сегашната клетка +- {` [}: ако стойността в сегашната клетка е 0, тогава програмата "скача" напред към знака след съответната {` ]} +- {` ]}: ако стойността в сегашната клетка не е 0, тогава програмата "скача" назад към знака след съответната {` [} -От входа ще получавате редица знаци, които ще съставят вашата brainfuck програма, като при знака [`$`] входът спира и трябва да започнете изпълнение на brainfuck кода. +От входа ще получавате редица знаци, които ще съставят вашата brainfuck програма, като при знака {` $} входът спира и трябва да започнете изпълнение на brainfuck кода. Не знаете колко памет на "машината" ще ви трябва, затова бъдете готови да я разширявате при нужда. -[=Пример:=] +{b Пример:} -:table_2 +:table +:2 |= Вход |= Изход @@ -177,6 +190,7 @@ GitHub classroom: [url https://classroom.github.com/a/Big7FRUG classroom.github. |: 7 + ## Задача 7 Нека да направим една игра, ще я наричамe "коридорен dungeon". @@ -224,4 +238,4 @@ GitHub classroom: [url https://classroom.github.com/a/Big7FRUG classroom.github. Всеки допълнителен телепортер, извън първоначалния с който спирате играта, ви носи още 50 точки. На всеки ход трябва да изкарате броя точки живот на играча, броя точки живот които меча му отнема, сегашната стая в която се намира, левите 5 стаи и десните 5 стаи. -Една стая е изобразена със знака [`?`] ако не е посетена, [` `] ако е празна, [`c`] ако има съкровище, [`m`] ако има чудовище и [`t`] ако има тунел. +Една стая е изобразена със знака {` ?} ако не е посетена, {` } ако е празна, {` c} ако има съкровище, {` m} ако има чудовище и {` t} ако има тунел. diff --git a/src/teaching/upp-2023/week9/index.du b/src/teaching/upp-2023/week9/index.du index 9e93216..9c16c51 100644 --- a/src/teaching/upp-2023/week9/index.du +++ b/src/teaching/upp-2023/week9/index.du @@ -1,19 +1,23 @@ -# Задачи - УПП, Седмица 9, 01.12.2023 +'def title Задачи - УПП, Седмица 9, 01.12.2023 +'def desc Условия на задачите за упражнение + +# {title} \n -GitHub classroom: [url https://classroom.github.com/a/lGXxCRZO classroom.github.com/a/lGXxCRZO] +GitHub classroom: {url classroom.github.com/a/lGXxCRZO;https://classroom.github.com/a/lGXxCRZO} .warn Освен ако не е казано друго, може да зачитате, че максималната дължина на един низ е 1024 знака. ## Задача 1 Получавате от входа два низа. -Трябва да изкарате на екрана низ, при който има знакът "\_" на индексите, където буквите между двата низа се различават, и съответната буква, когато не се различават. +Трябва да изкарате на екрана низ, при който има знакът "_" на индексите, където буквите между двата низа се различават, и съответната буква, когато не се различават. -[=Пример:=] +{b Пример:} -:table_2 +:table +:2 |= Вход |= Изход @@ -27,6 +31,7 @@ AKDDCP A__D__ + ## Задача 2 От входа получавате число N и на следващия ред получавате низ с толкова на брой знака. @@ -35,9 +40,10 @@ A__D__ .important Трябва да използвате динамична памет -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход @@ -60,14 +66,16 @@ ABCKLMN KLMNABC + ## Задача 3 От входа получаввате един низ, трябва да изкарате броя думи в него. Думите се разделят с една или повече шпации, като знаци (точка, запетая, удивителна, ...) не са думи. -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход @@ -90,13 +98,14 @@ This , is , a , sentence .! |: 4 + ## Задача 4 Една от ранните програми за Apple I компютърът, написана от Steve Wozniak в упътването на компютъра, е така наречената "Woz Monitor", или wozmon за картко. Тя позволява да погледнеш стойностите в клетки от паметта, да запишеш стойности и да стартираш програми. Игнорирайки последната му възможност, нека да го имплементираме. -За нашите цели, паметта на компютъра е просто един масив, които ще расте [=когато е нужно=]. +За нашите цели, паметта на компютъра е просто един масив, които ще расте {b когато е нужно}. Ще адресираме (индексираме) стойностите от масива с числа от 16-тична бройна система. Когато въведем низ във формата: @@ -121,9 +130,10 @@ This , is , a , sentence .! - "адрес: стойност ...", като предходното, обаче може да определим стойностите на сегашната и на следващите клетки (пак изкарваме във формата "X: V ...") -[=Примери:=] +{b Примери:} -:table_2 +:table +:2 |= Вход |= Изход @@ -176,6 +186,7 @@ This , is , a , sentence .! 9: ABB 8A 99 0 + ## Задача 5 Перфокартите са стар формат за съхраняване на текст (код) върху хартиен носител, който е четим от машини. @@ -188,7 +199,7 @@ This , is , a , sentence .! Трябва да имплементирате програма, която получава перфо карти в стандартния IBM формат: 12 реда и 80 колони и изкарва съответния ред, който е закодиран. Тоест, от входа получавате 12 низа, всеки низ е с дължина 80, и са съставени от 0 и 1.\n -Стойностите [=по колони=]: +Стойностите {b по колони}: .bulleted - от "100000000000" до "000000000001" (със само една 1ца) съответстват на знаците "&", "-", "0", "1", ... "9". @@ -196,9 +207,10 @@ This , is , a , sentence .! - от "010100000000" до "010000000001" (с две 1ци, едната която е винаги втората) съответстват на знаците от "J" до "R". - от "001100000000" до "001000000001" (с две 1ци, едната която е винаги третата) съответстват на знаците "/", "S", ... "Z". -[=Пример:=] +{b Пример:} -:table_2 +:table +:2 |= Вход |= Изход @@ -220,6 +232,7 @@ This , is , a , sentence .! |: &-0123456789ABCDEFGHIJKLMNOPQR/STUVWXYZ + ## Задача 6 Регулярните изрази са низове, които позволяват да опишем шаблони, с които да филтрираме/приемаме низове. @@ -232,21 +245,21 @@ This , is , a , sentence .! - ако не е някой от горните знаци, тогава искаме сегашната буква да бъде равна на тази в израза :unordered -1. Какво описва регулярният израз [`aa*bcd`]? +1. Какво описва регулярният израз {` aa*bcd}? .p - Първата буква от нашия низ трябва да бъде [`а`]. - След това имаме [`a*`], след тази първа буква може да имаме 0 или повече [`a`]-та. - Тоест втората буква може да бъде [`a`] или [`b`], ако е [`a`], третата буква може да бъде [`a`] или [`b`], обаче ако втората буква е [`b`], тогава продължаваме напред и останалите букви трябва да са [`bcd`]. + Първата буква от нашия низ трябва да бъде {` а}. + След това имаме {` a*}, след тази първа буква може да имаме 0 или повече {` a}-та. + Тоест втората буква може да бъде {` a} или {` b}, ако е {` a}, третата буква може да бъде {` a} или {` b}, обаче ако втората буква е {` b}, тогава продължаваме напред и останалите букви трябва да са {` bcd}. .p - Тоест, този регулярен израз приема низове, които започват с [`a`], след това имат 0 или повече [`a`]-та и завършват на [`bcd`]. + Тоест, този регулярен израз приема низове, които започват с {` a}, след това имат 0 или повече {` a}-та и завършват на {` bcd}. Следните низове ще бъдат приети: "abcd", "aabcd", "aaabcd", "aaaabcd" и так. нат. -2. Какво описва регулярният израз [`b*cd?`]? +2. Какво описва регулярният израз {` b*cd?}? .p - В началото имаме [`b`] нула или повече пъти, след това имаме [`c`] и накрая имаме нула или едно [`d`]. + В началото имаме {` b} нула или повече пъти, след това имаме {` c} и накрая имаме нула или едно {` d}. Следните низове ще бъдат приети: "c", "bc", "bbc", "bbbc", ..., "cd", "bcd", "bbcd", ... @@ -257,8 +270,8 @@ This , is , a , sentence .! В противен случай изкарвате "No match". Ако регулярния израз е в грешен формат (срещнете "?" или "\*" като първи знак), трябва да изкарате "Bad regex". -[=Пример:=] -[*Смесен вход/изход*] +{b Пример:} +{i Смесен вход/изход} ``` -'include ./ex6-io.txt +'snippet 1 $ ./ex6-io.txt diff --git a/src/teaching/upp-2025/cpp-pitfalls/index.du b/src/teaching/upp-2025/cpp-pitfalls/index.du index 8a6936b..09b9339 100644 --- a/src/teaching/upp-2025/cpp-pitfalls/index.du +++ b/src/teaching/upp-2025/cpp-pitfalls/index.du @@ -1,37 +1,37 @@ -# Капани в C++ - УПП, КН, 2025-2026 +'def title Капани в C++ - УПП, КН, 2025-2026 +'def desc Помощна страница с кажи-речи всички странности и неприятности, които трябва да се знаят за УП курса. -'define expected-reading 15 min -'define created 22 November 2025 -'define edited 23 November 2025 -[$pagenav] +# {title} + +{pagenav 15 min;22 November 2025;23 November 2025} .warn Този документ ще бъде обновяван до края на курса. Моля, следете за промени! -[$br2] +{br2} :contents :numbered -1. [url #section-1 Лоши практики] +1. {uhref Лоши практики} .numbered - 1. [url #section-2 Записване/връщане на булеви стойности] + 1. {uhref Записване/връщане на булеви стойности} -2. [url #section-3 Оператори] +2. {uhref Оператори} .numbered - 1. [url #section-4 Типове на аритметични операции] - 2. [url #section-5 Лениво оценяване на булеви изрази] + 1. {uhref Типове на аритметични операции} + 2. {uhref Лениво оценяване на булеви изрази} -3. [url #undefined-behaviour Undefined behaviour] +3. {uhref Undefined behaviour} .numbered - 1. [url #section-6 Приоритет на скоби спрямо аритметични оператори] + 1. {uhref Приоритет на скоби спрямо аритметични оператори} -5. [url #section-7 Масиви и матрици] +5. {uhref Масиви и матрици} .numbered - 1. [url #section-8 Връщане на масиви] - 2. [url #section-9 Инициализация на масиви] - 3. [url #section-10 Масиви с неконстантен размер] - 4. [url #-int73-vs-int3-vs-int Тип на матрици (int[7\][3\] vs int(*)[3\] vs int**)] + 1. {uhref Връщане на масиви} + 2. {uhref Инициализация на масиви} + 3. {uhref Масиви с неконстантен размер} + 4. {uhref Тип на матрици (int[7][3] vs int(*)[3] vs int**)} @@ -48,24 +48,24 @@ Когато запишем булева стойност в променлива, лоша практика е да направим нещо такова: -```c++ +```cpp if (condition) myvar = true; else myvar = false; -Стойността на [`condition`] е булева сама по себе си, добрата практика е директно да запишем стойността: +Стойността на {` condition} е булева сама по себе си, добрата практика е директно да запишем стойността: -```c++ +```cpp myvar = condition; -Като [`condition`] е какъвто и да е булев израз. +Като {` condition} е какъвто и да е булев израз. -[$br2] +{br2} Еквивалентно имаме случая: -```c++ +```cpp bool f() { if (condition) return true; @@ -73,24 +73,24 @@ bool f() { return false; } -Коректното е просто да върнем [`condition`], тя е булева: +Коректното е просто да върнем {` condition}, тя е булева: -```c++ +```cpp bool f() { return condition; } -[$br2] +{br2} Трябва да е очевидно, но изрази от типа на: -```c++ +```cpp if (condition) myvar = false; else myvar = true; -```c++ +```cpp bool f() { if (condition) return false; @@ -101,10 +101,10 @@ bool f() { Спадат в същата категория. Резултата просто трябва да се обърне, булево: -```c++ +```cpp myvar = !condition; -```c++ +```cpp bool f() { return !condition; } @@ -117,7 +117,7 @@ bool f() { И върната стойност е от този тип. Например: -```c++ +```cpp int x = 5; double y = 6; std::cout << (x * y); // double е по-голямо от int, @@ -126,7 +126,7 @@ std::cout << (x * y); // double е по-голямо от int, Ефекта от това е, че деление на цели числа връща цяло число (което закръгля резултата). Например: -```c++ +```cpp int x = 5, y = 8; std::cout << (x / y); // деление на цели числа, резултата се закръгля надолу std::cout << (double)(x / y); // резултата от деление вече е закръглен, @@ -141,42 +141,42 @@ std::cout << ((double)x / y); // едното вече е с плаваща за Двата главни примера се срещат при оператори "и" и "или". -[$br2] +{br2} -```c++ +```cpp a || b || c || d -Ако [`a`] е истина, тогава другите няма да се изпълнят, защото тяхната стойност не е от значение, общия израз ще си остане истина. -Аналогично, ако [`a`] е лъжа, но [`b`] е истина, тогава [`c`] и [`d`] няма да се изпълнят. +Ако {` a} е истина, тогава другите няма да се изпълнят, защото тяхната стойност не е от значение, общия израз ще си остане истина. +Аналогично, ако {` a} е лъжа, но {` b} е истина, тогава {` c} и {` d} няма да се изпълнят. -[$br2] +{br2} -```c++ +```cpp a && b && c && d Напълно еквивалентно работи и "или". -Ако [`a`] е лъжа, тогава другите няма да се изпълнят, защото общия израз ще си остане лъжа. +Ако {` a} е лъжа, тогава другите няма да се изпълнят, защото общия израз ще си остане лъжа. -[$br2] +{br2} Това е релевантно когато използваме присвояващи оператори в логически условия, например: -```c++ +```cpp if (condition1 && ((myvar += 5) == 8)) и когато използваме функции: -```c++ +```cpp if (condition1 && f()) -И в двата случая, ако [`condition1`] е лъжа, тогава присвояването и извикването на функцията няма да се изпълнят. +И в двата случая, ако {` condition1} е лъжа, тогава присвояването и извикването на функцията няма да се изпълнят. Дали това е желан ефект или не зависи от кода. ## Undefined behaviour C++ наследява идеята от C, че някои неща в стандарта на езика не са дефинирани. -Тоест, какво ще се случи зависи от имплементацията на компилатора (това което превръща кода в [`.exe`]) и често се срещат разлики. +Тоест, какво ще се случи зависи от имплементацията на компилатора (това което превръща кода в {` .exe}) и често се срещат разлики. ### Приоритет на скоби спрямо аритметични оператори @@ -186,37 +186,37 @@ C++ наследява идеята от C, че някои неща в стан Този ефект е значим само при употреба на присвояващи оператори. Например: -```c++ +```cpp int x = 9; int y = (x += 5) * (x += 1) * (x -= 8); -Има два начина да се изчисли стойността на [`y`]: +Има два начина да се изчисли стойността на {` y}: :ordered 1. Първо изчисляваме всички изрази в скобите и след това изпълняваме умноженията. .p - Тоест, първо правим [`x += 5`], после [`x += 1`] и след това [`x -= 8`]. - Това променя стойността на [`x`] на 7 и стойността на [`y`] се свежда до [`x * x * x = 343`] + Тоест, първо правим {` x += 5}, после {` x += 1} и след това {` x -= 8}. + Това променя стойността на {` x} на 7 и стойността на {` y} се свежда до {` x * x * x = 343} 2. Първо изчисляваме умноженията. Това означава, че първо "слагаме" скоби около умноженията; израза се изпълнява все едно е: - ```c++ + ```cpp ((x += 5) * (x += 1)) * (x -= 8) .p - [*(Умножението е ляво асоциативно)*] + {i (Умножението е ляво асоциативно)} .p - Тоест, първо правим [`x += 5`] и след това [`x += 1`]. - Стойността на [`x`] е 15 и в големите скоби изчисляваме [`x * x = 225`]. + Тоест, първо правим {` x += 5} и след това {` x += 1}. + Стойността на {` x} е 15 и в големите скоби изчисляваме {` x * x = 225}. Сега израза се свежда до: - ```c++ + ```cpp 225 * (x -= 8) - Изпълнява се [`x -= 8`], [`x`] става 7, и [`y`] се свежда до [`225 * 7 = 1575`]. + Изпълнява се {` x -= 8}, {` x} става 7, и {` y} се свежда до {` 225 * 7 = 1575}. Първия метод се изпълнява от компилатора на Visual Studio, втория метод от gcc (много популярен C++ компилатор под Linux/MacOS). @@ -224,7 +224,7 @@ int y = (x += 5) * (x += 1) * (x -= 8); ## Масиви и матрици .important -Всички неща, които важат за статично-заделени масиви ([`int arr[5];`]), важат и за статично-заделени матрици ([`int mat[5][6];`])! +Всички неща, които важат за статично-заделени масиви ({` int arr[5];}), важат и за статично-заделени матрици ({` int mat[5][6];})! ### Връщане на масиви @@ -235,7 +235,7 @@ int y = (x += 5) * (x += 1) * (x -= 8); Например (да, в C++ можем да правим ей така обхвати): -```c++ +```cpp int main() { { int a = 5; // a се създава @@ -252,33 +252,33 @@ int main() { } // b се освобождава } -Като цяло, няма особено значение дали говорим за къдравите скоби на функция, на [`if`], на цикъл, ... +Като цяло, няма особено значение дали говорим за къдравите скоби на функция, на {` if}, на цикъл, ... -[$br2] +{br2} -Затова следното е [=грешно=]: +Затова следното е {b грешно}: -```c++ +```cpp int* f() { int arr[5] = { 1, 2, 3, 4, 5 }; return arr; } -[`arr`] е адрес в паметта (индекс, позиция, ..., която посочва клетка в паметта), някакво число. +{` arr} е адрес в паметта (индекс, позиция, ..., която посочва клетка в паметта), някакво число. -След като функцията свърши изпълнение и се върне стойността, ще сме "стигнали" къдравата скоба и [`arr`] ще бъде освободено. +След като функцията свърши изпълнение и се върне стойността, ще сме "стигнали" къдравата скоба и {` arr} ще бъде освободено. Може да зачитате, че стойностите се унищожават в този момент. Обаче, адреса сам по себе си е число, което си се връща и ние можем да работим с него както си искаме. -Тоест, [=C++ няма да ни се скара, че използваме масив, въпреки че той е, на практика, унищожен!=] +Тоест, {b C++ няма да ни се скара, че използваме масив, въпреки че той е, на практика, унищожен!} -[$br2] +{br2} -Ако искаме действително да върнем масив от стойности, трябва да го създадем в [=обхвата в който функцията се извиква и да го подадем като аргумент.=] +Ако искаме действително да върнем масив от стойности, трябва да го създадем в {b обхвата в който функцията се извиква и да го подадем като аргумент.} Например: -```c++ +```cpp void f(int* arr) { /* ... */ arr[0] = 28; @@ -295,111 +295,111 @@ int main() { Често използваме нотацията за къдрави скоби да инициализираме елементите на масив: -```c++ +```cpp int arr1[3] = { 1, 2, 3 }; Ако искаме да напълним масива с нули, често правим: -```c++ +```cpp int arr2[3] = { 0 }; -Обаче, ако примерно се опитаме да напълним масива с единици, тогава следното [=няма=] да проработи: +Обаче, ако примерно се опитаме да напълним масива с единици, тогава следното {b няма} да проработи: -```c++ +```cpp int arr3[3] = { 1 }; -[$br2] +{br2} Инициализацията чрез къдрави скоби работи по следния начин: всички елементи в масива се попълват спрямо подадените елементи в къдравите скоби. -[=Ако в къдравите скоби има по-малко елементи отколкото е голям масива, останалите елементи се попълват с нули!=] +{b Ако в къдравите скоби има по-малко елементи отколкото е голям масива, останалите елементи се попълват с нули!} -Тоест, в [`arr2`] ние попъляваме първия елемент да е нула, и останалите стават нули по подразбиране. -В [`arr3`] попълваме първия елемент да е единица и останалите стават нули по подразбиране. +Тоест, в {` arr2} ние попъляваме първия елемент да е нула, и останалите стават нули по подразбиране. +В {` arr3} попълваме първия елемент да е единица и останалите стават нули по подразбиране. Това навява на мисълта, дали не можем в C++ да пропуснем записването на първия елемент, когато искаме всичко да е нула? Можем! -```c++ +```cpp int arr4[3] = { }; // попълва arr4 с нули -[$br2] +{br2} Коректния метод, ако искаме да напълним масива с друг елемент, е да използваме цикъл. Например: -```c++ +```cpp for (int i = 0; i < 3; i++) arr[i] = 1; ### Масиви с неконстантен размер -[=Не=] позволяваме в този курс да правите такива неща: +{b Не} позволяваме в този курс да правите такива неща: -```c++ +```cpp int size; std::cin >> size; int arr[size]; -Въпреки че това [*може*] да се компилира и да работи. +Въпреки че това {i може} да се компилира и да работи. -Причината е защото този тип масиви се наричат [url https://en.wikipedia.org/wiki/Variable-length_array VLA]. -И в [=C++ VLA-ове не са позволени!=] +Причината е защото този тип масиви се наричат {url VLA;https://en.wikipedia.org/wiki/Variable-length_array}. +И в {b C++ VLA-ове не са позволени!} Въпреки това, много компилатори ги поддържат, главно защото много C++ компилатори са и C компилатори (и VLA-ове са позволени в C). -[=Единствения=] коректен метод да създадем масив, чиито размер не знаем предварително, е чрез динамича памет. +{b Единствения} коректен метод да създадем масив, чиито размер не знаем предварително, е чрез динамича памет. ### Тип на матрици (int[7][3] vs int(*)[3] vs int**) -```c++ +```cpp int mat[7][3]; -Какъв е типа на [`mat`]? +Какъв е типа на {` mat}? -От една страна е [`int[7][3]`]. -Но какъв е типа като указател, тоест когато няма въведени редове [=и=] колони? +От една страна е {` int[7][3]}. +Но какъв е типа като указател, тоест когато няма въведени редове {b и} колони? -Отговорите са два: [`int(*)[3]`] и [`int*`]. +Отговорите са два: {` int(*)[3]} и {` int*}. Ето защо. -[$br2] +{br2} Да си припомним как работят нормалните масиви. Когато декларираме следното: -```c++ +```cpp int arr[14]; -Тогава в паметта се [*използва*] (заделя) [=последователност=] от клетки, която побира 14 [`int`] стойности. +Тогава в паметта се {i използва} (заделя) {b последователност} от клетки, която побира 14 {` int} стойности. -Също да си припомним, че [`arr`] е указател към първата от тези клетки. +Също да си припомним, че {` arr} е указател към първата от тези клетки. -На кратко, това означава че [`arr`] е адрес (индекс, позиция, ..., число което посочва в коя клетка на паметта се намираме). +На кратко, това означава че {` arr} е адрес (индекс, позиция, ..., число което посочва в коя клетка на паметта се намираме). Финално припомняме, че индексирането в масив е същото като отместване на адреса. -Т.е. [`arr[6]`] е еквивалентно на [`*(arr + 6)`]. +Т.е. {` arr[6]} е еквивалентно на {` *(arr + 6)}. -На кратко, ние преместваме нашия адрес (индекс в паметта) напред с 6 позиции и с [`*`] дереферираме (прочитаме стойността на подадения адрес). +На кратко, ние преместваме нашия адрес (индекс в паметта) напред с 6 позиции и с {` *} дереферираме (прочитаме стойността на подадения адрес). -Това означава, че [=всички елементи в масива е нужно да бъдат поставени последователно в паметта=]. +Това означава, че {b всички елементи в масива е нужно да бъдат поставени последователно в паметта}. -[$br2] +{br2} -Двумерните масиви [=работят по същия начин!=] +Двумерните масиви {b работят по същия начин!} -В декларацията на [`mat`], в паметта се заделя последователност от клетки в паметта, равна на размера на матрицата. -Тоест [`7 * 3 = 21`] [=последователни=] [*позиции*] в паметта. +В декларацията на {` mat}, в паметта се заделя последователност от клетки в паметта, равна на размера на матрицата. +Тоест {` 7 * 3 = 21} {b последователни} {i позиции} в паметта. -Тогава, [`mat[2][1]`] на какво е еквивалентно? +Тогава, {` mat[2][1]} на какво е еквивалентно? -Отговорът е [`*(mat + 2 * 7 + 1)`]. +Отговорът е {` *(mat + 2 * 7 + 1)}. Нашата таблица е разположена като последователност от клетки, където първо имаме клетките от първи ред, след това от втория ред и так. нат. Например, при следната дефиниция на матрица: -```c++ +```cpp int nums[3][2] = { { 8, 92 }, { 20, 50 }, @@ -411,59 +411,59 @@ int nums[3][2] = { ``` 8 92 20 50 7 45 -Как извеждаме елемента [`nums[2][1]`]? -Това е последната стойност в матрицата, [`45`]. +Как извеждаме елемента {` nums[2][1]}? +Това е последната стойност в матрицата, {` 45}. Щом искаме трети ред (втори по индекс), значи трябва да пропуснем първите два реда. -Това са общо 4 числа, как го сметнахме? [`Два реда * брой колони на ред = 2 * 2`]. +Това са общо 4 числа, как го сметнахме? {` Два реда * брой колони на ред = 2 * 2}. Сега сме на последния ред, искаме втория елемент (първи по индекс), значи отиваме на следващия елемент. -Така показахме, че [`nums[2][1]`] е еквивалентно на [`*(nums + 2 * 2 + 1)`]. +Така показахме, че {` nums[2][1]} е еквивалентно на {` *(nums + 2 * 2 + 1)}. -[$br2] +{br2} -Това трябва да поражда въпрос: не можем ли да използваме [`nums`] като едномерен масив и да напишем [`nums[2 * 2 + 1]`]? +Това трябва да поражда въпрос: не можем ли да използваме {` nums} като едномерен масив и да напишем {` nums[2 * 2 + 1]}? Можем! -Затова е смислено да преобразуваме [`int[3][2]`] към [`int*`]. +Затова е смислено да преобразуваме {` int[3][2]} към {` int*}. Единствения проблем, е че употребата става неприятна. Например: -```c++ +```cpp void f(int* matrix) { /* ... */ matrix[2 * 2 + 1]; /* ... */ } -[$br2] +{br2} Забелязваме, че ако C++ знае броя колони, би трябвало да може да направи сам тази сметка с пропускането на редове. -От там се поражда [`int(*)[2]`] като смислено преобразуване на [`int[3][2]`]. +От там се поражда {` int(*)[2]} като смислено преобразуване на {` int[3][2]}. Това е най-обикновен указател, обаче му даваме броя колони (и с това, подсказваме че ще работим с матрица). С такъв тип указател можем да използваме синтаксиса с двете квадратни скоби. Например: -```c++ +```cpp void g(int (*matrix)[2]) { /* ... */ matrix[2][1]; /* ... */ } -[$br2] +{br2} Очевиден проблем, е че броя колони трябва да бъде константен (зададен в типа), ако искаме да ползваме двата чифта квадратни скоби. Няма ли начин да ги използваме с неконстантен брой колони? -Отговорът е [=не!=] +Отговорът е {b не!} -Изкушаващо е да използваме [`int**`], но този тип обозначава нещо друго: указател към указател. +Изкушаващо е да използваме {` int**}, но този тип обозначава нещо друго: указател към указател. -Ако имаме [`int** x`], то тогава [`x[2][1]`] [=няма=] да бъде еквивалентно на [`*(x + 2 * колони + 1)`]! -Ще бъде еквивалентно на [`*(*(x + 2) + 1)`]! +Ако имаме {` int** x}, то тогава {` x[2][1]} {b няма} да бъде еквивалентно на {` *(x + 2 * колони + 1)}! +Ще бъде еквивалентно на {` *(*(x + 2) + 1)}! Това защо е така ще разберем когато учим динамична памет. Тогава, матриците ни няма да бъдат последователност от елементи, ами ще бъдат последователност от (указатели към) масиви. diff --git a/src/teaching/upp-2025/ideas.du b/src/teaching/upp-2025/ideas.du index 7453dcf..b246989 100644 --- a/src/teaching/upp-2025/ideas.du +++ b/src/teaching/upp-2025/ideas.du @@ -144,7 +144,7 @@ Във входа получавате цяло число. Трябва да върнете (изкарате на екрана) стойността на числото делено на 7 (закръглено надолу). -[=Примери:=] +{b Примери:} :table_2 |= Вход @@ -162,9 +162,9 @@ Във входа получавате цяло число: дължина в инчове. Трябва да върнете размера в сантиметри по формулата (закръглено надолу): -[image ./cm-inch-formula Сантиметри = 50 / 127 * Инчове] +{img Сантиметри = 50 / 127 * Инчове;./cm-inch-formula} -[=Примери:=] +{b Примери:} :table_2 |= Вход diff --git a/src/teaching/upp-2025/index.du b/src/teaching/upp-2025/index.du index 2cad1df..f3f2c78 100644 --- a/src/teaching/upp-2025/index.du +++ b/src/teaching/upp-2025/index.du @@ -1,21 +1,25 @@ -# Увод в програмирането - практикум, Компютърни науки, 5 група +'def title Увод в програмирането - практикум, Компютърни науки, 5 група +'def desc Материали на проведените през 2025/2026 практикуми по Увод в програмирането на Компютърни науки (2 поток), 5 група. + +# {title} Материали на проведените през 2025/2026 практикуми по Увод в програмирането на Компютърни науки (2 поток), 5 група. -[=Зала:=] ФМИ 107 [$dbarsep] -[=Време:=] 16:00 - 18:00 [$dbarsep] -[=Ден:=] Четвъртък +{b Зала:} ФМИ 107 {dbarsep} +{b Време:} 16:00 - 18:00 {dbarsep} +{b Ден:} Четвъртък -[=Директни връзки:=] -[url ./week01/introduction.html?a#section-3 Контакт с мен] -| [url https://github.com/Syndamia/upp-2025-solutions Решения на задачи] -| [url https://github.com/18ivan18/IntroductionToProgramming2025 Материали от семинари] -| [url https://learn.fmi.uni-sofia.bg/course/view.php?id=11601 Курс в мудъл] +{b Директни връзки:} +{url Контакт с мен;./week01/introduction.html?a#section-3} +| {url Решения на задачи;https://github.com/Syndamia/upp-2025-solutions} +| {url Материали от семинари;https://github.com/18ivan18/IntroductionToProgramming2025} +| {url Курс в мудъл;https://learn.fmi.uni-sofia.bg/course/view.php?id=11601} -[=Допълнителни ресурси:=] -[url ./cpp-pitfalls Капани в C++] +{b Допълнителни ресурси:} +{url Капани в C++;./cpp-pitfalls} -:table_3 +:table +:3 |= № |= Дата |= Материали @@ -27,34 +31,34 @@ |: |: |: -[url ./week01/introduction.html?a Уводни бележки] -|| [url ./week01/concepts.html?a Общи концепции] -|| [url ./week01/github_classroom.html?a GitHub Classroom упътване] -|| [url ./week01/visual_studio.html?a Visual Studio упътване] -|| <br>[url ./week01/zip.html?a ZIP архиви упътване] +{url Уводни бележки;./week01/introduction.html?a} +|| {url Общи концепции;./week01/concepts.html?a} +|| {url GitHub Classroom упътване;./week01/github_classroom.html?a} +|| {url Visual Studio упътване;./week01/visual_studio.html?a} +|| <br>{url ZIP архиви упътване;./week01/zip.html?a} |: |: |: -[url ./week01 Задачи] -|| [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week01 Решения] -|| [url https://classroom.github.com/a/-1l498jX GitHub Classroom] +{url Задачи;./week01} +|| {url Решения;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week01} +|| {url GitHub Classroom;https://classroom.github.com/a/-1l498jX} |: 2 |: 09.10.2025 -|: Програмистко мислене [*(много експериментално)*] +|: Програмистко мислене {i (много експериментално)} |: |: |: -[url ./week02/machine_manual.html?a Упътване на машинната таблица] || [url ./week02/machine.html?a Машинна таблица] +{url Упътване на машинната таблица;./week02/machine_manual.html?a} || {url Машинна таблица;./week02/machine.html?a} |: |: |: -[url ./week02 Задачи] -|| [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week02 Решения] -|| [url https://classroom.github.com/a/DRjtkc6f GitHub Classroom] +{url Задачи;./week02} +|| {url Решения;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week02} +|| {url GitHub Classroom;https://classroom.github.com/a/DRjtkc6f} |: 3 |: 16.10.2025 @@ -63,9 +67,9 @@ |: |: |: -[url ./week03 Задачи] -|| [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week03 Решения] -|| [url https://classroom.github.com/a/UMc2WhVX GitHub Classroom] +{url Задачи;./week03} +|| {url Решения;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week03} +|| {url GitHub Classroom;https://classroom.github.com/a/UMc2WhVX} |: 4 |: 23.10.2025 @@ -74,9 +78,9 @@ |: |: |: -[url ./week04 Задачи] -|| [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04 Решения] -|| [url https://classroom.github.com/a/rOzekyCs GitHub Classroom] +{url Задачи;./week04} +|| {url Решения;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04} +|| {url GitHub Classroom;https://classroom.github.com/a/rOzekyCs} |: 5 |: 30.10.2025 @@ -85,9 +89,9 @@ |: |: |: -[url ./week05 Задачи] -|| [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05 Решения] -|| [url https://classroom.github.com/a/6oPRMxJx GitHub Classroom] +{url Задачи;./week05} +|| {url Решения;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05} +|| {url GitHub Classroom;https://classroom.github.com/a/6oPRMxJx} |: 6 |: 06.11.2025 @@ -96,9 +100,9 @@ |: |: |: -[url ./week06 Задачи] -|| [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06 Решения] -|| [url https://classroom.github.com/a/JSB1UK_f GitHub Classroom] +{url Задачи;./week06} +|| {url Решения;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06} +|| {url GitHub Classroom;https://classroom.github.com/a/JSB1UK_f} |: 7 |: 13.11.2025 @@ -107,9 +111,9 @@ |: |: |: -[url ./week07 Задачи] -|| [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07 Решения] -|| [url https://classroom.github.com/a/clYBilXQ GitHub Classroom] +{url Задачи;./week07} +|| {url Решения;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07} +|| {url GitHub Classroom;https://classroom.github.com/a/clYBilXQ} |: 8 |: 20.11.2025 @@ -118,9 +122,9 @@ |: |: |: -[url ./week08 Задачи] -|| [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08 Решения] -|| [url https://classroom.github.com/a/rhpKbNmH GitHub Classroom] +{url Задачи;./week08} +|| {url Решения;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08} +|| {url GitHub Classroom;https://classroom.github.com/a/rhpKbNmH} |: 9 |: 27.11.2025 @@ -129,9 +133,9 @@ |: |: |: -[url ./week09 Задачи] -|| [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week09 Решения] -|| [url https://classroom.github.com/a/ZYFDdLi4 GitHub Classroom] +{url Задачи;./week09} +|| {url Решения;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week09} +|| {url GitHub Classroom;https://classroom.github.com/a/ZYFDdLi4} |: 10 |: 04.12.2025 @@ -140,9 +144,9 @@ |: |: |: -[url ./week10 Задачи] -|| [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week10 Решения] -|| [url https://classroom.github.com/a/kDfmWmy7 GitHub Classroom] +{url Задачи;./week10} +|| {url Решения;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week10} +|| {url GitHub Classroom;https://classroom.github.com/a/kDfmWmy7} |: 11 |: 11.12.2025 @@ -151,9 +155,9 @@ |: |: |: -[url ./week11 Задачи] -|| [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11 Решения] -|| [url https://classroom.github.com/a/z_C3UMi8 GitHub Classroom] +{url Задачи;./week11} +|| {url Решения;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11} +|| {url GitHub Classroom;https://classroom.github.com/a/z_C3UMi8} |: 12 |: 18.12.2025 @@ -162,9 +166,9 @@ |: |: |: -[url ./week12 Задачи] -|| [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week12 Решения] -|| [url https://classroom.github.com/a/zvYPAVPS GitHub Classroom] +{url Задачи;./week12} +|| {url Решения;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week12} +|| {url GitHub Classroom;https://classroom.github.com/a/zvYPAVPS} |: 13 |: 08.01.2026 @@ -173,9 +177,9 @@ |: |: |: -[url ./week13 Задачи] -|| [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13 Решения] -|| [url https://classroom.github.com/a/8vTquPOY GitHub Classroom] +{url Задачи;./week13} +|| {url Решения;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13} +|| {url GitHub Classroom;https://classroom.github.com/a/8vTquPOY} |: 14 |: 15.01.2026 @@ -184,11 +188,11 @@ |: |: |: -[url ./week14/bitwise-and-binary-representation.html?a Побитови операции и представяне на числени данни] +{url Побитови операции и представяне на числени данни;./week14/bitwise-and-binary-representation.html?a} |: |: |: -[url ./week14 Задачи] -|| [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week14 Решения] -|| [url https://classroom.github.com/a/JjE8rZOx GitHub Classroom] +{url Задачи;./week14} +|| {url Решения;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week14} +|| {url GitHub Classroom;https://classroom.github.com/a/JjE8rZOx} diff --git a/src/teaching/upp-2025/week01/concepts.du b/src/teaching/upp-2025/week01/concepts.du index 242e635..33bb98e 100644 --- a/src/teaching/upp-2025/week01/concepts.du +++ b/src/teaching/upp-2025/week01/concepts.du @@ -1,11 +1,11 @@ -# Общи концепции - УПП, Седмица 1, 02.10.2025 +'def title Общи концепции - УПП, Седмица 1, 02.10.2025 +'def desc Общи концепции за компютрите, компилацията, git и GitHub Classroom. -'define expected-reading 4 min -'define created 27 September 2025 -'define edited 28 September 2025 -[$pagenav] +# {title} -[$presentation-controller] +{pagenav 4 min;27 September 2025;28 September 2025} + +{presentation-controller} :title_slide35 @@ -16,7 +16,7 @@ ## Компютър, код, компилиране -[$br2] +{br2} :unordered - Компютъра е една гигантска елка с много бутони и памет @@ -34,28 +34,28 @@ - В древността (около 1940те) програмистите са ръчно са размествали жички за да работят с компютъра - Електротехниката се развива и това "разместване" се случва без нуждата от промяна в електрическата схема - На хората им омръзва от писането на числа, изобретяват програмните езици -- Това е ([=неформатиран=]) текст, като комбинации от знаци се свеждат до съответните цифри +- Това е ({b неформатиран}) текст, като комбинации от знаци се свеждат до съответните цифри .unordered - Например, нека числото 200 да обозначава\n - "добавяне на единица към [*(регистър)*] Y" - - С програмен език текста [`INY`] или [`++Y`] се свежда до числото 200 + "добавяне на единица към {i (регистър)} Y" + - С програмен език текста {` INY} или {` ++Y} се свежда до числото 200 :middle_slide35 .unordered -- Програмите които превръщат този текст в числа се наричат [=компилатори=]. - Самия процес - [=компилиране=]. +- Програмите които превръщат този текст в числа се наричат {b компилатори}. + Самия процес - {b компилиране}. - Разногласия по какъв текст какво трябва да значи още текат, затова имаме различни (програмни) езици - Допълнително, хората правят комбинации от знаци, които се превеждат до много числа по сложни начини -- Така се зараждат [=парадигмите=] +- Така се зараждат {b парадигмите} :slide35 ## История на версиите, git -[$br2] +{br2} .unordered - Microsoft Word, браузърите, ... следят история на действия @@ -67,21 +67,21 @@ :middle_slide35 .unordered -- [url https://git-scm.com/ git] е програма, която пази такива разклонени редици от промени върху файловете в директории -- Всяка промяна се нарича "[=commit=]" -- Различните разклонения се наричат "[=branch=]"-ове +- {url git;https://git-scm.com/} е програма, която пази такива разклонени редици от промени върху файловете в директории +- Всяка промяна се нарича "{b commit}" +- Различните разклонения се наричат "{b branch}"-ове - Всеки "commit" трябва да има автор и описание, тоест commit-ове не се правят автоматично! - Създаването/изтриването на файлове с/без съдържание също се включва в commit-ите -- Папка (и всички под-папки в нея) в която git следи за промени се нарича "[=repository=]" (хранилище) +- Папка (и всички под-папки в нея) в която git следи за промени се нарича "{b repository}" (хранилище) :slide35 .unordered - Понякога искаме да споделим нашите промени и да смесим чужди промени при нас\n - [*(примерно няколко програмиста паралелно правят модификации по един и същ код)*] + {i (примерно няколко програмиста паралелно правят модификации по един и същ код)} - Можем да използваме Google Drive/Dropbox/... и ръчно да смесваме, но става сложно и тромаво -- Сайтове като [url https://github.com GitHub] са специализирани за работа с repository-та. +- Сайтове като {url GitHub;https://github.com} са специализирани за работа с repository-та. Предоставят: .unordered - безплатно пространство (облак) за repository-и @@ -100,12 +100,12 @@ ## GitHub Classroom -[$br1] +{br1} .unordered -- Чрез [url https://classroom.github.com GitHub Classroom] ще създавам [=задания с ограничен срок=] (края на съответното упражнение) +- Чрез {url GitHub Classroom;https://classroom.github.com} ще създавам {b задания с ограничен срок} (края на съответното упражнение) - Когато вие приемете заданието, автоматично се създава git repository към което имате (ограничен) достъп -- Преди срока трябва да добавите commit с вашата работа по време на упражнението, [=колкото и малко да е!=] +- Преди срока трябва да добавите commit с вашата работа по време на упражнението, {b колкото и малко да е!} - Добавя се един автоматичен "pull request" в който ще пиша отзивите. @@ -113,4 +113,4 @@ :title_slide35 -.p [url ./github_classroom.html?a Към "GitHub Classroom упътване"] +.p {url Към "GitHub Classroom упътване";./github_classroom.html?a} diff --git a/src/teaching/upp-2025/week01/github_classroom.du b/src/teaching/upp-2025/week01/github_classroom.du index fbce90d..8ece732 100644 --- a/src/teaching/upp-2025/week01/github_classroom.du +++ b/src/teaching/upp-2025/week01/github_classroom.du @@ -1,11 +1,11 @@ -# GitHub Classroom упътване - УПП, Седмица 1, 02.10.2025 +'def title GitHub Classroom упътване - УПП, Седмица 1, 02.10.2025 +'def desc Упътване как да си създадете GitHub акаунт и как да използвате GitHub Classroom. -'define expected-reading 5 min -'define created 27 September 2025 -'define edited 27 September 2025 -[$pagenav] +# {title} -[$presentation-controller] +{pagenav 5 min;27 September 2025;27 September 2025} + +{presentation-controller} :title_slide @@ -19,9 +19,9 @@ ## Сега всички (които нямат) трябва да си направят GitHub акаунти .p -Отивате на [url https://github.com/signup github.com/signup], въвеждате си данните една по една и се регистрирате +Отивате на {url github.com/signup;https://github.com/signup}, въвеждате си данните една по една и се регистрирате -.p [image ../../upp-2023/week1/img/github-signup.gif] +.p {img ../../upp-2023/week1/img/github-signup.gif} :middle_slide @@ -29,7 +29,7 @@ .p След това, като влезете в акаунтите си (което става автоматично след регистрация), на заглавната страница ще имате нещо такова: -.width75% [image ../../upp-2023/week1/img/github-index.gif] +.width75% {img ../../upp-2023/week1/img/github-index.gif} .p В горния десен ъгъл, където е иконката с квадрати на бял фон, след натискане получавате sidebar. @@ -46,11 +46,11 @@ .p Най-простия начин, който намерих, е да отворите -[url https://support.github.com/contact/reinstatement support.github.com/contact/reinstatement]\n +{url support.github.com/contact/reinstatement;https://support.github.com/contact/reinstatement}\n Ако отгоре пише "Your account has been flagged", тогава имаме проблем. .p -[image ../../upp-2023/week1/img/github-support-flagged.gif] +{img ../../upp-2023/week1/img/github-support-flagged.gif} :title_slide35 @@ -62,14 +62,14 @@ ## Как ще ползваме GitHub Classroom -[$br3] +{br3} .p За всеки практикум ще има направя линк. При приемане на заданието се генерира repository. .p -Трябва да сте качили работата си [=по време=] на упражнението (или малко след това) в това repository. +Трябва да сте качили работата си {b по време} на упражнението (или малко след това) в това repository. GitHub предоставя лесни начини да правите промени по файлове директно чрез браузъра, така че за незаинтересуваните, може да го ползвате като усложнен Google Drive. .p @@ -84,12 +84,12 @@ GitHub предоставя лесни начини да правите пром За всяко упражнение ще има отделен линк.\n Този за днеска е: [url https://classroom.github.com/a/-1l498jX] -[$br1] +{br1} :row .p След като го отворите, ще видите съобщение за разрешение, авторизирайте го. -.p [image ../../upp-2023/week1/img/github-classroom-authorize.gif] +.p {img ../../upp-2023/week1/img/github-classroom-authorize.gif} @@ -97,7 +97,7 @@ GitHub предоставя лесни начини да правите пром :row -.width60% [image ../../upp-2023/week1/img/join-the-classroom.gif] +.width60% {img ../../upp-2023/week1/img/join-the-classroom.gif} :column @@ -114,12 +114,12 @@ GitHub предоставя лесни начини да правите пром .p След това, би трябвало да видите страницата за "Приемане на заданието". -.width40% [image ../../upp-2023/week1/img/accept-assignment.gif] +.width40% {img ../../upp-2023/week1/img/accept-assignment.gif} .p След като го приемете, на новата страница, изчакайте няколко секунди и презаредете. Трябва да видите това: -.width40% [image ../../upp-2023/week1/img/ready-to-go.gif] +.width40% {img ../../upp-2023/week1/img/ready-to-go.gif} :middle_slide @@ -144,7 +144,7 @@ GitHub предоставя лесни начини да правите пром Целта е да видя какво правите и да ви помогна, моля проверявайте какво съм ви писал, по подразбиране би трябвало да получавате известия на имейл-а. .centered -.width80% [image ../../upp-2023/week1/img/feedback.gif] +.width80% {img ../../upp-2023/week1/img/feedback.gif} :slide @@ -160,9 +160,9 @@ GitHub предоставя лесни начини да правите пром Най-елементарния начин: копирате всичко, след това отивате на вашето GitHub repository, кликвате "Add", после "Create new file". .p -Отгоре на "Name your file..." пишете някакво име, което [=моля да завърша на [`.cpp`]!=] +Отгоре на "Name your file..." пишете някакво име, което {b моля да завърша на {` .cpp}!} Това показва, че файла съдържа код на C++. -Също, когато решавате много задачи и създавате много такива файлове, [=напомням че имената на файловете трябва да са различни.=] +Също, когато решавате много задачи и създавате много такива файлове, {b напомням че имената на файловете трябва да са различни.} .p В "Enter file contents here" пействате копирания код. @@ -171,4 +171,4 @@ GitHub предоставя лесни начини да правите пром :title_slide35 -.p [url ./visual_studio.html?a Към "Visual Studio упътване"] +.p {url Към "Visual Studio упътване";./visual_studio.html?a} diff --git a/src/teaching/upp-2025/week01/index.du b/src/teaching/upp-2025/week01/index.du index f3a5364..8fc3e52 100644 --- a/src/teaching/upp-2025/week01/index.du +++ b/src/teaching/upp-2025/week01/index.du @@ -1,44 +1,44 @@ -# Задачи - УПП, Седмица 1, 01.10.2025 +'def title Задачи - УПП, Седмица 1, 02.10.2025 +'def desc Условия на задачите за упражнение. -'define expected-reading 2 min -'define created 27 September 2025 -'define edited 27 September 2025 -[$pagenav] +# {title} + +{pagenav 2 min;27 September 2025;27 September 2025} .warn Не сте имали нито лекция нито семинарно упражнение, затова в задачите няма писане на код. -GitHub Classroom: [url https://classroom.github.com/a/-1l498jX] +GitHub Classroom: {url https://classroom.github.com/a/-1l498jX} ## 1 задача - Hello, World! Изкарайте на екрана съобщението "Hello, World!". Ако използвате Visual Studio, проектът по подразбиране трябва да съдържа програмата за "Hello, World!". -Нужно е единствено да я компилирате и пуснете, както са инструкциите в [url ./visual_studio.du#section-6 презентацията "Visual Studio"]. +Нужно е единствено да я компилирате и пуснете, както са инструкциите в {url презентацията "Visual Studio";./visual_studio.du#section-6}. -Ако използвате друга среда/редактор, създайте [`C++`] файл със следното съдържание: +Ако използвате друга среда/редактор, създайте {` C++} файл със следното съдържание: -```c++ -'include ./helloworld.cpp +```cpp +'snippet 1 $ ./helloworld.cpp Компилирайте го и го изпълнете според инструкциите на вашата програма. ### Исторически контекст В модерно време, това е класическата първа задача по програмиране. -Цялата идея идва от книгата/упътване [url https://en.wikipedia.org/wiki/The_C_Programming_Language The C Programming Language] (първо издание 1978). +Цялата идея идва от книгата/упътване {url The C Programming Language;https://en.wikipedia.org/wiki/The_C_Programming_Language} (първо издание 1978). Тази книга (и съответния език) са едни от най-популярните в програмирането. Ако някой не е запознат, целия свят се крепи на C :) ## 2 задача - Качване в GitHub Classroom -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week01 Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week01} -Създайте [=ZIP архив=] който съдържа вашия [`.cpp`] файл (съдържащ "Hello, World!" програмата). +Създайте {b ZIP архив} който съдържа вашия {` .cpp} файл (съдържащ "Hello, World!" програмата). Качете архива във вашето repository към заданието най-отгоре на страницата. -Инструкции за създаване на ZIP архив [url ./zip.html тук]. +Инструкции за създаване на ZIP архив {url тук;./zip.html}. -Инструкции за използване на GitHub Classroom [url ./github_classroom.html#-github-classroom-1 тук]. +Инструкции за използване на GitHub Classroom {url тук;./github_classroom.html#-github-classroom-1}. diff --git a/src/teaching/upp-2025/week01/introduction.du b/src/teaching/upp-2025/week01/introduction.du index 1e077c5..0585131 100644 --- a/src/teaching/upp-2025/week01/introduction.du +++ b/src/teaching/upp-2025/week01/introduction.du @@ -1,11 +1,11 @@ -# Уводни бележки - УПП, Седмица 1, 02.10.2025 +'def title Уводни бележки - УПП, Седмица 1, 02.10.2025 +'def desc Бележки относно практикума и курса. -'define expected-reading 4 min -'define created 27 September 2025 -'define edited 30 September 2025 -[$pagenav] +# {title} -[$presentation-controller] +{pagenav 4 min;27 September 2025;30 September 2025} + +{presentation-controller} :title_slide35 @@ -13,14 +13,14 @@ .p .width65% -[image_url https://upload.wikimedia.org/wikipedia/commons/3/3c/Chimpanzee_seated_at_typewriter.jpg https://en.wikipedia.org/wiki/Infinite_monkey_theorem] +{url {img https://upload.wikimedia.org/wikipedia/commons/3/3c/Chimpanzee_seated_at_typewriter.jpg};https://en.wikipedia.org/wiki/Infinite_monkey_theorem} :slide35 ## Елементарните неща out of the way -[$br3] +{br3} .unordered - Първите 15 минути на всеки кръгъл час са почивка @@ -33,7 +33,7 @@ ## Кой съм Аз -[$br5] +{br5} .unordered - Казвам се Камен. @@ -55,7 +55,7 @@ - <a href="mailto:kamen.d.mladenov@protonmail.com">kamen.d.mladenov@protonmail.com</a> <a class="borderless" href="/files/publickey-kamen.d.mladenov@protonmail.com-62ca52e87475c874b9e6ebf3c4c9f716b6ce4c9d.asc"><img class="borderless unzoomable" src="/img/pgpkey.gif" alt="PGP key"></a> -.p Директни линкове към Facebook и Discord има на [url https://learn.fmi.uni-sofia.bg/user/profile.php?id=23229 профила ми в Moodle].\n +.p Директни линкове към Facebook и Discord има на {url профила ми в Moodle;https://learn.fmi.uni-sofia.bg/user/profile.php?id=23229}.\n @@ -63,12 +63,12 @@ ## Кои сте вие? -[$br2] +{br2} .unordered - Няма да обикалям човек по човек. -[$br1] +{br1} .unordered - Кои са състезатели? @@ -86,18 +86,18 @@ ## Занятията -[$br3] +{br3} .unordered -- [=Лекции=] - теория и формалности зад нещата -- [=Семинари=] (семинарни упражнения) - как теоретичните неща се реализират -- [=Практикуми=] (практически упражнения) - реализиране на нещата от вас +- {b Лекции} - теория и формалности зад нещата +- {b Семинари} (семинарни упражнения) - как теоретичните неща се реализират +- {b Практикуми} (практически упражнения) - реализиране на нещата от вас :slide35 ## Оценяване -[$br4] +{br4} .unordered - Ще разберете на лекцията утре, от доц. Нора Ангелова.\n @@ -110,17 +110,17 @@ ## Материала -[$br4] +{br4} .unordered -- Ще работим изцяло с езика [`C++`] +- Ще работим изцяло с езика {` C++} - Ще разглеждаме общи концепции: оператори, цикли, функции, масиви, низове -- И някои по-специални понятия: [=указатели=], [=рекурсия=] +- И някои по-специални понятия: {b указатели}, {b рекурсия} :slide35 -[$br2] +{br2} ### За състезателите @@ -128,45 +128,45 @@ - Ще трябва да научите как се пише четим код - Може би не сте запознати с някои детайли -[$br1] +{br1} ### За хората без опит .unordered -- Материалът е [=много=] и бързо напредваме. +- Материалът е {b много} и бързо напредваме. Няма да имаме време всичко да изговорим. -- Допълнителна самоподготовка е [=нужна=] и едва ли ще можете да се справите без нея. +- Допълнителна самоподготовка е {b нужна} и едва ли ще можете да се справите без нея. :slide35 ### За всички -[$br3] +{br3} .unordered -- [=Не се отпускайте!=] -- [`C++`] е език на ниско ниво, има безброй много детайли които може да ви спънат. +- {b Не се отпускайте!} +- {` C++} е език на ниско ниво, има безброй много детайли които може да ви спънат. - Ние имаме специфични изисквания за писане на код.\n - [=Ако не ги спазвате, дори решението да работи, може да получите слаба оценка!=] + {b Ако не ги спазвате, дори решението да работи, може да получите слаба оценка!} :slide35 ## Плагиатство -[$br2] +{br2} .unordered - В училище (разкрито) преписването води до двойка и потенциално обаждане към родителите. -- Във ФМИ при установено плагиатството, [=в срок от една година=], студента [*може*] да бъде [=изключен от университета без възможност да се запише обратно=]. +- Във ФМИ при установено плагиатството, {b в срок от една година}, студента {i може} да бъде {b изключен от университета без възможност да се запише обратно}. - По-добре си изкарайте двойката, ще ви дадем достатъчно шансове да си минете курса. :middle_slide35 :centered -.p [*Пък и може би не си заслужава...*] +.p {i Пък и може би не си заслужава...} <iframe width="480" height="360" src="https://www.youtube.com/embed/hMloyp6NI4E"> </iframe> @@ -182,20 +182,20 @@ ## Как ще ги водим -[$br2] +{br2} .unordered - В началото на часа давам задачи, вие ги решавате. - Всички текстови редактори/IDE-та са позволени. -- До края на часа трябва да предадете написаното от вас в [url ./github_classroom.html#-github-classroom-1 GitHub Classroom] -- Ще връщам обратна връзка към предаденото, [*моля да я четете!*] +- До края на часа трябва да предадете написаното от вас в {url GitHub Classroom;./github_classroom.html#-github-classroom-1} +- Ще връщам обратна връзка към предаденото, {i моля да я четете!} :slide ## Видове задачи -[$br1] +{br1} .defs ; За решаване @@ -203,7 +203,7 @@ ; За самоподготовка : По-сложни задачи, които ще описват възможни проблеми от реалния свят ; За любознателните -: 1-2 сложни задачи, чиято цел е да се реализира [*реалистичен*] използваем софтуерен компонент +: 1-2 сложни задачи, чиято цел е да се реализира {i реалистичен} използваем софтуерен компонент :middle_slide35 @@ -218,23 +218,23 @@ ## Изкуствен интелект -[$br4] +{br4} .unordered - Ще чуете и други мнения от екипа по тематa - Анализ на генериран изход от ИИ ще бъде разглеждан в курса -- На практикумите ви е позволено да го ползвате, [=но=] не го окуражавам +- На практикумите ви е позволено да го ползвате, {b но} не го окуражавам :slide35 -[$br2] +{br2} .p Различни умения са: .numbered -1. да [=напишеш сам=] код от нулата -2. да [=четеш=] код и разбереш какво прави -3. да [=модифицираш/допълниш=] вече написан код +1. да {b напишеш сам} код от нулата +2. да {b четеш} код и разбереш какво прави +3. да {b модифицираш/допълниш} вече написан код .unordered - Чрез ИИ избягвате да правите първото. @@ -244,4 +244,4 @@ :title_slide35 -.p [url ./concepts.html?a Към "Общи концепции"] +.p {url Към "Общи концепции";./concepts.html?a} diff --git a/src/teaching/upp-2025/week01/visual_studio.du b/src/teaching/upp-2025/week01/visual_studio.du index cf7a9d4..e1f943d 100644 --- a/src/teaching/upp-2025/week01/visual_studio.du +++ b/src/teaching/upp-2025/week01/visual_studio.du @@ -1,11 +1,11 @@ -# Visual Studio упътване - УПП, Седмица 1, 02.10.2025 +'def title Visual Studio упътване - УПП, Седмица 1, 02.10.2025 +'def desc Упътване как да инсталирате, настроите и използвате Visual Studio. -'define expected-reading 6 min -'define created 27 September 2025 -'define edited 28 September 2025 -[$pagenav] +# {title} -[$presentation-controller] +{pagenav 6 min;27 September 2025;28 September 2025} + +{presentation-controller} :title_slide35 @@ -16,17 +16,17 @@ ## Къде пишем код? -[$br2] +{br2} .p -[=Кодът е чисто и просто текст=], компилаторът е специалната програма, която превръща този текст в нещо, което може компютъра да изпълни. +{b Кодът е чисто и просто текст}, компилаторът е специалната програма, която превръща този текст в нещо, което може компютъра да изпълни. .p -За писане и редактиране на текст ползваме [=текстови редактори=]. +За писане и редактиране на текст ползваме {b текстови редактори}. Програмистите са искали да улеснят работата си, затова модерните текстови редактори поддържат много помощни функционалности: показване на грешки на точния ред, автоматично форматиране, ... .p -За някои и това не е било достатъчно удобно, затова са създадени [=Integrated Development Environment=] (IDE), програми които съдържат в себе си всичко нужно за разработка на код. +За някои и това не е било достатъчно удобно, затова са създадени {b Integrated Development Environment} (IDE), програми които съдържат в себе си всичко нужно за разработка на код. Тоест, те са текстови редактори, но "вградено" могат да компилират код, да менажират сегашното repository, ... @@ -57,13 +57,13 @@ Visual Studio е вече инсталирано там. ### Инсталация -[$br5] +{br5} .p -За Visual Studio, отивате на [url https://visualstudio.microsoft.com/ visualstudio.microsoft.com], скролвате малко надолу, избирате "Download Visual Studio" и след това "Community 2022". +За Visual Studio, отивате на {url visualstudio.microsoft.com;https://visualstudio.microsoft.com/}, скролвате малко надолу, избирате "Download Visual Studio" и след това "Community 2022". .bulleted 'footnote vs-2022-old-win Може би има трикове с които да инсталирате 2022 версията, но те не са официални и затова няма да го преподам -- Ако искате да ползвате по-стара ОС, като Windows 8.1 или Windows 7 ще трябва да използвате "Community 2019"[$vs-2022-old-win], разликата между версиите не е съществена, затова не се притеснявайте. +- Ако искате да ползвате по-стара ОС, като Windows 8.1 или Windows 7 ще трябва да използвате "Community 2019"{vs-2022-old-win}, разликата между версиите не е съществена, затова не се притеснявайте. :slide @@ -76,7 +76,7 @@ Visual Studio е вече инсталирано там. Би трябвало да заема към 11 GB памет и в моето тестване се инсталира за 10тина минути. .centered -.width80% [image ../../upp-2023/week1/img/vs-install.gif] +.width80% {img ../../upp-2023/week1/img/vs-install.gif} :slide @@ -92,9 +92,9 @@ Visual Studio е вече инсталирано там. :width75% :row -.p [image ../../upp-2023/week1/img/vs-signin.gif] +.p {img ../../upp-2023/week1/img/vs-signin.gif} -.p [image ../../upp-2023/week1/img/vs-start-env.gif] +.p {img ../../upp-2023/week1/img/vs-start-env.gif} @@ -114,7 +114,7 @@ Visual Studio е вече инсталирано там. В лявата колона имате скорошни проекти, в дясната имате начини да създадете нов проект. :centered -:width80% [image ../../upp-2023/week1/img/vs-open-recent.gif] +:width80% {img ../../upp-2023/week1/img/vs-open-recent.gif} @@ -127,7 +127,7 @@ Visual Studio е вече инсталирано там. В този курс ще работим само и единствено с "Console App", затова изберете него и кликнете "Next". :centered -:width75% [image ../../upp-2023/week1/img/vs-create-project.gif] +:width75% {img ../../upp-2023/week1/img/vs-create-project.gif} @@ -139,7 +139,7 @@ Visual Studio е вече инсталирано там. Тук единствено може да искате да промените Project Name и Location, другото не е важно. :centered -:width80% [image ../../upp-2023/week1/img/vs-configure-project.gif] +:width80% {img ../../upp-2023/week1/img/vs-configure-project.gif} @@ -171,7 +171,7 @@ Visual Studio е вече инсталирано там. :centered :width60% -.p [image ../../upp-2023/week1/img/vs-general.gif] +.p {img ../../upp-2023/week1/img/vs-general.gif} @@ -179,7 +179,7 @@ Visual Studio е вече инсталирано там. В Solution Explorer имате всички файлове от проекта (Visual Studio позволява да групирате няколко проекта в едно, наречено Solution, не е нужно да се занимавате). .p -Тук [=единственото важно за вас се намира в папката "Source Files"=]. +Тук {b единственото важно за вас се намира в папката "Source Files"}. В нея ще се намира вашия код, всичко останало са допълнителни неща, които са релевантни за по-големи проекти. @@ -192,7 +192,7 @@ Visual Studio е вече инсталирано там. :width50% :fright -.p [image ../../upp-2023/week1/img/vs-debug-menu.gif] +.p {img ../../upp-2023/week1/img/vs-debug-menu.gif} @@ -200,14 +200,14 @@ Visual Studio е вече инсталирано там. .p След малко чакане, би трябвало да излезе един прозорец, който изглежда горе-долу така: -.p [image ../../upp-2023/week1/img/vs-console.gif] +.p {img ../../upp-2023/week1/img/vs-console.gif} :slide ### Дебъгване -[$br1] +{br1} .p Bug е когато нещо непланирано се случи в кода. @@ -220,7 +220,7 @@ Visual Studio предоставя много функционалности, к .p При компилиране, ще получим съобщение за грешки по време на компилирането. -.p [image ../../upp-2023/week1/img/vs-build-errors.gif] +.p {img ../../upp-2023/week1/img/vs-build-errors.gif} :slide @@ -235,11 +235,11 @@ Visual Studio предоставя много функционалности, к Той се появява когато при компилиране получим грешки и изчезва когато няма. :centered -:width70% [image ../../upp-2023/week1/img/vs-errors.gif] +:width70% {img ../../upp-2023/week1/img/vs-errors.gif} :title_slide35 -.p [url ./zip.html?a Към "ZIP архиви упътване"] +.p {url Към "ZIP архиви упътване";./zip.html?a} diff --git a/src/teaching/upp-2025/week01/zip.du b/src/teaching/upp-2025/week01/zip.du index d81320a..5b73cd9 100644 --- a/src/teaching/upp-2025/week01/zip.du +++ b/src/teaching/upp-2025/week01/zip.du @@ -1,11 +1,11 @@ -# ZIP архиви упътване - УПП, Седмица 1, 01.09.2025 +'def title ZIP архиви упътване - УПП, Седмица 1, 02.10.2025 +'def desc Упътване какво да инсталирате за създаване на ZIP архиви и как да ги създадете. -'define expected-reading 2 min -'define created 27 September 2025 -'define edited 28 September 2025 -[$pagenav] +# {title} -[$presentation-controller] +{pagenav 2 min;27 September 2025;28 September 2025} + +{presentation-controller} :title_slide35 @@ -23,10 +23,10 @@ ## Windows 11 -[$br4] +{br4} :unordered -- Под Windows 11 с [*новото*] меню което излиза при натискане на десен бутон, можете директно да архивирате селектираните файлове +- Под Windows 11 с {i новото} меню което излиза при натискане на десен бутон, можете директно да архивирате селектираните файлове - Тоест, процедурата е .numbered 1. Селекция на файловете за архивиране @@ -41,30 +41,30 @@ ## Windows 2000 - Windows 11 -[$br3] +{br3} :unordered - Ще трябва да инсталирате програма за ZIP файлове. -- Тази която аз препоръчвам е [url https://www.7-zip.org/ 7-Zip], спрямо WinRAR: +- Тази която аз препоръчвам е {url 7-Zip;https://www.7-zip.org/}, спрямо WinRAR: .unordered - Няма дразненето с безплатния trial - Поддържа повече формати - Налично е за повече ОС -- Инсталацията е стандартна: от [url https://www.7-zip.org/ заглавната страница] изтегляте 64bit-овата версия, пускате инсталатора +- Инсталацията е стандартна: от {url заглавната страница;https://www.7-zip.org/} изтегляте 64bit-овата версия, пускате инсталатора :slide -[$br3] +{br3} .ordered 1. Селектирате файловете които искате да архивирате -2. Десен бутон [*(под Windows 11 трябва да натиснете "Show more options")*] +2. Десен бутон {i (под Windows 11 трябва да натиснете "Show more options")} 3. Задържате курсора върху "7-Zip" -4. Избирате [`Add to "SOMETHING.[=zip=]"`], където [`SOMETHING`] ще е името на папката в която се намирате. +4. Избирате {` Add to "SOMETHING.{b zip}"}, където {` SOMETHING} ще е името на папката в която се намирате. Това директно създава архив с името на текущата папка. -5. Алтернативно избирате [`Add to archive...`]. +5. Алтернативно избирате {` Add to archive...}. От там се отваря прозорец с настройки, най-важно под "Archive format" да изберете ZIP. Другите неща не е нужно да променяте. @@ -73,7 +73,7 @@ ## MacOS -[$br6] +{br6} .ordered 1. Селектирате файловете които искате да архивирате @@ -87,14 +87,14 @@ .p .font20 -[*Ползваш Linux и се нуждаеш от туториал? Слабо.*] +{i Ползваш Linux и се нуждаеш от туториал? Слабо.} -[$br5] +{br5} ### Чрез командния ред .ordered -1. Инсталираш [`zip`] командата (пакета почти винаги също се казва [`zip`]) +1. Инсталираш {` zip} командата (пакета почти винаги също се казва {` zip}) 2. Извикваш команда във следната форма: ```bash zip archive.zip file1 file2 ... @@ -104,7 +104,7 @@ zip archive.zip file1 file2 ... ### Графично приложение -[$br7] +{br7} .unordered - Отваряш съответния "App Store", търсиш "zip", инсталираш първото и ползваш. @@ -113,4 +113,4 @@ zip archive.zip file1 file2 ... :title_slide35 -.p [url ./index.html Към задачите] +.p {url Към задачите;./index.html} diff --git a/src/teaching/upp-2025/week02/index.du b/src/teaching/upp-2025/week02/index.du index d1be61f..efaf969 100644 --- a/src/teaching/upp-2025/week02/index.du +++ b/src/teaching/upp-2025/week02/index.du @@ -1,85 +1,85 @@ -# Задачи - УПП, Седмица 2, 09.10.2025 +'def title Задачи - УПП, Седмица 2, 09.10.2025 +'def desc Условията на задачите за упражнение. -'define expected-reading 2 min -'define created 05 October 2025 -'define edited 11 October 2025 -[$pagenav] +# {title} + +{pagenav 2 min;05 October 2025;11 October 2025} .warn -Всички задачи от днес са върху [url ./machine.html "машинната таблица"]. +Всички задачи от днес са върху {url "машинната таблица";./machine.html}. GitHub Classroom: [url https://classroom.github.com/a/DRjtkc6f] ## Задача 1 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week02/Решение01.csv Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week02/Решение01.csv} Покажете числото 1337 в "popup". ## Задача 2 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week02/Решение02.csv Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week02/Решение02.csv} -Покажете сумата на [`INPUT1`] и 8 в "popup". +Покажете сумата на {` INPUT1} и 8 в "popup". ## Задача 3 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week02/Решение03.csv Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week02/Решение03.csv} -Покажете числото [`INPUT1`] в "popup", но с обърнат знак. +Покажете числото {` INPUT1} в "popup", но с обърнат знак. ## Задача 4 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week02/Решение04.csv Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week02/Решение04.csv} -Покажете [`INPUT1`] умножено по две в "popup". +Покажете {` INPUT1} умножено по две в "popup". ## Задача 5 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week02/Решение05.csv Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week02/Решение05.csv} -Ако [`INPUT1`] е равно на 10, покажете в "popup" стойността 1. +Ако {` INPUT1} е равно на 10, покажете в "popup" стойността 1. Иначе, покажете стойността 0. ## Задача 6 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week02/Решение06.csv Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week02/Решение06.csv} -Покажете в "popup" числото 1 ако [`INPUT1`] [=или=] [`INPUT2`] е равно на 5. +Покажете в "popup" числото 1 ако {` INPUT1} {b или} {` INPUT2} е равно на 5. Иначе покажете 0. ## Задача 7 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week02/Решение07.csv Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week02/Решение07.csv} -Покажете в "popup" числото 1 ако [`INPUT1`] [=и=] [`INPUT2`] са равни на 5. +Покажете в "popup" числото 1 ако {` INPUT1} {b и} {` INPUT2} са равни на 5. Иначе покажете 0. ## Задача 8 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week02/Решение08.csv Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week02/Решение08.csv} -Покажете в "popup" умножението на [`INPUT1`] и [`INPUT2`]. -Допускаме, че [`INPUT2`] е неотрицателно цяло число. +Покажете в "popup" умножението на {` INPUT1} и {` INPUT2}. +Допускаме, че {` INPUT2} е неотрицателно цяло число. ## Задача 9 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week02/Решение09.csv Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week02/Решение09.csv} -Нека [`INPUT1`] да обозначава разликата на аритметична прогресия (разликата между два съседни елементa) и [`INPUT2`] да обозначава индекса на елемент в тази прогресия. +Нека {` INPUT1} да обозначава разликата на аритметична прогресия (разликата между два съседни елементa) и {` INPUT2} да обозначава индекса на елемент в тази прогресия. -Покажаете в "popup" числото на [`INPUT2`] позиция от аритметичната прогресия. +Покажаете в "popup" числото на {` INPUT2} позиция от аритметичната прогресия. Нека първия елемент винаги е 0 и неговия индекс е 1. -Допускаме, че [`INPUT2`] е неотрицателно цяло число. +Допускаме, че {` INPUT2} е неотрицателно цяло число. ## Задача 10 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week02/Решение10.csv Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week02/Решение10.csv} .note -[=(11.09.2025)=] Вече в условието и [`INPUT1`] е неотрицателно, иначе решението става твърде голямо. +{b (11.09.2025)} Вече в условието и {` INPUT1} е неотрицателно, иначе решението става твърде голямо. -Покажете в "popup" делението на [`INPUT1`] и [`INPUT2`], закръглено нагоре. -Допускаме, че [`INPUT1`] и [`INPUT2`] са неотрицателни цели числа. +Покажете в "popup" делението на {` INPUT1} и {` INPUT2}, закръглено нагоре. +Допускаме, че {` INPUT1} и {` INPUT2} са неотрицателни цели числа. Може да зачитате, че резултата при деление на 0 е 0. diff --git a/src/teaching/upp-2025/week02/machine.du b/src/teaching/upp-2025/week02/machine.du index 6c63d22..72d89fc 100644 --- a/src/teaching/upp-2025/week02/machine.du +++ b/src/teaching/upp-2025/week02/machine.du @@ -1,17 +1,17 @@ -# Машинна таблица - УПП, Седмица 2, 09.10.2025 +'def title Машинна таблица - УПП, Седмица 2, 09.10.2025 +'def desc Страница където може да работите с машинната таблица -'define expected-reading 2 min -'define created 05 October 2025 -'define edited 11 October 2025 -[$pagenav] +# {title} + +{pagenav 2 min;05 October 2025;11 October 2025} В тази таблица може да редактирате клетките на колона A и тези срещу INPUT1 и INPUT2. При изпълнение, всяка клетка в A се обикаля отгоре-надолу (показано с жълто). -Ако срещне [=команда=] тогава потенциално прочита и долната клетка, и извършва някакво действие. +Ако срещне {b команда} тогава потенциално прочита и долната клетка, и извършва някакво действие. -Повече подробности в [url ./machine_manual.html упътването]. -Списък от налични команди [url #section-1 в дъното на страницата]. +Повече подробности в {url упътването;./machine_manual.html}. +Списък от налични команди {url в дъното на страницата;#section-1}. .text 'snippet 8 $ ./machine_table.html @@ -19,25 +19,25 @@ ## Команди :defs -; [`ASUM`] -: Прави [`A = A + <числото в долната клетка>`] +; {` ASUM} +: Прави {` A = A + <числото в долната клетка>} -; [`ASUBTRACT`] -: Прави [`A = A - <числото в долната клетка>`] +; {` ASUBTRACT} +: Прави {` A = A - <числото в долната клетка>} -; [`ASHOW`] -: Показва стойността на [`A`] като pop-up. +; {` ASHOW} +: Показва стойността на {` A} като pop-up. -; [`BSUM`] -: Прави [`B = B + <числото в долната клетка>`] +; {` BSUM} +: Прави {` B = B + <числото в долната клетка>} -; [`BSUBTRACT`] -: Прави [`B = B - <числото в долната клетка>`] +; {` BSUBTRACT} +: Прави {` B = B - <числото в долната клетка>} -; [`GOTOBZ`] -: Ако [`B`] [=е=] 0, тогава отива на реда, посочен от следващата клетка. +; {` GOTOBZ} +: Ако {` B} {b е} 0, тогава отива на реда, посочен от следващата клетка. Иначе продължава нататък. -; [`GOTOBN`] -: Ако [`B`] [=е по-голямо или равно на=] 0, тогава отива на реда, посочен от следващата клетка. +; {` GOTOBN} +: Ако {` B} {b е по-голямо или равно на} 0, тогава отива на реда, посочен от следващата клетка. Иначе продължава нататък. diff --git a/src/teaching/upp-2025/week02/machine_manual.du b/src/teaching/upp-2025/week02/machine_manual.du index 7090a12..1104907 100644 --- a/src/teaching/upp-2025/week02/machine_manual.du +++ b/src/teaching/upp-2025/week02/machine_manual.du @@ -1,11 +1,11 @@ -# Упътване на машинната таблица - УПП, Седмица 2, 09.10.2025 +'def title Упътване на машинната таблица - УПП, Седмица 2, 09.10.2025 +'def desc Какво е машинната таблица, как работи, какви команди поддържа. -'define expected-reading 3 min -'define created 05 October 2025 -'define edited 05 October 2025 -[$pagenav] +# {title} -[$presentation-controller] +{pagenav 3 min;05 October 2025;05 October 2025} + +{presentation-controller} :title_slide35 @@ -18,8 +18,8 @@ - Целта е да разиграем мисленето за програмиране - Без да пишем истински код - "Машинната таблица" е специална таблица, която създадох за този практикум\n - [*(щеше да е на Excel ама...)*] -- Тя симулира действието на един [=много=] прост компютър + {i (щеше да е на Excel ама...)} +- Тя симулира действието на един {b много} прост компютър :slide35 @@ -27,7 +27,7 @@ ## Принцип на действие .centered -[image ./img/machine_table.png] +{img ./img/machine_table.png} :middle_slide35 @@ -37,55 +37,55 @@ .centered .font18 -[*(По принцип ще спре при първия празен ред)*] +{i (По принцип ще спре при първия празен ред)} .centered .p -[image ./img/table_execution_continuous.gif] +{img ./img/table_execution_continuous.gif} :middle_slide35 .centered .p -Продължава да обикаля клетки, докато не срещне [=празна клетка=] или не свършат всички клетки +Продължава да обикаля клетки, докато не срещне {b празна клетка} или не свършат всички клетки .centered .p -[image ./img/table_execution_empty.gif] +{img ./img/table_execution_empty.gif} :middle_slide35 .unordered -- Във всяка една клетка може да срещне [=команда=] или [=число=] +- Във всяка една клетка може да срещне {b команда} или {b число} - Очаква последователност от команди в колона A -- След [=някои=] команди, може да се срещне и число +- След {b някои} команди, може да се срещне и число - Стойности могат да се въвеждат в колоната A - Клетките "A" и "B" стават 0 при изпълнение -- Всяка команда работи със стойността на клетката "A" [=или=] "B" +- Всяка команда работи със стойността на клетката "A" {b или} "B" :middle_slide35 -## Командата [`ASHOW`] +## Командата {` ASHOW} .p Показва стойността на клетката A като popup .p -[image ./img/table_ashow.gif] +{img ./img/table_ashow.gif} :middle_slide35 -## Командата [`ASUM`] +## Командата {` ASUM} .p Поглежда числото в долната клетка и го сумира към клетката "А". .p -[image ./img/table_asum.gif] +{img ./img/table_asum.gif} :middle_slide35 @@ -96,18 +96,18 @@ Нека да покажем "A", добавим 5 към него и пак го покажем .p -[image ./img/table_ashow_and_asum.gif] +{img ./img/table_ashow_and_asum.gif} :middle_slide35 -## Командата [`ASUBTRACT`] +## Командата {` ASUBTRACT} .p -Като [`ASUM`], но изважда вместо да събере. +Като {` ASUM}, но изважда вместо да събере. .p -[image ./img/table_asubtract.gif] +{img ./img/table_asubtract.gif} :middle_slide35 @@ -127,7 +127,7 @@ Нека да добавим стойността на INPUT1 към "A" .p -[image ./img/table_asum_input1.gif] +{img ./img/table_asum_input1.gif} :middle_slide35 @@ -138,65 +138,65 @@ Нека добавим стойността на INPUT1 и INPUT2 към "А" .p -[image ./img/table_asum_input1_input2.gif] +{img ./img/table_asum_input1_input2.gif} :middle_slide35 -## Командата [`BSUM`] +## Командата {` BSUM} .p -Същото като [`ASUM`], но с клетка "B". +Същото като {` ASUM}, но с клетка "B". -## Командата [`BSUBTRACT`] +## Командата {` BSUBTRACT} .p -Същото като [`ASUBTRACT`], но с клетка "B". +Същото като {` ASUBTRACT}, но с клетка "B". -[$br1] +{br1} .p -[=Нямаме [`BSHOW`]!=] +{b Нямаме {` BSHOW}!} Но имаме други специални команди. :middle_slide35 -## Командата [`GOTOBZ`] +## Командата {` GOTOBZ} .p -[=Ако=] клетка "B" е равна на 0, тогава прочита следващата клетка и отива на посочения ред. +{b Ако} клетка "B" е равна на 0, тогава прочита следващата клетка и отива на посочения ред. .p -[image ./img/table_gotobz.gif] +{img ./img/table_gotobz.gif} :middle_slide .p -[=Иначе=] продължава напред +{b Иначе} продължава напред .p -[image ./img/table_gotobz_false.gif] +{img ./img/table_gotobz_false.gif} :middle_slide35 -## Командата [`GOTOBN`] +## Командата {` GOTOBN} .p -Същата като [`GOTOBZ`], обаче отива на посочения ред когато "B" е [=по-голямо или равно=] на 0 (неотрицателно). +Същата като {` GOTOBZ}, обаче отива на посочения ред когато "B" е {b по-голямо или равно} на 0 (неотрицателно). :middle_slide35 .unordered - Употребата на останалите бутони трябва да е явна. -- "Запази" запазва [=само=] колона A! +- "Запази" запазва {b само} колона A! :middle_slide35 .p .centered -[url ./index.html Към задачите] +{url Към задачите;./index.html} diff --git a/src/teaching/upp-2025/week03/index.du b/src/teaching/upp-2025/week03/index.du index 6eeb8f4..17a8ee7 100644 --- a/src/teaching/upp-2025/week03/index.du +++ b/src/teaching/upp-2025/week03/index.du @@ -1,12 +1,12 @@ -# Задачи - УПП, Седмица 3, 16.10.2025 +'def title Задачи - УПП, Седмица 3, 16.10.2025 +'def desc Условията на задачите за упражнение. -'define expected-reading 9 min -'define created 11 October 2025 -'define edited 18 October 2025 -[$pagenav] +# {title} + +{pagenav 9 min;11 October 2025;18 October 2025} .warn -Не сте учили побитови операции, затова някои задачи са преместени в [url #section-3 За любознателните]. +Не сте учили побитови операции, затова някои задачи са преместени в {url За любознателните;#section-3}. GitHub Classroom: [url https://classroom.github.com/a/UMc2WhVX] @@ -14,12 +14,13 @@ GitHub Classroom: [url https://classroom.github.com/a/UMc2WhVX] ### Задача 1 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week03/Exercise01.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week03/Exercise01.cpp} Получавате цяло число. Трябва да върнете 0 ако е нечетно и 1 ако е четно. -:table_2 +:table +:2 |= Вход |= Изход @@ -30,14 +31,16 @@ GitHub Classroom: [url https://classroom.github.com/a/UMc2WhVX] |: 1 + ### Задача 2 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week03/Exercise02.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week03/Exercise02.cpp} Получавате главна буква. Трябва да върнете съответната малка буква. -:table_2 +:table +:2 |= Вход |= Изход @@ -51,13 +54,15 @@ GitHub Classroom: [url https://classroom.github.com/a/UMc2WhVX] |: u + ### Задача 3 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week03/Exercise03.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week03/Exercise03.cpp} Получавате 3 цели числа, трябва да върнете 1 ако образуват аритметична прогресия и 0 иначе. -:table_2 +:table +:2 |= Вход |= Изход @@ -74,16 +79,18 @@ GitHub Classroom: [url https://classroom.github.com/a/UMc2WhVX] |: 1 + ### Задача 5 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week03/Exercise05.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week03/Exercise05.cpp} -Получавате десетично число: сума в [=левове=]. -Трябва да върнете същата сума в [=евро=], като [`1 € = 1.95583 лв`]. +Получавате десетично число: сума в {b левове}. +Трябва да върнете същата сума в {b евро}, като {` 1 € = 1.95583 лв}. -[*Поради прецизност при такива числа, вашите изходи може с много малко да се различават.*] +{i Поради прецизност при такива числа, вашите изходи може с много малко да се различават.} -:table_2 +:table +:2 |= Вход |= Изход @@ -103,9 +110,10 @@ GitHub Classroom: [url https://classroom.github.com/a/UMc2WhVX] |: 230.081 + ### Задача 6 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week03/Exercise06.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week03/Exercise06.cpp} Получавате две булеви стойности. Трябва да върнете 1 ако свойството "би-импликация" е изпълнено за тях. @@ -113,9 +121,10 @@ GitHub Classroom: [url https://classroom.github.com/a/UMc2WhVX] Припомняме, че би-импликацията и импликацията се дефинират по следния начин: -[image ./img/biimplication.png] +{img ./img/biimplication.png} -:table_2 +:table +:2 |= Вход |= Изход @@ -132,19 +141,21 @@ GitHub Classroom: [url https://classroom.github.com/a/UMc2WhVX] |: 1 + ### Задача 7 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week03/Exercise07.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week03/Exercise07.cpp} Получавате 4 цели числа от входа. За тях трябва да изкарате: .bulleted - средно аритметично, - сума, -- сума от вида [`1/<първо число> + 1/<второ число> + ...`], +- сума от вида {` 1/<първо число> + 1/<второ число> + ...}, - умножение. -:table_2 +:table +:2 |= Вход |= Изход @@ -158,19 +169,21 @@ GitHub Classroom: [url https://classroom.github.com/a/UMc2WhVX] |: -72.0 -288 inf 0 + ### Задача 8 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week03/Exercise08.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week03/Exercise08.cpp} -Получавате 5 реални числа: коефициентите на полином от трета степен [`a`] ([`a`] различно от 0), [`b`], [`c`], [`d`] и потенциален негов корен [`x`]. +Получавате 5 реални числа: коефициентите на полином от трета степен {` a} ({` a} различно от 0), {` b}, {` c}, {` d} и потенциален негов корен {` x}. -Трябва да върнете 1 ако [`x`] е корен на уравнението и 0 ако не е. +Трябва да върнете 1 ако {` x} е корен на уравнението и 0 ако не е. -Припомняме, че [`x`] е корен на кубично уравнение, когато: +Припомняме, че {` x} е корен на кубично уравнение, когато: -[image ./img/cubic.png] +{img ./img/cubic.png} -:table_2 +:table +:2 |= Вход |= Изход @@ -193,18 +206,20 @@ GitHub Classroom: [url https://classroom.github.com/a/UMc2WhVX] |: 1 + ### Задача 10 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week03/Exercise10.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week03/Exercise10.cpp} Получавате 6 реални числа: коефициентите на два (ортонормирани) триизмерни вектора. Върнете тяхното точково умножение. Припомняме, че алгебричата дефиниция на точковото умножение е: -[image ./img/dotproduct.png] +{img ./img/dotproduct.png} -:table_2 +:table +:2 |= Вход |= Изход @@ -221,24 +236,26 @@ GitHub Classroom: [url https://classroom.github.com/a/UMc2WhVX] |: 30 + ## За самоподготовка ### Задача 12 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week03/Exercise12.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week03/Exercise12.cpp} -Първите релефни етикети (които човек може сам да попълни) са въведени през 1958 от [url https://en.wikipedia.org/wiki/Dymo_Corporation#History DYMO]. +Първите релефни етикети (които човек може сам да попълни) са въведени през 1958 от {url DYMO;https://en.wikipedia.org/wiki/Dymo_Corporation#History}. Механични устройства съдържат диск с букви (знаци), който се завърта докато не се избере желаната буква. Чрез стискане на дръжката, малък чук прищипва лентата върху диска (който има релефи на буквите), пластмасовата лента се изкривява и буква се отпечтва (подобно на пишеща машина). -[image ./img/dymo.JPG] +{img ./img/dymo.JPG} Нека нашия диск съдържа само малки букви. Във входа получавате две малки букви: коя буква е избрана в момента и коя буква е желана. Трябва да върнете с колко позиции на ляво (обратно на часовниковата стрелка) трябва да се завърти диска, така че желаната буква да се избере. -:table_2 +:table +:2 |= Вход |= Изход @@ -261,28 +278,30 @@ GitHub Classroom: [url https://classroom.github.com/a/UMc2WhVX] |: 7 + ### Задача 13 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week03/Exercise13.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week03/Exercise13.cpp} -През 629, индийския математик [url https://en.wikipedia.org/wiki/Bh%C4%81skara_I Бхаскара 1ви] представя една забележителна апроксимация на синус функцията (в радиани): +През 629, индийския математик {url Бхаскара 1ви;https://en.wikipedia.org/wiki/Bh%C4%81skara_I} представя една забележителна апроксимация на синус функцията (в радиани): -[image ./img/sineapprox.png] +{img ./img/sineapprox.png} От входа ще получите два ъгъла в радиани, α и β, чиято сума е между 0 и π/2 (включително). -Използвайки [=единствено=] апроксимацията на Бхаскара 1ви, пресметнете [`tg(α + β)`].\n -[=Не може да използвате коренуване!=] +Използвайки {b единствено} апроксимацията на Бхаскара 1ви, пресметнете {` tg(α + β)}.\n +{b Не може да използвате коренуване!} За константата π, използвайте поне 5 цифри след десетичната запетая. .text <details> -<summary>[*Подсказка*]</summary> -Използвайте факта, че [url https://en.wikipedia.org/wiki/List_of_trigonometric_identities#Shifts_and_periodicity може да представите косинус чрез отместване на синус]. +<summary>{i Подсказка}</summary> +Използвайте факта, че {url може да представите косинус чрез отместване на синус;https://en.wikipedia.org/wiki/List_of_trigonometric_identities#Shifts_and_periodicity}. </details> -:table_2 +:table +:2 |= Вход |= Изход @@ -305,6 +324,7 @@ GitHub Classroom: [url https://classroom.github.com/a/UMc2WhVX] |: 1.30265 + .comment pi / 2 = 1.570795 pi / 3 = 1.047196 @@ -320,7 +340,8 @@ pi / 8 = 0.392698 Трябва да върнете 1 ако правоъгълниците се пресичат и 0 иначе. -:table_2 +:table +:2 |= Вход |= Изход @@ -340,6 +361,7 @@ pi / 8 = 0.392698 |: 1 + ## За любознателните .note @@ -351,7 +373,8 @@ pi / 8 = 0.392698 Трябва да върнете бит-а на съответната позиция в числото, като индекс 0 е най-десния бит (младши), докато 31 е най-левия бит (старши). -:table_2 +:table +:2 |= Вход |= Изход @@ -371,12 +394,14 @@ pi / 8 = 0.392698 |: 1 + ### Задача 9 Получавате цяло неотрицателно 8-битово число. Трябва да върнете 1 ако броя единици в числото е нечетно и 0 иначе. -:table_2 +:table +:2 |= Вход |= Изход @@ -396,6 +421,7 @@ pi / 8 = 0.392698 |: 1 + ### Задача 11 Нека да разделим едно цяло неотрицателно 32-битово число на 4 части, всяка по 8 бита. @@ -404,9 +430,10 @@ pi / 8 = 0.392698 Примерно, числото 2148271109 в двоичната бройна система е 10000000000011000000010000000101, което се разделя на подчислата 10000000, 00001100, 00000100 и 00000101 (128, 12, 4 и 5). Получавате две 32-битови цели неотрицателни числа. -Сумирайте [=съответните=] подчисла в двете числа и изкарайте резултаното "надчисло". +Сумирайте {b съответните} подчисла в двете числа и изкарайте резултаното "надчисло". -:table_2 +:table +:2 |= Вход |= Изход @@ -429,6 +456,7 @@ pi / 8 = 0.392698 |: 10291711 + .comment 0.0.0.3 + 0.0.0.4 = 7 0.0.0.255 + 0.0.0.1 = 0 @@ -449,7 +477,8 @@ pi / 8 = 0.392698 То представлява UNIX време. Трябва да изкарате UTC часа и датата, в "човешки" формат ("час:минути:секунди ден месец година"). -:table_2 +:table +:2 |= Вход |= Изход @@ -472,9 +501,10 @@ pi / 8 = 0.392698 |: 7:6:14 12 10 2025 + ### Задача 15 -В модерния интернет, всяко устройство се обозначава с [*уникален*] адрес. +В модерния интернет, всяко устройство се обозначава с {i уникален} адрес. Това е 32-битово цяло неотрицателно число. За човешко удобоство, това число се представя чрез "dot-decimal notation": всеки 8 бита се представят като десетично число и тези 4 числа се слепват с точки между тях. @@ -485,7 +515,8 @@ pi / 8 = 0.392698 От входа получавате цяло неотрицателно 32-битово число. Трябва да изкарате стойността му в "dot-decimal notation". -:table_2 +:table +:2 |= Вход |= Изход @@ -508,14 +539,15 @@ pi / 8 = 0.392698 |: 216.24.57.7 + ### Задача 17 -В автомобилите, за комуникация между всички електронни компоненти се използва [url https://en.wikipedia.org/wiki/CAN_bus Controller Area Network bus]. +В автомобилите, за комуникация между всички електронни компоненти се използва {url Controller Area Network bus;https://en.wikipedia.org/wiki/CAN_bus}. Различни устройства се свързват в една мрежа и си комуникират помежду си. Единичен трансфер на данни се нарича "frame". Всеки "frame" следва стандартен формат, описващ какви данни се пренасят, колко и т.н. -Как изглежда този формат може да намерите на: [url https://en.wikipedia.org/wiki/ISO_15765-2] +Как изглежда този формат може да намерите на: {url https://en.wikipedia.org/wiki/ISO_15765-2} От входа получавате осем 8-битови числа. Те представляват един CAN frame. diff --git a/src/teaching/upp-2025/week04/index.du b/src/teaching/upp-2025/week04/index.du index 8b138fa..89cd0db 100644 --- a/src/teaching/upp-2025/week04/index.du +++ b/src/teaching/upp-2025/week04/index.du @@ -1,17 +1,17 @@ -# Задачи - УПП, Седмица 4, 23.10.2025 +'def title Задачи - УПП, Седмица 4, 23.10.2025 +'def desc Условията на задачите за упражнение. -'define expected-reading 9 min -'define created 18 October 2025 -'define edited 25 October 2025 -[$pagenav] +# {title} -GitHub Classroom: [url https://classroom.github.com/a/rOzekyCs] +{pagenav 9 min;18 October 2025;25 October 2025} + +GitHub Classroom: {url https://classroom.github.com/a/rOzekyCs} :important .p -При [`if`]-ове [=ще=] вземаме точки за изрази от типа: +При {` if}-ове {b ще} вземаме точки за изрази от типа: -```c++ +```cpp if (condition) std::cout << 1; else @@ -20,7 +20,7 @@ else .p или -```c++ +```cpp if (condition) std::cout << false; else @@ -29,7 +29,7 @@ else .p или -```c++ +```cpp if (condition) std::cout << '0'; else @@ -43,12 +43,13 @@ else ### Задача 1 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise01.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise01.cpp} От входа получавате две реални числа. Трябва да ги върнете в нарастващ ред. -:table_2 +:table +:2 |= Вход |= Изход @@ -62,9 +63,10 @@ else |: -11.1 -2.5 + ### Задача 2 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise02.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise02.cpp} От входа получавате буква. Трябва да изкрате: @@ -74,7 +76,8 @@ else - "Digit" ако е цифра и - "Other" в останалите случаи. -:table_2 +:table +:2 |= Вход |= Изход @@ -91,14 +94,16 @@ else |: Other + ### Задача 3 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise03.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise03.cpp} От входа получавате ден в месеца (допускаме 30-дневен месец, където първи ден е Понеделник; като месец Септември от тази година). Трябва да върнете името на деня от седмицата. -:table_2 +:table +:2 |= Вход |= Изход @@ -118,18 +123,20 @@ else |: Tuesday + ### Задача 4 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise04.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise04.cpp} -От входа получавате реални коефициенти на квадратно уравнение: [`a`], [`b`] и [`c`]. +От входа получавате реални коефициенти на квадратно уравнение: {` a}, {` b} и {` c}. Трябва да изкарате корените на уравнението, като: .bulleted - ако има два корена, изкарвате и двата, -- ако има един корен, изкарвате [=само=] него, +- ако има един корен, изкарвате {b само} него, - ако няма реални корени, изкарвате "No real roots". -:table_2 +:table +:2 |= Вход |= Изход @@ -143,21 +150,23 @@ else |: 1.5 + ### Задача 5 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise05.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise05.cpp} От входа получавате буква, съответстваща на операция върху числа: .bulleted -- [`_`] за закръгляне надолу на число -- [`+`] за събиране на две числа -- [`*`] за умножение на две числа -- [`x`] за умножение на три числа -- [`.`] за умножение на четири числа +- {` _} за закръгляне надолу на число +- {` +} за събиране на две числа +- {` *} за умножение на две числа +- {` x} за умножение на три числа +- {` .} за умножение на четири числа След тази буква ще получите съответния брой реални числа и трябва да изкарате резултата от операцията. -:table_2 +:table +:2 |= Вход |= Изход @@ -177,16 +186,17 @@ else |: -8 + ### Задача 6 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise06.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise06.cpp} От входа получавате число, което определя фигура. Това число може да бъде: .bulleted -- [`1`] за окръжност, -- [`2`] за правоъгълник и -- [`3`] за триъгълник. +- {` 1} за окръжност, +- {` 2} за правоъгълник и +- {` 3} за триъгълник. Спрямо типа фигура, ще приемете различен брой реални числа: .bulleted @@ -197,7 +207,8 @@ else Използвайки тези числа, трябва да изкарате периметър (дължина) на фигурата. За константата π използвайте поне 5 цифри след запетаята. -:table_2 +:table +:2 |= Вход |= Изход @@ -211,16 +222,18 @@ else |: 1849.63 + ### Задача 7 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise07.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise07.cpp} От входа получавате цяло число. Изкарайте за него таблицата на умножение от 1 до 10 включително. -[=Използвайте цикъл!=] +{b Използвайте цикъл!} -:table_2 +:table +:2 |= Вход |= Изход @@ -253,14 +266,16 @@ else 10 -80 + ### Задача 8 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise08.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise08.cpp} -От входа получавате две цели положителни числа, [`a`] и [`x`]. -Пресметнете [`a`] на степен [`x`]. +От входа получавате две цели положителни числа, {` a} и {` x}. +Пресметнете {` a} на степен {` x}. -:table_2 +:table +:2 |= Вход |= Изход @@ -277,15 +292,17 @@ else |: 844596301 + ### Задача 9 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise09.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise09.cpp} От входа получавате цяло положително число. -Трябва [=поотделно=] да сумирате всички четни и нечетни числа от 1 до подаденото число, включително. +Трябва {b поотделно} да сумирате всички четни и нечетни числа от 1 до подаденото число, включително. Накрая изкарайте двете суми. -:table_2 +:table +:2 |= Вход |= Изход @@ -299,14 +316,16 @@ else |: 1056 1024 + ### Задача 10 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise10.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise10.cpp} От входа получавате цяло положително число. Изкарайте за него "Prime" ако е просто и "Not prime" ако не е, последвано от най-малкия делител (различен от 1 и самото число). -:table_2 +:table +:2 |= Вход |= Изход @@ -323,14 +342,16 @@ else |: Not prime 1187 + ### Задача 11 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise11.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise11.cpp} От входа получавате цели числа докато не срещнете числото 0. Трябва да върнете умножението на всички тези числа (без нулата). -:table_2 +:table +:2 |= Вход |= Изход @@ -344,20 +365,22 @@ else |: -1479870000 + ### Задача 12 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise12.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise12.cpp} От входа получавате знак. -Ако този знак е аритметична операция ([`+`], [`-`], [`*`], [`/`]), тогава ще получите две цели числа. +Ако този знак е аритметична операция ({` +}, {` -}, {` *}, {` /}), тогава ще получите две цели числа. Трябва да пресметнете резултата на операцията върху тези числа, да го изкарате и пак да очаквате знак. Ако този знак е точка, тогава спирате програмата. -[*При вас вход и изход ще са смесени.*] +{i При вас вход и изход ще са смесени.} -:table_2 +:table +:2 |= Вход |= Изход @@ -371,16 +394,18 @@ else |: 8192 5 49 100 + ### Задача 13 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise13.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise13.cpp} -[url https://en.wikipedia.org/wiki/Fibonacci_sequence Редицата на Фибоначи] е последователност от числа, където всяко следващо е равно на сумата на предходните две. +{url Редицата на Фибоначи;https://en.wikipedia.org/wiki/Fibonacci_sequence} е последователност от числа, където всяко следващо е равно на сумата на предходните две. По-точно, първото число (на индекс 0) е 0, второто число (на индекс 1) е 1 и всяко следващо се определя от предходните две. От входа получавате неотрицателен индекс и трябва да изкарате съответното число на фибоначи. -:table_2 +:table +:2 |= Вход |= Изход @@ -406,14 +431,16 @@ else |: 3524578 + ### Задача 14 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise14.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise14.cpp} От входа получавате цяло неотрицателно число. Трябва да обърнете реда на цифрите в числото и да изкарате резултата. -:table_2 +:table +:2 |= Вход |= Изход @@ -430,11 +457,12 @@ else |: 73444672 + ## За самоподготовка ### Задача 15 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise15.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise15.cpp} Получавате реално число: оценка по шестобалната система. Трябва да върнете "наименованието" на оценката спрямо стойността: @@ -446,7 +474,8 @@ else - "Weak" (оценки от 2.99 до 2.0) и - "Bad" (по-малко от двойка) -:table_2 +:table +:2 |= Вход |= Изход @@ -469,9 +498,10 @@ else |: Bad + ### Задача 16 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise16.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise16.cpp} Получавате три реални числа: ъгли в градуси. Трябва да върнете дали триъгълник с тези ъгли може да съществува, и ако да, дали е: @@ -482,7 +512,8 @@ else - тъп ("Obtuse") или - правоъгълен ("Right"). -:table_2 +:table +:2 |= Вход |= Изход @@ -502,16 +533,18 @@ else |: Obtuse triangle + ### Задача 17 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise17.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise17.cpp} -[url https://en.wikipedia.org/wiki/Factorial Факториел] е функция върху число, която представлява умножението на всички цели числа от 1 до самото число включително. +{url Факториел;https://en.wikipedia.org/wiki/Factorial} е функция върху число, която представлява умножението на всички цели числа от 1 до самото число включително. От входа получавате цяло положително число. Трябва да изкарате неговия факториел. -:table_2 +:table +:2 |= Вход |= Изход @@ -531,9 +564,10 @@ else |: 6 + ### Задача 18 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise18.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise18.cpp} Във вашата програма запазете цяла неотрицателна константа. От входа получавате цели неотрицателни числа: опити да се познае. @@ -542,9 +576,10 @@ else Ако е по-голямо, трябва да върнете "Lower". Ако бъде познато, трябва да върнете "You guessed it!" и да спрете програмата. -[*В следните примери числото е 1337. Вашия вход и изход ще бъдат смесени.*] +{i В следните примери числото е 1337. Вашия вход и изход ще бъдат смесени.} -:table_2 +:table +:2 |= Вход |= Изход @@ -578,15 +613,16 @@ You guessed it! ### Задача 19 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise19.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise19.cpp} -[url https://en.wikipedia.org/wiki/Harmonic_series_(mathematics) Хармоничния ред] е редица числа, където n-тото число се определя по формулата: +{url Хармоничния ред;https://en.wikipedia.org/wiki/Harmonic_series_(mathematics)} е редица числа, където n-тото число се определя по формулата: -[image ./img/harmonic_element.png] +{img ./img/harmonic_element.png} От входа ще получите положително цяло число n, трябва да върнете n-тото число в хармоничния ред. -:table_2 +:table +:2 |= Вход |= Изход @@ -606,21 +642,23 @@ You guessed it! |: 3.59774 + ### Задача 20 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise20.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise20.cpp} От входа получавате реално ненулево "целево" число и реално "обсег" число (в проценти). След това получавате редица реални ненулеви числа. -Продължавате да приемате реални числа, докато сумата на всички числа в редицата не е поне с "обсег" процента [*близкост*] до целевото число. +Продължавате да приемате реални числа, докато сумата на всички числа в редицата не е поне с "обсег" процента {i близкост} до целевото число. Накрая на програмата изкарайте тази сума. Формулата за процентова разлика между числа а и b е: -[image ./img/percent_diff.png] +{img ./img/percent_diff.png} -:table_2 +:table +:2 |= Вход |= Изход @@ -637,20 +675,21 @@ You guessed it! |: 20 + ## За любознателните ### Задача 21 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise21.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week04/Exercise21.cpp} В година 60та, преди близко до 2000 години, гръцкия математик Херон описва алгоритъм за пресмятане на корен квадратен на подадено число S. -Описва се редица от числа x, където всяко следващо е равно на предходното, следвайки [url https://en.wikipedia.org/wiki/Square_root_algorithms#Heron's_method просто линейно взаимоотношение]. +Описва се редица от числа x, където всяко следващо е равно на предходното, следвайки {url просто линейно взаимоотношение;https://en.wikipedia.org/wiki/Square_root_algorithms#Heron's_method}. Всеки следващ член на редицата става все по-близък до истинската стойност на корена. Първия член е произволно първоначално приближение. Разбира се, колко е по-близко приближението до истинската стойност, толкова по-бързо се приближаваме. -Нека за нашите цели да използваме [url https://en.wikipedia.org/wiki/Square_root_algorithms#Hyperbolic_estimates хиперболичното приближение]. +Нека за нашите цели да използваме {url хиперболичното приближение;https://en.wikipedia.org/wiki/Square_root_algorithms#Hyperbolic_estimates}. Получавате цяло число S и индекс на член в редицата n. Трябва да върнете корена на числото по метода на Херон. diff --git a/src/teaching/upp-2025/week05/index.du b/src/teaching/upp-2025/week05/index.du index f19ff04..6e545e7 100644 --- a/src/teaching/upp-2025/week05/index.du +++ b/src/teaching/upp-2025/week05/index.du @@ -1,9 +1,9 @@ -# Задачи - УПП, Седмица 5, 30.10.2025 +'def title Задачи - УПП, Седмица 5, 30.10.2025 +'def desc Условията на задачите за упражнение. -'define expected-reading 14 min -'define created 26 October 2025 -'define edited 01 November 2025 -[$pagenav] +# {title} + +{pagenav 14 min;26 October 2025;01 November 2025} GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] @@ -14,12 +14,13 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] ### Задача 1 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise01.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise01.cpp} От входа получавате 10 реални числа. Трябва да ги върнете в обратен ред. -:table_2 +:table +:2 |= Вход |= Изход @@ -30,14 +31,16 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: 39.8 6 69.21 84.55 100.001 18.62 34.799 65 89.95 41.4 + ### Задача 2 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise02.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise02.cpp} От входа получавате 7 букви. Трябва да изкарате буквите в същата последователност, обаче завъртяни надясно с 3 позиции. -:table_2 +:table +:2 |= Вход |= Изход @@ -48,15 +51,17 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: j l b k l m l + ### Задача 3 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise03.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise03.cpp} От входа получавате 14 цели неотрицателни числа. Трябва да изкарате второто най-голямо число. Ако няма такова, просто изкарайте най-голямото. -:table_2 +:table +:2 |= Вход |= Изход @@ -70,17 +75,19 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: 9 + ### Задача 4 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise04.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise04.cpp} От входа получавате две цели положителни числа. -Трябва да върнете [url https://en.wikipedia.org/wiki/Factorial#Definition факториел] от първото число, който факториел е повдигнат на степен второто число. +Трябва да върнете {url факториел;https://en.wikipedia.org/wiki/Factorial#Definition} от първото число, който факториел е повдигнат на степен второто число. Факториел на едно (неотрицателно цяло) число е умножението на всички цели числа от 1 до самото число включително. -Примерно, факториел от 5 е [`1 * 2 * 3 * 4 * 5 = 120`]. +Примерно, факториел от 5 е {` 1 * 2 * 3 * 4 * 5 = 120}. -:table_2 +:table +:2 |= Вход |= Изход @@ -103,14 +110,16 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: 256 + ### Задача 5 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise05.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise05.cpp} От входа получавате 18 цели числа. Трябва да изкарате същата поредица числа, обаче всички нули са в началото на редицата. -:table_2 +:table +:2 |= Вход |= Изход @@ -121,12 +130,13 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: 0 0 0 0 839 643 42 -694 57 650 729 -434 35 155 176 873 40 658 + .question Нужни ли са масиви, ако в условието трябваше да изкарвате нулите в края на поредицата? ### Задача 6 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise06.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise06.cpp} От входа получавате 15 цели числа. Трябва да изкарате дължината на най-дългата последователност от числа, която е подредена в нарастващ ред. @@ -134,9 +144,10 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] Последователност от числа, която съдържа еднакви числа, също се зачита за сортирана в нарастващ ред. .note -[=(01.11.2025)=] Поправен е изхода в първия пример, от 6 на 8. +{b (01.11.2025)} Поправен е изхода в първия пример, от 6 на 8. -:table_2 +:table +:2 |= Вход |= Изход @@ -159,14 +170,16 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: 5 + ### Задача 7 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise07.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise07.cpp} От входата получавате цяло неотрицателно число. Върнете дали то е перфектно: дали е равно на сумата на всички свои делители, освен себе си. -:table_2 +:table +:2 |= Вход |= Изход @@ -201,16 +214,18 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: Perfect + ### Задача 8 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise08.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise08.cpp} От входа получавате две редици от по 10 реални числа (т.е. първите 10 числа са от първата редица, и вторите 10 числа образуват втората редица). -След това получавате знак - аритметича операция ([`+`], [`-`], [`*`], [`/`]). +След това получавате знак - аритметича операция ({` +}, {` -}, {` *}, {` /}). Трябва да изпълните операцията върху всяка съответна двойка числа от двете редици и да върнете резултатите. -:table_2 +:table +:2 |= Вход |= Изход @@ -231,19 +246,21 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: inf -2 16.175 16.41 100.011 -inf 4 31.714 71 -nan + ### Задача 9 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise09.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise09.cpp} От входа получавате реално число z между 0 (изключително) и 2 (включително), заедно с дължина n. -Трябва да намерите стойността на логаритъм с основа ℯ ([url https://en.wikipedia.org/wiki/E_(mathematical_constant) Неперово число]) от това число, използвайки развитието по ред на Тейлър: +Трябва да намерите стойността на логаритъм с основа ℯ ({url Неперово число;https://en.wikipedia.org/wiki/E_(mathematical_constant)}) от това число, използвайки развитието по ред на Тейлър: -[image ./img/ln_taylor_series.png] +{img ./img/ln_taylor_series.png} като n определя колко елемента от реда да използвате. -:table_2 +:table +:2 |= Вход |= Изход @@ -281,22 +298,24 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: -4.60517 + ### Задача 10 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise10.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise10.cpp} От входа получавате цяло неотрицатено число с максимум 8 цифри. -Това число представлява сериен номер под [url https://en.wikipedia.org/wiki/S10_(UPU_standard) S10 стандарта за идентификационни номера на пратки]. +Това число представлява сериен номер под {url S10 стандарта за идентификационни номера на пратки;https://en.wikipedia.org/wiki/S10_(UPU_standard)}. Трябва да пресметнете "контролната цифра" (check digit) на серийния номер. Това става по следния начин: .numbered 1. От ляво на дясно, трябва да умножите всяка цифра със съответната си "тежест": 8, 6, 4, 2, 3, 5, 9, 7 2. Сумирате умножените цифри -3. Пресмятате контролната цифра по формулата: [`11 - <сума> mod 11`], където +3. Пресмятате контролната цифра по формулата: {` 11 - <сума> mod 11}, където ако резултата е 10, цифрата е 0 и ако резултата е 11, цифрата е 5. -:table_2 +:table +:2 |= Вход |= Изход @@ -325,28 +344,30 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: 5 + ### Задача 11 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise11.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise11.cpp} От входа получавате цяло неотрицателно число. -Изкарвате [url https://en.wikipedia.org/wiki/Lucas_number числото на Лукас] след толкова на брой позиции и ако числото [=не=] е било 0, приемаме ново число и повтаряте логиката. +Изкарвате {url числото на Лукас;https://en.wikipedia.org/wiki/Lucas_number} след толкова на брой позиции и ако числото {b не} е било 0, приемаме ново число и повтаряте логиката. -Тоест, ако първото число е n, тогава връщате [`n`]-тото число на Лукас.\n -Ако второто число е m, тогава връщате [`n + m`]-тото число на Лукас. +Тоест, ако първото число е n, тогава връщате {` n}-тото число на Лукас.\n +Ако второто число е m, тогава връщате {` n + m}-тото число на Лукас. И така нататък. Числата на Лукас се определят по следния начин: -[image ./img/lucas_def.png] +{img ./img/lucas_def.png} .note -[=(01.11.2025)=] Входа на последния пример е поправен. +{b (01.11.2025)} Входа на последния пример е поправен. -[*Вашия вход и изход може да са смесени!*] +{i Вашия вход и изход може да са смесени!} -:table_2 +:table +:2 |= Вход |= Изход @@ -369,9 +390,10 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: 47 2207 3571 3571 + ### Задача 12 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise12.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise12.cpp} От входа получавате 20 цели числа, всяко от които е индекс на елемент в масива (т.е. всяко е между 0 и 19 включително). @@ -384,9 +406,10 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] Ако се поражда цикъл (посетим някое число повече от един път), тогава трябва да изкарате "Infinity". .note -[=(01.11.2025)=] Входа на първия пример е поправен. +{b (01.11.2025)} Входа на първия пример е поправен. -:table_2 +:table +:2 |= Вход |= Изход @@ -406,18 +429,20 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: Infinity + ## За самоподготовка ### Задача 13 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise13.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise13.cpp} От входа получавате 8 цели числа. След това получавате 9то цяло число. Трябва да върнете, сред 8те цели числа, колко често се среща 9тото. -:table_2 +:table +:2 |= Вход |= Изход @@ -434,14 +459,16 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: 8 + ### Задача 14 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise14.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise14.cpp} От входа получавате 16 цели числа. Трябва да изкарате, на два реда, първо всички четни числа и после всички нечетни. -:table_2 +:table +:2 |= Вход |= Изход @@ -458,9 +485,10 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] -961 871 657 -297 -5 -9 255 + ### Задача 15 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise15.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise15.cpp} От входа получавате 12 реални числа. Трябва да върнете, на отделни редове, двойки числа от тази поредица: @@ -469,7 +497,8 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] - Втората двойка има второто и пред-посленото число. - И така нататък. -:table_2 +:table +:2 |= Вход |= Изход @@ -494,15 +523,17 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] 769.89 505 + ### Задача 16 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise16.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise16.cpp} От входа получавате две редици от по 5 цели числа (т.е. първите 5 числа са част от първата редица и вторите 5 числа са част от втората). Трябва да изкарате една редица от числа, където двете редици са преплетени: първо имаме първото число от първата редица, след това първото число от втората редица, след това второто число от първата редица и така нататък. -:table_2 +:table +:2 |= Вход |= Изход @@ -513,15 +544,17 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: 0 1 1 0 0 1 1 0 0 1 + ### Задача 17 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise17.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise17.cpp} От входа получавате цяло число в десетична бройна система. -Трябва да изкарате дали то е [url https://en.wikipedia.org/wiki/Narcissistic_number число на Армстронг]: число, което е равно на сумата на цифрите си, където всяка цифра е повдигната на степен, дължината на числото. +Трябва да изкарате дали то е {url число на Армстронг;https://en.wikipedia.org/wiki/Narcissistic_number}: число, което е равно на сумата на цифрите си, където всяка цифра е повдигната на степен, дължината на числото. -:table_2 +:table +:2 |= Вход |= Изход @@ -544,12 +577,13 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: Narcissistic + ### Задача 18 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise18.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise18.cpp} .note -[=(01.11.2025)=] Поправени бройката на входните цели числа и втория пример. +{b (01.11.2025)} Поправени бройката на входните цели числа и втория пример. От входа получавате 7 цели числа. @@ -557,7 +591,8 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] Ако такаъв индекс не съществува, изкарате "No such index". -:table_2 +:table +:2 |= Вход |= Изход @@ -568,19 +603,21 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: No such index + ### Задача 19 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise19.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise19.cpp} От входа получавате две числа: реален ъгъл в радиани x и положителен максимален индекс n. Трябва да върнете стойността на синус от този ъгъл, използвайки реда на Тейлър: -[image ./img/sinx_taylor_series.png] +{img ./img/sinx_taylor_series.png} където n определя с колко елемента от реда да смятаме. -:table_2 +:table +:2 |= Вход |= Изход @@ -597,27 +634,29 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: -1.08189 + ### Задача 20 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise20.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise20.cpp} От входа получавате цяло положително число. -Трябва да валидирате това число използвайки [url https://en.wikipedia.org/wiki/Luhn_algorithm алгоритъма на Luhn]: +Трябва да валидирате това число използвайки {url алгоритъма на Luhn;https://en.wikipedia.org/wiki/Luhn_algorithm}: .numbered 1. Най-дясната цифра е "цифра за проверка", тя трябва да бъде изкарана за после. 2. Започвайки от най-дясната цифра (от останалите цифри, т.е. втората най-дясна в числото), трябва да умножите всяка втора цифра по две. - Ако цифрата стане по-голяма от 9, трябва да [*извадите*] 9. + Ако цифрата стане по-голяма от 9, трябва да {i извадите} 9. 3. Сумирате всички цифри (всички умножени и неумножени). -4. Проверявате дали цифрата за проверка е равна на [`(10 - (сумa mod 10)) mod 10`] +4. Проверявате дали цифрата за проверка е равна на {` (10 - (сумa mod 10)) mod 10} Този алгоритъм се използва главно в проверката на номера на дебитни/кредитни карти. Главната цел е да се засекат някои механични грешки при въвеждане на номера. .note -[=(01.11.2025)=] Поправен е входа на третия пример. +{b (01.11.2025)} Поправен е входа на третия пример. -:table_2 +:table +:2 |= Вход |= Изход @@ -640,21 +679,23 @@ GitHub Classroom: [url https://classroom.github.com/a/6oPRMxJx] |: Invalid + ### Задача 21 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise21.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week05/Exercise21.cpp} От входа получавате цяло неотрицателно число. -Трябва да върнете съответното по индекс [url https://en.wikipedia.org/wiki/Catalan_number число на Каталан]. +Трябва да върнете съответното по индекс {url число на Каталан;https://en.wikipedia.org/wiki/Catalan_number}. n-тото число на Каталан се дефинира по следния начин: -[image ./img/catalan_def.png] +{img ./img/catalan_def.png} -Където [`x!`] е [url https://en.wikipedia.org/wiki/Factorial#Definition факториел] от x. +Където {` x!} е {url факториел;https://en.wikipedia.org/wiki/Factorial#Definition} от x. Припомняме, че факториел на едно число е умножението на всички цели числа от 1 до самото число включително. -:table_2 +:table +:2 |= Вход |= Изход diff --git a/src/teaching/upp-2025/week06/index.du b/src/teaching/upp-2025/week06/index.du index a1660f8..dcdd607 100644 --- a/src/teaching/upp-2025/week06/index.du +++ b/src/teaching/upp-2025/week06/index.du @@ -1,27 +1,28 @@ -# Задачи - УПП, Седмица 6, 06.11.2025 +'def title Задачи - УПП, Седмица 6, 06.11.2025 +'def desc Условията на задачите за упражнение. -'define expected-reading 10 min -'define created 01 November 2025 -'define edited 06 November 2025 -[$pagenav] +# {title} -GitHub Classroom: [url https://classroom.github.com/a/JSB1UK_f] +{pagenav 10 min;01 November 2025;06 November 2025} + +GitHub Classroom: {url https://classroom.github.com/a/JSB1UK_f} ## За решаване ### Задача 1 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise01.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise01.cpp} -През 1837 година, [url https://en.wikipedia.org/wiki/Charles_Babbage Чарлз Бабидж] пита въпроса: +През 1837 година, {url Чарлз Бабидж;https://en.wikipedia.org/wiki/Charles_Babbage} пита въпроса: .quote What is the smallest positive integer whose square ends in the digits 269,696? Според него това число е 99736 (чиито квадрат е 9947269696). -Напишете програма, която [=намира=] най-малкото число, отговарящо на въпроса. +Напишете програма, която {b намира} най-малкото число, отговарящо на въпроса. -:table_2 +:table +:2 |= Вход |= Изход @@ -29,14 +30,16 @@ What is the smallest positive integer whose square ends in the digits 269,696? |: 25264 + ### Задача 2 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise02.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise02.cpp} От входа получавате 8 цели положителни числа. Трябва да изкарате най-голямото общо делимо между всички тези числа. -:table_2 +:table +:2 |= Вход |= Изход @@ -50,16 +53,18 @@ What is the smallest positive integer whose square ends in the digits 269,696? |: 1 + ### Задача 3 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise03.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise03.cpp} Получавате цяло положително число. В него трябва да замените всички срещания на най-срещаната цифра с 0. Ако има няколко такива цифри, трябва да замените само най голямата от тях. -:table_2 +:table +:2 |= Вход |= Изход @@ -88,14 +93,16 @@ What is the smallest positive integer whose square ends in the digits 269,696? |: 535035030 + ### Задача 4 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise04.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise04.cpp} Получавате една редица от 15 цели числа и след това втора редица с 5 цели уникални числа. Трябва да върнете броя срещания в първата редица на всяко от числата във втората редица. -:table_2 +:table +:2 |= Вход |= Изход @@ -106,21 +113,23 @@ What is the smallest positive integer whose square ends in the digits 269,696? |: 0 2 7 6 0 + ### Задача 5 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise05.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise05.cpp} От входа получавате две реални числа: координати на точка в равнината. Спрямо следното изображение: -[image ./img/rectangle_and_line.png] +{img ./img/rectangle_and_line.png} изкарайте дали точката е в защрихованата област или не. -Областта [=не=] включва правата и правоъгълника! +Областта {b не} включва правата и правоъгълника! Зачитайте, че черните прави отбелязват главните оси, а разстоянията между съседни сиви оси е единица. -:table_2 +:table +:2 |= Вход |= Изход @@ -164,12 +173,13 @@ What is the smallest positive integer whose square ends in the digits 269,696? |: Inside + ### Задача 6 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise06.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise06.cpp} От входа получавате цяло положително число. -Трябва да върнете дали то е [url https://en.wikipedia.org/wiki/Happy_number щастливо]. +Трябва да върнете дали то е {url щастливо;https://en.wikipedia.org/wiki/Happy_number}. Нека да вземем нашето число и да го заменим със сумата на всички свои цифри, повдигнати на квадрат. Оригиналното число е щастливо, ако след краен брой прилагания на тази операция, получим числото 1. @@ -177,7 +187,8 @@ What is the smallest positive integer whose square ends in the digits 269,696? Когато число не е щастливо, влизаме в безкрайния цикъл 4, 16, 37, 58, 89, 145, 42, 20, 4, 16, ... Това е единствения възможен цикъл в който нещастно число може да попадне. -:table_2 +:table +:2 |= Вход |= Изход @@ -206,18 +217,20 @@ What is the smallest positive integer whose square ends in the digits 269,696? |: Happy + ### Задача 7 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise07.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise07.cpp} От входа получавате 6 реални числа. -Пресметнете съответните 6 [url https://en.wikipedia.org/wiki/Prefix_sum префиксни суми] и ги изкарайте. +Пресметнете съответните 6 {url префиксни суми;https://en.wikipedia.org/wiki/Prefix_sum} и ги изкарайте. Това са сумите на всички числа до сега. Тоест, префиксната сума на второто число е сумата на първото и второто число. Префиксата сума на третото число е сумата на първото, второто и третото число. -:table_2 +:table +:2 |= Вход |= Изход @@ -228,21 +241,23 @@ What is the smallest positive integer whose square ends in the digits 269,696? |: 30.86 998.074 1083.07 1598.34 1145.34 1107.55 + ### Задача 8 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise08.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise08.cpp} От входа получавате две реални числа: координати на точка в равнината. Спрямо следното изображение: -[image ./img/two_circles.png] +{img ./img/two_circles.png} изкарайте дали точката е в защрихованата област или не. -Областта [=не=] включва самите окръжности! +Областта {b не} включва самите окръжности! Зачитайте, че черните прави отбелязват главните оси, а разстоянията между съседни сиви оси е единица. -:table_2 +:table +:2 |= Вход |= Изход @@ -289,14 +304,16 @@ What is the smallest positive integer whose square ends in the digits 269,696? |: Outside + ### Задача 9 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise09.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise09.cpp} От входа получавате 10 цели числа. Трябва да върнете дали сред тях същестуват три числа (на различни позиции), чиято сума е равна на 0. -:table_2 +:table +:2 |= Вход |= Изход @@ -310,16 +327,18 @@ What is the smallest positive integer whose square ends in the digits 269,696? |: Doesn't exist + ### Задача 10 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise10.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise10.cpp} От входа получавате четири трицифрени цели неотрицателн числа. Трябва да върнете най-голямото възможно цяло число, което се получава след "слепване" на тези числа. -[*Не е нужно да използвате сортиращ алгоритъм!*] +{i Не е нужно да използвате сортиращ алгоритъм!} -:table_2 +:table +:2 |= Вход |= Изход @@ -333,20 +352,22 @@ What is the smallest positive integer whose square ends in the digits 269,696? |: 492382352289 + ### Задача 11 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise11.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise11.cpp} От входа получавате две реални числа: координати на точка в равнината. Спрямо следното изображение: -[image ./img/triangle_and_circle.png] +{img ./img/triangle_and_circle.png} -Областта [=не=] включва правата и правоъгълника! +Областта {b не} включва правата и правоъгълника! Зачитайте, че черните прави отбелязват главните оси, а разстоянията между съседни сиви оси е единица. -:table_2 +:table +:2 |= Вход |= Изход @@ -390,18 +411,20 @@ What is the smallest positive integer whose square ends in the digits 269,696? |: Outside + ## За самоподготовка ### Задача 12 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise12.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise12.cpp} От входа получавате цяло неотрицателно число. -Трябва да върнете дали е [url https://en.wikipedia.org/wiki/Sum-product_number число на "сума-произведение"]. +Трябва да върнете дали е {url число на "сума-произведение";https://en.wikipedia.org/wiki/Sum-product_number}. С други думи, дали е равно на сумата на цифрите си, умножено по умнежнието на цифрите. -:table_2 +:table +:2 |= Вход |= Изход @@ -421,14 +444,16 @@ What is the smallest positive integer whose square ends in the digits 269,696? |: Not a sum-product number + ### Задача 13 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise13.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise13.cpp} От входа получавате цяло положително число. Трябва да върнете всички негови делители. -:table_2 +:table +:2 |= Вход |= Изход @@ -448,19 +473,21 @@ What is the smallest positive integer whose square ends in the digits 269,696? |: 1 2 3 4 6 8 9 12 16 18 24 27 32 36 48 54 72 96 108 144 216 288 432 864 + ### Задача 14 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise14.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise14.cpp} От входа получавате две цели неотрицателни числа. -Трябва да намерите [url https://en.wikipedia.org/wiki/Tetration тетрацията] на първото числото на степен второто число. +Трябва да намерите {url тетрацията;https://en.wikipedia.org/wiki/Tetration} на първото числото на степен второто число. Както нормалното степенуване е повторено умножение, така тетрацията е повторено степенуване. Число на тетрация "степен" озачава, че числото се повдига на нормална степен себе си, тетрация степен на брой пъти. Тетрацията расте бързо, използвайте най-големия възможен тип. -:table_2 +:table +:2 |= Вход |= Изход @@ -480,16 +507,18 @@ What is the smallest positive integer whose square ends in the digits 269,696? |: 16777216 + ### Задача 15 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise15.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise15.cpp} От входа получавате 8 цели неотрицателни числа. Трябва да върнете най-малкото общо кратно на всеки две съседни числа. Най-малко общо кратно е най-малкото число, което се дели без остатък на двете числа. -:table_2 +:table +:2 |= Вход |= Изход @@ -500,18 +529,20 @@ What is the smallest positive integer whose square ends in the digits 269,696? |: 12 18 3501 5057 13 26 8 + ### Задача 16 От входа получавате две реални числа: координати на точка в равнината. Спрямо следното изображение: -[image ./img/rectangles_and_circle.png] +{img ./img/rectangles_and_circle.png} изкарайте дали точката е в защрихованата област или не. Зачитайте, че всяка сива права отбелязва брой единици разстояние от нулата. -:table_2 +:table +:2 |= Вход |= Изход @@ -540,16 +571,18 @@ What is the smallest positive integer whose square ends in the digits 269,696? |: Outside + ### Задача 17 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise17.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise17.cpp} -От входа получавате две естествени числа, [`a`] и [`b`]. -Трябва да върнете дали [`a`] е [url https://en.wikipedia.org/wiki/Unitary_divisor унитарен делител] на [`b`]. +От входа получавате две естествени числа, {` a} и {` b}. +Трябва да върнете дали {` a} е {url унитарен делител;https://en.wikipedia.org/wiki/Unitary_divisor} на {` b}. -Това е изпълнено, когато [`a`] е делител на [`b`] и най-големия общ делител на [`a`] и [`b / a`] е 1. +Това е изпълнено, когато {` a} е делител на {` b} и най-големия общ делител на {` a} и {` b / a} е 1. -:table_2 +:table +:2 |= Вход |= Изход @@ -569,14 +602,16 @@ What is the smallest positive integer whose square ends in the digits 269,696? |: Not a unitary divisor + ### Задача 18 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise18.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week06/Exercise18.cpp} От входа получавате 10 реални числа. -Трябва да върнете най-голямата възможна сума, получена чрез събиране на колкото и дълга [=последователна=] редица от елементи. +Трябва да върнете най-голямата възможна сума, получена чрез събиране на колкото и дълга {b последователна} редица от елементи. -:table_2 +:table +:2 |= Вход |= Изход diff --git a/src/teaching/upp-2025/week07/index.du b/src/teaching/upp-2025/week07/index.du index 3f671b0..8c1cbfc 100644 --- a/src/teaching/upp-2025/week07/index.du +++ b/src/teaching/upp-2025/week07/index.du @@ -1,17 +1,17 @@ -# Задачи - УПП, Седмица 7, 13.11.2025 +'def title Задачи - УПП, Седмица 7, 13.11.2025 +'def desc Условията на задачите за упражнение. -'define expected-reading 13 min -'define created 10 November 2025 -'define edited 14 November 2025 -[$pagenav] +# {title} -GitHub Classroom: [url https://classroom.github.com/a/clYBilXQ] +{pagenav 13 min;10 November 2025;14 November 2025} + +GitHub Classroom: {url https://classroom.github.com/a/clYBilXQ} :important -.p Както при [`if`]-ове, следното е лоша практика и ще се вземат точки: +.p Както при {` if}-ове, следното е лоша практика и ще се вземат точки: -```c++ +```cpp bool f() { if (condition) return true; @@ -22,9 +22,9 @@ bool f() { :important -.p Следното е [=грешно=] и ще се вземат точки: +.p Следното е {b грешно} и ще се вземат точки: -```c++ +```cpp int* f() { int numbers[5] = { 0 }; return numbers; @@ -35,18 +35,19 @@ int* f() { ### Задача 1 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise01.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise01.cpp} Напишете функция, която приема цяло число и връща дали е четно и положително. Нека вашата функция да следва декларацията: -```c++ +```cpp bool evenAndPositive(int x); От входа получавате цяло число. -Използвайки [`evenAndPositive`], върнете дали е четно и положително. +Използвайки {` evenAndPositive}, върнете дали е четно и положително. -:table_2 +:table +:2 |= Вход |= Изход @@ -60,22 +61,24 @@ bool evenAndPositive(int x); |: Not even and positive + ### Задача 2 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise02.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise02.cpp} -Напишете функция, която приема цяло неотрицателно число [`n`] и връща n-тото число на фибоначи. +Напишете функция, която приема цяло неотрицателно число {` n} и връща n-тото число на фибоначи. Припомняме, че нулевото число на фибоначи е 0, първото число е 1 и всяко следващо е сумата на предходните две. Нека вашата функция да следва декларацията: -```c++ +```cpp unsigned int fib(unsigned int n); От входа получавате цяло неотрицателно число. -Използвайки [`fib`], трябва да изкарате n-тото число на фибоначи. +Използвайки {` fib}, трябва да изкарате n-тото число на фибоначи. -:table_2 +:table +:2 |= Вход |= Изход @@ -98,23 +101,25 @@ unsigned int fib(unsigned int n); |: 3524578 + ### Задача 3 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise03.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise03.cpp} Напишете функция, която приема масив от 15 цели числа и намира средното аритметично на всички тях. Нека вашата функция да следва декларацията: -```c++ +```cpp double average(int numbers[15]); От входа получавате 15 цели числа. -Използвайки [`average`], трябва да изкарате средното аритметично на всички тях. +Използвайки {` average}, трябва да изкарате средното аритметично на всички тях. .note -[*(14.11.2025)*] Оправен изхода на втори пример. +{i (14.11.2025)} Оправен изхода на втори пример. -:table_2 +:table +:2 |= Вход |= Изход @@ -128,24 +133,26 @@ double average(int numbers[15]); |: -4.93333 + ### Задача 4 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise04.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise04.cpp} -Напишете функция, която приема число с плаваща запетая и [*връща*] две числа: +Напишете функция, която приема число с плаваща запетая и {i връща} две числа: .numbered 1. числото, разделено на половина и 2. числото, закръглено надолу към най-близкото цяло число. Нека вашата функция да следва декларацията: -```c++ +```cpp void calc(float number, double &half, int* integer); От входа получавате число с плаваща запетая. -Използвайки [`calc`], трябва да изкарате двете [*върнати*] стойности. +Използвайки {` calc}, трябва да изкарате двете {i върнати} стойности. -:table_2 +:table +:2 |= Вход |= Изход @@ -156,19 +163,21 @@ void calc(float number, double &half, int* integer); |: -4.995 -9 + ### Задача 5 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise05.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise05.cpp} -Напишете функция [`maxElem`], която приема масив от числа с плаваща запетая и негов размер [=поотделно=]! +Напишете функция {` maxElem}, която приема масив от числа с плаваща запетая и негов размер {b поотделно}! Това означава, че на функцията може да ѝ бъде подаден масив с 10, 15, 2 или ... елемента. Нека вашата функция да върне най-големия елемент в масива. От входа получавате една редица от 5 реални числа и втора редица от 7 реални числа. -Използвайки [`maxElem`], върнете най-големия елемент в първата и във втората редица. +Използвайки {` maxElem}, върнете най-големия елемент в първата и във втората редица. -:table_2 +:table +:2 |= Вход |= Изход @@ -187,20 +196,22 @@ void calc(float number, double &half, int* integer); |: 50.5 37.9 + ### Задача 6 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise06.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise06.cpp} -Напишете функция, която приема масив с произволна дължина (масива и размера се подават поотделно), съствен от цели числа, и [*върнете*] най-големия и най-малкия му елемент. +Напишете функция, която приема масив с произволна дължина (масива и размера се подават поотделно), съствен от цели числа, и {i върнете} най-големия и най-малкия му елемент. Нека вашата функция да следва декларацията: -```c++ +```cpp void minmaxElems(int* arr, unsigned size, int* min, int* max); От входа получавате две редици от по 10 и 8 цели числа съответно. -Използвайки [`minmaxElems`], върнете най-големия и най-малкия елемент на всяка редица. +Използвайки {` minmaxElems}, върнете най-големия и най-малкия елемент на всяка редица. -:table_2 +:table +:2 |= Вход |= Изход @@ -225,9 +236,10 @@ void minmaxElems(int* arr, unsigned size, int* min, int* max); 86 -97 + ### Задача 7 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise07.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise07.cpp} Напишете функция, която приема масив с произволна дължина, съставен от цели числа, и връща сумата на всички елементи. Нека вашата функция да следва декларацията: @@ -236,14 +248,15 @@ void minmaxElems(int* arr, unsigned size, int* min, int* max); unsigned sumElems(int* arr, unsigned size); От входа получавате 11 цели числа. -Трябва да върнете първата последователност от 3 елемента, чиято сума е 0, използвайки [`sumElems`]. +Трябва да върнете първата последователност от 3 елемента, чиято сума е 0, използвайки {` sumElems}. Ако няма такава, не изкарвайте нищо. .note -[*(14.11.2025)*] Оправен изхода на трети пример. +{i (14.11.2025)} Оправен изхода на трети пример. -:table_2 +:table +:2 |= Вход |= Изход @@ -257,24 +270,26 @@ unsigned sumElems(int* arr, unsigned size); |: -1 0 1 + ### Задача 8 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise08.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise08.cpp} Напишете функция, която приема масив с произволен размер, съставен от цели неотрицателни числа, и неотрицателно число: ротация. Трябва да завъртите елементите в масива с ротация на брой позиции на дясно. -Тоест, ако масива е [`1 2 3 4`], тогава след ротация с една позиция, масива ще е [`4 1 2 3`]. -Ако имахме две ротации, тогава щяхме да получим [`3 4 1 2`]. +Тоест, ако масива е {` 1 2 3 4}, тогава след ротация с една позиция, масива ще е {` 4 1 2 3}. +Ако имахме две ротации, тогава щяхме да получим {` 3 4 1 2}. Не модифицирайте оригиналния масив! -Трябва да [*върнете*] друг масив със завъртяните елементи. +Трябва да {i върнете} друг масив със завъртяните елементи. От входа получавате две редици от по 6 и 7 цели числа. След всяка редица получавате ротация. Трябва да изкарате двете редици, обаче завъртяни, използвайки вашата функция. -:table_2 +:table +:2 |= Вход |= Изход @@ -299,37 +314,39 @@ unsigned sumElems(int* arr, unsigned size); 5 6 7 1 2 3 4 + ### Задача 9 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise09.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise09.cpp} .note -[*(14.11.2025)*] Оправена декларацията на функцията, примери и добавено упътване. +{i (14.11.2025)} Оправена декларацията на функцията, примери и добавено упътване. .warn -НЕ може да използвате "вградената" функция [`pow`]! +НЕ може да използвате "вградената" функция {` pow}! Напишете функция, която приема число с плаваща запетая и цяло неотрицателно число, и връща първото число на степен второто. Нека вашата функция да следва декларацията: -```c++ +```cpp double topower(double x, unsigned int a); От входа получавате 11 реални числа. Първите 10 са коефициентите в полином от 10та степен. 11тото е потенциален корен. -Трябва да върнете дали 11тото действително е корен на уравнението, използвайки [`topower`]. +Трябва да върнете дали 11тото действително е корен на уравнението, използвайки {` topower}. -Припомняме, че едно число [`x`] е корен на полином от 10та степен, когато: +Припомняме, че едно число {` x} е корен на полином от 10та степен, когато: -[image ./img/polynomial.png] +{img ./img/polynomial.png} -[=Упътване:=] +{b Упътване:} За някои примери, прецизността на въведения корен не е достатъчна. Може да приемете, че ако (абсолютната стойност на) сумата е по-малка от 0.0001, то сумата на практика е 0. -:table_2 +:table +:2 |= Вход |= Изход @@ -358,25 +375,27 @@ double topower(double x, unsigned int a); |: Not a root + ### Задача 10 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise10.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise10.cpp} Напишете функция, която приема два масива с произволни размери, съставени от цели числа, и връща колко от елементите на двата масива съвпадат по стойност на еднакви индекси. Тоест, на колко еднакви позиции срещаме еднакви елементи. Нека вашата функция да следва декларацията: -```c++ +```cpp unsigned int countSameElementsOnSameIndecies(int* arr1, unsigned int size1, int* arr2, unsigned int size2); От входа получавате две редици от по 10 и 15 цели числа. -Трябва да върнете бройката на съвпадащи стойности на съвпадащи индекси, използвайки [`countSameElementsOnSameIndecies`]. +Трябва да върнете бройката на съвпадащи стойности на съвпадащи индекси, използвайки {` countSameElementsOnSameIndecies}. .note -[*14.11.2025*] Оправен вход на последния пример. +{i 14.11.2025} Оправен вход на последния пример. -:table_2 +:table +:2 |= Вход |= Изход @@ -402,18 +421,20 @@ unsigned int countSameElementsOnSameIndecies(int* arr1, unsigned int size1, int* |: 4 + ## За самоподготовка ### Задача 11 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise11.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise11.cpp} Напишете функция, която приема неотрицателно цяло число и връща дали е просто. От входа получавате две естествени числа. Трябва да върнете бройката на всички прости числа между тези две числа (включително), използвайки вашата функция. -:table_2 +:table +:2 |= Вход |= Изход @@ -427,16 +448,18 @@ unsigned int countSameElementsOnSameIndecies(int* arr1, unsigned int size1, int* |: 139 + ### Задача 12 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise12.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise12.cpp} Напишете функция, която получава масив с произволен размер, съствен от цели числа, и инкрементира всеки елемент. Получавате две редици от по 10 и 9 елемента. Трябва да върнете двете редици, обаче всеки елемент е инкрементиран, използвайки вашата фунцкия. -:table_2 +:table +:2 |= Вход |= Изход @@ -461,18 +484,20 @@ unsigned int countSameElementsOnSameIndecies(int* arr1, unsigned int size1, int* 26 101 29 -31 33 -69 -94 -97 -85 + ### Задача 13 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise13.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise13.cpp} Напишете функция, която получава масив от 4 букви и връща дали трите буква образуват последователност "буква, цифра, буква, цифра". От входа получавате 12 букви и трябва да върнете дали целия масив образува последователността "буква, цифра, буква, цифра, буква, цифрва, ...", използвайки вашата функция. .note -[*(14.11.2025)*] Оправен трети пример. +{i (14.11.2025)} Оправен трети пример. -:table_2 +:table +:2 |= Вход |= Изход @@ -486,21 +511,23 @@ unsigned int countSameElementsOnSameIndecies(int* arr1, unsigned int size1, int* |: Follows pattern + ### Задача 14 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise14.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise14.cpp} -Напишете функция, която получава масив от 10 реални числа и [*връща*] масив от 5 реални числа. +Напишете функция, която получава масив от 10 реални числа и {i връща} масив от 5 реални числа. Резултатния масив се формира по следния начин: .numbered -1. Първия елемент на [*върнатия*] масив е разликата на втория от първия елемент на входния (получения) масив. -2. Втория елемент на [*върнатия*] масив е разликата на четвъртия от третия елемент на входния масив. +1. Първия елемент на {i върнатия} масив е разликата на втория от първия елемент на входния (получения) масив. +2. Втория елемент на {i върнатия} масив е разликата на четвъртия от третия елемент на входния масив. 3. И така нататък. От входа получавате масив с 10 елемента. -Трябва да [*върнете*] резултатния 5-елементен масив от вашата функция. +Трябва да {i върнете} резултатния 5-елементен масив от вашата функция. -:table_2 +:table +:2 |= Вход |= Изход @@ -517,9 +544,10 @@ unsigned int countSameElementsOnSameIndecies(int* arr1, unsigned int size1, int* |: 32 118 69 82 -49 + ### Задача 15 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise15.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07/Exercise15.cpp} Напишете две функции, всяка от които приема масив с 5 естествени числа. Нека първата да повдига всяко число на втора степен и втората да умножава всяко число по 3. @@ -532,9 +560,10 @@ unsigned int countSameElementsOnSameIndecies(int* arr1, unsigned int size1, int* Допуснете, че винаги ще срещнете целевото число. Използвайте вашите функции. .note -[*(14.11.2025)*] Оправени входове на първите два примера. +{i (14.11.2025)} Оправени входове на първите два примера. -:table_2 +:table +:2 |= Вход |= Изход diff --git a/src/teaching/upp-2025/week08/index.du b/src/teaching/upp-2025/week08/index.du index 4b75284..f7b2eaa 100644 --- a/src/teaching/upp-2025/week08/index.du +++ b/src/teaching/upp-2025/week08/index.du @@ -1,22 +1,23 @@ -# Задачи - УПП, Седмица 8, 20.11.2025 +'def title Задачи - УПП, Седмица 8, 20.11.2025 +'def desc Условията на задачите за упражнение. -'define expected-reading 34 min -'define created 15 November 2025 -'define edited 23 November 2025 -[$pagenav] +# {title} -GitHub Classroom: [url https://classroom.github.com/a/rhpKbNmH] +{pagenav 34 min;15 November 2025;23 November 2025} + +GitHub Classroom: {url https://classroom.github.com/a/rhpKbNmH} ## За решаване ### Задача 1 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise01.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise01.cpp} От входа получавате матрица 5 на 5 от цели числа. -Трябва да върнете дали е разредена матрица: дали има [*повече*] нули отколкото други числа. +Трябва да върнете дали е разредена матрица: дали има {i повече} нули отколкото други числа. -:table_2 +:table +:2 |= Вход |= Изход @@ -45,9 +46,10 @@ Not sparse Sparse + ### Задача 2 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise02.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise02.cpp} Напишете функция, която получава матрица с произволен размер и масив, чиято дължина е същата като на един ред в матрицата. @@ -56,7 +58,8 @@ Sparse От входа получавате матрица 7 на 3 от цели неотрицателни числа. Използвайки вашата функция, намерете сумата на всички редове и я изкарайте. -:table_2 +:table +:2 |= Вход |= Изход @@ -89,9 +92,10 @@ Sparse 204 208 379 + ### Задача 3 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise03.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise03.cpp} Напишете функция, която получава две матрици с произволни размери, съствени от реални числа. Може да допуснете, че размера на втората матрица е по-малък от тази на първата. @@ -100,14 +104,15 @@ Sparse Тоест, всички елементи от горния ляв ъгъл, надолу и надясно колкото е размера на втората матрица. От входа получавате матрица 6 на 6 от реални числа. -След това получавате 4 неотрицателни числа: първите две са координат в матрицата (където горния ляв ъгъл е [`(0, 0)`]), вторите две са нейни размери. +След това получавате 4 неотрицателни числа: първите две са координат в матрицата (където горния ляв ъгъл е {` (0, 0)}), вторите две са нейни размери. -Използвайки вашата функция, трябва да изкарате подматрицата с начало подадения координат и размери подадените размери [=използвайки=] вашата функция. +Използвайки вашата функция, трябва да изкарате подматрицата с начало подадения координат и размери подадените размери {b използвайки} вашата функция. .note -[=(23.11.2025)=] Опростени някои примери. +{b (23.11.2025)} Опростени някои примери. -:table_2 +:table +:2 |= Вход |= Изход @@ -180,26 +185,28 @@ Sparse 100 64 46.204 30812 + ### Задача 4 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise04.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise04.cpp} City Bloxx е известна мобилна игра за строене на сгради. В нейния "Build city" режим, целта е построените сгради да се подредят в матрица 5 на 5. Нека да разгледаме следните правила за сгради (в самата игра има някои разлики): .numbered -1. [*Жилищните сгради*] може да се поставят навсякъде. -2. [*Търговските сгради*] трябва да бъдат поставени до поне една жилищна сграда. -3. [*Офис сградите*] трябва да бъдат поставени до поне една жилищна и една търговска. -4. [*Луксозните сгради*] трябва да бъдат поставени до поне една жилищна, една търговска и една офис сграда. +1. {i Жилищните сгради} може да се поставят навсякъде. +2. {i Търговските сгради} трябва да бъдат поставени до поне една жилищна сграда. +3. {i Офис сградите} трябва да бъдат поставени до поне една жилищна и една търговска. +4. {i Луксозните сгради} трябва да бъдат поставени до поне една жилищна, една търговска и една офис сграда. -Сгради са съседни само по вертикал и хоризонтал, [=не=] по диагонал. +Сгради са съседни само по вертикал и хоризонтал, {b не} по диагонал. От входа получавате масив 5 на 5 с цели числа, където с 1 до 4 се обозначават сградите, от жилищни до луксозни. Изкарайте дали подредбата на сградите е позволена (следва горните правила). -:table_2 +:table +:2 |= Вход |= Изход @@ -254,14 +261,16 @@ City Bloxx е известна мобилна игра за строене на |: Valid + ### Задача 5 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise05.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise05.cpp} От входа получавате матрица 3 на 3, съствена от цели числа. Трябва да я транспонирате: да смените елементите над и под главния диагонал, и да изкарате резултата. -:table_2 +:table +:2 |= Вход |= Изход @@ -290,9 +299,10 @@ City Bloxx е известна мобилна игра за строене на 0 2 5 + ### Задача 6 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise06.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise06.cpp} Напишете функция, която приема матрица с произволни размери, съствена от реални числа, заедно с два индекса. Разменете колоните на подадените индекси, ако това е възможно. @@ -302,9 +312,10 @@ City Bloxx е известна мобилна игра за строене на Трябва да размените двете колони, използвайки вашата функция, и да изкарате резултата. -[*Вашия изход не е нужно да бъде подравнен.*] +{i Вашия изход не е нужно да бъде подравнен.} -:table_2 +:table +:2 |= Вход |= Изход @@ -348,17 +359,19 @@ City Bloxx е известна мобилна игра за строене на 16.84 53.84 0 -21.11 23.22 + ### Задача 7 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise07.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise07.cpp} От входа получавате матрица от букви 3 на 3. -Тя определя шаблон, където буквата [`*`] означава, че всяка стойност е позволена. +Тя определя шаблон, където буквата {` *} означава, че всяка стойност е позволена. След това от входа получавате матрица 6 на 6, съствена от букви. -Трябва да намерите всички срещания на шаблона в тази матрица, като [=срещанията може да се застъпват!=] +Трябва да намерите всички срещания на шаблона в тази матрица, като {b срещанията може да се застъпват!} -:table_2 +:table +:2 |= Вход |= Изход @@ -419,17 +432,19 @@ City Bloxx е известна мобилна игра за строене на |: 16 + ### Задача 8 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise08.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise08.cpp} От входа получавате две матрици 3 на 3, съствени от цели неотрицателни числа. Пресметнете умножението на матриците (ред по стълб) и изкарайте резултата. .note -[=(23.11.2025)=] Оправен входа на втория пример. +{b (23.11.2025)} Оправен входа на втория пример. -:table_2 +:table +:2 |= Вход |= Изход @@ -464,30 +479,32 @@ City Bloxx е известна мобилна игра за строене на 17 13 14 + ### Задача 9 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise09.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise09.cpp} При изграждането на устройства като клавиатури, често се използва "бутонна матрица". -Няма да навлизаме в електрониката, но идеята е че когато натиснеш бутон, съответната колона [=и=] ред са "свързани"/активни. +Няма да навлизаме в електрониката, но идеята е че когато натиснеш бутон, съответната колона {b и} ред са "свързани"/активни. -[=Тоест, когато активни ред и колона се пресичат, тогава съответния бутон е натиснат.=] +{b Тоест, когато активни ред и колона се пресичат, тогава съответния бутон е натиснат.} Това означава, че се нуждаем да погледнем само състоянията на всеки ред и колона, и ще знаем всички натиснати бутони (вместо да поглеждаме всеки бутон поотделно). 'footnote keypad_image_attrib Изображение от Sakurambo - създадено чрез Adobe Illustrator CS2, Публичен домейн, [url https://commons.wikimedia.org/w/index.php?curid=2048341] -Нека да разглеждаме стандартна 4 на 3 телефонна клавиатура[$keypad_image_attrib]: +Нека да разглеждаме стандартна 4 на 3 телефонна клавиатура{keypad_image_attrib}: -[image https://upload.wikimedia.org/wikipedia/commons/thumb/7/73/Telephone-keypad2.svg/330px-Telephone-keypad2.svg.png] +{img https://upload.wikimedia.org/wikipedia/commons/thumb/7/73/Telephone-keypad2.svg/330px-Telephone-keypad2.svg.png} От входа първо получавате 4 булеви стойности: дали реда е активен (отгоре надолу). След това получавате още 3 булеви стойности: дали колоната е активна (отляво надясно). -Изкарайте кои бутони са натиснати, използвайки цифровите знаци, звезда ([`*`]) и диез ([`#`]). +Изкарайте кои бутони са натиснати, използвайки цифровите знаци, звезда ({` *}) и диез ({` #}). Ако няма натиснати, изкарайте съответно съобщение. -:table_2 +:table +:2 |= Вход |= Изход @@ -510,43 +527,44 @@ City Bloxx е известна мобилна игра за строене на |: Nothing pressed + ### Задача 10 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise10.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise10.cpp} -[url https://en.wikipedia.org/wiki/Pascal%27s_triangle Триъгълника на Паскал] е изчисление, при което се конструира триъгълник от числа. +{url Триъгълника на Паскал;https://en.wikipedia.org/wiki/Pascal%27s_triangle} е изчисление, при което се конструира триъгълник от числа. По двете "рамене" има единици, и всяко вътрешно число е сумата на горните две. 'footnote pascal_animation_attrib Анимация от Hersfold - собствен труд, Публичен домейн, [url https://commons.wikimedia.org/w/index.php?curid=3902538] -Пояснителна анимация[$pascal_animation_attrib]: +Пояснителна анимация{pascal_animation_attrib}: -[image https://upload.wikimedia.org/wikipedia/commons/0/0d/PascalTriangleAnimated2.gif] +{img https://upload.wikimedia.org/wikipedia/commons/0/0d/PascalTriangleAnimated2.gif} -[=Генерирайте=] и изкарайте триъгълника на паскал в матрица 11 на 11, където двете страни на триъгълника са първата колона и главния диагонал. +{b Генерирайте} и изкарайте триъгълника на паскал в матрица 11 на 11, където двете страни на триъгълника са първата колона и главния диагонал. Нека стойностите извън триъгълника да са нули. -[=Изход:=] [*(не е нужно да бъде подравнен)*] +{b Изход:} {i (не е нужно да бъде подравнен)} .comment https://www.fcfung2000.com/ufcfiles/ufcmatrk.htm ``` -[=1=] 0 0 0 0 0 0 0 0 0 0 -[=1=] [=1=] 0 0 0 0 0 0 0 0 0 -[=1=] 2 [=1=] 0 0 0 0 0 0 0 0 -[=1=] 3 3 [=1=] 0 0 0 0 0 0 0 -[=1=] 4 6 4 [=1=] 0 0 0 0 0 0 -[=1=] 5 10 10 5 [=1=] 0 0 0 0 0 -[=1=] 6 15 20 15 6 [=1=] 0 0 0 0 -[=1=] 7 21 35 35 21 7 [=1=] 0 0 0 -[=1=] 8 28 56 70 56 28 8 [=1=] 0 0 -[=1=] 9 36 84 126 126 84 36 9 [=1=] 0 -[=1=] 10 45 120 210 252 210 120 45 10 [=1=] +{b 1} 0 0 0 0 0 0 0 0 0 0 +{b 1} {b 1} 0 0 0 0 0 0 0 0 0 +{b 1} 2 {b 1} 0 0 0 0 0 0 0 0 +{b 1} 3 3 {b 1} 0 0 0 0 0 0 0 +{b 1} 4 6 4 {b 1} 0 0 0 0 0 0 +{b 1} 5 10 10 5 {b 1} 0 0 0 0 0 +{b 1} 6 15 20 15 6 {b 1} 0 0 0 0 +{b 1} 7 21 35 35 21 7 {b 1} 0 0 0 +{b 1} 8 28 56 70 56 28 8 {b 1} 0 0 +{b 1} 9 36 84 126 126 84 36 9 {b 1} 0 +{b 1} 10 45 120 210 252 210 120 45 10 {b 1} ### Задача 11 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise11.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise11.cpp} От входа получавате матрица 10 на 10 от цели неотрицателни числа. След това получавате размер между 0 и 10. @@ -559,11 +577,12 @@ City Bloxx е известна мобилна игра за строене на Не добавяйте към средното аритметично несъществуващи клетки (напр. клетката в горния ляв ъгъл няма клетки над или в ляво от себе си). .note -[=(23.11.2025)=] Добавени още примери. +{b (23.11.2025)} Добавени още примери. -[*(Вашия изход не е нужно да бъде подравнен.)*] +{i (Вашия изход не е нужно да бъде подравнен.)} -:table_2 +:table +:2 |= Вход |= Изход @@ -649,61 +668,65 @@ City Bloxx е известна мобилна игра за строене на 0 0 0 0 0 0 2 0 0 0 + ### Задача 12 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise12.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise12.cpp} От входа получавате два реални координата, между (0,0) и (10,10). -Трябва да върнете матрица 10 на 10 от знаци, която се съставя единствено от шпации (spaces) и хиксове ([`x`]). +Трябва да върнете матрица 10 на 10 от знаци, която се съставя единствено от шпации (spaces) и хиксове ({` x}). Зачитаме, че координатите директно съответстват на матрицата, като (0,0) се намира в горния ляв ъгъл и (10,10) в долния десен. В тази матрица, по подразбиране стоят само шпации. Хиксовете се намират там, където начертаната отсечка между входните точки би застъпила матрицата. Примерна диаграма: -[image ./img/line_interpolation.png] +{img ./img/line_interpolation.png} Тази операция се нарича интерполация. .note -[=(23.11.2025)=] Добавени още примери. +{b (23.11.2025)} Добавени още примери. -:table_2 +:table +:2 |= Вход |= Изход |: 1 8.5 8.5 2.5 |: ``` -'include ./text/output_interpolation_1.txt +'snippet 1 $ ./text/output_interpolation_1.txt |: 0 0 10 10 |: ``` -'include ./text/output_interpolation_2.txt +'snippet 1 $ ./text/output_interpolation_2.txt |: 2.3 1.8 9.9 7 |: ``` -'include ./text/output_interpolation_3.txt +'snippet 1 $ ./text/output_interpolation_3.txt |: 0 5 10 5 |: ``` -'include ./text/output_interpolation_4.txt +'snippet 1 $ ./text/output_interpolation_4.txt + ## За самоподготовка ### Задача 13 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise13.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise13.cpp} От входа получавате матрица 8 на 8, съставена от символите точка и плюс. Трябва да върнете височината и ширината на най-големия правоъгълник, който застъпва всички плюсове. -:table_2 +:table +:2 |= Вход |= Изход @@ -747,14 +770,16 @@ City Bloxx е известна мобилна игра за строене на |: 8 8 + ### Задача 14 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise14.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise14.cpp} От входа приемате масив от 6 елемента и матрица с 6 реда и 3 колони, всички съставени от реални числа. Трябва да реализирате умножение на вектор по матрица (където масива е вектора). -:table_2 +:table +:2 |= Вход |= Изход @@ -783,16 +808,18 @@ City Bloxx е известна мобилна игра за строене на |: 8 7 41.8 + ### Задача 15 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise15.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week08/Exercise15.cpp} От входа получавате матрица 9 на 7 с реални числа. След това получавате още едно реално число: максимална разлика. Проверете дали данните са гладки: стойността във всяка една клетка да се различава с най-много максималната разлика от всички свои съседни клетки (по хоризонтала, вертикала и диагонала). -:table_2 +:table +:2 |= Вход |= Изход @@ -857,6 +884,7 @@ City Bloxx е известна мобилна игра за строене на |: Not smooth + ### Задача 16 Напишете функция която приема матрица с произволни размери и "връща" матрица, която е като входната матрица, но всички елементи са "завъртяни" на дясно с 90 градуса. @@ -867,9 +895,10 @@ City Bloxx е известна мобилна игра за строене на Ако не можете, не записвайте нищо във върнатата. От входа получавате матрица 4 на 8, съставена от цели числа. -[=Използвайки вашата функция=], завъртете матрицата и изкарайте резултата. +{b Използвайки вашата функция}, завъртете матрицата и изкарайте резултата. -:table_2 +:table +:2 |= Вход |= Изход @@ -892,6 +921,7 @@ City Bloxx е известна мобилна игра за строене на 32 24 16 8 + ### Задача 17 Трябва да реализирате (опростен вариант на) "pixel binning": спрямо подаден коефициент, стойностите в клетки се смесват. @@ -901,7 +931,8 @@ City Bloxx е известна мобилна игра за строене на От входа получавате матрица 12 на 12 с цели неотрицателни числа и неотрицателен binning коефициент. Трябва да върнете матрицата след приложен binning. -:table_2 +:table +:2 |= Вход |= Изход @@ -937,6 +968,7 @@ City Bloxx е известна мобилна игра за строене на 2 2 0 0 0 0 0 0 0 0 12 12 + ### Задача 18 От входа получавате матрица 10 на 10 с цели неотрицателни числа. @@ -945,7 +977,8 @@ City Bloxx е известна мобилна игра за строене на Сравнявайте матриците по техния размер, тоест броя елементи. Ако има няколко еднакво големи подматрици, може да изкарате която и да е от тях. -:table_2 +:table +:2 |= Вход |= Изход @@ -970,6 +1003,7 @@ City Bloxx е известна мобилна игра за строене на 1 1 1 + ### Задача 19 От входа получавате матрица 8 на 8 от реални числа. @@ -984,7 +1018,8 @@ City Bloxx е известна мобилна игра за строене на Накрая изкарате резултатното число. -:table_2 +:table +:2 |= Вход |= Изход @@ -1020,9 +1055,10 @@ City Bloxx е известна мобилна игра за строене на 160 155 + ### Задача 20 -[=Генерирайте=] и изкарайте [url https://en.wikipedia.org/wiki/Bell_triangle триъгълника на Бел] в долния ляв ъгъл на матрица 11 на 11. +{b Генерирайте} и изкарайте {url триъгълника на Бел;https://en.wikipedia.org/wiki/Bell_triangle} в долния ляв ъгъл на матрица 11 на 11. Това означава, че страните на триъгълника включват първата колона и главния диагонал. .bulleted @@ -1033,13 +1069,13 @@ City Bloxx е известна мобилна игра за строене на 'footnote bell_animation_attrib Анимация от Xanthoxyl - собствен труд, CC BY-SA 3.0, [url https://commons.wikimedia.org/w/index.php?curid=5832904] -Пояснителна анимация[$bell_animation_attrib]: +Пояснителна анимация{bell_animation_attrib}: -[image https://upload.wikimedia.org/wikipedia/commons/a/ab/BellNumberAnimated.gif] +{img https://upload.wikimedia.org/wikipedia/commons/a/ab/BellNumberAnimated.gif} -Тази задача е подобна на [url #-10 Задача 10]. +Тази задача е подобна на {url Задача 10;#-10}. -[=Изход:=] [*(не е нужно да бъде подравнен)*] +{b Изход:} {i (не е нужно да бъде подравнен)} .comment https://oeis.org/A011971 @@ -1068,7 +1104,8 @@ https://www.apcomputersciencetutoring.com/2d-array-practice-exercises/#grow-meth Ако изходната матрица е по-голяма, попълнете празните позиции с нули. -:table_2 +:table +:2 |= Вход |= Изход @@ -1101,6 +1138,7 @@ https://www.apcomputersciencetutoring.com/2d-array-practice-exercises/#grow-meth 7 8 + ### Задача 22 От входа получавате матрица 3 на 3 със знаци. @@ -1108,11 +1146,12 @@ https://www.apcomputersciencetutoring.com/2d-array-practice-exercises/#grow-meth Трябва да изкарате матрица със знаци 9 на 9, в която е попълнено изображението спрямо режима. .numbered -1. [=Режим 1=] обозначава повтаряне, където изображението се повтаря последователно -2. [=Режим 2=] обозначава "border", където изображението се слага в центъра и останалта част се попълва със знак диес [`#`]. -3. [=Режим 3=] обозначава "clamp", изображението се слага в центъра и останалата част се попълва като се повтаря последната буква. Тоест, дясното 3 на 3 се попълва с повторение на десния знак. +1. {b Режим 1} обозначава повтаряне, където изображението се повтаря последователно +2. {b Режим 2} обозначава "border", където изображението се слага в центъра и останалта част се попълва със знак диес {` #}. +3. {b Режим 3} обозначава "clamp", изображението се слага в центъра и останалата част се попълва като се повтаря последната буква. Тоест, дясното 3 на 3 се попълва с повторение на десния знак. -:table_2 +:table +:2 |= Вход |= Изход @@ -1144,6 +1183,7 @@ f g h |: ``` +'emplace # # # # # # # # # # # # # # # # # # # # # # # # # # # @@ -1153,6 +1193,7 @@ f g h # # # # # # # # # # # # # # # # # # # # # # # # # # # +'endemplace |: ``` @@ -1174,6 +1215,7 @@ f f f g g g h h h f f f g g g h h h + ### Задача 23 От входа получавате цяло неотрицателно число, по-малко от 50. @@ -1181,9 +1223,10 @@ f f f g g g h h h Зачитайте, че 0 винаги е в центъра на спиралата и се въртите първо с една позиция разстояние, после с две и так. нат. -[*(Вашия изход не е нужно да бъде подравнен.)*] +{i (Вашия изход не е нужно да бъде подравнен.)} -:table_2 +:table +:2 |= Вход |= Изход @@ -1215,6 +1258,7 @@ f f f g g g h h h 15 14 13 12 + ## За любознателни ### Задача 24 @@ -1222,24 +1266,24 @@ f f f g g g h h h Реализирайте матричен калкулатор. От входа получавате матрица 4 на 4 с реални числа и след това получавате редица операции. -Всяка операция започва с буква, като буквата [`$`] сигнализира край на програмата. +Всяка операция започва с буква, като буквата {` $} сигнализира край на програмата. След всеки знак има няколко аргумента, т.е. допълнителни стойности които трябва да се въведат, преди операцията да се изпълни. .bulleted -- Операцията [`*`] обозначава умножение на ред, и след знака има цяло неотрицателно число за индекс на ред и след него е реално число (коефициент с който да умножим реда). -- Операцията [`+`] обозначава сума на редове, след знака се очакват два неотрицателни индекса на редове, първия ред се сумира в втория -- Операцията [`^`] обозначава размяна на редове, след знака се очакват два неотрицателни индекса на редове и стойностите им се разменят. +- Операцията {` *} обозначава умножение на ред, и след знака има цяло неотрицателно число за индекс на ред и след него е реално число (коефициент с който да умножим реда). +- Операцията {` +} обозначава сума на редове, след знака се очакват два неотрицателни индекса на редове, първия ред се сумира в втория +- Операцията {` ^} обозначава размяна на редове, след знака се очакват два неотрицателни индекса на редове и стойностите им се разменят. -След всяка операция (освен [`$`]) трябва да изкарате състоянието на матрицата. +След всяка операция (освен {` $}) трябва да изкарате състоянието на матрицата. ### Задача 25 -Трябва да реализирате [url https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life Играта "Живот"]. +Трябва да реализирате {url Играта "Живот";https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life}. От входа получавате матрица 10 на 10 с булеви стойности. След това получавате неотрицателно число: брой генерации (ходове). -Всяка клетка наричаме жива или мъртва (съответно на [`true`] или [`false`]). +Всяка клетка наричаме жива или мъртва (съответно на {` true} или {` false}). В една генерация (ход) на играта, всяка клетка променя своя статус (стойност) по следните правила: .bulleted - всяка жива клетка с по-малко от два живи съседа (вертикално, хоризонтално и диагонално) умира diff --git a/src/teaching/upp-2025/week09/index.du b/src/teaching/upp-2025/week09/index.du index 55febbf..a737cae 100644 --- a/src/teaching/upp-2025/week09/index.du +++ b/src/teaching/upp-2025/week09/index.du @@ -1,14 +1,14 @@ -# Задачи - УПП, Седмица 9, 27.11.2025 +'def title Задачи - УПП, Седмица 9, 27.11.2025 +'def desc Условията на задачите за упражнение. -'define expected-reading 12 min -'define created 24 November 2025 -'define edited 26 November 2025 -[$pagenav] +# {title} + +{pagenav 12 min;24 November 2025;26 November 2025} .important Реализирайте единствено архитектурни решения! -GitHub Classroom: [url https://classroom.github.com/a/ZYFDdLi4] +GitHub Classroom: {url https://classroom.github.com/a/ZYFDdLi4} ## За решаване @@ -30,41 +30,41 @@ GitHub Classroom: [url https://classroom.github.com/a/ZYFDdLi4] Всеки хигрометър измерва процента влажност. В условието не са дадени подробности относно формата на тази стойност, затова ще използваме тип с плаваща запетая, който ще покрие всички реални стойности. -Ще изведем в глобална константа [`SIZE`] размера на едно измерение на матрицата, и самата матрица ще съдържа влажността в стойности от тип [`double`]. +Ще изведем в глобална константа {` SIZE} размера на едно измерение на матрицата, и самата матрица ще съдържа влажността в стойности от тип {` double}. -За намиране на средната влажност в града, ще изградим функцията [`average`], която изглежда по следния начин: +За намиране на средната влажност в града, ще изградим функцията {` average}, която изглежда по следния начин: -```c++ +```cpp double average(const double hygrometers[SIZE][SIZE]); Функцията приема матрицата със стойности на влажност от всеки хигрометър и връща средната стойност. Реализацията изисква линейно итериране през цялата матрица, като се пази сума на всички елементи. Върнатата стойност е сумата, разделена на броя хигрометри. -За намиране на най-влажен и най-сух квадрант ще реализираме функцията [`quadrantHumidity`], чиято декларация е: +За намиране на най-влажен и най-сух квадрант ще реализираме функцията {` quadrantHumidity}, чиято декларация е: -```c++ +```cpp double quadrantHumidity(const double hygrometers[SIZE][SIZE], unsigned startRow, unsigned startCol); Функцията приема матрицата с влажности и начални индекси по ред и колона на съответния квадрант. Знаем, че един квадрант ще бъде една четвърт от размера на матрицата (половината височина и ширина), затова не е нужно той да бъде подаден. -В имплементацията, ще итерираме през матрицата, като започнем от началните редове и колона, и обиколим точно [`SIZE / 2`] реда и колони. +В имплементацията, ще итерираме през матрицата, като започнем от началните редове и колона, и обиколим точно {` SIZE / 2} реда и колони. Ще пазим сума на всички елементи и накрая ще разделим на броя елементи, т.е. ще върнем средната стойност на влажност в квадранта. В заглавната функция ще дефинираме матрицата и ще попълним входните влажности. -След това ще изкараме стойността, върната от извикване на [`average`]. +След това ще изкараме стойността, върната от извикване на {` average}. За сух и влажен квадрант, ще създадем две променливи за най-голяма и най-малка стойност. -След това ще извикваме [`quadrantHumidity`], като ще запазим върната стойност като най-голяма и най-малка спрямо текущите стойности. +След това ще извикваме {` quadrantHumidity}, като ще запазим върната стойност като най-голяма и най-малка спрямо текущите стойности. -Началните ред и колона ще подаваме с вложен цикъл, който ще итерира колоните и редовете от най-първите (на индекси 0,0) и ще увеличава всеки индекс с размера на страната на квадрант ([`SIZE / 2`]). +Началните ред и колона ще подаваме с вложен цикъл, който ще итерира колоните и редовете от най-първите (на индекси 0,0) и ще увеличава всеки индекс с размера на страната на квадрант ({` SIZE / 2}). След цикъла и всички извиквания ще имаме стойностите в нашите променливи и ще ги изкараме. ### Задача 1 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week09/Exercise01.txt Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week09/Exercise01.txt} Сграда разполага с два асансьора и 5 етажа. Инженерите на асансьорите са забелязали, че асансьора се качва по-бързо отколкото слиза. @@ -74,7 +74,7 @@ double quadrantHumidity(const double hygrometers[SIZE][SIZE], unsigned startRow, ### Задача 2 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week09/Exercise02.txt Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week09/Exercise02.txt} Автобусна фирма в един град трябва да замени всички свои автобуси. В града има 6 автобусни линии и всяка линия има между 5 и 17 спирки. @@ -86,7 +86,7 @@ double quadrantHumidity(const double hygrometers[SIZE][SIZE], unsigned startRow, ### Задача 3 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week09/Exercise03.txt Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week09/Exercise03.txt} Фабрика купува 5 нови машини, всяка от които изработва по 10000 градивни елемента на час. Всеки час от 8 часов работен ден, работниците във фабриката отбелязват в счетоводни таблици дали всеки един елемент е дефектен или не. diff --git a/src/teaching/upp-2025/week10/index.du b/src/teaching/upp-2025/week10/index.du index 5ec2926..c8d7f63 100644 --- a/src/teaching/upp-2025/week10/index.du +++ b/src/teaching/upp-2025/week10/index.du @@ -1,20 +1,20 @@ -# Задачи - УПП, Седмица 10, 04.12.2025 +'def title Задачи - УПП, Седмица 10, 04.12.2025 +'def desc Условията на задачите за упражнение. -'define expected-reading 12 min -'define created 01 December 2025 -'define edited 03 December 2025 -[$pagenav] +# {title} + +{pagenav 12 min;01 December 2025;03 December 2025} .important -Едно от най-важните неща: [=всяка динамично-заделена памет трябва да се освободи преди края на програмата!=] +Едно от най-важните неща: {b всяка динамично-заделена памет трябва да се освободи преди края на програмата!} -GitHub Classroom: [url https://classroom.github.com/a/kDfmWmy7] +GitHub Classroom: {url https://classroom.github.com/a/kDfmWmy7} ## За решаване ### Задача 1 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week10/Exercise01.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week10/Exercise01.cpp} Потребителя ще въведе цяло неотрицателно число n. След това ще въведе n на брой реални числа. @@ -22,7 +22,8 @@ GitHub Classroom: [url https://classroom.github.com/a/kDfmWmy7] Няма ограничения върху размера n. -:table_2 +:table +:2 |= Вход |= Изход @@ -33,16 +34,18 @@ GitHub Classroom: [url https://classroom.github.com/a/kDfmWmy7] |: -24 -69 -45 93 -43 89 6 -91 -100 -15 -70 -82 -31.1 37 -53 -12 54 70 -56 86 -91 24 55 40 -19 94 -72 -90 5 91 70.01 57 -59 -59 87 -39 -46 10 -39 59 44 78 -28 63 -22 -98 45 -97 40.8 + ### Задача 2 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week10/Exercise02.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week10/Exercise02.cpp} -Реализирайте функцията [`average`], която приема масив, съставен от цели числа, с произволен размер, и връща средното аритметично на всички тези числа. +Реализирайте функцията {` average}, която приема масив, съставен от цели числа, с произволен размер, и връща средното аритметично на всички тези числа. От входа ще получите размер n и след това 2n на брой цели числа. Използвайки вашата функция, трябва да върнете средното аритметично на тези числа. -:table_2 +:table +:2 |= Вход |= Изход @@ -50,17 +53,19 @@ GitHub Classroom: [url https://classroom.github.com/a/kDfmWmy7] |: -20.125 + ### Задача 3 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week10/Exercise03.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week10/Exercise03.cpp} От входа получавате размерите на матрица, съставена от неотрицателни целочислени стойности, и след това всички стойности в самата матрица. -[=В паметта=] обърнете реда на редовете и изкарайте резултата. +{b В паметта} обърнете реда на редовете и изкарайте резултата. .question Може ли да се направи по по-прост начин, отколкото ако матрицата беше статично-заделена? -:table_2 +:table +:2 |= Вход |= Изход @@ -80,16 +85,18 @@ GitHub Classroom: [url https://classroom.github.com/a/kDfmWmy7] 1 2 3 + ### Задача 4 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week10/Exercise04.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week10/Exercise04.cpp} От входа получавате две матрици и трябва да върнете тяхното умножение (ред по стълб). За всяка матрица, първо получавате две цели неотрицателни стойности, размерите на матрицата, и след това получавате съответния брой реални числа. Ако умножението не е възможно, изкарайте съобщение за грешка. -:table_2 +:table +:2 |= Вход |= Изход @@ -127,19 +134,21 @@ GitHub Classroom: [url https://classroom.github.com/a/kDfmWmy7] Cannot multiply! + ### Задача 5 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week10/Exercise05.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week10/Exercise05.cpp} .note -[*(07.12.2025)*] Оправено условие и пример +{i (07.12.2025)} Оправено условие и пример -Реализирайте функция [`largest`], която приема матрица, съставена от цели числа, с произволни размери, и връща най-големия елемент в нея. +Реализирайте функция {` largest}, която приема матрица, съставена от цели числа, с произволни размери, и връща най-големия елемент в нея. От входа получавате две числа, размери на матрица, и след това всички елементи в матрицата. Използвайки вашата функция, върнете най-голямото число. -:table_2 +:table +:2 |= Вход |= Изход @@ -157,15 +166,17 @@ Cannot multiply! |: 97 + ### Задача 6 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week10/Exercise06.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week10/Exercise06.cpp} От входа получавате цели числа, докато не получите числото 0. Трябва да върнете редицата, където всяко число е равно на сумата на себе си и следващото число. Последното число не го променяйте. -:table_2 +:table +:2 |= Вход |= Изход @@ -176,9 +187,10 @@ Cannot multiply! |: 1292 1284 1266 1300 1291 1280 780 777 0 + ### Задача 7 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week10/Exercise07.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week10/Exercise07.cpp} Змия пълзи върху произволно голяма дъска, разделена на квадратна решетка. Тя започва в клетка (0,0), която ще зачитаме за горния ляв ъгъл на дъската. @@ -190,9 +202,10 @@ Cannot multiply! След това получавате координат в дъската, трябва да върнете дали змията някога е посетила тази клетка. .note -[*(07.12.2025)*] Разменени ред и колона в примерите +{i (07.12.2025)} Разменени ред и колона в примерите -:table_2 +:table +:2 |= Вход |= Изход @@ -215,9 +228,10 @@ Cannot multiply! |: Not visited + ### Задача 8 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week10/Exercise08.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week10/Exercise08.cpp} От входа получавате преплетени елементите в два масива, съдържащи цели числа. Тоест, първия елемент е първи на първия масив, втори елемент е първи на втория масив, третия елемент е втори на първия масив и так. нат. @@ -226,7 +240,8 @@ Cannot multiply! Числото 0 обозначава край на преплетената редица. -:table_2 +:table +:2 |= Вход |= Изход @@ -237,9 +252,10 @@ Cannot multiply! |: 10 1 2 + ### Задача 9 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week10/Exercise09.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week10/Exercise09.cpp} От входа получавате стойностите на "jagged" матрица: такава, където редовете имат различни размери в паметта. Тоест, получавате размер на текущия ред и след това всичките му стойности. @@ -248,7 +264,8 @@ Cannot multiply! Трябва да изкарате, на отделни редове, стойностите във всяка "колона" отгоре надолу, започвайки от последната "колона" към първата. Игнорирайте "дупки" от елементи. -:table_2 +:table +:2 |= Вход |= Изход @@ -269,9 +286,10 @@ Cannot multiply! 1 5 7 3 + ### Задача 10 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week10/Exercise10.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week10/Exercise10.cpp} .important Заемайте възможно най-малко памет! @@ -286,9 +304,10 @@ Cannot multiply! Трябва да върнете елементите по контура (краищата) на часовника, следвайки горното правило. .note -[*(07.12.2025)*] Поправен примера с четния размер +{i (07.12.2025)} Поправен примера с четния размер -:table_2 +:table +:2 |= Вход |= Изход @@ -323,11 +342,12 @@ Cannot multiply! |: 1 2 3 4 5 8 9 0 3 4 5 6 7 2 9 6 + ## За упражнение ### Задача 11 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week10/Exercise11.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week10/Exercise11.cpp} От входа получавате цяло неотрицатлно число n, което обозначава степеннта на полином. След това получавате реалните коефициенти пред всяка степен (започвайки от най-голямата, n). @@ -336,9 +356,10 @@ Cannot multiply! Трябва да върнете дали числото е корен на съответния полином. .note -[*(07.12.2025)*] Поправени примерите с първа степен полином +{i (07.12.2025)} Поправени примерите с първа степен полином -:table_2 +:table +:2 |= Вход |= Изход @@ -367,9 +388,10 @@ Cannot multiply! |: Is a root + ### Задача 12 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week10/Exercise12.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week10/Exercise12.cpp} .important Заемайте възможно най-малко памет! @@ -381,7 +403,8 @@ Cannot multiply! След това получавате индекс и трябва да върнете стойността на съответния елемент. -:table_2 +:table +:2 |= Вход |= Изход @@ -392,6 +415,7 @@ Cannot multiply! |: 0 + ### Задача 13 Магазин продава всеки ден стоки. @@ -400,24 +424,24 @@ Cannot multiply! След това влизате в "потребителски интерфейс", където от входа получавате буква, обозначаваща команда върху дневника. Командите са: .bulleted -- [`e`] обозначава край на програмата -- [`m`], получавате индекс на ден и трябва да върнете максималната продажба в този ден -- [`M`], трябва да върнете индекса на най-печелившия ден +- {` e} обозначава край на програмата +- {` m}, получавате индекс на ден и трябва да върнете максималната продажба в този ден +- {` M}, трябва да върнете индекса на най-печелившия ден -[=Пример:=] [*(вход и изход са смесени, изходът е удебелен)*] +{b Пример:} {i (вход и изход са смесени, изходът е удебелен)} ``` 3 4 0.5 100 19.99 7 0 2 500 8 m 0 -[=100=] +{b 100} m 1 -[=0=] +{b 0} m 2 -[=500=] +{b 500} M -[=2=] +{b 2} e ### Задача 14 @@ -435,7 +459,8 @@ e След това, от входа получавате ред и колона. Трябва да изкарате матрицата, без съответния ред и стълб. -:table_2 +:table +:2 |= Вход |= Изход diff --git a/src/teaching/upp-2025/week11/index.du b/src/teaching/upp-2025/week11/index.du index a381246..b88bd75 100644 --- a/src/teaching/upp-2025/week11/index.du +++ b/src/teaching/upp-2025/week11/index.du @@ -1,18 +1,18 @@ -# Задачи - УПП, Седмица 11, 11.12.2025 +'def title Задачи - УПП, Седмица 11, 11.12.2025 +'def desc Условията на задачите за упражнение. -'define expected-reading 7 min -'define created 10 December 2025 -'define edited 14 December 2025 -[$pagenav] +# {title} + +{pagenav 7 min;10 December 2025;14 December 2025} :question Има два начина да приемем низ от входа: -```c++ +```cpp cin.getline(char*, size_t, char); -```c++ +```cpp cin.get(char&); Кога бихме избрали всеки от тях? @@ -24,12 +24,13 @@ GitHub Classroom: [url https://classroom.github.com/a/z_C3UMi8] ### Задача 1 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise01.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise01.cpp} От входа получавате 20 буквен низ: име. -Трябва да изкарате съобщението "Hello [*[име]*]!" +Трябва да изкарате съобщението "Hello {i [име]}!" -:table_2 +:table +:2 |= Вход |= Изход @@ -40,14 +41,16 @@ GitHub Classroom: [url https://classroom.github.com/a/z_C3UMi8] |: Hello Aleksandur! + ### Задача 2 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise02.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise02.cpp} От входа получавате изречение: низ, завършващ на точка. Трябва да изкарате броя букви (малки или големи) в изречението. -:table_2 +:table +:2 |= Вход |= Изход @@ -58,9 +61,10 @@ GitHub Classroom: [url https://classroom.github.com/a/z_C3UMi8] |: 10 + ### Задача 3 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise03.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise03.cpp} От входа получавате изречение: низ, завършващ на точка. Трябва да изкарате броя полета в низа. @@ -69,31 +73,33 @@ GitHub Classroom: [url https://classroom.github.com/a/z_C3UMi8] Изключвайте крайната точка в бройката на полетата. .note -[*(14.12.2025)*] Добавени точки в края на изреченията. +{i (14.12.2025)} Добавени точки в края на изреченията. -:table_2 +:table +:2 |= Вход |= Изход -|: [`first second third fourth.`] +|: {` first second third fourth.} |: 4 -|: [`I'm glad you're here.`] +|: {` I'm glad you're here.} |: 4 -|: [` a b c d 8 k * * .`] +|: {` a b c d 8 k * * .} |: 8 ### Задача 4 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise04.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise04.cpp} От входа получавате текст, докато не срещнете първия празен ред. Трябва да изкарате броя редове в текста. -:table_2 +:table +:2 |= Вход |= Изход @@ -115,14 +121,16 @@ trail led eastward through the fat spruce timberland.\n |: 4 + ### Задача 5 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise05.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise05.cpp} От входа получавате низ, завършващ на двоеточие и след това две реални числа. За всяко срещане на думата "sum" в низа, трябва да изкарате сумата на числата, и за всяко срещане на "sub" в низа, трябва да изкарате разликата на числата. -:table_2 +:table +:2 |= Вход |= Изход @@ -139,19 +147,21 @@ trail led eastward through the fat spruce timberland.\n |: 3 -1 3 + ### Задача 6 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise06.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise06.cpp} От входа получавате ред, обозначаващ число в 16-тича бройна система. -Тоест, реда започва с [`0x`] и останалото са 16-тични цифри. +Тоест, реда започва с {` 0x} и останалото са 16-тични цифри. -Трябва да изкарате стойността на числото в 10-тична бройна система, [=като направите конвертирането ръчно!=] -Тоест [=не е позволено да използвате функционалност от стандартната библиотека!=] +Трябва да изкарате стойността на числото в 10-тична бройна система, {b като направите конвертирането ръчно!} +Тоест {b не е позволено да използвате функционалност от стандартната библиотека!} -Приемете, че буквите A-F са главни и че няма да имате водещи нули (напр. [`0x0001`]). +Приемете, че буквите A-F са главни и че няма да имате водещи нули (напр. {` 0x0001}). -:table_2 +:table +:2 |= Вход |= Изход @@ -180,14 +190,16 @@ trail led eastward through the fat spruce timberland.\n |: 1597463007 + ### Задача 7 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise07.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise07.cpp} От входа получавате 5 буквен низ и след това един ред текст. Трябва да изкарате всички срещания на първия низ във втория (като препокривания са позволени). -:table_2 +:table +:2 |= Вход |= Изход @@ -206,16 +218,18 @@ aaaaaaaaaaaaaaaaaaaa |: 16 + ### Задача 8 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise08.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise08.cpp} От входа получавате букви, докато не срещнете низа "end". Трябва да изкарате всички полета в обратен ред. Поле наричаме всяка последователност от букви, която не съдържа шпация. -:table_2 +:table +:2 |= Вход |= Изход @@ -226,14 +240,16 @@ aaaaaaaaaaaaaaaaaaaa |: weekend the on free is he said They + ### Задача 9 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise09.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise09.cpp} От входа получавате две полета, съставени от главни и малки латински букви. Трябва да върнете общата бройка срещания на всяка буква от второто поле в първото. -:table_2 +:table +:2 |= Вход |= Изход @@ -244,16 +260,18 @@ aaaaaaaaaaaaaaaaaaaa |: 0 + ## За упражнение ### Задача 10 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise10.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise10.cpp} От входа получавате ред с текст. -Трябва да върнете дали е [url https://bg.wikipedia.org/wiki/%D0%9F%D0%B0%D0%BD%D0%B3%D1%80%D0%B0%D0%BC%D0%B0 панграма] на латинската азбука: дали всяка буква се среща поне веднъж (без значение дали е главна или малка). +Трябва да върнете дали е {url панграма;https://bg.wikipedia.org/wiki/%D0%9F%D0%B0%D0%BD%D0%B3%D1%80%D0%B0%D0%BC%D0%B0} на латинската азбука: дали всяка буква се среща поне веднъж (без значение дали е главна или малка). -:table_2 +:table +:2 |= Вход |= Изход @@ -267,14 +285,16 @@ aaaaaaaaaaaaaaaaaaaa |: Not a pangram + ### Задача 11 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise11.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise11.cpp} От входа получавате два реда. Трябва да премахнете всяко срещане на втория ред в първия и да изкарате резултата. -:table_2 +:table +:2 |= Вход |= Изход @@ -297,9 +317,10 @@ buffalo Buffalo Buffalo Buffalo + ### Задача 12 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise12.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise12.cpp} От входа получавате ред с текст. Зачитайки го за парола, трябва да върнете колко силна е паролата. @@ -315,9 +336,10 @@ Buffalo Buffalo Buffalo Накрая тряба да върнете оценката на паролата. .note -[*(14.12.2025)*] Оправени оценки в примерите +{i (14.12.2025)} Оправени оценки в примерите -:table_2 +:table +:2 |= Вход |= Изход @@ -334,12 +356,13 @@ Buffalo Buffalo Buffalo |: 5 + ### Задача 13 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise13.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise13.cpp} Хешираща функция е функция, която превръща низ в число. -Една много често използвана е функцията на [url https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function Fowler-Noll-Vo]. +Една много често използвана е функцията на {url Fowler-Noll-Vo;https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function}. Тя работи по следния начин: .bulleted @@ -352,36 +375,39 @@ Buffalo Buffalo Buffalo Използвайки 32-битовите offset basis (2166136261) и FNV простото число (16777619), изкарайте хешираната стойност на подадения ред текст. .note -[*(14.12.2025)*] Поправен хеш на последния пример. +{i (14.12.2025)} Поправен хеш на последния пример. -:table_2 +:table +:2 |= Вход |= Изход -|: [`Hello World`] +|: {` Hello World} |: 310551791 -|: [`Nothing`] +|: {` Nothing} |: 383317984 -|: [`!`] +|: {` !} |: 84696382 -|: [`The most effective debugging tool is still careful thought, coupled with judiciously placed print statements.`] +|: {` The most effective debugging tool is still careful thought, coupled with judiciously placed print statements.} |: 2408366471 + ### Задача 14 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise14.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise14.cpp} От входа получавате два реда с текст. -Трябва да върнете дали първия ред е [url https://en.wikipedia.org/wiki/Anagram анаграма] на втория, +Трябва да върнете дали първия ред е {url анаграма;https://en.wikipedia.org/wiki/Anagram} на втория, тоест дали втория низ може да се получи след някакво разместване на всички (латински) букви в първия низ. Игнорирайте дали буквата е главна или малка. -:table_2 +:table +:2 |= Вход |= Изход @@ -421,12 +447,13 @@ I am Lord Voldemort |: Anagram + ## За любознателните ### Задача 15 От входа получавате два реда с текст. -Трябва да пресметнете [url https://en.wikipedia.org/wiki/Levenshtein_distance разстоянието на Ливенщайн] между тях. +Трябва да пресметнете {url разстоянието на Ливенщайн;https://en.wikipedia.org/wiki/Levenshtein_distance} между тях. То се пресмята така: .numbered diff --git a/src/teaching/upp-2025/week12/index.du b/src/teaching/upp-2025/week12/index.du index 5fc86b8..1d1ff4d 100644 --- a/src/teaching/upp-2025/week12/index.du +++ b/src/teaching/upp-2025/week12/index.du @@ -1,19 +1,19 @@ -# Задачи - УПП, Седмица 12, 18.12.2025 +'def title Задачи - УПП, Седмица 12, 18.12.2025 +'def desc Условията на задачите за упражнение. -'define expected-reading 14 min -'define created 17 December 2025 -'define edited 23 December 2025 -[$pagenav] +# {title} -GitHub Classroom: [url https://classroom.github.com/a/zvYPAVPS] +{pagenav 14 min;17 December 2025;23 December 2025} + +GitHub Classroom: {url https://classroom.github.com/a/zvYPAVPS} ## За решаване ### Задача 1 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week12/Exercise01.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week12/Exercise01.cpp} -[url https://en.wikipedia.org/wiki/Caesar_cipher Шифъра на Цезар] е античен шифър, при който всяка буква от азбуката се отмества и замества. +{url Шифъра на Цезар;https://en.wikipedia.org/wiki/Caesar_cipher} е античен шифър, при който всяка буква от азбуката се отмества и замества. Например, при отместване от 3, A става D, B става E, Z става C и така нататък. От входа получавате един ред с текст на английски, който е шифриран с шифъра на Цезар. @@ -24,7 +24,8 @@ GitHub Classroom: [url https://classroom.github.com/a/zvYPAVPS] Игнорирайте дали буквите са главни или малки във вашите проверки по време на дешифриране. -:table_2 +:table +:2 |= Вход |= Изход @@ -38,9 +39,10 @@ GitHub Classroom: [url https://classroom.github.com/a/zvYPAVPS] |: DAY HAD DAWNED COLD AND GRAY WHEN the man turned aside from the main Yukon trail + ### Задача 2 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week12/Exercise02.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week12/Exercise02.cpp} От входа получавате един ред текст. След това получавате положително число: брой колони (където всяка една колона съдържа един знак). @@ -50,7 +52,8 @@ GitHub Classroom: [url https://classroom.github.com/a/zvYPAVPS] С други думи, не може да разделяте думи (полета) на повече от един ред! Ако има поле, което е по-дълго от броя колони, то ще запълни цял ред и ще "прелее" извън броя колони. -:table_2 +:table +:2 |= Вход |= Изход @@ -104,26 +107,28 @@ sky. It was a clear day. + ### Задача 3 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week12/Exercise03.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week12/Exercise03.cpp} От входа получавате две полета (низове, които не съдържат шпации). След това получавате положително число: брой колони (където една колона съдържа един знак). Трябва да разположите двете полета в колоните така, че разстоянието между полетата и разтоянията между всяко поле и краищата са еднакви. -С други думи, ако сме получили [`Hello`], [`World`] и 25 колони, трябва да изкараме следния низ (където [`|`] обграждат всичките колони): +С други думи, ако сме получили {` Hello}, {` World} и 25 колони, трябва да изкараме следния низ (където {` |} обграждат всичките колони): ``` | Hello World | -Разстоянието между [`|`] и [`H`] е същото като между [`o`] и [`W`], и между [`d`] и [`|`], а иммено 5 шпации. +Разстоянието между {` |} и {` H} е същото като между {` o} и {` W}, и между {` d} и {` |}, а иммено 5 шпации. Когато разстоянията не могат да са точни, трябва или средното да е по-късото, или и двата края да са по-къси. Ако буквите в думите са повече от броя колоните, тогава изкарайте думите слепени. -:table_2 +:table +:2 |= Вход |= Изход @@ -158,22 +163,24 @@ Loremipsum Lorem ipsum + ### Задача 4 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week12/Exercise04.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week12/Exercise04.cpp} От входа получавате едно поле (последователност от букви, която не съдържа шпация). Трябва да върнете типа на полето, спрямо тези правила: .ordered -1. [=Тип "integer":=] може да започне с [`+`] или [`-`] и всички останали букви са цифри -2. [=Тип "float":=] може да започне с [`+`] или [`-`] и след това съдържа цифри и точка, която точка трябва да се намира между цифри (т.е. не е преди или след всички цифри) -3. [=Тип "word":=] ако съдържа само латински букви (главни или малки) -4. [=Тип "time":=] може да започне или завърши с "AM" или "PM", след това (допускайки че е започва с низа) съдържа 1-2 цифри (часа), които са между 0 и 24 вкл., знака двоеточие [`:`] и накрая завършва на две цифри (минутите), които са между 0 и 59 вкл. -5. [=Тип "percentage":=] започва с поне една цифра, като след първите цифри може да има точка и още цифри, и накрая завършва на знака [`%`] -6. [=Тип "other"=], когато не можем да го свържем с никое от горните правила +1. {b Тип "integer":} може да започне с {` +} или {` -} и всички останали букви са цифри +2. {b Тип "float":} може да започне с {` +} или {` -} и след това съдържа цифри и точка, която точка трябва да се намира между цифри (т.е. не е преди или след всички цифри) +3. {b Тип "word":} ако съдържа само латински букви (главни или малки) +4. {b Тип "time":} може да започне или завърши с "AM" или "PM", след това (допускайки че е започва с низа) съдържа 1-2 цифри (часа), които са между 0 и 24 вкл., знака двоеточие {` :} и накрая завършва на две цифри (минутите), които са между 0 и 59 вкл. +5. {b Тип "percentage":} започва с поне една цифра, като след първите цифри може да има точка и още цифри, и накрая завършва на знака {` %} +6. {b Тип "other"}, когато не можем да го свържем с никое от горните правила -:table_2 +:table +:2 |= Вход |= Изход @@ -229,6 +236,7 @@ Lorem ipsum |: other + ### Задача 5 От входа получавате две положителни цели числа: месец и година. @@ -244,7 +252,8 @@ Mo Tu We Th Fr Sa Su Като дните трябва да са коректно подравнени. -:table_2 +:table +:2 |= Вход |= Изход @@ -289,13 +298,14 @@ Mo Tu We Th Fr Sa Su 24 25 26 27 28 29 + ## За самоподготовка ### Задача 6 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week12/Exercise06.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week12/Exercise06.cpp} -Модерните текстови редактори са визуални редактори: редактираш текста, който едновременно виждаш (подобно на лист хартия). Предшественик на тези редактори са [url https://en.wikipedia.org/wiki/Line_editor редовите редактори]: пускаш редица команди, всяка от които променя текста по някакъв начин. +Модерните текстови редактори са визуални редактори: редактираш текста, който едновременно виждаш (подобно на лист хартия). Предшественик на тези редактори са {url редовите редактори;https://en.wikipedia.org/wiki/Line_editor}: пускаш редица команди, всяка от които променя текста по някакъв начин. Минуса е, че не нямаш курсор с който да правиш промените директно, това да видиш текста и да го редактираш са отделни команди, които трябва да изписваш всеки път. Плюса е, че реализацията е много по-проста и лесно се правят автоматизации/скриптове. @@ -306,7 +316,7 @@ Mo Tu We Th Fr Sa Su Трябва да изпълните всяка команда или да изкарате съобщение за грешка, ако командата е невалидна. .question -За любознателните: дизайна на този редактор е базиран на [url https://www.gnu.org/software/ed/manual/ed_manual.html ed] +За любознателните: дизайна на този редактор е базиран на {url ed;https://www.gnu.org/software/ed/manual/ed_manual.html} #### Обсег и текущия ред @@ -324,17 +334,17 @@ Mo Tu We Th Fr Sa Su Обсега за един ред е една от 3 типа стойности: .numbered 1. цяло число (последователност от цифри), която определя реда в текущия текст -2. [`.`], което обозначава текущия ред -3. [`$`], което обозначава последния ред във файла +2. {` .}, което обозначава текущия ред +3. {` $}, което обозначава последния ред във файла -Ако въведем [=само=] обсег за един ред, то това обновява текущия ред. +Ако въведем {b само} обсег за един ред, то това обновява текущия ред. -Имаме и обсег за няколко реда, който е във формата [`начало,край`]. -[`начало`] и [`край`] са в същия формат като обсега за един ред. +Имаме и обсег за няколко реда, който е във формата {` начало,край}. +{` начало} и {` край} са в същия формат като обсега за един ред. Тоест, това са два обсега за един ред, слепени със запетая. -[`начало`] може да бъде пропуснато, в който случай по подразбиране е 1 (първия ред). -[`край`] може да бъде пропуснато, в който случай по подразбиране е [`$`] (последния ред). +{` начало} може да бъде пропуснато, в който случай по подразбиране е 1 (първия ред). +{` край} може да бъде пропуснато, в който случай по подразбиране е {` $} (последния ред). Трябва да върнете съобщение за грешка, ако е подаден невалиден обсег за текущия текст. @@ -344,19 +354,19 @@ Mo Tu We Th Fr Sa Su Това са всички команди: .numbered -1. [`p`] - изкарва редовете в обсега -2. [`n`] - изкарва редовете в обсега, като преди всеки е поставен неговия номер на реда -3. [`d`] - изтрива редовете в обсега -4. [`а`] - добавя текст [=след=] всеки ред в обсега -5. [`i`] - добавя текст [=преди=] всеки ред в обсега -6. [`q`] - прекратява програмата +1. {` p} - изкарва редовете в обсега +2. {` n} - изкарва редовете в обсега, като преди всеки е поставен неговия номер на реда +3. {` d} - изтрива редовете в обсега +4. {` а} - добавя текст {b след} всеки ред в обсега +5. {` i} - добавя текст {b преди} всеки ред в обсега +6. {` q} - прекратява програмата -Буквите, след командите [`a`] и [`i`] са текста, който трябва да бъде вмъкнат. +Буквите, след командите {` a} и {` i} са текста, който трябва да бъде вмъкнат. Може да се вмъкне само по един ред текст. -След въвеждане на ред чрез [`a`] или [`i`], текущия ред автоматично се обновява на ново-добавения ред. +След въвеждане на ред чрез {` a} или {` i}, текущия ред автоматично се обновява на ново-добавения ред. -След изтриване на ред чрез [`d`], трябва да обновите текущия ред, само когато има смисъл. +След изтриване на ред чрез {` d}, трябва да обновите текущия ред, само когато има смисъл. Например, ако текущия ред е 10 и изтриете ред 20, няма нужда от промяна. Ако текущия ред е 10 и изтриете редове 2 и 3, тогава текущия ред трябва да се намали с броя изтрите редове, а имменно, с 2, от 10 на 8. @@ -365,24 +375,27 @@ Mo Tu We Th Fr Sa Su Вход и изход не са смесени. Наклонения текст е допълнителен коментар на това, което се случва (тоест, вие не трябва да го подавате на вашата програма). -[=Вход 1:=] +{b Вход 1:} ``` +'emplace aThe man looked along the way he had come. aThe Yukon lay a mile wide and hidden under three feet of ice. aOn top of this ice were as many feet of snow. It was all pure white. ,p q +'endemplace -[=Изход 1:=] +{b Изход 1:} ``` The man looked along the way he had come. The Yukon lay a mile wide and hidden under three feet of ice. On top of this ice were as many feet of snow. It was all pure white. -[$br1] +{br1} -[=Вход 2:=] +{b Вход 2:} ``` +'emplace aThe Yukon lay a mile wide and hidden under three feet of ice. iThe man looked along the way he had come. $aOn top of this ice were as many feet of snow. It was all pure white. @@ -393,25 +406,27 @@ p ,i ,p q +'endemplace -[=Изход 2:=] +{b Изход 2:} ``` -[*Изход от ",2n"*] +{i Изход от ",2n"} 1 The man looked along the way he had come. 2 The Yukon lay a mile wide and hidden under three feet of ice. -[*Изход от първото "p"*] +{i Изход от първото "p"} On top of this ice were as many feet of snow. It was all pure white. -[*Изход от второто "p"*] +{i Изход от второто "p"} The Yukon lay a mile wide and hidden under three feet of ice. -[*Изход от ",p"*]\n +{i Изход от ",p"}\n The man looked along the way he had come.\n The Yukon lay a mile wide and hidden under three feet of ice.\n On top of this ice were as many feet of snow. It was all pure white. -[$br1] +{br1} -[=Вход 3:=] +{b Вход 3:} ``` +'emplace aNorth and south, as far as his eye could see, ait was unbroken white. aThe one thing that relieved @@ -428,30 +443,31 @@ icurved from the pine-covered .n ,p q +'endemplace -[=Изход 3:=] +{b Изход 3:} .note -[=(23.12.2025)=] Поправен този изход +{b (23.12.2025)} Поправен този изход ``` -[*Изход от "3,5p"*] +{i Изход от "3,5p"} The one thing that relieved the whiteness was a thin dark line that cruved from the pine-covered -[*Изход от ",n"*] +{i Изход от ",n"} 1 North and south, as far as his eye could see, 2 it was unbroken white. 3 The one thing that relieved 4 the whiteness was a thin dark line that 5 island to the south. -[*Изход от ".,$p"*] +{i Изход от ".,$p"} curved from the pine-covered the whiteness was a thin dark line that island to the south. -[*Изход от ".n"*] +{i Изход от ".n"} 3 curved from the pine-covered -[*Изход от ",p"*] +{i Изход от ",p"} The one thing that relieved the whiteness was a thin dark line that curved from the pine-covered diff --git a/src/teaching/upp-2025/week13/index.du b/src/teaching/upp-2025/week13/index.du index 1ff00e7..d8edf79 100644 --- a/src/teaching/upp-2025/week13/index.du +++ b/src/teaching/upp-2025/week13/index.du @@ -1,25 +1,26 @@ -# Задачи - УПП, Седмица 13, 08.01.2026 +'def title Задачи - УПП, Седмица 13, 08.01.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 15 min -'define created 05 January 2025 -'define edited 08 January 2025 -[$pagenav] +# {title} + +{pagenav 15 min;05 January 2025;08 January 2025} .important Използвайте рекурсия, за да решите всички тези задачи! -GitHub Classroom: [url https://classroom.github.com/a/8vTquPOY] +GitHub Classroom: {url https://classroom.github.com/a/8vTquPOY} ## За решаване ### Задача 1 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise01.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise01.cpp} Реализирайте програма, която по подаден положителен размер изкарва "стълбище" от плюсове. .warn Както с всички останали задачи, решете условието с рекурсия! -:table_2 +:table +:2 |= Вход |= Изход @@ -50,17 +51,19 @@ GitHub Classroom: [url https://classroom.github.com/a/8vTquPOY] +++++++ + ### Задача 2 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise02.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise02.cpp} -Припомняме, че в [url https://en.wikipedia.org/wiki/Fibonacci_sequence редицата на Фибоначи], всеки следвавщ елемент е сумата на предходните два, като първите два елемента са 0 и 1. +Припомняме, че в {url редицата на Фибоначи;https://en.wikipedia.org/wiki/Fibonacci_sequence}, всеки следвавщ елемент е сумата на предходните два, като първите два елемента са 0 и 1. От входа получавате неотрицателен индекс, трябва да изкарате съответното число на Фибоначи. .warn Както с всички останали задачи, решете условието с рекурсия! -:table_2 +:table +:2 |= Вход |= Изход @@ -86,16 +89,18 @@ GitHub Classroom: [url https://classroom.github.com/a/8vTquPOY] |: 3524578 + ### Задача 3 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise03.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise03.cpp} От входа получавате цяло неотрицателно число. Изкарайте сумата на всички негови цифри. .warn Както с всички останали задачи, решете условието с рекурсия! -:table_2 +:table +:2 |= Вход |= Изход @@ -109,14 +114,16 @@ GitHub Classroom: [url https://classroom.github.com/a/8vTquPOY] |: 38 + ### Задача 4 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise04.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise04.cpp} От входа получавате един ред с текст. Трябва да обърнете реда на всички букви в текста и да изкарате резултата. -:table_2 +:table +:2 |= Вход |= Изход @@ -134,17 +141,19 @@ He should not have built the fire under the pine tree. |: ``` -.eert enip eht rednu erif eht tliub evah ton dluohs eH +\.eert enip eht rednu erif eht tliub evah ton dluohs eH + ### Задача 5 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise05.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise05.cpp} От входа получавате цяло неотрицателно число. Изкарайте "хълм" от плюсове с размер, подаденото число. -:table_2 +:table +:2 |= Вход |= Изход @@ -184,16 +193,18 @@ He should not have built the fire under the pine tree. + + ### Задача 6 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise06.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise06.cpp} -Напишете рекурентна функция, която по подадени две цели числа [`a`] и [`b`], връща сумата [=и=] средното аритметично на всички числа между [`a`] и [`b`], включително. +Напишете рекурентна функция, която по подадени две цели числа {` a} и {` b}, връща сумата {b и} средното аритметично на всички числа между {` a} и {` b}, включително. От входа получавате две цели числа. -Използвайки вашата функция, изкарайте сумата и средното аритметично на всички цели числа в интервала [`[a, b]`]. +Използвайки вашата функция, изкарайте сумата и средното аритметично на всички цели числа в интервала {` [a, b]}. -:table_2 +:table +:2 |= Вход |= Изход @@ -204,14 +215,16 @@ He should not have built the fire under the pine tree. |: 69 3 + ### Задача 7 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise07.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise07.cpp} От входа получавате неотрицателно цяло число - брой битове. Изкарайте всички възможни двоични числа, съставени от броя битове. -:table_2 +:table +:2 |= Вход |= Изход @@ -236,17 +249,19 @@ He should not have built the fire under the pine tree. 111 + ### Задача 8 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise08.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise08.cpp} От входа получавате неотрицателен индекс, трябва да изкарате преплетената поредица от числа на Фибоначи, от първото до това на подадения индекс. По-точно, трябва резултатните елементи на четните индекси да представляват редицата на Фибоначи в нарастващ ред, и тези на нечетните индекси да са същата редица в намаляващ ред. .warn -Изполвайте [=само=] едно начално извикване на рекурентната ви функция. +Изполвайте {b само} едно начално извикване на рекурентната ви функция. -:table_2 +:table +:2 |= Вход |= Изход @@ -260,14 +275,16 @@ He should not have built the fire under the pine tree. |: 0 0 + ### Задача 9 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise09.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise09.cpp} От входа получавате низ, съставен само и единствено от отварящи и затварящи кръгли скоби. Трябва да върнете дали скобите са балансирани, т.е. дали след всяка отваряща скоба, съществува "нейна си" затаваряща скоба, по-нататък в низа. -:table_2 +:table +:2 |= Вход |= Изход @@ -302,16 +319,18 @@ He should not have built the fire under the pine tree. |: Balanced + ### Задача 10 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise10.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise10.cpp} -Използвайки [=опашкова рекурсия=], имплементирайте функция която приема масив от реални числа и връща сумата на всички тях. +Използвайки {b опашкова рекурсия}, имплементирайте функция която приема масив от реални числа и връща сумата на всички тях. От входа получавате неотрицателно число N и след това N на брой реални числа. Използвайки вашата функция, изкарайте сумата на всички реални числа. -:table_2 +:table +:2 |= Вход |= Изход @@ -322,17 +341,19 @@ He should not have built the fire under the pine tree. |: 141.83 + ### Задача 11 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise11.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise11.cpp} -Напишете програма, която решава [url https://en.wikipedia.org/wiki/Ages_of_Three_Children_puzzle пъзела с възрастта на трите деца]. +Напишете програма, която решава {url пъзела с възрастта на трите деца;https://en.wikipedia.org/wiki/Ages_of_Three_Children_puzzle}. В пъзела знаете сумата на възрастите на трите деца, умножението на възрастите, както и факта, че едно от децата е най-голямо. От входа получавате две положителни числа: сумата и произведението на възрастите. Трябва да изкарате резултата: -:table_2 +:table +:2 |= Вход |= Изход @@ -343,17 +364,19 @@ He should not have built the fire under the pine tree. |: 2 2 9 + ### Задача 12 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise12.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise12.cpp} От входа получавате неотрицателно число N и след това N на брой цели числа. -Трябва да изкарате дължината на най-дългата [=строго нарастваща=] подредица (под-последователност) от числа. +Трябва да изкарате дължината на най-дългата {b строго нарастваща} подредица (под-последователност) от числа. .note -[*(11.01.2026)*] Поправени примери +{i (11.01.2026)} Поправени примери -:table_2 +:table +:2 |= Вход |= Изход @@ -373,11 +396,12 @@ He should not have built the fire under the pine tree. |: 6 + ### Задача 13 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise13.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise13.cpp} -Напишете програма, която решава [url https://en.wikipedia.org/wiki/Takuzu Такузу пъзели]. +Напишете програма, която решава {url Такузу пъзели;https://en.wikipedia.org/wiki/Takuzu}. Пъзлите са формулирани така: в дъска 4 на 4 трябва да се попълнят нули и единици, така че на всяка колона и ред да има еднакъв брой нули и единици. Допълнително, на всеки ред и колона, не може да има повече от две последователни еднакви числа. @@ -385,7 +409,8 @@ He should not have built the fire under the pine tree. От входа получавате нерешен такузу пъзел, където "празните" позиции са маркирани с -1. Трябва да изкарате решение на пъзела. -:table_2 +:table +:2 |= Вход |= Изход @@ -432,21 +457,23 @@ He should not have built the fire under the pine tree. 1 1 0 0 + ## За упражнение ### Задача 14 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise14.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise14.cpp} -Един от най-простите алгоритми за псевдо-случайни числа е [url https://en.wikipedia.org/wiki/Lehmer_random_number_generator генератора на Лемер]. -Започвайки от "seed" [`X[_0_]`], всяко следващо случайно число [`X[_k+1_]`] е равно на [`(a * X[_k_]) mod m`], където [`а`] и [`m`] са константи. +Един от най-простите алгоритми за псевдо-случайни числа е {url генератора на Лемер;https://en.wikipedia.org/wiki/Lehmer_random_number_generator}. +Започвайки от "seed" {` X{_ 0}}, всяко следващо случайно число {` X{_ k+1}} е равно на {` (a * X{_ k}) mod m}, където {` а} и {` m} са константи. -Нека да фиксираме [`a = 16807`] и [`m = 2[^31^] - 1`]. -От входа получавате две положителни цели числа: "seed" и бройка [`N`]. +Нека да фиксираме {` a = 16807} и {` m = 2{^ 31} - 1}. +От входа получавате две положителни цели числа: "seed" и бройка {` N}. -Трябва да изкарате всички произволни числа [`X[_1_]`] до [`X[_N_]`]. +Трябва да изкарате всички произволни числа {` X{_ 1}} до {` X{_ N}}. -:table_2 +:table +:2 |= Вход |= Изход @@ -460,25 +487,27 @@ He should not have built the fire under the pine tree. |: 16807 282475249 1622647863 947787490 1578127215 + ### Задача 15 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise15.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise15.cpp} Във физиката, можем да определим позицията на едно тяло по елиптична (Кеплерова) орбита чрез екцентричната аномалия. Обаче, на практика тя не се намира директно, ами се изчисляват средната аномалия и ексцентрицитетът на елипсата. -Чрез [url https://en.wikipedia.org/wiki/Kepler%27s_equation уравнението на Кеплер], можем да изведем следната рекурентна връзка за екцентричната аномалия: +Чрез {url уравнението на Кеплер;https://en.wikipedia.org/wiki/Kepler%27s_equation}, можем да изведем следната рекурентна връзка за екцентричната аномалия: -[image ./img/eccentric-anomaly.png] +{img ./img/eccentric-anomaly.png} -Където [`M`] е средната аномалия и [`e`] е ексцентрицитетът на елипсата. -От входа получавате две реални числа, [`M`] и [`e`], както и цяло положително число "дълбочина". +Където {` M} е средната аномалия и {` e} е ексцентрицитетът на елипсата. +От входа получавате две реални числа, {` M} и {` e}, както и цяло положително число "дълбочина". Трябва да върнете (приближение на) екцентричната аномалия, като рекурсията ви трябва да се "вложи" максимум "дълбочина" на брой пъти. -За дъно на рекурсията, може да върнете стойността [`M`]. -Използвайте [`<cmath>`] за синус функцията. +За дъно на рекурсията, може да върнете стойността {` M}. +Използвайте {` <cmath>} за синус функцията. -:table_2 +:table +:2 |= Вход |= Изход @@ -492,16 +521,18 @@ He should not have built the fire under the pine tree. |: 1.42528 + ### Задача 16 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise16.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise16.cpp} От входа получавате две неотрицателни цели числа. -Изкарайте техния най-голям общ делител, използвайки [url https://en.wikipedia.org/wiki/Euclidean_algorithm алгоритъма на Евклид]: +Изкарайте техния най-голям общ делител, използвайки {url алгоритъма на Евклид;https://en.wikipedia.org/wiki/Euclidean_algorithm}: -[image ./img/gcd-euclid.png] +{img ./img/gcd-euclid.png} -:table_2 +:table +:2 |= Вход |= Изход @@ -515,14 +546,16 @@ He should not have built the fire under the pine tree. |: 1 + ### Задача 17 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise17.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise17.cpp} От входа получавате един ред с текст. Трябва да изкарате дали текста е палиндром. -:table_2 +:table +:2 |= Вход |= Изход @@ -539,14 +572,16 @@ racecar racecar |: Is a palindrome + ### Задача 18 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise18.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise18.cpp} От входа получавате цяло неотрицателно число и цифра, между 1 и 9. Трябва да изкарате бройката срещания на цифрата в числото. -:table_2 +:table +:2 |= Вход |= Изход @@ -560,18 +595,20 @@ racecar racecar |: 4 + ### Задача 19 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise19.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise19.cpp} Един от начините да изчислим стойността на биномен коефициент е чрез следната рекурентна връзка: -[image ./img/binom.png] +{img ./img/binom.png} -От входа получавате две неотрицателни цели числа [`n`] и [`k`]. +От входа получавате две неотрицателни цели числа {` n} и {` k}. Трябва да изкарате съответния биномен коефициент, използвайки рекурентната връзка. -:table_2 +:table +:2 |= Вход |= Изход @@ -585,11 +622,13 @@ racecar racecar |: 1 + ### Задача 20 Напишете програма, която "изиграва" всички възможни игри на морски шах и връща в колко тях някой печели и в колко от тях никой не печели. -:table_2 +:table +:2 |= Вход |= Изход @@ -598,21 +637,23 @@ racecar racecar .comment Source: http://www.se16.info/hgb/tictactoe.htm + ### Задача 21 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise21.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise21.cpp} -[url https://en.wikipedia.org/wiki/Levenshtein_distance Разстоянието на Ливенщайн] е метод за измерване на разликата между два низа. +{url Разстоянието на Ливенщайн;https://en.wikipedia.org/wiki/Levenshtein_distance} е метод за измерване на разликата между два низа. Смята се по следния начин: -[image ./img/levenshtein.png] +{img ./img/levenshtein.png} -Където с [`x[1..]`] бележим остатък от низа [`x`], след първата буква. +Където с {` x[1..]} бележим остатък от низа {` x}, след първата буква. От входа получавате два реда с текст. Трябва да върнете разстоянието на Ливенщайн между тях. -:table_2 +:table +:2 |= Вход |= Изход @@ -638,18 +679,20 @@ Winterland |: 1 + ### Задача 22 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise22.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise22.cpp} -Аритметико-геометричното на две числа [`a`] и [`b`] се дефинира чрез следната рекурентна връзка: +Аритметико-геометричното на две числа {` a} и {` b} се дефинира чрез следната рекурентна връзка: -[image ./img/agm.png] +{img ./img/agm.png} -От входа получавате две реални числа, [`a`] и [`b`], и брой итерации [`n`]. -Изкарайте резултатното аритметико-геометрично число, като за дъно на рекурсията можете да върнете [`a[_n+1_]`]. +От входа получавате две реални числа, {` a} и {` b}, и брой итерации {` n}. +Изкарайте резултатното аритметико-геометрично число, като за дъно на рекурсията можете да върнете {` a{_ n+1}}. -:table_2 +:table +:2 |= Вход |= Изход @@ -663,16 +706,18 @@ Winterland |: 0.189868 + ### Задача 23 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise23.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise23.cpp} -Използвайки [=опашкова рекурсия=], напишете функция, която получава масив от цели числа и връща най-големия елемент от тях. +Използвайки {b опашкова рекурсия}, напишете функция, която получава масив от цели числа и връща най-големия елемент от тях. -От входа получавате неотрицателно цяло [`N`] и след това [`N`] на брой цели числа. +От входа получавате неотрицателно цяло {` N} и след това {` N} на брой цели числа. Използвайки вашата функция, изкарайте най-голямото число. -:table_2 +:table +:2 |= Вход |= Изход @@ -683,19 +728,21 @@ Winterland |: 1 + ### Задача 24 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise24.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week13/Exercise24.cpp} Чрез бездънни дроби можем да представим редица функции/изрази, за които няма точна формула. -От входа получавате реално число [`x`] и дълбочина [`n`], върнете [`e[^x^]`] използвайки: +От входа получавате реално число {` x} и дълбочина {` n}, върнете {` e{^ x}} използвайки: -[image ./img/eulers_identity.png] +{img ./img/eulers_identity.png} Като, всеки "етаж" от дробта е единица дълбочина (и първото ниво е 0). -:table_2 +:table +:2 |= Вход |= Изход @@ -712,10 +759,11 @@ Winterland |: 23.1406 + ### Задача 25 От входа получавате положителни цели размери на матрица от букви. -След това получавате стойностите на самата матрица, като буквата [`#`] определя стена и [`.`] определя празно пространство. +След това получавате стойностите на самата матрица, като буквата {` #} определя стена и {` .} определя празно пространство. Накрая получавате двойка индекси (координат) в матрицата. Трябва да запълните всички празни клетки, които са достижими от подадения координат (като не може да се минаава през стените). @@ -725,12 +773,13 @@ Winterland От входа получавате недовършен судоку пъзел, където празните клетки са отбелязани с -1. Трябва да намерите и изкарате решение(то) на пъзела. -:table_2 +:table +:2 |= Вход |= Изход |: -:code +```` 6 -1 3 2 -1 5 7 -1 1 -1 2 -1 -1 -1 -1 -1 9 -1 9 -1 -1 6 -1 7 -1 -1 3 @@ -745,7 +794,7 @@ Winterland |: -:code +```` 6 4 3 2 9 5 7 8 1 5 2 7 8 1 3 4 9 6 9 1 8 6 4 7 5 2 3 @@ -760,18 +809,20 @@ Winterland + ### Задача 27 -[url https://en.wikipedia.org/wiki/Recaman%27s_sequence#bodyContent Редицата на Рекаман] се дефинира по следния начин: +{url Редицата на Рекаман;https://en.wikipedia.org/wiki/Recaman%27s_sequence#bodyContent} се дефинира по следния начин: .unordered -- първия елемент (с индекс [`n = 0`]) е 0 -- всеки следващ елемент е равен на предходния минус [`n`], ако резултата ще е положително и резултата не е срещан преди -- иначе, всеки следващ елемент е равен на предходния плюс [`n`] +- първия елемент (с индекс {` n = 0}) е 0 +- всеки следващ елемент е равен на предходния минус {` n}, ако резултата ще е положително и резултата не е срещан преди +- иначе, всеки следващ елемент е равен на предходния плюс {` n} -От входа получавате цяло неотрицателно чило [`n`], изкарайте [`n`]-тото число от редицата на Рекаман. +От входа получавате цяло неотрицателно чило {` n}, изкарайте {` n}-тото число от редицата на Рекаман. -:table_2 +:table +:2 |= Вход |= Изход @@ -788,15 +839,17 @@ Winterland |: 1 + ### Задача 28 -Напишете програма, която връща [=бройката решения=] на [url https://en.wikipedia.org/wiki/Eight_queens_puzzle пъзела на 8те царици]. +Напишете програма, която връща {b бройката решения} на {url пъзела на 8те царици;https://en.wikipedia.org/wiki/Eight_queens_puzzle}. Пъзела е формулиран така: имате шахматна дъска (8 на 8) и върху нея имате 8 царици. Припомняме, че царицата се движи вертикално, хоризонтално и диагонално по дъската. Целта на пъзела е цариците да се поставят така, че нито една царица да не може да вземе никоя друга. -:table_2 +:table +:2 |= Вход |= Изход @@ -804,10 +857,11 @@ Winterland |: 92 + ### Задача 29 От входа получавате положителни цели размери на матрица от букви. -След това получавате стойностите на самата матрица, като буквата [`#`] определя стена и [`.`] определя празно пространство. +След това получавате стойностите на самата матрица, като буквата {` #} определя стена и {` .} определя празно пространство. Накрая получавате две двойки координати (индекси) в матрицата. Трябва да изкарате дали има път по празните пространства, така че да се придвижите от началните (първите) координати до финалните (вторите). @@ -821,7 +875,7 @@ Winterland Целта е да изкараме дали подадения низ съответства на шаблона. За нашите цели, регулярнят израз ще има следния формат: започвайки от началото, всяка буква директно съответства на буква в подадения низ. -Обаче, имаме специалната буква [`*`], която казва, че предходната буква може да се повтори нула или повече пъти. +Обаче, имаме специалната буква {` *}, която казва, че предходната буква може да се повтори нула или повече пъти. -Тоест, ако в регулярния израз нямаме [`*`], на практика проверяваме дали двата низа съвпадат. -В случаите когато имаме [`*`], [*пробваме*] да съпоставим буквата, например в регулярен израз "a*", низовете "", "a", "aa", "aaa" съответстват. +Тоест, ако в регулярния израз нямаме {` *}, на практика проверяваме дали двата низа съвпадат. +В случаите когато имаме {` *}, {i пробваме} да съпоставим буквата, например в регулярен израз "a*", низовете "", "a", "aa", "aaa" съответстват. diff --git a/src/teaching/upp-2025/week14/bitwise-and-binary-representation.du b/src/teaching/upp-2025/week14/bitwise-and-binary-representation.du index 8369230..ac76e8e 100644 --- a/src/teaching/upp-2025/week14/bitwise-and-binary-representation.du +++ b/src/teaching/upp-2025/week14/bitwise-and-binary-representation.du @@ -1,11 +1,11 @@ -# Побитови операции и представяне на числени данни - УПП, Седмица 14, 15.01.2026 +'def title Побитови операции и представяне на числени данни - УПП, Седмица 14, 15.01.2026 +'def desc Презентация върху размери на типове данни, 1s complement, 2s complement и IEEE754 -'define expected-reading 4 min -'define created 13 January 2026 -'define edited 14 January 2026 -[$pagenav] +# {title} -[$presentation-controller] +{pagenav 4 min;13 January 2026;14 January 2026} + +{presentation-controller} :title_slide @@ -16,17 +16,17 @@ ## Какво е бит? -[$br4] +{br4} :unordered - всичко в компютъра се представя в двоична бройна система -- [*бит*] е най-малката единица памет +- {i бит} е най-малката единица памет -- [*байт*] (byte) е най-малката [=адресируема=] единица памет +- {i байт} (byte) е най-малката {b адресируема} единица памет -- [*дума*] (word) е най-голямата [=обработваема=] единица памет +- {i дума} (word) е най-голямата {b обработваема} единица памет @@ -35,74 +35,76 @@ :slide35 -[$br3] +{br3} :unordered -- На [=модерни=] процесори: - [`x86-64`] (Intel/AMD), [`ARM`] (Apple M series/Snapdragon/Exynos/Cortex)\n +- На {b модерни} процесори: + {` x86-64} (Intel/AMD), {` ARM} (Apple M series/Snapdragon/Exynos/Cortex)\n байт е 8 бита, дума е 64 бита -- процесора извършва повечето инструкции върху [*думи*] +- процесора извършва повечето инструкции върху {i думи} -- в повечето архитектури, размера на един адрес ([=указател=]) е една [*дума*] +- в повечето архитектури, размера на един адрес ({b указател}) е една {i дума} -- [`bool`] заема един [*байт*], въпреки че стойността му може да се побере в един [*бит*] +- {` bool} заема един {i байт}, въпреки че стойността му може да се побере в един {i бит} Общо взето, за модерен процесор/ОС/... може да използвате размерите в долната таблица. .warn -[=Обаче=], стандарта на C++ определя единствено [*минимален*] размер за типовете. +{b Обаче}, стандарта на C++ определя единствено {i минимален} размер за типовете. Долните стойности не са закон! :slide35 -[$br2] +{br2} -:table_2 +:table +:2 |= Тип |= Размер -|: [`bool`], [`char`] +|: {` bool}, {` char} |: "1" бит (1 байт) -|: [`short`] +|: {` short} |: 16 бита (2 байта) -|: [`int`], [`float`] +|: {` int}, {` float} |: 32 бита (4 байта) -|: [`long`] -|: 32 бита [url https://learn.microsoft.com/en-us/windows/win32/winprog/windows-data-types#LONG Windows], 64 бита MacOS/Linux +|: {` long} +|: 32 бита {url Windows;https://learn.microsoft.com/en-us/windows/win32/winprog/windows-data-types#LONG}, 64 бита MacOS/Linux -|: [`long long`], [`double`] +|: {` long long}, {` double} |: 64 бита (8 байта) + :slide35 ## Побитови оператори -[$br4] +{br4} .p Аритметичните оператори извършват аритметика върху целите стойности на числата .p -Побитовите оператори извършват [*логически*] операции върху всеки два [*съответни*] бита +Побитовите оператори извършват {i логически} операции върху всеки два {i съответни} бита :slide35 -### Побитово "И" [`&`], "ИЛИ" [`|`], "НЕ" [`~`] +### Побитово "И" {` &}, "ИЛИ" {` |}, "НЕ" {` ~} .p -Работят като логическите [`&&`], [`||`], [`!`] но върху битовете. +Работят като логическите {` &&}, {` ||}, {` !} но върху битовете. Разглеждайки две еднобайтови числа: ``` @@ -110,7 +112,7 @@ 10010011 | 10011100 = 10011111 ~ 10010011 = 01101100 -### Побитово "изключващо или" [`^`] +### Побитово "изключващо или" {` ^} .p Истина, когато двата бита са различни и лъжа, когато са еднакви @@ -121,10 +123,10 @@ :middle_slide35 -### Отместване наляво [`<<`] +### Отместване наляво {` <<} .p -Отместваме битовете с [`n`] на брой позиции на ляво +Отместваме битовете с {` n} на брой позиции на ляво ``` 10010011 << 1 = 00100110 @@ -134,11 +136,11 @@ :middle_slide35 -### Отместване надясно [`>>`] +### Отместване надясно {` >>} .p -Отместваме битовете с [`n`] на брой позиции на дясно.\n -Ако типа е [`unsigned`]: +Отместваме битовете с {` n} на брой позиции на дясно.\n +Ако типа е {` unsigned}: ``` 10010011 >> 1 = 01001001 @@ -157,7 +159,7 @@ ## Представяне на цели числа -[$br4] +{br4} :unordered @@ -172,7 +174,7 @@ :middle_slide35 .p -Идея: [=старшия бит=] (най-левия) да определя дали е положително или отрицателно +Идея: {b старшия бит} (най-левия) да определя дали е положително или отрицателно ``` 000 0 @@ -188,7 +190,7 @@ :middle_slide35 .p -Проблем: нормалното събиране [=не=] работи +Проблем: нормалното събиране {b не} работи ``` 1 + 1 = 001 + 001 = 010 = 2 @@ -196,17 +198,17 @@ -1 + -1 = 101 + 101 = 1010 = 2 (отрязваме) .p -Не би ли било готино да представим числата, така че събиране/изваждане да работи по [*същия*] начин? +Не би ли било готино да представим числата, така че събиране/изваждане да работи по {i същия} начин? :slide ### 1s complement -[$br1] +{br1} .p -Отрицателното число е като положителното, но с [=обратните=] битове +Отрицателното число е като положителното, но с {b обратните} битове ``` 000 0 @@ -219,7 +221,7 @@ 111 -0 .p -Нарича се така, защото [`x & -x`] винаги е равно на [`111...111`] +Нарича се така, защото {` x & -x} винаги е равно на {` 111...111} :middle_slide35 @@ -237,15 +239,15 @@ -1 + -1 = 110 + 110 = 1100 = 1 + 100 = 101 = -2 .p -[=Плюсове:=] водещия бит е единица при отрицателни.\n -[=Минуси:=] има +0 и -0, нуждаем се от "end-arround carry". +{b Плюсове:} водещия бит е единица при отрицателни.\n +{b Минуси:} има +0 и -0, нуждаем се от "end-arround carry". :slide ### 2s complement -[$br1] +{br1} .p Като 1s complement, но при отрицателните числа изваждаме единица. @@ -261,7 +263,7 @@ 111 -1 .p -Нарича се така, защото [`x + -x`] е равно на 2 на степен броя битове +Нарича се така, защото {` x + -x} е равно на 2 на степен броя битове :middle_slide35 @@ -279,7 +281,7 @@ ## Представяне на числа с плаваща запетая -[$br1] +{br1} .p Идея: цяло число, в което закодираме позиция на точката. @@ -295,7 +297,7 @@ :slide35 -[$br3] +{br3} :unordered @@ -305,7 +307,7 @@ - Имаме много нули -- 4те бита за позиция са wasted, защото най-лявата позиция е 12, [`1100`] +- 4те бита за позиция са wasted, защото най-лявата позиция е 12, {` 1100} @@ -313,14 +315,14 @@ ### IEEE754 -[$br1] +{br1} .unordered -- Формат, публикуван през [url https://en.wikipedia.org/wiki/IEEE_754-1985 1985] година +- Формат, публикуван през {url 1985;https://en.wikipedia.org/wiki/IEEE_754-1985} година - За 16 бита, обхвата му е от -65504 до 65504, най-прецизното възможно число е 0.000000059604645 - Поддържа "числата" безкрайност и "not a number" - Представя числата като дроби (научна нотация) -- [=Не всички числа в обхвата могат да бъдат представени=] +- {b Не всички числа в обхвата могат да бъдат представени} - Числата около нулата могат да имат много цифри след запетаята, тези по-далеч могат по-малко @@ -330,7 +332,7 @@ Сложен е, любознателните могат да го разучат: .unordered -- [url https://mathcenter.oxford.emory.edu/site/cs170/ieee754/] -- [url https://www.h-schmidt.net/FloatConverter/IEEE754.html] -- [url https://en.wikipedia.org/wiki/Half-precision_floating-point_format#Half_precision_examples] -- [url https://codingnest.com/the-little-things-comparing-floating-point-numbers/] +- {url https://mathcenter.oxford.emory.edu/site/cs170/ieee754/} +- {url https://www.h-schmidt.net/FloatConverter/IEEE754.html} +- {url https://en.wikipedia.org/wiki/Half-precision_floating-point_format#Half_precision_examples} +- {url https://codingnest.com/the-little-things-comparing-floating-point-numbers/} diff --git a/src/teaching/upp-2025/week14/index.du b/src/teaching/upp-2025/week14/index.du index c9c67c0..db5a4a2 100644 --- a/src/teaching/upp-2025/week14/index.du +++ b/src/teaching/upp-2025/week14/index.du @@ -1,22 +1,23 @@ -# Задачи - УПП, Седмица 14, 15.01.2026 +'def title Задачи - УПП, Седмица 14, 15.01.2026 +'def desc Условията на задачите за упражнение. -'define expected-reading 1 min -'define created 14 January 2025 -'define edited 18 January 2025 -[$pagenav] +# {title} -GitHub Classroom: [url https://classroom.github.com/a/JjE8rZOx] +{pagenav 1 min;14 January 2025;18 January 2025} + +GitHub Classroom: {url https://classroom.github.com/a/JjE8rZOx} ## За решаване ### Задача 1 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week14/Exercise01.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week14/Exercise01.cpp} От входа получавате цяло неотрицателно число. -Използвайки [=единствено=] побитови операции, умножете числото по 8 и върнете резултата. +Използвайки {b единствено} побитови операции, умножете числото по 8 и върнете резултата. -:table_2 +:table +:2 |= Вход |= Изход @@ -27,14 +28,16 @@ GitHub Classroom: [url https://classroom.github.com/a/JjE8rZOx] |: 40 + ### Задача 2 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week14/Exercise02.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week14/Exercise02.cpp} От входа получавате цяло неотрицателно число. -Отместете битовете му с 3 позиция на ляво [=без=] да използвате побитови оператори и изкарайте резултата. +Отместете битовете му с 3 позиция на ляво {b без} да използвате побитови оператори и изкарайте резултата. -:table_2 +:table +:2 |= Вход |= Изход @@ -45,14 +48,16 @@ GitHub Classroom: [url https://classroom.github.com/a/JjE8rZOx] |: 304 + ### Задача 3 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week14/Exercise03.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week14/Exercise03.cpp} От входа получавате неотрицателно 32-битово число. -Използвайки [=единствено=] побитови операции, изкарайте 1 ако в числото има нечетен брой единици битове и 0 иначе. +Използвайки {b единствено} побитови операции, изкарайте 1 ако в числото има нечетен брой единици битове и 0 иначе. -:table_2 +:table +:2 |= Вход |= Изход @@ -63,14 +68,16 @@ GitHub Classroom: [url https://classroom.github.com/a/JjE8rZOx] |: 0 + ### Задача 4 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week14/Exercise04.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week14/Exercise04.cpp} От входа получавате неотрицателно 32-битово число. Разделете числото на 4 последователни 8-битови числа и изкарайте всяко от тях. -:table_2 +:table +:2 |= Вход |= Изход @@ -78,20 +85,22 @@ GitHub Classroom: [url https://classroom.github.com/a/JjE8rZOx] |: 76 204 133 210 + ### Задача 5 -.solution-link [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week14/Exercise05.cpp Решение] +.solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week14/Exercise05.cpp} От входа получавате две неотрицателни целия 32-битови числа. Разбийте всяко на три подчисла, две по 11 бита и едно по 10 бита. -След това от входа получавате буква: [`+`], [`-`], [`*`], [`/`]. +След това от входа получавате буква: {` +}, {` -}, {` *}, {` /}. Извършете операцията върху всеки две съответни подчисла от двете числа (т.е. върху първото подчисло на първото число и първото подчисло на второто число, второто подчисло на първото число и второто подчисло на второто число и ...). .note -[*(18.01.2026)*] Оправени примери +{i (18.01.2026)} Оправени примери -:table_2 +:table +:2 |= Вход |= Изход |