From aeca0d6b2f3dfc30286180cc85fe99ea274cfc46 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Fri, 15 Dec 2023 08:27:51 +0200 Subject: [te/upp-2023/w10] Added exercises --- src/teaching/upp-2023/index.md | 1 + src/teaching/upp-2023/week10/img/fib.png | Bin 0 -> 6292 bytes src/teaching/upp-2023/week10/index.md | 89 +++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+) create mode 100644 src/teaching/upp-2023/week10/img/fib.png create mode 100644 src/teaching/upp-2023/week10/index.md (limited to 'src') diff --git a/src/teaching/upp-2023/index.md b/src/teaching/upp-2023/index.md index 9ef5d77..7e8c1f4 100644 --- a/src/teaching/upp-2023/index.md +++ b/src/teaching/upp-2023/index.md @@ -28,3 +28,4 @@ |8 |24.11.2023|[Задачи](./week8) \|\| [Решения](https://github.com/Syndamia/upp-2023-solutions/tree/main/week08) \|\| [GitHub classroom](https://classroom.github.com/a/Big7FRUG)| |9 |01.12.2023|[Задачи](./week9) \|\| [GitHub classroom](https://classroom.github.com/a/lGXxCRZO)| | |04.12.2023|[Допълнително упражнение 2](./additional2/) \|\| [GitHub classroom](https://classroom.github.com/a/CrerXpf6)| +|10|15.12.2023|[Задачи](./week10) \|\| [GitHub classroom](https://classroom.github.com/a/EJcTQRz4)| diff --git a/src/teaching/upp-2023/week10/img/fib.png b/src/teaching/upp-2023/week10/img/fib.png new file mode 100644 index 0000000..b0bc958 Binary files /dev/null and b/src/teaching/upp-2023/week10/img/fib.png differ diff --git a/src/teaching/upp-2023/week10/index.md b/src/teaching/upp-2023/week10/index.md new file mode 100644 index 0000000..c7d5b86 --- /dev/null +++ b/src/teaching/upp-2023/week10/index.md @@ -0,0 +1,89 @@ +# Задачи - УПП, Седмица 10, 15.12.2023 + +GitHub classroom: [classroom.github.com/a/EJcTQRz4](https://classroom.github.com/a/EJcTQRz4) + +&&important Във всички задачи **трябва** да използвате рекурсия! + +## Задача 1 + +Най-големия общ делител на числата `a` и `b` е най-голямото, число което ги дели без остатък. +Евклидовият алгоритъм се базира на факта, че за две положителни числа `a` и `b`, като `a > b`, НОД на `a` и `b` е същия като НОД на `a - b` и `b` и когато `a = b`, тогава НОД на `a` и `b` е тяхната стойност. + +От входа получавате две цели положителни числа и трябва да изкарате техния НОК, чрез алгоритъма на Евклид **имплементиран с рекурсия**. + +**Примери:** + +|Вход|Изход| +|----|-----| +|6 6 |6 | +|48 18|6 | + +## Задача 2 + +От входа получавате неотрицателно число `N` и трябва да изкарате `N`-тото число на Фибоначи **чрез рекурсия**, като нулевото число е 0, първото е 1, второто е 1, третото е 2, четвъртото е 3 и так. нат. +Напомням, че математически фибоначи се дефинира така: + + + +![F(0) = 0; F(1) = 1; F(n) = F(n-1) + F(n-2)](./img/fib.png) + +**Примери:** + +|Вход|Изход| +|----|-----| +|0 |0 | +|1 |1 | +|4 |3 | +|12 |144 | +|17 |1597 | +|24 |46368| + +## Задача 3 + +От входа получавате положително число `N`, трябва да изкарате на екрана "рисунка", показваща формата на пясъчен часовник с височина `2N` (вижте примерите). + +**Примери:** + +|Вход|Изход| +|----|-----| +|1 |
+
#
| +|2 |
+++
+
#
###
| +|3 |
+++++
+++
+
#
###
#####
| +|5 |
+++++++++
+++++++
+++++
+++
+
#
###
#####
#######
#########
| + +## Задача 4 + +От входа получавате число `N`, след това тябва да изкарате на нови редове, в нарастващ ред, всички двоични числа, които могат да се представят с `N`-бита. +Вкарвате и водещи нули, тоест всяко число е съставено от точно `N` букви (`N` нули и единици). + +**Примери:** + +|Вход|Изход| +|----|-----| +|1 |0
1| +|2 |00
01
10
11| +|3 |000
001
010
011
100
101
110
111| +|4 |0000
0001
...
0111
1000
1001
...
1101
1110
1111| + +## Задача 5 + +Получавате един ред от терминала, в който ще имате скоби, знакът `+` и `*`, шпации и числа. +Това е прост математически израз, трябва да изкарате резултата след неговото пресмятане, като винаги около `число + число` и `число * число` има скоби (тоест не е нужно да се притеснявате от приоритет и асоциативност). + +За удобство спокойно може да ползвате `atoi` за конверитране на числовите части от низа в числа. + +**Примери:** + +|Вход|Изход| +|----|-----| +|(1 + 2)|3 | +|((2 + 9) * 3)|33| +|(((8 * 1) * (56 + 4)) + (19 * 2))|518| -- cgit v1.3.1-23-gd82d From 12cc9f84f7c4b61c4483d3095d818bdc68321225 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Fri, 15 Dec 2023 10:25:21 +0200 Subject: [te/upp-2023/w10] Fixed typo --- src/teaching/upp-2023/week10/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/teaching/upp-2023/week10/index.md b/src/teaching/upp-2023/week10/index.md index c7d5b86..26064c5 100644 --- a/src/teaching/upp-2023/week10/index.md +++ b/src/teaching/upp-2023/week10/index.md @@ -9,7 +9,7 @@ GitHub classroom: [classroom.github.com/a/EJcTQRz4](https://classroom.github.com Най-големия общ делител на числата `a` и `b` е най-голямото, число което ги дели без остатък. Евклидовият алгоритъм се базира на факта, че за две положителни числа `a` и `b`, като `a > b`, НОД на `a` и `b` е същия като НОД на `a - b` и `b` и когато `a = b`, тогава НОД на `a` и `b` е тяхната стойност. -От входа получавате две цели положителни числа и трябва да изкарате техния НОК, чрез алгоритъма на Евклид **имплементиран с рекурсия**. +От входа получавате две цели положителни числа и трябва да изкарате техния НОД, чрез алгоритъма на Евклид **имплементиран с рекурсия**. **Примери:** -- cgit v1.3.1-23-gd82d From 530d88d7b995f87c2e8faad64167b4a071775f0c Mon Sep 17 00:00:00 2001 From: Syndamia Date: Fri, 15 Dec 2023 10:59:09 +0200 Subject: [te/upp-2023/w10] Updated ex2 to have original description --- src/teaching/upp-2023/week10/index.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/teaching/upp-2023/week10/index.md b/src/teaching/upp-2023/week10/index.md index 26064c5..043d913 100644 --- a/src/teaching/upp-2023/week10/index.md +++ b/src/teaching/upp-2023/week10/index.md @@ -20,7 +20,8 @@ GitHub classroom: [classroom.github.com/a/EJcTQRz4](https://classroom.github.com ## Задача 2 -От входа получавате неотрицателно число `N` и трябва да изкарате `N`-тото число на Фибоначи **чрез рекурсия**, като нулевото число е 0, първото е 1, второто е 1, третото е 2, четвъртото е 3 и так. нат. +От входа получавате неотрицателно число `N`, което ще бъде някое число на Фибоначи. +Трябва да върнете кое по ред е, като 0 е нулевото, 1 е първото, 2 е третото, 3 е четвъртото и так. нат. Напомням, че математически фибоначи се дефинира така: | + + +## Задача 2 + +Получавате N и M, съответно броя редове и колони в дъска. +Всяка клетка от дъската е пълна или празна. +След това получавате NxM на брой символа за всяка клетка, като `.` означава празна клетка, докато `#` означава пълна. +Накрая получавате две числа - координати (започващи от нула, като 0,0 е горния-ляв ъгъл) в дъската. + +От подадените координати трябва да запълните "фигурата" в която се намира (фигурата която огражда) дадената плочка. +С други думи, представете си че дъската е изображение, всяка клетка е пиксел, в изображението има бели и черни пиксели, и на дадените координати е кликнато с "Bucket fill" за да се оцвети в черно дадена фигура. + +Оцветяването да се случва само в 4те прави посоки (без диагонали). + +![](https://upload.wikimedia.org/wikipedia/commons/7/7e/Recursive_Flood_Fill_4_%28aka%29.gif) + +**Пример:** + +|Вход|Изход| +|----|-----| +|5 11
- - # # - - - - - - -
- # - - # - - - - - -
# - - - - # # # # # #
- # - - # - - - # - #
- - # # - - - - - - -
2 2|
- - # # - - - - - - -
- # # # # - - - - - -
# # # # # # # # # # #
- # # # # - - - # - #
- - # # - - - - - - -
| + +## Задача 3 + +Имате шахматна дъска (8 на 8) и върху нея имате 8 царици. +Напомням, че царицата в шаха може да се движи вертикално, хоризонтално и диагонално произволен брой клетки в един ход. + +Интересуваме се от такова поставяне на всички царици, че нито една няма да вземе никоя друга царица в един ход. +Пример: + +![](https://upload.wikimedia.org/wikipedia/commons/6/69/Solution_A_for_8_Queen_Puzzles.png) + +Напишете програма, която намира броя на възможните такива поставяния на цариците. +От входа не получавате нищо. + +**Пример:** + +|Вход|Изход| +|----|-----| +| |92 | + +**Бонус:** направете програмата да изкарва всяко решение + +## Задача 4 + + + +Нормално ние представяме математически операции чрез "инфиксен" запис, тоест операторът е по средата, между нещата върху които работи (пример: `1 + 2`). +Обаче, това не е задължително, по обратната полска нотация винаги слагаме оператът след нещата върху които работи (пример: `1 2 +`). + +Бонусът на това, е че не ни трябва скобуване и ред на операциите. +В инфиксния израз `(2 + 3) * (2 ^^ 2)`, без скобите, сбора ще се извърши след умножението и степенуването ще се извърши след умножението. +Обаче, ако искаме да изразим това в обратен полски запис, просто правим `2 3 + 2 * ^^ 2`. +А ако искаме оригиналното действие, без скоби, записваме `2 3 2 * 2 ^^ +`. + +Ако изглежда объркващо, идеята е че всеки оператор работи върху предходните две стойности, изчисляваме изразите от ляво надясно и заместваме веднага. +Тоест, при последния пример, пропускаме първите три числа, стигаме до `*`, умножаваме последните две и заместваме трите неща (`3 2 *`) с резултата, следователно имаме `2 6 2 ^^ +`, пропускаме две, стигаме до `^^` и так.нат. + +Направете програма, която чисто рекурсивно изчислиява изрази в обратен полски запис, който поддържа цели числа и операциите събиране, умножение, деление, изваждане и степенуване (за степенуване ще използваме знакът `^`). + +&&important Обаче, за едно извикване на рекурсивната функция, може да пазите само един елемент на израза (число или оператор)! + +Изразът винаги завършва на знака `$`. + +&&warn Относно вход/изход, понеже няма как да знаем дали i-тата стойност е число или знак (операция), трябва да използваме функцията `std::cin.fail()`, която връща булева стойност, която ни казва дали записването на входа е било успешно.
+ Тоест, може винаги да запазвате входа в целочислен тип, когато стигнете до знак `std::cin.fail()` ще върне `true`. + След това трябва да "забравите" за грешката чрез `std::cin.clear()` и може втори път да запазите входа (провалените данни ще се препрочетат) в променлива от знаков тип.
+ Но това поражда друг проблем, понеже записваме в целочислен тип, когато въведем `+` или `-`, `std::cin` ще очаква това да е водещ знак на число, и ще продължи да чака входа докато не въведем друг знак, тоест `+` и `-` ще бъдат пропуснати. + Като компромисен вариант, просто пред тях винаги ще слагаме `'` и в кода ще го пропускаме. + +**Примери:** + +|Вход|Изход| +|----|-----| +|1 2 '+ 3 / $|1| +|1 4 3 2 ^ * '+ 14 7 / '- $|35| + +## Attribution + +- Анимация в [Задача 2](#2) от André Karwath (Aka) на [Уикипедия](https://commons.wikimedia.org/w/index.php?curid=481651) под лиценз CC BY-SA 2.5 +- Изображение на шахматна дъска в [Задача 3](#3) от Encik Tekateki в [Уикипедия](https://commons.wikimedia.org/w/index.php?curid=77832290) под лиценз CC BY-SA 4.0 -- cgit v1.3.1-23-gd82d From 56ec8311cf591506e15f69e6ca57aced20e9d360 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Fri, 5 Jan 2024 09:02:39 +0200 Subject: [te/upp-2023] Added solutions links to all previous weeks that were missing them --- src/teaching/upp-2023/index.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/teaching/upp-2023/index.md b/src/teaching/upp-2023/index.md index 77958b3..9888181 100644 --- a/src/teaching/upp-2023/index.md +++ b/src/teaching/upp-2023/index.md @@ -26,8 +26,8 @@ |6 |10.11.2023|[Задачи](./week6) \|\| [Решения](https://github.com/Syndamia/upp-2023-solutions/tree/main/week06) \|\| [GitHub classroom](https://classroom.github.com/a/BBLlWMOy)| |7 |17.11.2023|[Задачи](./week7) \|\| [Решения](https://github.com/Syndamia/upp-2023-solutions/tree/main/week07) \|\| [GitHub classroom](https://classroom.github.com/a/m5M2_CWD)| |8 |24.11.2023|[Задачи](./week8) \|\| [Решения](https://github.com/Syndamia/upp-2023-solutions/tree/main/week08) \|\| [GitHub classroom](https://classroom.github.com/a/Big7FRUG)| -|9 |01.12.2023|[Задачи](./week9) \|\| [GitHub classroom](https://classroom.github.com/a/lGXxCRZO)| -| |04.12.2023|[Допълнително упражнение 2](./additional2/) \|\| [GitHub classroom](https://classroom.github.com/a/CrerXpf6)| -|10|15.12.2023|[Задачи](./week10) \|\| [GitHub classroom](https://classroom.github.com/a/EJcTQRz4)| -|11|22.12.2023|[Задачи](./week11) \|\| [GitHub classroom](https://classroom.github.com/a/cZRnZj9y)| +|9 |01.12.2023|[Задачи](./week9) \|\| [Решения](https://github.com/Syndamia/upp-2023-solutions/tree/main/week09) \|\| [GitHub classroom](https://classroom.github.com/a/lGXxCRZO)| +| |04.12.2023|[Допълнително упражнение 2](./additional2/) \|\| [Решения](https://github.com/Syndamia/upp-2023-solutions/tree/main/additional2) \|\| [GitHub classroom](https://classroom.github.com/a/CrerXpf6)| +|10|15.12.2023|[Задачи](./week10) \|\| [Решения](https://github.com/Syndamia/upp-2023-solutions/tree/main/week10) \|\| [GitHub classroom](https://classroom.github.com/a/EJcTQRz4)| +|11|22.12.2023|[Задачи](./week11) \|\| [Решения](https://github.com/Syndamia/upp-2023-solutions/tree/main/week11) \|\| [GitHub classroom](https://classroom.github.com/a/cZRnZj9y)| |12|05.01.2024|[Задачи](./week12) \|\| [GitHub classroom](https://classroom.github.com/a/KEDSxDjl)| -- cgit v1.3.1-23-gd82d From 324f03baa65d5b84ef9c9e11e95a6e2f8168ade6 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Fri, 5 Jan 2024 09:33:28 +0200 Subject: [te/upp-2023/w12] Fixed outdated chatacter in explanation --- src/teaching/upp-2023/week12/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/teaching/upp-2023/week12/index.md b/src/teaching/upp-2023/week12/index.md index d8f9886..e3847d9 100644 --- a/src/teaching/upp-2023/week12/index.md +++ b/src/teaching/upp-2023/week12/index.md @@ -32,7 +32,7 @@ GitHub classroom: [classroom.github.com/a/KEDSxDjl](https://classroom.github.com Получавате N и M, съответно броя редове и колони в дъска. Всяка клетка от дъската е пълна или празна. -След това получавате NxM на брой символа за всяка клетка, като `.` означава празна клетка, докато `#` означава пълна. +След това получавате NxM на брой символа за всяка клетка, като `-` означава празна клетка, докато `#` означава пълна. Накрая получавате две числа - координати (започващи от нула, като 0,0 е горния-ляв ъгъл) в дъската. От подадените координати трябва да запълните "фигурата" в която се намира (фигурата която огражда) дадената плочка. -- cgit v1.3.1-23-gd82d From 3b3f968c022aaea1f422bd53c45a1eb56ea6c09c Mon Sep 17 00:00:00 2001 From: Syndamia Date: Fri, 5 Jan 2024 10:23:23 +0200 Subject: [te/upp-2023/w12] Fixed classroom link --- src/teaching/upp-2023/week12/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/teaching/upp-2023/week12/index.md b/src/teaching/upp-2023/week12/index.md index e3847d9..e36751e 100644 --- a/src/teaching/upp-2023/week12/index.md +++ b/src/teaching/upp-2023/week12/index.md @@ -1,6 +1,6 @@ # Задачи - УПП, Седмица 12, 05.01.2024 -GitHub classroom: [classroom.github.com/a/KEDSxDjl](https://classroom.github.com/a/cZRnZj9y) +GitHub classroom: [classroom.github.com/a/KEDSxDjl](https://classroom.github.com/a/KEDSxDjl) &&important Във всички задачи **трябва** да използвате рекурсия! -- cgit v1.3.1-23-gd82d From dbb9ec4cedabbd50f96b0dca79d01e7c4d2b5b1d Mon Sep 17 00:00:00 2001 From: Syndamia Date: Fri, 5 Jan 2024 11:15:01 +0200 Subject: [te/upp-2023/w12] Fixed example --- src/teaching/upp-2023/week12/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/teaching/upp-2023/week12/index.md b/src/teaching/upp-2023/week12/index.md index e36751e..4bfa3c8 100644 --- a/src/teaching/upp-2023/week12/index.md +++ b/src/teaching/upp-2023/week12/index.md @@ -25,7 +25,7 @@ GitHub classroom: [classroom.github.com/a/KEDSxDjl](https://classroom.github.com |----|-----| |3
1 4
2 5
3 1
4|3| |3
1 4
2 5
3 6
3|0| -|6
50 56
50 59
64 80
46 64
50 75
5 17
190|190| +|6
50 56
50 59
64 80
46 64
50 75
5 17
190|150| ## Задача 2 -- cgit v1.3.1-23-gd82d From fcb2a239f15cb4bfab94aee250b98033441cd035 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Fri, 5 Jan 2024 11:53:13 +0200 Subject: [te/upp-2023/w12] Fixed example --- src/teaching/upp-2023/week12/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/teaching/upp-2023/week12/index.md b/src/teaching/upp-2023/week12/index.md index 4bfa3c8..c43a3e8 100644 --- a/src/teaching/upp-2023/week12/index.md +++ b/src/teaching/upp-2023/week12/index.md @@ -78,7 +78,7 @@ GitHub classroom: [classroom.github.com/a/KEDSxDjl](https://classroom.github.com Бонусът на това, е че не ни трябва скобуване и ред на операциите. В инфиксния израз `(2 + 3) * (2 ^^ 2)`, без скобите, сбора ще се извърши след умножението и степенуването ще се извърши след умножението. -Обаче, ако искаме да изразим това в обратен полски запис, просто правим `2 3 + 2 * ^^ 2`. +Обаче, ако искаме да изразим това в обратен полски запис, просто правим `2 3 + 2 2 ^^ *`. А ако искаме оригиналното действие, без скоби, записваме `2 3 2 * 2 ^^ +`. Ако изглежда объркващо, идеята е че всеки оператор работи върху предходните две стойности, изчисляваме изразите от ляво надясно и заместваме веднага. -- cgit v1.3.1-23-gd82d From f0cfdc9cefb1a2fa0058836a69352c6c4c29ea8f Mon Sep 17 00:00:00 2001 From: Syndamia Date: Fri, 5 Jan 2024 15:29:04 +0200 Subject: [te/upp-2023/w12] Fixed apostrophies in ex4 examples --- src/teaching/upp-2023/week12/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/teaching/upp-2023/week12/index.md b/src/teaching/upp-2023/week12/index.md index c43a3e8..a4be259 100644 --- a/src/teaching/upp-2023/week12/index.md +++ b/src/teaching/upp-2023/week12/index.md @@ -100,8 +100,8 @@ GitHub classroom: [classroom.github.com/a/KEDSxDjl](https://classroom.github.com |Вход|Изход| |----|-----| -|1 2 '+ 3 / $|1| -|1 4 3 2 ^ * '+ 14 7 / '- $|35| +|1 2 '+ 3 / $|1| +|1 4 3 2 ^ * '+ 14 7 / '- $|35| ## Attribution -- cgit v1.3.1-23-gd82d From 3f7d2f1d4b4bd61d0d182af5745a529bdff5a2dd Mon Sep 17 00:00:00 2001 From: Syndamia Date: Fri, 12 Jan 2024 08:32:14 +0200 Subject: [te/upp-2023/w13] Added exercises --- src/teaching/upp-2023/index.md | 1 + src/teaching/upp-2023/week13/index.md | 124 ++++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 src/teaching/upp-2023/week13/index.md (limited to 'src') diff --git a/src/teaching/upp-2023/index.md b/src/teaching/upp-2023/index.md index 9888181..6529f20 100644 --- a/src/teaching/upp-2023/index.md +++ b/src/teaching/upp-2023/index.md @@ -31,3 +31,4 @@ |10|15.12.2023|[Задачи](./week10) \|\| [Решения](https://github.com/Syndamia/upp-2023-solutions/tree/main/week10) \|\| [GitHub classroom](https://classroom.github.com/a/EJcTQRz4)| |11|22.12.2023|[Задачи](./week11) \|\| [Решения](https://github.com/Syndamia/upp-2023-solutions/tree/main/week11) \|\| [GitHub classroom](https://classroom.github.com/a/cZRnZj9y)| |12|05.01.2024|[Задачи](./week12) \|\| [GitHub classroom](https://classroom.github.com/a/KEDSxDjl)| +|13|12.01.2024|[Задачи](./week13) \|\| [GitHub classroom](https://classroom.github.com/a/bgiFD6SB)| diff --git a/src/teaching/upp-2023/week13/index.md b/src/teaching/upp-2023/week13/index.md new file mode 100644 index 0000000..70a2be9 --- /dev/null +++ b/src/teaching/upp-2023/week13/index.md @@ -0,0 +1,124 @@ +# Задачи - УПП, Седмица 13, 12.01.2024 + +GitHub classroom: [classroom.github.com/a/bgiFD6SB](https://classroom.github.com/a/bgiFD6SB) + +## Алтернативни задачи + +Считайте [задачите от семинара](https://github.com/ivanahristova/introduction-to-programming-2023-2024/tree/main/sem13) и [тези от миналия път](../week12/) като част от днешните задачи. +Тоест, за хората които се затрудняват повечко, решете ги и след това се върнете тук. +Разбира се, ще помагам и с тях. + + +## 1 задача + +От входа получавате число N, това е броя на "пробни" думи. +След тях получавате още една дума, която е желаната дума. +Трябва да изкарате коя пробна дума е най-близка до (различава се с най-малко знаци с) желаната дума. + +Всяка дума е на нов ред и е съставена от малки латински букви. +Ако има няколко думи с еднаква "близкост", изкарайте последната от тях. + +**Примери:** + +|Вход|Изход| +|----|-----| +|5
cate
cot
dog
cote
co
cat|cot| +|4
nask
nmaskl
msdal
task
mask|task| + +## 2 задача + +Ще дефинираме обвито изречение, като редица от букви, за които са изпълнени следните правила: + +- първата е главна +- последната е точка +- между тях има само малки букви, цифри и шпации +- всяко изречение е "обвито" до някакъв брой колони + + Тоест за всяко изречение са избрани максимален брой колони, и знаците са обвити, така че да се поберат. + Примерно, ако имахме изречението "Hello world." и бяхме избрали 5 колони, тогава оплучаваме: + + ``` + Hello + worl + d. + ``` + +От входа получавате N и M, те съответстват на матрица от символи с N реда и M колони. +В матрицата имате обвити изречения, подредени по такъв начин, че между съседни има със сигурност поне една шпация (която действа като разделител). +Допускаме, че при "двусмислици" възможно най-много шпации са част от изречението (а не от разделителя), тоест ако имаме: + +``` +A B +. . +``` + +тогва двете ни изречения са: + +``` +B. +A . +``` + +Изкарайте на конзолата всички обвити изречения в матрицата (редът им няма значение). + +**Примери:** + +|Вход|Изход| +|----|-----| +|
7 13
Thi A Someth
s i n ing.
s c .
ool
. Good Hel
luc lo.
Ha. k.
|Something.
An.
This is cool.
Hello.
Good luck.
Ha.
| +|
2 7
B A.
.
|
A.
B .
| +|
3 7
A.
B
.
|
A.
B .
| +|
4 7
A.

B
.
|
A.
B .
| +|
3 6
Big
jumper
.
|
Big   jumper.
| + +## 3 задача + +В префиксния (или полския) запис слагаме оператора за смятане пред (в ляво от) елементите върху които работи (нормален запис - `1 + 2`, полски запис - `+ 1 2`). +Ще разглеждаме "многоредови" изрази в полски запис, тоест изрази в които има няколко реда от целочислени стойности, така че трябва да се изчислят няколко израза с еднаква "форма", но различни стойности. + +Един такъв израз изглежда така: + +``` ++ 1 2 + 3 4 + 5 6 . +``` + +Точката на края на последния ред задава край на израза. +В този пример ще изчислим `1 + 2`, `3 + 4` и `5 + 6`, тоест ще "върне" три стойности: 3, 7 и 11. +Всяка колона в израза е от един и същи "тип", тоест в една колона винаги ще има числова стойност или някакъв знак. +С изключение на точката, всеки знак може да се постави на произволен ред (обаче в една колона не може да има повече от един знак). + +Примерно: + +``` + 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, първия определя нормера на израза, докато втория определя коя стойност искаме. +Примерно: + +``` + 1 2 ++ 3 4 + 5 6 . +* 0.0 0.2 . +``` + +В последния израз умножаваме от нулевия израз, първата и третата стойност, тоест умножаваме 3 и 11. + +Накрая трябва да изкарате всички стойности от последния израз. + + +**Пример:** + +|Вход|Изход| +|----|-----| +|
  1 5
+ 2 6
3 7
4 8 .
- 0.3 0.2 .
* 1.0 0.1 .
1.0 3 0.2 3
- 3 0.3 0.1 1.0
* 0.0 2.0 / 2.0 0.1 .
$
|-3 -36 -20| -- cgit v1.3.1-23-gd82d From 97178d663c375bb7eb22d4d3d4457b7e0d43186b Mon Sep 17 00:00:00 2001 From: Syndamia Date: Fri, 12 Jan 2024 08:32:23 +0200 Subject: [te/upp-2023/w12] Added solutions link --- src/teaching/upp-2023/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/teaching/upp-2023/index.md b/src/teaching/upp-2023/index.md index 6529f20..6a8bfd2 100644 --- a/src/teaching/upp-2023/index.md +++ b/src/teaching/upp-2023/index.md @@ -30,5 +30,5 @@ | |04.12.2023|[Допълнително упражнение 2](./additional2/) \|\| [Решения](https://github.com/Syndamia/upp-2023-solutions/tree/main/additional2) \|\| [GitHub classroom](https://classroom.github.com/a/CrerXpf6)| |10|15.12.2023|[Задачи](./week10) \|\| [Решения](https://github.com/Syndamia/upp-2023-solutions/tree/main/week10) \|\| [GitHub classroom](https://classroom.github.com/a/EJcTQRz4)| |11|22.12.2023|[Задачи](./week11) \|\| [Решения](https://github.com/Syndamia/upp-2023-solutions/tree/main/week11) \|\| [GitHub classroom](https://classroom.github.com/a/cZRnZj9y)| -|12|05.01.2024|[Задачи](./week12) \|\| [GitHub classroom](https://classroom.github.com/a/KEDSxDjl)| +|12|05.01.2024|[Задачи](./week12) \|\| [Решения](https://github.com/Syndamia/upp-2023-solutions/tree/main/week12) \|\| [GitHub classroom](https://classroom.github.com/a/KEDSxDjl)| |13|12.01.2024|[Задачи](./week13) \|\| [GitHub classroom](https://classroom.github.com/a/bgiFD6SB)| -- cgit v1.3.1-23-gd82d From f8284e6e64b16b796d0e5981e036a836229d8943 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Fri, 12 Jan 2024 08:33:29 +0200 Subject: [te/upp-2023/w13] Fixed typos --- src/teaching/upp-2023/week13/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/teaching/upp-2023/week13/index.md b/src/teaching/upp-2023/week13/index.md index 70a2be9..1a9e037 100644 --- a/src/teaching/upp-2023/week13/index.md +++ b/src/teaching/upp-2023/week13/index.md @@ -35,7 +35,7 @@ GitHub classroom: [classroom.github.com/a/bgiFD6SB](https://classroom.github.com - всяко изречение е "обвито" до някакъв брой колони Тоест за всяко изречение са избрани максимален брой колони, и знаците са обвити, така че да се поберат. - Примерно, ако имахме изречението "Hello world." и бяхме избрали 5 колони, тогава оплучаваме: + Примерно, ако имахме изречението "Hello world." и бяхме избрали 5 колони, тогава получаваме: ``` Hello @@ -52,7 +52,7 @@ A B . . ``` -тогва двете ни изречения са: +тогава двете ни изречения са: ``` B. @@ -102,7 +102,7 @@ A . От входа получавате няколко такива израза, докато не получите знака `$`. -Може да достъпвате стойност от предходни изрази чрез синтаксиса "ИНДЕКС.ИНДЕКС", където индексите са от 0, първия определя нормера на израза, докато втория определя коя стойност искаме. +Може да достъпвате стойност от предходни изрази чрез синтаксиса "ИНДЕКС.ИНДЕКС", където индексите са от 0, първия определя номера на израза, докато втория определя коя стойност искаме. Примерно: ``` -- cgit v1.3.1-23-gd82d From aeb4f6614e4b42b05368bc9721e7f0b0d673c1db Mon Sep 17 00:00:00 2001 From: Syndamia Date: Fri, 12 Jan 2024 10:38:24 +0200 Subject: [te/upp-2023/w13] Added another exercise --- src/teaching/upp-2023/week13/index.md | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/teaching/upp-2023/week13/index.md b/src/teaching/upp-2023/week13/index.md index 1a9e037..4608c3b 100644 --- a/src/teaching/upp-2023/week13/index.md +++ b/src/teaching/upp-2023/week13/index.md @@ -27,6 +27,26 @@ GitHub classroom: [classroom.github.com/a/bgiFD6SB](https://classroom.github.com ## 2 задача +В началото получавате неотрицателно цяло число N. +След това получавате N на брой редове. +Всеки ред е във формата "(Име) (Фамилия) (Брой продадени продукти)". + +Редовете са разбъркани, изкарайте първо име и фамилия на хората с най-много продадени продукти. +Ако има няколко хора, които са продали най-много продукти, изкарайте имената им в азбучен ред, първо по фамилия, после по име. + +Използвайте **само една функция за сортиране!** +Като подсказка, използвайте указатели към функции за да променяте как тя работи. + +&&question Какво свойство трябва да е изпълнено за сортиращата функция? + +**Примери:** + +|Вход|Изход| +|----|-----| +|Antony Garcia 10
John Doe 9
Joseph Carmichael 10
Steven Wayne 1
Bob Carmichael 10
Holy Wilson 9|Bob Carmichael
Joseph Carmichael
Antony Garcia| + +## 3 задача + Ще дефинираме обвито изречение, като редица от букви, за които са изпълнени следните правила: - първата е главна @@ -71,7 +91,7 @@ A . |
4 7
A.

B
.
|
A.
B .
| |
3 6
Big
jumper
.
|
Big   jumper.
| -## 3 задача +## 4 задача В префиксния (или полския) запис слагаме оператора за смятане пред (в ляво от) елементите върху които работи (нормален запис - `1 + 2`, полски запис - `+ 1 2`). Ще разглеждаме "многоредови" изрази в полски запис, тоест изрази в които има няколко реда от целочислени стойности, така че трябва да се изчислят няколко израза с еднаква "форма", но различни стойности. @@ -116,6 +136,7 @@ A . Накрая трябва да изкарате всички стойности от последния израз. +&&warn Погледнете пояснението за вход/изход от [последната задача от миналия път](../week12/#4). **Пример:** -- cgit v1.3.1-23-gd82d From 85e75aeda7b41b5815501dad33e52cb3b50662a4 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Fri, 19 Jan 2024 08:57:00 +0200 Subject: [te/upp-2023/w14] Added exercises --- src/teaching/upp-2023/index.md | 1 + src/teaching/upp-2023/week14/index.md | 239 ++++++++++++++++++++++++++++++++++ 2 files changed, 240 insertions(+) create mode 100644 src/teaching/upp-2023/week14/index.md (limited to 'src') diff --git a/src/teaching/upp-2023/index.md b/src/teaching/upp-2023/index.md index 6a8bfd2..19199ec 100644 --- a/src/teaching/upp-2023/index.md +++ b/src/teaching/upp-2023/index.md @@ -32,3 +32,4 @@ |11|22.12.2023|[Задачи](./week11) \|\| [Решения](https://github.com/Syndamia/upp-2023-solutions/tree/main/week11) \|\| [GitHub classroom](https://classroom.github.com/a/cZRnZj9y)| |12|05.01.2024|[Задачи](./week12) \|\| [Решения](https://github.com/Syndamia/upp-2023-solutions/tree/main/week12) \|\| [GitHub classroom](https://classroom.github.com/a/KEDSxDjl)| |13|12.01.2024|[Задачи](./week13) \|\| [GitHub classroom](https://classroom.github.com/a/bgiFD6SB)| +|14|19.01.2024|[Задачи](./week14) \|\| [GitHub classroom](https://classroom.github.com/a/B08TtnnW)| diff --git a/src/teaching/upp-2023/week14/index.md b/src/teaching/upp-2023/week14/index.md new file mode 100644 index 0000000..cf28fe7 --- /dev/null +++ b/src/teaching/upp-2023/week14/index.md @@ -0,0 +1,239 @@ +# Задачи - УПП, Седмица 14, 19.01.2024 + +GitHub classroom: [classroom.github.com/a/B08TtnnW](https://classroom.github.com/a/B08TtnnW) + +Това е последния практикум, затова ви давам по-лесни и приятни задачи: имплементации на игри! +Всичките са взети от [101 BASIC Computer Games](https://en.wikipedia.org/wiki/BASIC_Computer_Games) (книгата е налична в [archive.org](https://archive.org/details/bitsavers_decBooks10Mar75_26006648)). + +Разбира се, който иска, може да решава задачи от предходни практикуми, давал съм достатъчно задачи. + +## 1 задача - Ним + +Ним е една много стара игра за два играча. +В произволен брой купчини са сложени произволен брой предмети (предметите не се различават, примерно камъни или пръчки). +Алтернативно, всеки играч взема някакъв брой (поне един) предмети от една купчина. +Играчът който вземе последния предмет печели. + +В нашия вариант, предметите са пръчки. +Компютъра автоматично (и случайно) генерира между 5 и 20 купчини с между 1 и 10 пръчки. +Разбира се, трябва компютъра да съобщи за конкретните стойности: + +```terminal +X piles +Y sticks in pile 1 +Z sticks in pile 2 +[...] +K sticks in pile X +``` + +След това се редуват, първия играч, втория играч: + +```terminal +Player 1 turn +``` + +Избирате купчина с пръчки: + +```terminal +Which pile do you want sticks from? _ +``` + +където _ е мястото на курсора. +След това броя пръчки от купчината: + +```terminal +How many sticks? _ +``` + +Ако някоя стойност е невалидна, питате пак. +След това идва редът на втория играч: + +```terminal +Player 2 turn +``` + +Накрая, този който вземе последната пръчка печели играта и се пита дали искате наново да почнете играта: + +```terminal +Player X won. Do you want to play again? _ +``` + +## 2 задача - Хамураби + +Вие играете като древния Вавилонски цар Хамураби над своя малък град. +Управлявате три ресурса във вашето царство: хора, земя и жито. +Имате власт 10 години, обаче обществото може да ви изгони и преди това. + +Не е от голямо значение да знаете, но акър земя е приблизително 4000 квадратни метра, а бушел жито е приблизително 4 килограма жито. + +В началото вашия съветник казва: + +```terminal +Hamurabi, I beg to report to you +In year X, Y people starved, Z came to the city. +``` + +Разбира се, X, Y и Z са положителни целочислени стойности. +По-късно ще определим как се изменят и какви са началните стойности. + +След това имате 1/7 шанс чума да сполети вашия град. +Ако се случи, съветника ви съобщава за това и загубвате половината си население: + +```terminal +A horrible plague struck! Half of the people died. +``` + +След това съветника ви дава информация за града: + +```terminal +Population is now X. +The city now owns X acres. +You harvested Z bushels per acre. +Rats ate K bushels. +You now have L bushels in store. +``` + +Разбира се, X, Y, Z, K и L са целочислени стойности. + +Ако тази информация е в последната година от вашето царуване, играта свършва и получавате мнението на населението за вас. + +Иначе, сега съветника започва да ви дава информация и да ви пита за вашето действие: + +```terminal +Land is trading at X bushels per acre. +How many acres do you wish to buy? _ +``` + +Където X е произволно цяло число между 17 и 27, долна черта показва мястото на курсора. +Трябва да се въведе цяло число. +В този случай, както и всеки други, ако то е отрицателно, съветника напуска и играта свършва: + +```terminal +Hamurabi, I cannot do what you wish, get yourself another steward!!!!! +So long for now. +``` + +Последния ред винаги се показва, когато играта свърши. + +Ако нямате достатъчно бушели в резерв, за да купите всичката въведена земя, съветника ви казва: + +```terminal +Hamurabi, think again, you have only X bushels of grian. Now then, +``` + +и същото съобщение за "Land is trading at [...] How many acres ..." се изписва и приемате нов вход. + +Ако сте въвели 0, значи искате да продавате земя и съветника ви пита: + +```terminal +How many acres do you wish to sell? _ +``` + +Ако се въведе отрицателно число, случва се същото като при купуване на земя. + +Ако въведете повече земя, отколкото имате, съветника казва: + +```terminal +Hamurabi think again, you own only X acres. Now then, +``` + +и пак пита "How many acres [...]". + +След като сте купили или продали земя, сега съветника ви пита колко бушели жито ще отделите за нахранване на населението: + +```terminal +How many bushels do you wish to feed your people? _ +``` + +Ако се въведе твърде голямо число, съветника предупреждава и пита пак: + +```terminal +Hamurabi, think again, you have only X bushels of grain. Now then, +How many bushels do you wish to feed your people? _ +``` + +Остава последния въпрос от съветника за годината: + +```terminal +How many acres do you wish to plant with seed? _ +``` + +Разбира се, ако се въведат повече акри отколкото има, съветника предупреждава и пита пак: + +```terminal +Hamurabi, think again, you own only X acres. Now then, +How many acres do you wish to plant with seed? _ +``` + +Предполагам може да се сетите какво съобщение съветника връща при отрицателни акри. + +Един бушел жито може да засее два акъра земя, ако няма достатъчно жито, съветника предупреждава и пита пак. +Отнема 10 човека да се грижат за един акър земя, ако няма достатъчно хора, съветника предупреждава и пита пак: + +```terminal +But you have only X people to tend the fields. Now then, +``` + +Това са въпросите на съветника, сега остава годината да се изиграе. +Хората жънат (произволно число) между 1 и 6 бушела жито на всеки акър. + +След това избирате друго произволно число между 1 и 6. +Ако числото е по-голямо от 1, тогава плъховете ще изядат по толкова голяма дроб бушели жито от резерва (при числото 5, плъховете изяждат 1/5; тук бушелите жито се смятат преди жътва). + +Сега населението расте, броя хора които са "дошли" в града се определя по формулата `R * (20 * АКРИ ЗЕМЯ + БУШЕЛИ ЖИТО) / БРОЙ ХОРА / 100 + 1`, където R е цяло число между 1 и 6. +Бушелите жито се смятат след жътва. + +Предпоследно, определя се колко хора са умрели от глад, като всеки човек консумира 20 бушели жито. +Ако над 45% от населението са умрели от глад, останалите хора ви свалят от власт и играта свършва: + +```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! +So long for now. +``` + +Накрая на годината, трябва да обновите общия брой хора, които са умрели от глад, за цялото ви царуване, заедно със средния процент хора които са умирали на година. + +Ако успешно царувате 10 години, накрая съветника ви казва как сте се справили: + +```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 +You started with 10 acres per person and ended with X acres per person. +``` + +Ако средно над 33% от населението е умирало от глад всяка година или съотношението ви е под 7 акъра на човек, тогава се случва същото нещо, като когато над 45% от населението умира от глад. + +Ако средно над 10% (но под 34%) от населението е умирало от глад всяка година или съотношението ви е под 9 акъра на човек (но над 6), тогава оставате в историята като лош владетел: + +```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 +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. +``` + +Където х съответства на бройката, между 0 и 80 процента от населението. + +В противен случай, тоест средно под 4% от населението е умирало от глад всяка година или съотношението е над 10 акъра на човека, тогава хората ви харесват: + +```terminal +A fantastic performance!!! +Charlemange, Disraeli and Jefferson combined could not have done better. +So long for now. +``` + +В началото на играта започвате с 100 човека население, като 5 от тях са дошли в града, 1000 акри земя, жътва от 3 бушела на акър, плъхове са изяли 200 бушела и имате 2800 бушела в хранилището. -- cgit v1.3.1-23-gd82d From 727d31d1f143d7486aa07e38eed6cb4b0ee5c926 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Thu, 15 Feb 2024 21:27:50 +0200 Subject: [te/oop-2023] Added index page --- src/teaching.md | 3 +++ src/teaching/index.md | 3 +++ src/teaching/oop-2023/index.md | 16 ++++++++++++++++ 3 files changed, 22 insertions(+) create mode 100644 src/teaching/oop-2023/index.md (limited to 'src') diff --git a/src/teaching.md b/src/teaching.md index 29bad9b..e1e9092 100644 --- a/src/teaching.md +++ b/src/teaching.md @@ -4,5 +4,8 @@ This is a list of all the subjects I've taught professionally.
+&&bg 2023-2024   [З520 Обектно-ориентрано програмиране - практикум, КН, 8 група](/teaching/oop-2023) +: Хоноруван преподавател във [ФМИ](https://www.fmi.uni-sofia.bg/) на специалност [Компютърни науки](https://www.fmi.uni-sofia.bg/bg/kompyutrni-nauki) + &&bg 2023-2024   [3107 Увод в програмирането - практикум, КН, 8 група](/teaching/upp-2023) : Хоноруван преподавател във [ФМИ](https://www.fmi.uni-sofia.bg/) на специалност [Компютърни науки](https://www.fmi.uni-sofia.bg/bg/kompyutrni-nauki) diff --git a/src/teaching/index.md b/src/teaching/index.md index 29bad9b..e1e9092 100644 --- a/src/teaching/index.md +++ b/src/teaching/index.md @@ -4,5 +4,8 @@ This is a list of all the subjects I've taught professionally.
+&&bg 2023-2024   [З520 Обектно-ориентрано програмиране - практикум, КН, 8 група](/teaching/oop-2023) +: Хоноруван преподавател във [ФМИ](https://www.fmi.uni-sofia.bg/) на специалност [Компютърни науки](https://www.fmi.uni-sofia.bg/bg/kompyutrni-nauki) + &&bg 2023-2024   [3107 Увод в програмирането - практикум, КН, 8 група](/teaching/upp-2023) : Хоноруван преподавател във [ФМИ](https://www.fmi.uni-sofia.bg/) на специалност [Компютърни науки](https://www.fmi.uni-sofia.bg/bg/kompyutrni-nauki) diff --git a/src/teaching/oop-2023/index.md b/src/teaching/oop-2023/index.md new file mode 100644 index 0000000..3121a72 --- /dev/null +++ b/src/teaching/oop-2023/index.md @@ -0,0 +1,16 @@ +# Обектно-ориентирано програмиране - практикум, Компютърни науки, 8 група + +Материали на проведените през 2023/2024 практикуми по Обектно-ориентирано програмиране на Компютърни науки (2 поток), 8 група. + +**Зала:** ФМИ 019 || +**Време:** 9:15 - 11:00 || +**Ден:** Четвъртък +
+**Директни връзки:** +[Контакт с мен](../upp-2023/week1/welcome.html?a#section-4) + +|№|Дата|Материали| +|-------|----|---------| -- cgit v1.3.1-23-gd82d From e553d867950af688abe8c8072fe16fbc77c6476c Mon Sep 17 00:00:00 2001 From: Syndamia Date: Fri, 16 Feb 2024 15:52:57 +0200 Subject: [about] Updated face image --- src/img/face.jpeg | Bin 90198 -> 93556 bytes 1 file changed, 0 insertions(+), 0 deletions(-) (limited to 'src') diff --git a/src/img/face.jpeg b/src/img/face.jpeg index 977b9fb..ef89a01 100644 Binary files a/src/img/face.jpeg and b/src/img/face.jpeg differ -- cgit v1.3.1-23-gd82d From e7c4ef954c7bad66df21e5047eb89046299822a7 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Tue, 20 Feb 2024 17:04:07 +0200 Subject: [blog/mfe] Added blogpost for Microsoft and FOSS --- src/blog.md | 3 + src/blog/index.md | 3 + src/blog/microsoft-and-foss-extinguish/index.md | 83 +++++++++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 src/blog/microsoft-and-foss-extinguish/index.md (limited to 'src') diff --git a/src/blog.md b/src/blog.md index fc3d256..ac411a0 100644 --- a/src/blog.md +++ b/src/blog.md @@ -4,6 +4,9 @@ Articles detailing personal experiences or exploration of certain topics.
+&&gb 20 Feb   [Microsoft and FOSS: a fire to be extinguished](/blog/microsoft-and-foss-extinguish) +: `Shallow dive` | `Opinion` | `Microsoft` `GitHub` `Linux` `FOSS` + #### *2023* &&gb 30 Aug   [ThinkPad X270 - my favorite machine](/blog/thinkpad-x270-my-favorite-machine) diff --git a/src/blog/index.md b/src/blog/index.md index fc3d256..ac411a0 100644 --- a/src/blog/index.md +++ b/src/blog/index.md @@ -4,6 +4,9 @@ Articles detailing personal experiences or exploration of certain topics.
+&&gb 20 Feb   [Microsoft and FOSS: a fire to be extinguished](/blog/microsoft-and-foss-extinguish) +: `Shallow dive` | `Opinion` | `Microsoft` `GitHub` `Linux` `FOSS` + #### *2023* &&gb 30 Aug   [ThinkPad X270 - my favorite machine](/blog/thinkpad-x270-my-favorite-machine) diff --git a/src/blog/microsoft-and-foss-extinguish/index.md b/src/blog/microsoft-and-foss-extinguish/index.md new file mode 100644 index 0000000..ebd3ab5 --- /dev/null +++ b/src/blog/microsoft-and-foss-extinguish/index.md @@ -0,0 +1,83 @@ +# Microsoft and FOSS: a fire to be extinguished + +## Contents + +1. [GitHub's embrace and extensions](#githubs-embrace-and-extensions) +2. [Blowtorch to the penguin](#blowtorch-to-the-penguin) +3. [But these are good things for the user](#but-these-are-good-things-for-the-user) + 1. [The practical answer](#the-practical-answer) + 2. [The moral answer](#the-moral-answer) + +A week ago [Microsoft announced they'll be adding "sudo" to Windows](https://devblogs.microsoft.com/commandline/introducing-sudo-for-windows/). +I'm not really knowledgeable enough to be certain what I'm saying is true, so I could be wrong, but upon hearing these news, my mind immediately jumped to the [EEE: Embrace, Extend, Extinguish](https://en.wikipedia.org/wiki/Embrace,_extend,_and_extinguish). + +As it is explained on Wikipedia, this is a very old and successful tactic, where Microsoft would enter new markets by: + +1. Embracing public standards and implementing all features the current product landscape offers, then +2. Extending their offering with proprietary features, which will be pushed to customers and finally +3. Extinguishing their competition, since the vast majority of consumers would be depending on the proprietary features of Microsoft's product + +## GitHub's embrace and extensions + +Thinking about the development of GitHub under Microsoft's rule, this pattern seems to show up. +Open-source by itself is primarily about publishing the source code of your project, but GitHub isn't just about that. +Now we have: + +- [GitHub Octoverse](https://octoverse.github.com/), yearly reports on open-source globally, but quite often through the lens of GitHub +- [GitHub Insider](https://resources.github.com/newsletter/), a monthly newsletter +- [GitHub Copilot](https://github.com/features/copilot/), an AI developer tool +- [GitHub Enterprise](https://github.com/enterprise), an AI developer platform +- [GitHub blog](https://github.blog/), mostly a set of tutorials and informational articles regarding GitHub + +and the list just goes on. + +GitHub isn't just a public place to view open-source software anymore, if you are a novice developer or you just don't care that much, it will be very easy to associate the FOSS community with the GitHub community. +Once you've started using all of those services and tools, there is no coming back, because other repository platforms focus only on repositories. + +I mean, [GitLab](https://gitlab.com/) doesn't offer a developer forum like [GitHub Discussions](https://docs.github.com/en/discussions/collaborating-with-your-community-using-discussions/about-discussions), you won't find a [sourcehut](https://sourcehut.org/)-branded FOSS newsletter, [SourceForge](https://sourceforge.net/) won't allow you to add [animations, graphics, games, etc. on your profile](https://github.com/abhisheknaiidu/awesome-github-profile-readme), there isn't a [codeberg](https://codeberg.org/) [command-line repository management app](https://cli.github.com/), so *obviously GitHub is where it's at for FOSS*. + +And you'll be introduced to GitHub before any of the others, thanks to the [GitHub Student Developer Pack](https://education.github.com/pack), where students can get free access to a variety of services, or to [GitHub classroom](https://docs.github.com/en/education/manage-coursework-with-github-classroom/get-started-with-github-classroom/about-github-classroom), where newer developers will probably publish their first pieces of code. + +Why learn to use the git terminal command when [GitHub Desktop](https://desktop.github.com/) abstract everything away in a beautiful clicky interface (as a "bonus", this will make you associate git with GitHub too), why follow [Hacker News](https://news.ycombinator.com/) or multiple different FOSS websites, when Microsoft provides. + +Why learn anything, when Microsoft's GitHub serves it to you on a silver platter? +Well, for an increasing number of developers, I fear, the answer is: "there is no point". + +## Blowtorch to the penguin + +Now let's talk about Microsoft's other plaything: Linux. +Here, I feel, the tactic is even more obvious: thanks to [WSL](https://en.wikipedia.org/wiki/Windows_Subsystem_for_Linux), Linux applications look and run like any other Windows app. +Thanks to [Windows Terminal](https://en.wikipedia.org/wiki/Windows_Terminal), Windows can't be seen as a lesser OS for developers, all benefits of having a proper, fully-fledged, UNIX-like command-line can now be found on Windows. + +I mean, they've added the sudo command for crying out loud, there is even an official [Windows package manager](https://en.wikipedia.org/wiki/Windows_Package_Manager)! + +For a novice or someone uninterested, you wouldn't ever have to learn how to use Linux. +You'll use Windows as you've known for your entire life, and if you need something even vaguely related to Linux, you'll just easily get it on another silver platter. +I'm certain over the coming decade, the true Linux desktop market share, as in machines running natively Linux, will shrink, but since WSL users will contribute to that number, we'll see the opposite. + + +## But these are good things for the user + +It could be argued that Microsoft is creating something good for the user, that GitHub's extensions will pull more people into FOSS, it will make developers stronger and more connected than ever. +You could argue that integrating Linux into Windows just gives you the best of both worlds, that for a user you don't have to chose anymore, but reap the benefits of both OSs. +Why should any of this be seen as a problem? + +### The practical answer + +The whole point of FOSS is to oppose business, to oppose the idea that everything is a product which must be sold, which must be unchangeable and fully under the control of the company who made it. +A product which can be changed and regulated to feed the bottomless greed of businessmen. +If everyone thinks Microsoft equals FOSS, then they can start changing that definition and people will follow. + +I can easily imagine a future where, all of a sudden, you can view GitHub repositories only if you have a GitHub account, when it will be on a subscription, when to access Microsoft's open-source projects you need to go through some enlisting process (similar to that for Unreal Engine), when Microsoft adds some sort of authentication mechanism, where you cannot run modified versions of certain FOSS projects (so even if you have the source code, and can modify and compile it, you cannot run the executable, forcing you to use the official version only). + +If everyone thinks Linux is found in Windows, then developers will focus on integrating it better with Windows, until most new Linux software is somehow available only through WSL, but doesn't work on distributions. +It's tempting to imagine Linux software or Linux projects turn into Windows software and Windows projects, when less and less people try to make something new, something good, something for everyone, and more and more create proprietary garbage. + +### The moral answer + +[We do things, not because they are easy, but because they are hard](https://en.wikipedia.org/wiki/We_choose_to_go_to_the_Moon). +Knowledge is the most important resource we have, everything humanity has achieved has been with the creation, expansion and distribution of knowledge. +Developers are the craftsmen of computer software and to create you need knowledge, the more you have the more you can do. + +Tools we make must be used to make our job easier, but we must be able, or at least understand, how to do the job without the tool. +Walking down this path, at a certain point, entire concepts can become forgotten to history, which makes developers worse at their craft, and software worse to use. -- cgit v1.3.1-23-gd82d From 8163faf791403f1502b35d318d03bdfacd222a1f Mon Sep 17 00:00:00 2001 From: Syndamia Date: Tue, 20 Feb 2024 17:30:42 +0200 Subject: [te/oop-2023] Added links --- src/teaching/oop-2023/index.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/teaching/oop-2023/index.md b/src/teaching/oop-2023/index.md index 3121a72..bbc7b8e 100644 --- a/src/teaching/oop-2023/index.md +++ b/src/teaching/oop-2023/index.md @@ -7,10 +7,10 @@ **Ден:** Четвъртък
**Директни връзки:** -[Контакт с мен](../upp-2023/week1/welcome.html?a#section-4) +[Контакт с мен](../upp-2023/week1/welcome.html?a#section-4) | + +[Материали от семинари](https://github.com/Aleksis99/Object-Oriented-Programming_FMI_2023-2024) | +[Курс в мудъл](https://learn.fmi.uni-sofia.bg/course/view.php?id=10041) |№|Дата|Материали| |-------|----|---------| -- cgit v1.3.1-23-gd82d From d35306e637181eb30098ade75a893f4934a4d990 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Wed, 21 Feb 2024 22:10:49 +0200 Subject: [te/oop-2023/w1] Added presentations and exercises --- src/teaching/oop-2023/index.md | 1 + src/teaching/oop-2023/week1/good-software.md | 519 +++++++++++++++++++++++++++ src/teaching/oop-2023/week1/index.md | 97 +++++ src/teaching/oop-2023/week1/organization.md | 61 ++++ 4 files changed, 678 insertions(+) create mode 100644 src/teaching/oop-2023/week1/good-software.md create mode 100644 src/teaching/oop-2023/week1/index.md create mode 100644 src/teaching/oop-2023/week1/organization.md (limited to 'src') diff --git a/src/teaching/oop-2023/index.md b/src/teaching/oop-2023/index.md index bbc7b8e..4c5e195 100644 --- a/src/teaching/oop-2023/index.md +++ b/src/teaching/oop-2023/index.md @@ -14,3 +14,4 @@ |№|Дата|Материали| |-------|----|---------| +|1 |22.02.2024|[Организационно](./week1/organization.html?a) \|\| [Основни добри софтуерни практики](./week1/good-software.html?a) \|\| [Задачи](./week1/) \|\| [GitHub classroom](https://classroom.github.com/a/UPJOzHty)| diff --git a/src/teaching/oop-2023/week1/good-software.md b/src/teaching/oop-2023/week1/good-software.md new file mode 100644 index 0000000..9e2e833 --- /dev/null +++ b/src/teaching/oop-2023/week1/good-software.md @@ -0,0 +1,519 @@ +# Основни добри софтуерни практики - ООП, Седмица 1, 22.02.2024 + +Миналия семестър не ни стигна времето да обсъдим домашното по-сериозно. +Главния проблем, който забелязах, беше колко грозно и нагласено бяха написани решенията. +Като въведение в ООП, ще поговорим по тази тема. + +&&presentation + +&&clide &¢ered &&font35 + +# Основни идеи
при добро писане на код + +&&/font &&/centered &&/clide + + + +&&slide &&font35 + +## Какво прави програмиста с чужд код? + +&&lineb4 + +1. Чете +2. Разучава как се ползва/какво прави +3. Използва го/Модифицира го + +Добър код прави тези задачи лесни! + +&&/font &&/slide + + + +&&slide &&font35 + +## Подобряване на четене + +&&lineb3 + +- Лично вярвам, че четимост е по-важна от конвенции +- Човек вижда най-лесно "контрастни" шаблони + + +``` + . . 0.00.0 010010 815213 + 000000 000000 738438 +. . .0000. 100001 122481 + .... 0....0 011110 511119 +``` + +&&/font &&/slide + + + +Както виждате, в примера има усмихнато личице, "закодирано" по различни начини. +С точка и шпации е най-ясно, като заменим шпациите с нули става по-неясно, като заменим точките с единици става още повече и като заменим нулите със случайни не-единични цифри, става пък съвсем невидимо. +Важното е шаблона да се намира в среда на други шаблони, иначе трудно се забелязва. + +При код, ще илюстрирам идеята си с един пример, но няма да задълбавам, следващата секция е много по-важна. +Пък и тази тема е малко религиозна и ще чувате различни мнения според човека който питате. + + + +&&clide + +Труден за четене код *(забелязвате ли грешките?)*: + +&&font22 + +``` +int a, b; +std::cout << "Enter coordinates" << std::endl; +std::cin >> a; +if (a == -1) return layerNavigation(board, rows, cols, layers); +if (a < 0 || a >= rows || b < 0 || a >= cols) return false; +for (int i = 0; i < layers; i++) { +if (board[a][b][i] == ' ') { + for (int j = 0; j < 8; j++){ + if (enptyRow[j] != ' ') { + emptyRow[j] = board[a][b][i]; + board[a][b][i] = ' '; + return true; + } + } + return false; +} +} +``` + +&&/font &&/clide + + + +Нарочно съм премахнал оцветяването, то драстично помага, но тук повече се интересуваме от "формата" на код. + +Вмъкнал съм три грешки: едно нещо липсва, има една печатна и една логическа грешка. +Разбира се, ако се зачетете дума по дума сигурно ще ги откриете, но сега да сравним. + + + +&&clide + +По-лесен за четене код *(а сега виждат ли се по-лесно?)*: + +&&font18 + +``` +std::cout << "Enter coordinates" << std::endl; +int a, b; + +std::cin >> a; +if (a == -1) { + return layerNavigation(board, rows, cols, layers); +} + +if (a < 0 || a >= rows || b < 0 || a >= cols) { + return false; +} + +for (int i = 0; i < layers; i++) +{ + if (board[a][b][i] == ' ') + { + for (int j = 0; j < 8; j++) + { + if (enptyRow[j] != ' ') { + emptyRow[j] = board[a][b][i]; + board[a][b][i] = ' '; + + return true; + } + } + return false; + } +} +``` + +&&/font &&/clide + + + +Би трябвало да е малко по-лесно, в последния `if` имаме "e**n**ptyRow", което е печатната грешка, `!=` което трябва да бъде `==` и липсва въвеждането на `b` след първия `if`. + +Примерът не е перфектен, но илюстрира какво се опитвам да кажа: формата на код е от огромно значение, обръщайте ѝ внимание. + + + +&&slide + +## Абстракцията - улеснява изучаване И употреба/модификация + +&&lineb1 + +- Разделяме обработване на стойностите от директната имплементацията +- Създаваме нови "машинни инструкции" + +&&lineb1 + +- `doX()` е по-лошо от `do(X)` + - можем да преизползваме `do()` за неща, различни от `X` + - един път разбрано, всяка употреба на `do()` също е разбрана; този стил кара `do()` да бъде по-обща функция, което я прави по-лесна за разбиране + - модификация на `do(X)` се свежда до заменяне на `do()` с `doOther()` или до заменяне на `X` с `Y`; променяме "инструкцията" или променяме данната + +&&/slide + + + +Нека сега разгледаме няколко примера, първият е много груб и елементарен, но служи за добро начало: + + + +&&clide + + +```cpp +Лошо - doX() │ Добро - do(X) + │ +int fib5() │ int fib(int n) +{ │ { + int prev = 0, curr = 1; │ int prev = 0, curr = 1; + for (int i = 1; i < 5; i++) │ for (int i = 1; i < n; i++) + { │ { + int tempPrev = prev; │ int tempPrev = prev; + prev = curr; │ prev = curr; + curr = curr + prev; │ curr = curr + prev; + } │ } + return curr; │ return curr; +} │ } +``` + +&&/clide + + + +Би трябвало да е супер очевидно, никой няма да пише отделна функция на Фибоначи за всяко число. + +Нека сега да разгледаме няколко "реални" примера, свързани с домашното (за припомняне, условието се намира [тук](https://learn.fmi.uni-sofia.bg/mod/assign/view.php?id=296069)). +Самите решения няма винаги да са добре форматирани, това е направено с цел да се поберат добре в слайда. + +Първия е върху функция, която приема координатите на плочка, премахва я от дъската (ако съществува) и я слага в края на празния ред. + + + +&&slide + +Лошо - `doX()` в тялото на функцията + +```cpp +void tryTakeTile(char** board, int rows, int cols, + char emptyRow[8]) { + int x, y; + std::cin >> x >> y; + if (x<0 || x>=rows || y<0 || y>=cols || board[x][y] == ' ') { + std::cout << "Invalid coordinates!" << std::endl; + } + else { + int emptyRowIndex = -1; + for (int i = 0; i < 8; i++) { + if (emptyRow[i] == ' ') { + emptyRowIndex = i; + break; + } + } + emptyRow[emptyRowIndex] = board[x][y]; + board[x][y] = ' '; + } +} +``` + +&&/slide + + + +Повечето предадени работи са имплементирали функционалността по точно този начин. +Замислете се обаче, какво става ако сменим типа данна, тоест ако дъската е триизмерна? +Тогава трябва да добавим още една `int` променлива, още едно условие в `if`, трябва да я добавим при трите индексирания на `board`. + +Какво става ако променим самата структура от данни за `emptyRow` (за сега сте учили само масиви, но скоро ще видите, че има и други начини да съхраняваш редица информация), тогава ще трябва да пренапишем целия цикъл. + +Тоест, ако променим нещо, трябва да пренапишем значителни части от самия код, и като разширим това върху 10-20 функции, изведнъж малка промяна става голяма. +Нека сега да пренапишем функцията, използвайки колкото се може повече абстракция. + + +&&clide + +Добро - `do(X)` + +```cpp +bool tryReadCoordinates(int& x, int& y) { + std::cin >> x >> y; + if (!availablePosition(board, rows, cols, x, y)) { + std::cout << "Invalid coordinates!" << std::endl; + return false; + } + return true; +} + +void tryTakeTile(char** board, int rows, int cols, + char emptyRow[8]) { + int x, y; + if (tryReadCoordinates(x, y)) { + appendToArray(emptyRow, 8, board[x][y]); + board[x][y] = ' '; + } +} +``` + +&&/clide + + + +Искаме трето измерение на `board`? +Няма проблем, написали сме нова `tryReadCoordinates`, която приема три променливи, и в `tryTakeTile` добавяме една декларация и обновяваме двете индексирания на `board`. +Ако `emptyRow` стане друг тип данна, просто променяме функцията да бъде `appendToOtherDataType` и сме готови. + +И ако тази промяна трябва да се направи в много функции, даже бихме могли да употребяваме функционалност на самия текстов редактор да търси и заменя срещания на един низ с друг. + +Нека сега да увеличим сложността още малко, да разгледаме функция за генерирането на дъската. +Отново, повечето предадени решения изглеждаха подобни на примера. + + + +&&slide + +Лошо - всички цикли са `doX()` + +```cpp +void generateLayer(char** layer, int rows, int cols, + char* tiles, int* tileCounts, int tilesSize) { + for (int i = 0; i < rows; i++) { + for (int j = 0; j < cols; j++) { + layer[i][j] = ' '; + } + } + for (int i = 0; i < tilesSize; i++) { + for (int j = 0; j < tileCounts[i]; j++) { + int x, y; + do { // randNum(x,y) връща случайно число∈[x,y] + x = randNum(0, rows - 1); + y = randNum(0, cols - 1); + } while(layer[x][y] != ' '); + layer[x][y] = tileCounts[i]; + } + } +} +``` + +&&/slide + + + +Стария проблем, някакви цикли, ако искаме да променям някоя данна или как нещо работи, трябва да пренапишем половината функция. + +Този сегмент е по-интересен за променяне от преди, понеже за да го направим хубаво трябва да променим самата ни логика. +Запълването със шпации е ясно, обаче случайното поставяне на плочки не е. + +Ако имаме функция `placeRandomЕлемент` която само поставя една плочка в слоя, пак ще имаме вложени цикли, трябва да има начин да останем с един цикъл. +Ако направим `placeRandomElementNTimes`, тогава пък абстрахираната функция става твърде специфична и вече имаме `doX()` при самата нея. + +Чрез функционално програмиране този проблем може да се разреши лесно, обаче вие ще го учите следващия семестър. +С достатъчно размишления, може да стигнем до следния вариант: вместо всяка плочка да я поставяме на случайна позиция, защо не поставим всички плочки една след друга и не разбъркаме слоя? + + + +&&clide + +Добро - `do(X)` + +```cpp +void generateLayer(char** layer, int rows, int cols, + char* tiles, int* tileCounts, int tilesSize) { + fillMatrix(layer, rows, cols, '\0'); + for (int i = 0; i < tilesSize; i++) { + // appendToMatrix(mat,rows,cols,fill,max): + // замества първите (най-много) max празни клетки с fill + // връща колко клетки наистина е заместило + appendToMatrix(layer, rows, cols, + tiles[i], tileCounts[i]); + } + shuffleMatrix(layer, rows, cols); +} +``` + +**Бонус:** работи по-коректно от преди + +&&/clide + + + +В предходния вариант, ако примерно цялата е пълна освен една клетка, и трябва да поставим една финална плочка, тогава трябва да чакаме докато случайните стойности се напаснат точно с координатите на тази една клетка. +Това може да се случи след половин секунда, но може да отнеме и един час докато се случи. +Даже, този проблем става все по-тегав с времето: с всяка запълнена клетка, шанса случайните стойности да ударят на заети координати се увеличава. + +Докато тук, нямаме този проблем, отнема някакво консистентно предопределено време да разбъркаме матрицата. +Как имплементираме `shuffleMatrix` си има и своите тънкости, но най-елементарния начин е просто да направим сортираш алгоритъм, при който вместо да сравним две стойности, използваме случайна стойност, която определя дали ще разменим плочките. + +Друго хубаво нещо на решения с абстракция, е един лек лавинен ефект, където веднъж като почнем да мислим за абстракции, намираме къде да ги ползваме навсякъде. +Да разгледаме същата функция, обаче при D подточка. + + + +&&clide + +Решения със слоеве правят същото. Лошо - `doX()` при циклите: + +```cpp +void generate(char*** board, int rows, int cols, int layers, + char* tiles, int* tileCounts, int tilesSize) { + ... + do { + x = randNum(0, rows - 1); y = randNum(0, cols - 1); + layer = randNum(0, layers - 1); + } while(layer[x][y][layer] != ' '); + ... +} +``` + +&&/clide + + + +Без абстракция отново ще пренапишем голяма част от `generate` функцията, за да се побере на слайда съм оставил само "най-сложната" промяна - случайните стойности. +Пак, имаше решения на подточката, без преизползване на `generate` за един слой. +Айде да разгледаме решението, заедно с абстрахираната `generate`. + + + +&&slide + +Добро - `do(X)` + +```cpp +void generateLayer(char** layer, int rows, int cols, + char* tiles, int* tileCounts, int tilesSize) { + fillMatrix(layer, rows, cols, '\0'); + for (int i = 0; i < tilesSize; i++) { + int actuallyAppended = + appendToMatrix(layer, rows, cols, + tiles[i], tileCounts[i]); + tileCounts[i] -= actuallyAppended; + } + shuffleMatrix(layer, rows, cols); +} +void generate(char*** board, int rows, int cols, int layers, + char* tiles, int* tileCounts, int tilesSize) { + for (int i = 0; i < layers; i++) { + generateLayer(board[i], rows, cols, + tiles, tileCounts, tilesSize); + } +} +``` + +&&/slide + + + +Супер елементарно, има-няма 5-6 реда код промяна, при генериране за всеки слой, просто извикваме функцията за генериране върху един слой, за всеки слой. +А в самата функция само премахваме броя вмъкнати плочки от сумата на даден тип. + +Наблюдателните са забелязали, че в "ръчното" решение слоевете са третия индекс, тоест имаме `board[x][y][layer]`, докато в това решение е първия, тоест `board[layer][x][y]`. +Разликата е значителна, но от гледна точка на код, особено когато използваме абстракция, промяната е лесна. + +Иначе, в момента се намираме в много добра позиция, без абстракция как правим рестартирането на играта? +По условие броя и типовете плочки трябва да се запазят, но позиции не. +Истината е, че става малко тромаво: цикълът за намираме на позиции се преизползва, и броя плочки трябва да се запази. + +Обаче, сега това става с едно `shuffleMatrix`, не е нужно нищо специално да правим! + + + +&&clide &&font35 + +### Абстракцията - подобрява и коментари + +- Целта на коментарите е да направи разбиране и модификация на код по-лесни. +- В повечето случаи, коментарът трябва да ни дава *нова* информация или да *свърже* парчета информация + +&&/font &&/clide + + + +Да разгледаме следния пример. + + + +&&clide + +Лошо: + +```cpp +// Fill matrix with '\0' +for (int i = 0; i < rows; i++) { + for (int j = 0; j < cols; j++) { + matrix[i][j] = '\0'; + } +} +``` + +Добро: + +```cpp +// Prepare matrix for functionX +// (for which empty cells are '\0') +for (int i = 0; i < rows; i++) { + for (int j = 0; j < cols; j++) { + matrix[i][j] = '\0'; + } +} +``` + + +&&/clide + + + +При добрия вариант, получаваме нова информация, че това запълване се случва понеже ще подаваме към някаква си `functionX`, и че евентуално може да има други функции, при които празни клетки може да не се обозначават с `'\0'`. +В лошия можем да стигнем до същото заключение като погледнем самия код. + + + +Умението да разрешиш един проблем *не те* прави добър програмист, да го разрешиш по четим, разширяем, лесен, ефикасен, ... начин *те* прави добър програмист. + + + +&&slide &&font35 + +## Изводи + +&&lineb4 + +- Форматирайте/подравнявайте си кода, искате лесно четене +- Вдигайте абстракция + - Обширни функции > код за конкретни стойности + - Преизползване на възможно най-много код + - Коментари които дават или разширяват знание + +&&/font &&/slide diff --git a/src/teaching/oop-2023/week1/index.md b/src/teaching/oop-2023/week1/index.md new file mode 100644 index 0000000..9b94e18 --- /dev/null +++ b/src/teaching/oop-2023/week1/index.md @@ -0,0 +1,97 @@ +# Задачи - ООП, Седмица 1, 22.02.2024 + +GitHub classroom: [classroom.github.com/a/UPJOzHty](https://classroom.github.com/a/UPJOzHty) + +## Задача 1 + +Имплементирайте чрез структура низ. +В структурата трябва да запазвате указател към низа и неговата дължина. + +Имплементирайте функция `concatString`, която приема две структури от този тип и връща низ, пак в същата структура, който е конкатенация (слепване) на първите два низа. + +&&question Има ли значение дали типовете на аргументите, или на върнатата стойност, са референции или указатели (или нито едното)? + +В самия код тествайте функциите (не е нужен потребителски вход). + +## Задача 2 + +Имплементирайте структура за динамично-заделен масив от целочислени числа. +Тя трябва да запазва указател към масива, размера на масива и бройката на елементи в масива. + +Заделянето на динамична памет е бавна операция, затова винаги ще заделяме повече клетки, отколкото са ни нужни. + +Имплементирайте функция `resize`, която удвоява размера на масива (нека първоначалния размер на масива е 2), на подадена стойност от тип вашата структура. + +Имплементирайте функция `addToEnd`, която приема (инстанция на) структурата ви и вмъква елемент в първата незаета позиция. + +В самия код тествайте функциите (не е нужен потребителски вход). + +## Задача 3 + +Разглеждате "пакети" (логове) информация от редица датчици. +Един пакет запазва времето, когато информацията е била отчетена от датчиците, и стойностите на всички датчици: температура, атмосферно налягане, влажност и надморска височина. +Всички типове данни са целочислени. + +От входа получавате N, броя пакети, които трябва да запазите, и след това 5N на брой целочислени стойности. +Накрая получавате буква: `t`, `p`, `h`, `e`, всяка съответства на някоя отделна стойност от датчиците. + +Трябва да изкарате на екрана всичките стойности от пакетите, подредени в нарастващ ред на времето, като всички след първата са разликите им спрямо първата. + +**Пример:** + +|Вход|Изход| +|----|-----| +|6
56 45 64 -8 98
14 40 -15 -18 -1
22 89 72 62 4
85 44 60 17 13
75 18 -12 48 21
27 10 94 -5 16
p|-15 87 109 79 3 75| + +## Задача 4 + +Направете структура за съхранение на полети[^sabre]. +Трябва да запазите имената на началния и крайния град като низове (допускаме, че няма шпации в имената на градовете), часът на излитане и на кацане в целочислен формат (като на циферблат на дигитален часовник, без разделителното двоеточие) и цената на полета в тип с плаваща запетая (в долари). + +### а) въвеждане + +От входа получавате N, това определя броя полети, които трябва да се добавят в системата. +Всеки полет е редица от 5 стойности, в реда в който са дефинирани. + +*Напомням, че това е нагласено да ползвате `std::cin` вместо ръчно да обработвате целия ред.* + +Изкарайте началните и крайните градове, както и цената на полетите, подредени в нарастващ ред на час на излитане. + +**Пример:** + +|Вход|Изход| +|----|-----| +|5
Berlin Paris 1105 1255 140
Sofia Paris 0915 1115 140
Paris NewYork 1225 1610 500
Sofia NewYork 0610 1345 800
Sofia Berlin 1020 1130 200|Sofia NewYork 800
Sofia Paris 140
Sofia Berlin 200
Berlin Paris 140
Paris NewYork 500| + +### б) търсене + +След като се въведат всички полети, получавате от входа два низа - имена на градове. +Трябва да изкарате най-евтиния, и след него най-бързия, вариант за пътуване от първия град към втория. + +Прикачване между полети е позволено, така че под "вариант" трябва да изкарате всичките полети, които са решение. +За един полет е нужно да изкарате само началния град, крайния град, час на излитане и цена, като градовете трябва да са подредени в нарастващ ред на часа на излитане. + +**Пример:** + +|Вход|Изход| +|----|-----| +|5
Berlin Paris 1105 1255 140
Sofia Paris 0915 1115 140
Paris NewYork 1225 1610 500
Sofia NewYork 0610 1245 800
Sofia Berlin 1020 1130 200
Sofia NewYork|Cheapest:
Sofia Paris 0915 140
Paris NewYork 1225 500
Quickest:
Sofia NewYork 0610 800| + + +## Задача 5 + +Имате система за потребители, всеки потребител си има име и приятели (един приятел е **указател към потребител**). + +В началото се въвежда N, това е броят потребители в системата. +За един потребител, първо се въвежда на нов ред името му, след това броя на неговите приятели и накрая, на отделни редове, имената на всички тези приятели. + +Накрая получавате едно име, това е началния потребител. +Трябва да намерите, започвайки от него, с колко други потребителя има някаква приятелска връзка (директна, приятел на приятел, приятел на приятел на приятел, ...). + +**Пример:** + +|Вход|Изход| +|----|-----| +|5
Георги
2
Асен Гьонов
Майстора
Асен Гьонов
2
Георги
др. Божидаров
Майстора
1
Георги
др. Божидаров
1
Асен Гьонов
Павел
0
Майстора|3| + +[^sabre]: Защото една от първите индустрии, които са се нуждаели от компютърни системи, била [авиационната индустрия](https://en.wikipedia.org/wiki/Sabre_%28travel_reservation_system%29#History). diff --git a/src/teaching/oop-2023/week1/organization.md b/src/teaching/oop-2023/week1/organization.md new file mode 100644 index 0000000..866b93a --- /dev/null +++ b/src/teaching/oop-2023/week1/organization.md @@ -0,0 +1,61 @@ +# Организация - ООП, Седмица 1, 22.02.2024 + +&&presentation + +&&clide &¢ered &&font35 + +# Добре дошли в ООП + +&&/font &&/centered &&/clide + + + +За разлика от Увод в програмиране, по ООП практикума е малко по-специален. + + + +&&clide &&font35 + +- ООП практикум е избираема, която няма смисъл да не запишете + - Само плюсове за вас +- Оценката е според контролни/изпити по ООП + +&&/font &&/clide + + + +Така ви помагаме с избираемите: по учебен план трябва да имате поне 2 практикума, сравнително безплатно получавате единия. +Относно оценяване: + + + +&&clide &&font35 + +- Освобождаване от изпит според работата ви по време на практикум +- Няма намаляване на оценка +- Оценявам общите ви умения
+ Важното е да умеете да сте програмисти: коректност, брой и трудност на решени задачи се зачитат по-малко отколкото успех да напишете прилично-изглеждаща програма (дори с малко мой тласък) + +&&/font &&/clide + + + +Все пак не може да ви даваме безплатни оценки, затова: + + + +&&clide &&font35 + +- Зачитат се **единствено нещата, качени в GitHub classroom, качени в срок** + - До **15** минути след края на часа +- Както преди, не е нужно да присъствате, за да качвате решения +- Ако случайно някой не знае как се ползва: + +&¢ered [syndamia.com/upp-2023/week1/setup.html?a](../upp-2023/week1/setup.html?a) &&/centered + +&&/font &&/clide + + + +Който по време на УП е използвал GitHub classroom не би трябвало да прави нещо, продължавате си по старо му, със същите акаунти. +Разбира се, за всякакви проблеми се [свържете с мен](../upp-2023/week1/welcome.html?a#section-4). -- cgit v1.3.1-23-gd82d From 795d04783d25c0ada4ca3a5a4b56dbc18ff34bd6 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Thu, 22 Feb 2024 09:02:25 +0200 Subject: [te/oop-2023/w1] Slight rewording on exercise 1 --- src/teaching/oop-2023/week1/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/teaching/oop-2023/week1/index.md b/src/teaching/oop-2023/week1/index.md index 9b94e18..008e8dd 100644 --- a/src/teaching/oop-2023/week1/index.md +++ b/src/teaching/oop-2023/week1/index.md @@ -4,7 +4,7 @@ GitHub classroom: [classroom.github.com/a/UPJOzHty](https://classroom.github.com ## Задача 1 -Имплементирайте чрез структура низ. +Имплементирайте низ чрез структура. В структурата трябва да запазвате указател към низа и неговата дължина. Имплементирайте функция `concatString`, която приема две структури от този тип и връща низ, пак в същата структура, който е конкатенация (слепване) на първите два низа. -- cgit v1.3.1-23-gd82d From 86a913d3e15803d7a8775d86601e19cf5f720b96 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Fri, 23 Feb 2024 21:30:56 +0200 Subject: (te/oop-2023/w1) Reworked presentations into MEL format, from Presentation.awk's ftags --- src/teaching/oop-2023/week1/good-software.md | 86 ++++++++++++++-------------- src/teaching/oop-2023/week1/organization.md | 20 +++---- 2 files changed, 53 insertions(+), 53 deletions(-) (limited to 'src') diff --git a/src/teaching/oop-2023/week1/good-software.md b/src/teaching/oop-2023/week1/good-software.md index 9e2e833..bd34bb2 100644 --- a/src/teaching/oop-2023/week1/good-software.md +++ b/src/teaching/oop-2023/week1/good-software.md @@ -4,21 +4,21 @@ Главния проблем, който забелязах, беше колко грозно и нагласено бяха написани решенията. Като въведение в ООП, ще поговорим по тази тема. -&&presentation +&.presentation -&&clide &¢ered &&font35 +&[title # Основни идеи
при добро писане на код -&&/font &&/centered &&/clide +&] -&&slide &&font35 +&[slide35 ## Какво прави програмиста с чужд код? -&&lineb4 +&.br4 1. Чете 2. Разучава как се ползва/какво прави @@ -26,15 +26,15 @@ Добър код прави тези задачи лесни! -&&/font &&/slide +&] -&&slide &&font35 +&[slide35 ## Подобряване на четене -&&lineb3 +&.br4 - Лично вярвам, че четимост е по-важна от конвенции - Човек вижда най-лесно "контрастни" шаблони @@ -47,7 +47,7 @@ .... 0....0 011110 511119 ``` -&&/font &&/slide +&] @@ -60,11 +60,11 @@ -&&clide +&[vcen Труден за четене код *(забелязвате ли грешките?)*: -&&font22 +&(font22 ``` int a, b; @@ -86,7 +86,7 @@ if (board[a][b][i] == ' ') { } ``` -&&/font &&/clide +&) &] @@ -97,11 +97,11 @@ if (board[a][b][i] == ' ') { -&&clide +&[vcen По-лесен за четене код *(а сега виждат ли се по-лесно?)*: -&&font18 +&(font18 ``` std::cout << "Enter coordinates" << std::endl; @@ -134,7 +134,7 @@ for (int i = 0; i < layers; i++) } ``` -&&/font &&/clide +&) &] @@ -144,23 +144,23 @@ for (int i = 0; i < layers; i++) -&&slide +&[slide ## Абстракцията - улеснява изучаване И употреба/модификация -&&lineb1 +&.br1 - Разделяме обработване на стойностите от директната имплементацията - Създаваме нови "машинни инструкции" -&&lineb1 +&.br1 - `doX()` е по-лошо от `do(X)` - можем да преизползваме `do()` за неща, различни от `X` - един път разбрано, всяка употреба на `do()` също е разбрана; този стил кара `do()` да бъде по-обща функция, което я прави по-лесна за разбиране - модификация на `do(X)` се свежда до заменяне на `do()` с `doOther()` или до заменяне на `X` с `Y`; променяме "инструкцията" или променяме данната -&&/slide +&] @@ -168,7 +168,7 @@ for (int i = 0; i < layers; i++) -&&clide +&[vcen ```cpp @@ -187,7 +187,7 @@ int fib5() │ int fib(int n) } │ } ``` -&&/clide +&] @@ -200,7 +200,7 @@ int fib5() │ int fib(int n) -&&slide +&[slide Лошо - `doX()` в тялото на функцията @@ -226,7 +226,7 @@ void tryTakeTile(char** board, int rows, int cols, } ``` -&&/slide +&] @@ -240,7 +240,7 @@ void tryTakeTile(char** board, int rows, int cols, Нека сега да пренапишем функцията, използвайки колкото се може повече абстракция. -&&clide +&[vcen Добро - `do(X)` @@ -264,7 +264,7 @@ void tryTakeTile(char** board, int rows, int cols, } ``` -&&/clide +&] @@ -279,7 +279,7 @@ void tryTakeTile(char** board, int rows, int cols, -&&slide +&[slide Лошо - всички цикли са `doX()` @@ -304,7 +304,7 @@ void generateLayer(char** layer, int rows, int cols, } ``` -&&/slide +&] @@ -321,7 +321,7 @@ void generateLayer(char** layer, int rows, int cols, -&&clide +&[vcen Добро - `do(X)` @@ -342,7 +342,7 @@ void generateLayer(char** layer, int rows, int cols, **Бонус:** работи по-коректно от преди -&&/clide +&] @@ -358,7 +358,7 @@ void generateLayer(char** layer, int rows, int cols, -&&clide +&[vcen Решения със слоеве правят същото. Лошо - `doX()` при циклите: @@ -374,7 +374,7 @@ void generate(char*** board, int rows, int cols, int layers, } ``` -&&/clide +&] @@ -384,7 +384,7 @@ void generate(char*** board, int rows, int cols, int layers, -&&slide +&[slide Добро - `do(X)` @@ -409,7 +409,7 @@ void generate(char*** board, int rows, int cols, int layers, } ``` -&&/slide +&] @@ -427,14 +427,14 @@ void generate(char*** board, int rows, int cols, int layers, -&&clide &&font35 +&[vcen35 ### Абстракцията - подобрява и коментари - Целта на коментарите е да направи разбиране и модификация на код по-лесни. - В повечето случаи, коментарът трябва да ни дава *нова* информация или да *свърже* парчета информация -&&/font &&/clide +&] @@ -442,7 +442,7 @@ void generate(char*** board, int rows, int cols, int layers, -&&clide +&[vcen Лошо: @@ -468,7 +468,7 @@ for (int i = 0; i < rows; i++) { ``` -&&/clide +&] @@ -482,17 +482,17 @@ for (int i = 0; i < rows; i++) { -&&clide +&[vcen > 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, [Notes on Structured Programming, On our inability to do much](https://www.cs.utexas.edu/users/EWD/ewd02xx/EWD249.PDF) -&&lineb1 +&.br1 Решение на цялото домашно, с описаните методи TODO -&&/clide +&] @@ -504,11 +504,11 @@ for (int i = 0; i < rows; i++) { -&&slide &&font35 +&[slide35 ## Изводи -&&lineb4 +&.br4 - Форматирайте/подравнявайте си кода, искате лесно четене - Вдигайте абстракция @@ -516,4 +516,4 @@ for (int i = 0; i < rows; i++) { - Преизползване на възможно най-много код - Коментари които дават или разширяват знание -&&/font &&/slide +&] diff --git a/src/teaching/oop-2023/week1/organization.md b/src/teaching/oop-2023/week1/organization.md index 866b93a..dfdeafa 100644 --- a/src/teaching/oop-2023/week1/organization.md +++ b/src/teaching/oop-2023/week1/organization.md @@ -1,12 +1,12 @@ # Организация - ООП, Седмица 1, 22.02.2024 -&&presentation +&.presentation -&&clide &¢ered &&font35 +&[title35 # Добре дошли в ООП -&&/font &&/centered &&/clide +&] @@ -14,13 +14,13 @@ -&&clide &&font35 +&[vcen35 - ООП практикум е избираема, която няма смисъл да не запишете - Само плюсове за вас - Оценката е според контролни/изпити по ООП -&&/font &&/clide +&] @@ -29,14 +29,14 @@ -&&clide &&font35 +&[vcen35 - Освобождаване от изпит според работата ви по време на практикум - Няма намаляване на оценка - Оценявам общите ви умения
Важното е да умеете да сте програмисти: коректност, брой и трудност на решени задачи се зачитат по-малко отколкото успех да напишете прилично-изглеждаща програма (дори с малко мой тласък) -&&/font &&/clide +&] @@ -44,16 +44,16 @@ -&&clide &&font35 +&[vcen35 - Зачитат се **единствено нещата, качени в GitHub classroom, качени в срок** - До **15** минути след края на часа - Както преди, не е нужно да присъствате, за да качвате решения - Ако случайно някой не знае как се ползва: -&¢ered [syndamia.com/upp-2023/week1/setup.html?a](../upp-2023/week1/setup.html?a) &&/centered +&(centered [syndamia.com/upp-2023/week1/setup.html?a](../upp-2023/week1/setup.html?a) &) -&&/font &&/clide +&] -- cgit v1.3.1-23-gd82d From 535bf9a4649e0e73450b1c7bed7460a9c3225706 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Mon, 26 Feb 2024 09:10:47 +0200 Subject: (te/oop-2023/w1) Updated presentations with new MEL-Presentation tag names --- src/teaching/oop-2023/week1/good-software.md | 18 +++++++++--------- src/teaching/oop-2023/week1/organization.md | 6 +++--- 2 files changed, 12 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/teaching/oop-2023/week1/good-software.md b/src/teaching/oop-2023/week1/good-software.md index bd34bb2..79a51b0 100644 --- a/src/teaching/oop-2023/week1/good-software.md +++ b/src/teaching/oop-2023/week1/good-software.md @@ -60,7 +60,7 @@ -&[vcen +&[middle Труден за четене код *(забелязвате ли грешките?)*: @@ -97,7 +97,7 @@ if (board[a][b][i] == ' ') { -&[vcen +&[middle По-лесен за четене код *(а сега виждат ли се по-лесно?)*: @@ -168,7 +168,7 @@ for (int i = 0; i < layers; i++) -&[vcen +&[middle ```cpp @@ -240,7 +240,7 @@ void tryTakeTile(char** board, int rows, int cols, Нека сега да пренапишем функцията, използвайки колкото се може повече абстракция. -&[vcen +&[middle Добро - `do(X)` @@ -321,7 +321,7 @@ void generateLayer(char** layer, int rows, int cols, -&[vcen +&[middle Добро - `do(X)` @@ -358,7 +358,7 @@ void generateLayer(char** layer, int rows, int cols, -&[vcen +&[middle Решения със слоеве правят същото. Лошо - `doX()` при циклите: @@ -427,7 +427,7 @@ void generate(char*** board, int rows, int cols, int layers, -&[vcen35 +&[middle35 ### Абстракцията - подобрява и коментари @@ -442,7 +442,7 @@ void generate(char*** board, int rows, int cols, int layers, -&[vcen +&[middle Лошо: @@ -482,7 +482,7 @@ for (int i = 0; i < rows; i++) { -&[vcen +&[middle > 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! diff --git a/src/teaching/oop-2023/week1/organization.md b/src/teaching/oop-2023/week1/organization.md index dfdeafa..92fdcc8 100644 --- a/src/teaching/oop-2023/week1/organization.md +++ b/src/teaching/oop-2023/week1/organization.md @@ -14,7 +14,7 @@ -&[vcen35 +&[middle35 - ООП практикум е избираема, която няма смисъл да не запишете - Само плюсове за вас @@ -29,7 +29,7 @@ -&[vcen35 +&[middle35 - Освобождаване от изпит според работата ви по време на практикум - Няма намаляване на оценка @@ -44,7 +44,7 @@ -&[vcen35 +&[middle35 - Зачитат се **единствено нещата, качени в GitHub classroom, качени в срок** - До **15** минути след края на часа -- cgit v1.3.1-23-gd82d From a513840e51fb80f2363c4b298d7a855dccd0864a Mon Sep 17 00:00:00 2001 From: Syndamia Date: Mon, 26 Feb 2024 09:25:08 +0200 Subject: (te/upp-2023) Converted everything to MEL format And made adjustments where couldn't --- src/teaching/upp-2023/additional1/index.md | 28 ++--- src/teaching/upp-2023/additional2/index.md | 16 +-- src/teaching/upp-2023/index.md | 2 +- src/teaching/upp-2023/week1/setup.md | 175 ++++++++++++++-------------- src/teaching/upp-2023/week1/welcome.md | 180 ++++++++++++++--------------- src/teaching/upp-2023/week10/index.md | 2 +- src/teaching/upp-2023/week11/index.md | 4 +- src/teaching/upp-2023/week12/index.md | 6 +- src/teaching/upp-2023/week13/index.md | 4 +- src/teaching/upp-2023/week2/revision.md | 74 ++++++------ src/teaching/upp-2023/week3/revision.md | 78 ++++++------- src/teaching/upp-2023/week4/revision.md | 30 ++--- src/teaching/upp-2023/week6/index.md | 2 +- src/teaching/upp-2023/week7/index.md | 6 +- src/teaching/upp-2023/week8/index.md | 4 +- src/teaching/upp-2023/week9/index.md | 4 +- 16 files changed, 306 insertions(+), 309 deletions(-) (limited to 'src') diff --git a/src/teaching/upp-2023/additional1/index.md b/src/teaching/upp-2023/additional1/index.md index cf1dfce..f366858 100644 --- a/src/teaching/upp-2023/additional1/index.md +++ b/src/teaching/upp-2023/additional1/index.md @@ -2,13 +2,13 @@ GitHub classroom: [classroom.github.com/a/nlFuKALw](https://classroom.github.com/a/nlFuKALw) -При изображението &&question трябва да спрете, да помислите и да си отговорите на дадения въпрос. +При изображението ![](/img/dialog-question.png) трябва да спрете, да помислите и да си отговорите на дадения въпрос. Почти винаги ако не може да отговорите, ще имате проблеми в бъдеще с решаването. Понякога ще ви спираме и ще ви питаме за тези въпроси. ## Задача - База гаднни -&&warn **Нямате** право да използвате каквито и да е функции, които вие не сте написали, както и неизучаван материал като двуизмерни масиви или динамична памет. +&:warn **Нямате** право да използвате каквито и да е функции, които вие не сте написали, както и неизучаван материал като двуизмерни масиви или динамична памет. **Не** употребявайте търсачки, ако ви трябва информация за нещо, ще може да си я изкарате с една проста тестова програма или калкулатор.
@@ -18,7 +18,7 @@ GitHub classroom: [classroom.github.com/a/nlFuKALw](https://classroom.github.com Таблица А има максимум 8 реда, като всеки ред е едно цяло число с 9 цифри. Таблица Б има максимум 8 реда, като всеки ред е число между 1 и 4294967295. -&&question В какъв тип ще запазим всяка таблица? +&:question В какъв тип ще запазим всяка таблица? В задачата винаги номерираме редовете (числата) на всяка таблица, започвайки от индекс 1. Чрез различни комбинации на ред в таблица А и ред в таблица Б получаваме различни стойности. @@ -39,11 +39,11 @@ GitHub classroom: [classroom.github.com/a/nlFuKALw](https://classroom.github.com Стойностите от таблица А са винаги ограничени отгоре с най-големия брой битове, които комфортно може да поберем в 7 цифри. Тоест 9999999 не е валидна стойност от таблица А, докато 8388608 e. -&&question Колко най-много *битове* можем със сигурност да поберем в 7 цифри? +&:question Колко най-много *битове* можем със сигурност да поберем в 7 цифри? Понеже редовете са от 1 до 9, ако в таблица А имаме ред 0 правим нещо специално, но това ще видите в бъдеще. -&&question Разбрахте ли как таблиците "изглеждат"? +&:question Разбрахте ли как таблиците "изглеждат"? ### a) разделяне на реда от таблица А @@ -52,7 +52,7 @@ GitHub classroom: [classroom.github.com/a/nlFuKALw](https://classroom.github.com `getRow` - приема ред от таблица А и указатели към променливи за ред, тип и стойност; не връща нищо В подадените указатели пази съответните стойности от реда -&&question Защо приемаме указатели към променливи? Каква е "сигнатурата" на функцията? +&:question Защо приемаме указатели към променливи? Каква е "сигнатурата" на функцията?
**Примери:** @@ -68,7 +68,7 @@ GitHub classroom: [classroom.github.com/a/nlFuKALw](https://classroom.github.com Ако типа е цифрата "0", тогава стойността в базата данни е някакво число с плаваща запетая. Самото число е разделено на две части: цифрите преди запетаята се намират в стойността от таблица А, докато цифрите след запетаята са в реда от таблица Б. -&&question В какъв тип данни трябва да запазим числото? Как ще "слепим" двете му части. +&:question В какъв тип данни трябва да запазим числото? Как ще "слепим" двете му части. Имплементирайте функция: @@ -107,14 +107,14 @@ GitHub classroom: [classroom.github.com/a/nlFuKALw](https://classroom.github.com Тоест ако в нашия тип данни запазваме само 10 бита, тогава числото "2" ще бъде `0000000010` и имаме низа "AC". Игнорирайте старшите битове, които остават като "остатък" (по-малко от 5 бита ширина). -&&question Колко бита наистина запазваме в нашия тип данни? Колко бита ще трябва да игнорираме? Колко най-много букви може да поберем? +&:question Колко бита наистина запазваме в нашия тип данни? Колко бита ще трябва да игнорираме? Колко най-много букви може да поберем? Имплементирайте функция: `decodeNumberText` - приема ред от таблица Б и указател към "низ"; не връща нищо Записва декодиран текстът от реда в указателя -&&question Нарочно има кавички около думата "низ", какъв трябва наистина да е типа на указателя? +&:question Нарочно има кавички около думата "низ", какъв трябва наистина да е типа на указателя?
**Примери:** @@ -135,7 +135,7 @@ GitHub classroom: [classroom.github.com/a/nlFuKALw](https://classroom.github.com Как декодираме? Отместваме буквите назад, тоест ако имаме текста "KHOOR" и ви кажа, че съм го кодирал като съм отместил всяка буква напред с 3 позиции, тогава при декодиране от K става на H, от H става на E, от О става на L и от R става на O. -&&question Какво става със знака "!"? Има ли лесен (математически) начин да дешифрираме всяка буква? +&:question Какво става със знака "!"? Има ли лесен (математически) начин да дешифрираме всяка буква? Текстът, преди да е въведен в нашата база данни, ще бъде кодиран с шифъра на Цезар, като броя позиции с които сме отместили буквите се намира в стойността в таблица А. @@ -162,7 +162,7 @@ GitHub classroom: [classroom.github.com/a/nlFuKALw](https://classroom.github.com Ако типа е "2", тогава в реда от Б сме вложили масив от стойности (числа). Всеки 4 бита определят една стойност, като първия елемент е старшите (най-левите) битове, докато последния е младшите (най-десните) битове. -&&question Коколо на брой елемента пазим в реда от Б? +&:question Коколо на брой елемента пазим в реда от Б? Имплементирайте функцията: @@ -207,7 +207,7 @@ GitHub classroom: [classroom.github.com/a/nlFuKALw](https://classroom.github.com Ако редът в таблица А е 0, тогава цялата стойност в базата данни е побрана в стойността на таблица А. Очевидно само в стойност на таблица А имаме по-малко битове, отколкото в стойност на таблица А плюс ред в таблица Б, затова се налага по някакъв начин да "компресираме" информацията, така че да се побере. -&&question Колко бита побираме в стойност на таблица А? Колко бита ни трябват общо, за да обработим една стойност в базата данни? +&:question Колко бита побираме в стойност на таблица А? Колко бита ни трябват общо, за да обработим една стойност в базата данни? Ще го направим така: в стойността от таблица А ще пазим индекси, и всеки индекс ще съответства на някакво по-голямо число, което се съдържа в друг масив, който ще наричаме криптографски ред. @@ -225,7 +225,7 @@ GitHub classroom: [classroom.github.com/a/nlFuKALw](https://classroom.github.com Първите (най-левите) три бита от стойността в таблица А не са индекси, а трябва да се копират дословно. След тях има 4 индекса, всеки с по 5 бита. -&&question Как е разделена побитово една стойност от таблица А? Кои индекси за кои стойности ще се ползват? Достатъчно ли е всеки индекс към криптографския ред да бъде само 5 бита (тоест може ли да има повече от 2⁵ числа в реда)? Защо имаме само 4 индекса? +&:question Как е разделена побитово една стойност от таблица А? Кои индекси за кои стойности ще се ползват? Достатъчно ли е всеки индекс към криптографския ред да бъде само 5 бита (тоест може ли да има повече от 2⁵ числа в реда)? Защо имаме само 4 индекса? Напишете функция: @@ -266,4 +266,4 @@ GitHub classroom: [classroom.github.com/a/nlFuKALw](https://classroom.github.com Пробвате се да я запазите, използвайки и двете таблици, но ако Б вече е запълнена, добавяте я като компресирана стойност в таблица А. Ако и А е запълнена, изкарвате съобщение за запълнена база данни и не запазвате стойността. -&&question Какво трябва да направите, ако получите компресирана стойност за таблица А? +&:question Какво трябва да направите, ако получите компресирана стойност за таблица А? diff --git a/src/teaching/upp-2023/additional2/index.md b/src/teaching/upp-2023/additional2/index.md index 75530f8..d4e07b4 100644 --- a/src/teaching/upp-2023/additional2/index.md +++ b/src/teaching/upp-2023/additional2/index.md @@ -2,7 +2,7 @@ GitHub classroom: [classroom.github.com/a/CrerXpf6](https://classroom.github.com/a/CrerXpf6) -&&important Следете внимателно дали триете всичката си динамична памет коректно на всяка подточка! +&:important Следете внимателно дали триете всичката си динамична памет коректно на всяка подточка! Случвало се е на контролни да се пишат двойки ако всичко друго е коректно, но има неизтрита памет! ## Задача - текстов редактор @@ -18,7 +18,7 @@ GitHub classroom: [classroom.github.com/a/CrerXpf6](https://classroom.github.com Като за начало, нека да имплементираме запазването на текст. От конзолата ще получавате редове текст, всеки ред ще е с максимална дължина от 1024 знака, след това трябва да го запазите. -&&important Може да използвате масив със статична дължина за буфер, обаче трябва да използвате възможно най-малко памет за "перманентното" запазване на реда текст във вашата програма. +&:important Може да използвате масив със статична дължина за буфер, обаче трябва да използвате възможно най-малко памет за "перманентното" запазване на реда текст във вашата програма. Използвайте многомерен масив за запазване на редовете, вместо всичко да се запазва в един голям низ. Това е нужно за бъдещи подточки. @@ -58,10 +58,10 @@ est. It was a high bank, and he paused to breathe at the top. Ако низът е команда, тогава връща масив от низове, първия от които съдържа буквата, определяща командата, докато останалите низове са параметрите. Ако низът не е команда, тогава връща празен масив. -&&warn Какво означава празен масив зависи от имплементацията ви. +&:warn Какво означава празен масив зависи от имплементацията ви. За предпочитане е да не заделяте памет, когато не е нужно. -&&question Как ще върнем масив? Нужно ли е да връщаме бройката елементи? +&:question Как ще върнем масив? Нужно ли е да връщаме бройката елементи? *Само за тестване*, след всеки въведен ред, ако е команда, изкарайте извлечените стойности от `extractCommand`, със запетайки след всяка. Като при [подточка a)](#section), ако редът започва с `Q`, спирате приемане на вход и изкарвате запазения текст. @@ -195,9 +195,9 @@ the man turned aside from the main Yukon trail. He climbed the high Имплементирайте функцията `deleteRow`, която получава целия текст, въведен до сега, и номер на реда (редовете се индексират от 1 до N). Тя променя текста, като премахва реда на дадения номер. -&&important Не забравяйте да промените размера на масива с низове! Не е решение просто да промените указателя към дадения ред на `nullptr`, не искаме да използваме излишна памет. +&:important Не забравяйте да промените размера на масива с низове! Не е решение просто да промените указателя към дадения ред на `nullptr`, не искаме да използваме излишна памет. -&&question Какъв ще бъде типа на аргумента, който приема целия текст? +&:question Какъв ще бъде типа на аргумента, който приема целия текст? Добавете командата `D`, която приема един параметър - цяло положително число, и го прилага върху функцията `deleteRow`. Ако номера на реда е невалиден, трябва да изкарате съобщение "; Invalid row number". @@ -297,7 +297,7 @@ He excused Ред N+1 се изтрива. Ако N е 0 или номера на последния ред, не прави нищо. -&&important Не забравяйте да промените размера на масива с низове! Не е решение просто да промените указателя към дадения ред на `nullptr`, не искаме да използваме излишна памет. +&:important Не забравяйте да промените размера на масива с низове! Не е решение просто да промените указателя към дадения ред на `nullptr`, не искаме да използваме излишна памет. Добавете команда `J`, която приема номер на ред - положително число. Следващия ред ще се вмъкне в края на сегашния, с една шпация между тях, използвайки функцията `joinRows`. @@ -372,7 +372,7 @@ est. It was a high bank, and he paused to breathe at the top. Имплементирайте функция `substituteWord`, която приема целия текст и две думи (низове без шпации). В текстът, всяко срещане на първата дума е заменено с втората дума. -&&question Какво ще стане с размера на един ред, ако някоя дума/някои думи трябва да се заменят? +&:question Какво ще стане с размера на един ред, ако някоя дума/някои думи трябва да се заменят? Добавете команда `s`, която приема две думи - низове без шпации. Използвайки функцията `substituteWord` замества всяко срещане на първата дума с втората. diff --git a/src/teaching/upp-2023/index.md b/src/teaching/upp-2023/index.md index 19199ec..624a312 100644 --- a/src/teaching/upp-2023/index.md +++ b/src/teaching/upp-2023/index.md @@ -2,7 +2,7 @@ Материали на проведените през 2023/2024 практикуми по Увод в програмирането на Компютърни науки (2 поток), 8 група. -&&warn От сега нататък ще може да продължите да предавате решения след крайния срок в classroom. +&:warn От сега нататък ще може да продължите да предавате решения след крайния срок в classroom. Не мога да гарантирам кога ще погледна предадени решения след срока, но ще ги погледна! **Зала:** ФМИ 309 || diff --git a/src/teaching/upp-2023/week1/setup.md b/src/teaching/upp-2023/week1/setup.md index 73507a7..9327b2b 100644 --- a/src/teaching/upp-2023/week1/setup.md +++ b/src/teaching/upp-2023/week1/setup.md @@ -1,15 +1,16 @@ # Конфигуриране на GitHub classroom и Visual Studio - УПП, Седмица 1, 06.10.2023 -&&presentation -&&clide &¢ered +&.presentation + +&[title # Конфигуриране на GitHub classroom и Visual Studiо -&&/centered &&/clide +&] -&&slide +&[slide ## Теория относно GitHub classroom @@ -26,15 +27,15 @@ - Обединението на труда на всички, особено в огромни екипи, става супер трудно -&&/slide +&] -&&slide +&[slide ### Git -&&lineb1 +&.br1 git е програма (система) за [контрол на версиите](https://en.wikipedia.org/wiki/Distributed_version_control). В един проект, git пази **списък от всички commit-и**. @@ -47,15 +48,15 @@ git е програма (система) за [контрол на версии Така, когато смесваме кода от многото разработчици, ще можем да засечем **какви точно са различията** между работата на двама човека. Често промените не си "противоречат" и могат да бъдат смесени директно, понякога се налага ръчно да решим какво точно да се случи с тези парчета код. -&&/slide +&] -&&slide +&[slide ### GitHub -&&lineb5 +&.br5 Всички repository-та трябва да се пазят някъде и да може лесно да се споделят и гледат. Има много сайтове за тази цел, най-популярния се нарича [GitHub](https://github.com). @@ -63,11 +64,11 @@ git е програма (система) за [контрол на версии Напомням, че git и GitHub са напълно отделни неща, направени от различни хора с различни функционалности. Свързаността с имената е както свързаността между думите "чар" и "чаршаф". -&&/slide +&] -&&slide +&[slide ## Сега всички трябва да си направят GitHub акаунти @@ -75,24 +76,24 @@ git е програма (система) за [контрол на версии ![](./img/github-signup.gif) -&&/slide +&] -&&clide +&[middle След това, като влезете в акаунтите си (което става автоматично след регистрация), на заглавната страница ще имате нещо такова: -&&width75 ![](./img/github-index.gif) &&/width +&(width75% ![](./img/github-index.gif) &) В горния десен ъгъл, където е иконката с квадрати на бял фон, след натискане получавате sidebar. От него, може да достъпите профила си, repository-та които имате, и так. нат. -&&/clide +&] -&&slide +&[slide ### Проверете дали сте маркирани! @@ -105,15 +106,15 @@ git е програма (система) за [контрол на версии ![](./img/github-support-flagged.gif) -&&/slide +&] -&&slide +&[slide ## GitHub classroom -&&lineb3 +&.br3 За всеки практикум ще ви направя линк, чрез който след малко кликане ще се създаде ново лично repository за всеки от вас. @@ -124,38 +125,37 @@ GitHub предоставя лесни начини да правите пром Те ще се намират в таба "Pull Requests" на конкретното repository. Четете ги, отговаряйте, целта е да дискутираме какво сте направили. -&&/slide +&] -&&slide +&[slide ### Как ползваме GitHub classroom За всяко упражнение ще има отделен линк. Този за днеска е: [classroom.github.com/a/W7hZDMgC](https://classroom.github.com/a/W7hZDMgC) -&&lineb1 +&.br1 -&&table +&{row След като го отворите, ще видите съобщение за разрешение, авторизирайте го. ![](./img/github-classroom-authorize.gif) -&&/table - -&&/slide +&} +&] -&&clide +&[middle -&&table +&{row -&&width60 ![](./img/join-the-classroom.gif) &&/width +&(width60% ![](./img/join-the-classroom.gif) &) -&&cont +&{column При първо влизане ще получите страница с имената и факултетните имена на всички студенти от групата. @@ -163,30 +163,29 @@ GitHub предоставя лесни начини да правите пром Това се прави само веднъж, и след това никога пак. -&&/cont - -&&/table +&} -&&/clide +&} +&] -&&slide +&[slide След това, би трябвало да видите страницата за "Приемане на заданието". -&&width40 ![](./img/accept-assignment.gif) &&/width +&(width40% ![](./img/accept-assignment.gif) &) След като го приемете, на новата страница, изчакайте няколко секунди и презаредете. Трябва да видите това: -&&width40 ![](./img/ready-to-go.gif) &&/width +&(width40% ![](./img/ready-to-go.gif) &) -&&/slide +&] -&&clide +&[middle Сега сте готови, кликнете върху синия линк и ще стигнете във вашето GitHub repository. @@ -197,28 +196,28 @@ GitHub предоставя лесни начини да правите пром В края на презентация показвам как точно е най-лесно да качите работата си. -&&/clide +&] -&&slide +&[slide В таба "Pull requests", още от началото, ще имате едно "Feedback". В него ще ви връщам отзиви относно работата ви, и вие също можете да пишете неща и да ми отговаряте. Целта е да видя какво правите и да ви помогна, моля проверявайте какво съм ви писал, по подразбиране би трябвало да получавате известия на имейл-а. -&¢ered &&width80 ![](./img/feedback.gif) &&/width &&/centered +&(centered &(width80% ![](./img/feedback.gif) &) &) -&&/slide +&] -&&slide +&[slide ## Къде пишем код? -&&lineb2 +&.br2 **Кодът е чисто и просто текст**, компилаторът е специалната програма, която превръща този текст в нещо, което може компютъра да изпълни. @@ -228,11 +227,11 @@ GitHub предоставя лесни начини да правите пром За някои и това не е било достатъчно удобно, затова са създадени **Integrated Development Environment** (IDE), програми които съдържат в себе си всичко нужно за разработка на код. Тоест, те са текстови редактори, но "вградено" могат да компилират код, да менижират сегашното repository, ... -&&/slide +&] -&&clide +&[middle Главно очакваме да пишете на IDE-то наречено Visual Studio. Разработено е от Microsoft и е едно от най-използваните и развитите IDE-та на пазара. @@ -246,15 +245,15 @@ GitHub предоставя лесни начини да правите пром Извън това, по лично желание, с мен може да говорите за vim, а за neovim може би ще мога да ви насоча към някой с опит. -&&/clide +&] -&&slide +&[slide ### Инсталация -&&lineb1 +&.br1 Намираме се в компютърна зала, така че всички предоставени компютри би трябвало вече да са налични на предоставените компютри. За ваши лични машини, ще минем набързо през информацията тук. @@ -265,79 +264,79 @@ GitHub предоставя лесни начини да правите пром - Ако искате да ползвате по-стара ОС, като Windows 8.1 или Windows 7 ще трябва да използвате "Community 2019"[^vs-2022-old-win], разликата между версиите не е съществена, затова не се притеснявайте. -&&/slide +&] -&&slide +&[slide След като изтеглите инсталатора за Visual Studio и след като изчакате да заредят работи, би трябвало да имате прозорец на име "Installing - Visual Studio Community 2022". Единствено избирате "Desktop development with C++" в таба Worloads, и натискате "Install". Би трябвало да заема към 11 GB памет и в моето тестване се инсталира за 10тина минути. -&¢ered &&width80 ![](./img/vs-install.gif) &&/width &&/centered +&(centered &(width80% ![](./img/vs-install.gif) &) &) -&&/slide +&] -&&slide +&[slide Когато е готово, би трябвало да се включи автоматично и да имате прозорец с име "Sign in to Visual Studio". За сега това не е нужно, спокойно изберете "Not now, maybe later." След това, на "Start with a familiar environment", отново, не е нужно да променяте нищо, просто натиснете "Start Visual Studio". -&¢ered &&width75 &&table +&(centered &(width75% &{row ![](./img/vs-signin.gif) ![](./img/vs-start-env.gif) -&&/table &&/width &&/centered +&} &) &) -&&/slide +&] -&&slide +&[slide ### Как да създадем проект с Visual Studio Това е първия прозорец, който се отваря. В лявата колона имате скорошни проекти, в дясната имате начини да създадете нов проект. -&¢ered &&width80 ![](./img/vs-open-recent.gif) &&/width &&/centered +&(centered &(width80% ![](./img/vs-open-recent.gif) &) &) -&&/slide +&] -&&slide +&[slide Нека да направим нов проект, кликнете "Create a new project". В този прозорец избирате началната "конфигурация" на проекта. В този курс ще работим само и единствено с "Console App", затова изберете него и кликнете "Next". -&¢ered &&width75 ![](./img/vs-create-project.gif) &&/width &&/centered +&(centered &(width75% ![](./img/vs-create-project.gif) &) &) -&&/slide +&] -&&slide +&[slide Последния прозорец преди писането на код е за конфигурация на проекта. Тук единствено може да искате да промените Project Name и Location, другото не е важно. -&¢ered &&width80 ![](./img/vs-configure-project.gif) &&/width &&/centered +&(centered &(width80% ![](./img/vs-configure-project.gif) &) &) -&&/slide +&] -&&slide +&[slide #### Бърза вметка, какво и защо конзолата? @@ -351,50 +350,50 @@ GitHub предоставя лесни начини да правите пром Чисто практически, ние това знаем като конзолата: устройство (или в модерно време, програма) което може да получи входен текст и да изкара текст. -&&/slide +&] -&&slide +&[slide ### Как да компилираме с Visual Studio След малко чакане, най-после ще се намираме в средата за писане на код. -&¢ered &&width60 ![](./img/vs-general.gif) &&/width &&/centered +&(centered &(width60% ![](./img/vs-general.gif) &) &) В Solution Explorer имате всички файлове от проекта (Visual Studio позволява да групирате няколко проекта в едно, наречено Solution, не е нужно да се занимавате). Тук **единственото важно за вас се намира в папката "Source Files"**. В нея ще се намира вашия код, всичко останало са допълнителни неща, които са релевантни за по-големи проекти. -&&/slide +&] -&&slide +&[slide -&&table +&{row Компилирането на код става от менюто "Debug" най-отгоре, и след това избиране на "Start Without Debugging". -&&width50 &&fright ![](./img/vs-debug-menu.gif) &&/fright &&/width +&(width50% &(fright ![](./img/vs-debug-menu.gif) &) &) -&&/table +&} След малко чакане, би трябвало да излезе един прозорец, който изглежда горе-долу така: ![](./img/vs-console.gif) -&&/slide +&] -&&slide +&[slide ### Как да дебъгваме с Visual Studio -&&lineb1 +&.br1 Bug е когато нещо непланирано се случи в кода. Debuging е глаголът за откриване на причината за един bug. @@ -406,11 +405,11 @@ Visual Studio предоставя много функционалности, к ![](./img/vs-build-errors.gif) -&&/slide +&] -&&slide +&[slide Нека да натиснем "No" и да погледнем Visual Studio. @@ -419,13 +418,13 @@ Visual Studio предоставя много функционалности, к Грешки също се виждат в така наречения "Error List", който се намира директно под кода. Той се появява когато при компилиране получим грешки и изчезва когато няма. -&¢ered &&width70 ![](./img/vs-errors.gif) &&/width &&/centered +&(centered &(width70% ![](./img/vs-errors.gif) &) &) -&&/slide +&] -&&slide +&[slide ### Качване на решенията @@ -443,14 +442,14 @@ Visual Studio предоставя много функционалности, к Горе в дясно натискате "Commit changes...", в pop-up-a после пак натискате "Commit changes" (ако искате, променяйте "Commit message" и "Extended description", но не е нужно) и сте готови с този файл/задача. -&&/slide +&] -&&clide +&[middle ## Вече имате достатъчно информация да пишете код сами, [време е за задачи](./) -&&/clide +&] [^vs-2022-old-win]: Може би има трикове с които да инсталирате 2022 версията, но те не са официални и затова няма да го преподам diff --git a/src/teaching/upp-2023/week1/welcome.md b/src/teaching/upp-2023/week1/welcome.md index dfa46f0..a1cb6a0 100644 --- a/src/teaching/upp-2023/week1/welcome.md +++ b/src/teaching/upp-2023/week1/welcome.md @@ -1,52 +1,52 @@ # Добре дошли - УПП, Седмица 1, 06.10.2023 -&&presentation +&.presentation -&&slide &¢ered &&font35 +&[title35 # Добре дошли -&&width65 +&(width65% [![](https://upload.wikimedia.org/wikipedia/commons/3/3c/Chimpanzee_seated_at_typewriter.jpg)](https://en.wikipedia.org/wiki/Infinite_monkey_theorem) -&&/width +&) -&&/font &&/centered &&/slide +&] -&&slide +&[slide ## Кой съм аз -&&lineb2 +&.br2 -&&font35 +&(font35 Казвам се Камен (моля не ми говорете на Вие), в момента съм третокурсник в КН2. -&&lineb1 +&.br1 Ще водя практикуми - давам ви задачи, вие ги решавате и на живо оправяме проблеми. -&&lineb1 +&.br1 Също ще проверявам част от домашните и контролните през семестъра. -&&/font +&) -&&/slide +&] -&&slide +&[slide ## Кои сте вие Айде сега, ред по ред: -&&lineb2 +&.br3 -&&font35 +&(font35 - Име - Едва ли ще го запомня сега, не ми се сърдете :) @@ -56,24 +56,24 @@ - в какво IDE/текстов редактор? - как сте се научили (чрез интернет, курсове, ...)? Ходили ли сте на курсове? Къде? -&&/font +&) -&&/slide +&] -&&slide +&[slide ## Чисто организационно -&&lineb3 +&.br3 -&¢ered &&font35 +&(centered35 Задачи, презентации, ... [syndamia.com/teaching/upp-2023](/teaching/upp-2023) -&&/font &&/centered +&) -&&lineb3 +&.br3 - Не сме в училище, ако трябва да излезете за разговор или до тоалетна, просто си излезте (за предпочитане по-тихичко). @@ -82,11 +82,11 @@ - Оценяване: ще разберете на първата лекция -&&/slide +&] -&&slide +&[slide ## Как можете да се свържете @@ -101,11 +101,11 @@ Директни линкове към Facebook и Discord има на [профила ми в мудъл](https://learn.fmi.uni-sofia.bg/user/profile.php?id=23229). -&&/slide +&] -&&slide +&[slide ## Как ще протичат практикумите @@ -121,11 +121,11 @@ - Ще качвам решения на задачите, заедно с подробно коментари върху тях, тук: [github.com/Syndamia/upp-2023-solutions](https://github.com/Syndamia/upp-2023-solutions). Това ще се случва в началото на следващия практикум, тоест ще имате една седмица, от деня в който ви давам задачите, през която няма да имате решения. -&&/slide +&] -&&clide +&[middle - Ще използваме GitHub classroom, където ще трябва да качите работата си през упражнението. Целта е да видя какво сте правили и да връщам обратна връзка на всеки. @@ -136,11 +136,11 @@ - Обратна връзка със сигурност ще правя за нещата, предадени по време на практикума. Окуражавам ви да си решите всички задачи и след упражнението, обаче все пак имам лимитирано време, ако искате можете да се свържете с мен за работата ви по някоя от тях, но не гарантирам кога ще мога да го видя. -&&/clide +&] -&&slide +&[slide ## Оплаквайте се! @@ -149,7 +149,7 @@ Ако задачите са трудни, зле направени, ако нещо не обяснявам като хората, изобщо ако нещо не е ок, свържете се с мен, ще го обсъдим. -&&lineb3 +&.br3 ## Помагайте си! @@ -159,17 +159,17 @@ Със сигурност няма да успея да помогна на всеки по всяко време от практикума, не се страхувайте да питате съседите си за помощ. -&&/slide +&] -&&slide +&[slide ## Няколко съвета в позицията ми на третокурсник -&&lineb2 +&.br2 -&&font35 +&(font35 - **НЕ плагиатствайте!** **НЕ си качвайте решенията на контролни или домашни онлайн!** @@ -179,47 +179,47 @@ За хората с опит, ще дойде време когато ще искате да приложите лични знания и практики. Ако не е казано някъде, не го правите и не го обмисляте! -&&/font &&/slide +&) &] -&&clide &¢ered +&[title # Въпроси ? -&&/centered &&/clide +&] -&&clide &¢ered +&[title # ФМИ в контекста на програмирането Или защо учим толкова много математика -&&lineb2 +&.br2 -&&font22 +&(font22 Ще си позволя едно отклонение. Искам да обясня как **аз лично** виждам математиката в компютърния свят. -&&/font +&) -&&/centered &&/clide +&] -&&slide +&[slide ## В КН2 има много и трудна математика -&&table +&{row -&&width35 +&(width35% ![](./img/u4-mat-hard.gif) -&&/width +&) -&&cont +&{column - Жълто - математически предмет - Червено - проблемни предмети @@ -230,14 +230,14 @@ - Към половината предмети са математики - Почти всички проблемни са наблъскани в 1ви курс -&&/cont +&} -&&/table -&&/slide +&} +&] -&&slide +&[slide ## Защо учим толкова много математика? @@ -248,40 +248,38 @@ Смесица на уводите в няколко предмета: -&&table +&{row -&&font35 +&(font35 ![](https://upload.wikimedia.org/wikipedia/commons/9/99/ClaudeShannon_MFO3807.jpg?20190622223728) Claude Shannon -&&/font +&) -&&cont +&{column - **Булева алгебра**: как работим с истина/лъжа, с 0/1 - Доказана е [еквивалентност между ел. вериги и булевата алгебра](https://en.wikipedia.org/wiki/A_Symbolic_Analysis_of_Relay_and_Switching_Circuits). - Много типове данни и математически операции могат да се сведат до булева алгебра и работа с памет. -&&/cont +&} +&} &] -&&/table &&/slide - - -&&slide +&[slide ### Дискретни структури (продължение) -&&lineb1 +&.br1 - **Теория на множествата**: множество е някаква съвкупност от обекти - Позволява ни да третираме колекция от математически обекти като математически обект[^importance-of-sets]. Използва се в основата на много математики; колкото са полезни те, толкова са и множествата. -&&lineb2 +&.br2 - **Комбинаторика**[^importance-of-combinatorics]: изследва бройки на неща @@ -289,55 +287,55 @@ Claude Shannon - Употребява се при оптимизации и теория на кодирането (компресиране на данни, отстраняване на грешки, криптография) - Есенциална в теория на графите -&&/slide +&] -&&slide +&[slide ### Дискретни структури (продължение) -&&lineb5 +&.br5 - **Теория на графите**: граф е съвкупност от някакви обекти и връзки между тях. - Позволява моделиране на много естествени структури: интернет мрежите, географски карти (места и пътищата между тях), йерархии, биологически мрежи и так. нат. - Използва се във важни структури от данни като [heap](https://en.wikipedia.org/wiki/Heap_%28data_structure%29) (и интересната [fibonacci heap](https://www.youtube.com/watch?v=6JxvKfSV9Ns)) и [trie](https://en.wikipedia.org/wiki/Trie) -&&/slide +&] -&&slide +&[slide ### Езици, автомати и изчислимост -&&lineb5 +&.br5 -&&table +&{row -&&font35 -&&width85 ![](https://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Kleene.jpg/421px-Kleene.jpg?20230630215747) &&/width +&(font35 +&(width85% ![](https://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Kleene.jpg/421px-Kleene.jpg?20230630215747) &) Stephen Kleene -&&/font +&) -&&cont +&{column Това е част от материала в по-общото "theoretical computer science". Можем формално да опишем и работим с теоретични компютри и програми. - Позволява ни да използваме математика за създаване, обработка и доказване на програми -&&/cont +&} -&&/table -&&/slide +&} +&] -&&slide +&[slide -&&lineb1 +&.br1 ### Алгебра 1 @@ -347,7 +345,7 @@ Stephen Kleene - Основоположна в компютърната графика - Много използвана в machine learning -&&lineb3 +&.br3 ### Диференциално и интегрално смятане @@ -357,11 +355,11 @@ Stephen Kleene - Напреднал machine learning, главно заради употребата на статистиката (която на свой ред се основава на линейната алгебра) - Анализ на алгоритми -&&/slide +&] -&&slide &&font35 +&[slide35 ## В по-общ план @@ -378,11 +376,11 @@ Stephen Kleene Математиката е **неразделима** част от софтуера! Друг е въпросът дали на вас лично ще ви се налага да я използвате... -&&/font &&/slide +&] -&&slide +&[slide ## Какво означава да пишеш софтуер? @@ -394,32 +392,32 @@ Stephen Kleene - Най-великият труд на тази дисциплина е постигнат чрез **синхрон** между тези три предмета - &¢ered &&width60 &&table + &(centered &(width60% &{row ![](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) ![](https://upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Internet_map_1024.jpg/600px-Internet_map_1024.jpg?20121030160606) - &&/table &&/width &&/centered + &} &) &) -&&/slide +&] -&&clide &¢ered &&font35 +&[title35 # Означава да създадеш
deus ex machina С други думи, позволява ни да разрешим неразрешими проблеми -&&/font &&/centered &&/clide +&] -&&clide &¢ered &&font35 +&[title35 # [Достатъчно философия, сега ще конфигурираме всичко нужно за първото ни упражнение](./setup.html) -&&/font &&/centered &&/clide +&] ### Употреба на изображения diff --git a/src/teaching/upp-2023/week10/index.md b/src/teaching/upp-2023/week10/index.md index 043d913..722e705 100644 --- a/src/teaching/upp-2023/week10/index.md +++ b/src/teaching/upp-2023/week10/index.md @@ -2,7 +2,7 @@ GitHub classroom: [classroom.github.com/a/EJcTQRz4](https://classroom.github.com/a/EJcTQRz4) -&&important Във всички задачи **трябва** да използвате рекурсия! +&:important Във всички задачи **трябва** да използвате рекурсия! ## Задача 1 diff --git a/src/teaching/upp-2023/week11/index.md b/src/teaching/upp-2023/week11/index.md index d19f0d2..92ce89e 100644 --- a/src/teaching/upp-2023/week11/index.md +++ b/src/teaching/upp-2023/week11/index.md @@ -2,9 +2,9 @@ GitHub classroom: [classroom.github.com/a/cZRnZj9y](https://classroom.github.com/a/cZRnZj9y) -&&important Във всички задачи **трябва** да използвате рекурсия! +&:important Във всички задачи **трябва** да използвате рекурсия! -&&warn Някои задачи се повтарят с тези от миналия път, ако преди не сте ги решили, сега ги решете +&:warn Някои задачи се повтарят с тези от миналия път, ако преди не сте ги решили, сега ги решете ## Алтернативни задачи diff --git a/src/teaching/upp-2023/week12/index.md b/src/teaching/upp-2023/week12/index.md index a4be259..d914431 100644 --- a/src/teaching/upp-2023/week12/index.md +++ b/src/teaching/upp-2023/week12/index.md @@ -2,7 +2,7 @@ GitHub classroom: [classroom.github.com/a/KEDSxDjl](https://classroom.github.com/a/KEDSxDjl) -&&important Във всички задачи **трябва** да използвате рекурсия! +&:important Във всички задачи **трябва** да използвате рекурсия! ## Алтернативни задачи @@ -86,11 +86,11 @@ GitHub classroom: [classroom.github.com/a/KEDSxDjl](https://classroom.github.com Направете програма, която чисто рекурсивно изчислиява изрази в обратен полски запис, който поддържа цели числа и операциите събиране, умножение, деление, изваждане и степенуване (за степенуване ще използваме знакът `^`). -&&important Обаче, за едно извикване на рекурсивната функция, може да пазите само един елемент на израза (число или оператор)! +&:important Обаче, за едно извикване на рекурсивната функция, може да пазите само един елемент на израза (число или оператор)! Изразът винаги завършва на знака `$`. -&&warn Относно вход/изход, понеже няма как да знаем дали i-тата стойност е число или знак (операция), трябва да използваме функцията `std::cin.fail()`, която връща булева стойност, която ни казва дали записването на входа е било успешно.
+&:warn Относно вход/изход, понеже няма как да знаем дали i-тата стойност е число или знак (операция), трябва да използваме функцията `std::cin.fail()`, която връща булева стойност, която ни казва дали записването на входа е било успешно.
Тоест, може винаги да запазвате входа в целочислен тип, когато стигнете до знак `std::cin.fail()` ще върне `true`. След това трябва да "забравите" за грешката чрез `std::cin.clear()` и може втори път да запазите входа (провалените данни ще се препрочетат) в променлива от знаков тип.
Но това поражда друг проблем, понеже записваме в целочислен тип, когато въведем `+` или `-`, `std::cin` ще очаква това да е водещ знак на число, и ще продължи да чака входа докато не въведем друг знак, тоест `+` и `-` ще бъдат пропуснати. diff --git a/src/teaching/upp-2023/week13/index.md b/src/teaching/upp-2023/week13/index.md index 4608c3b..f0e4b9a 100644 --- a/src/teaching/upp-2023/week13/index.md +++ b/src/teaching/upp-2023/week13/index.md @@ -37,7 +37,7 @@ GitHub classroom: [classroom.github.com/a/bgiFD6SB](https://classroom.github.com Използвайте **само една функция за сортиране!** Като подсказка, използвайте указатели към функции за да променяте как тя работи. -&&question Какво свойство трябва да е изпълнено за сортиращата функция? +&:question Какво свойство трябва да е изпълнено за сортиращата функция? **Примери:** @@ -136,7 +136,7 @@ A . Накрая трябва да изкарате всички стойности от последния израз. -&&warn Погледнете пояснението за вход/изход от [последната задача от миналия път](../week12/#4). +&:warn Погледнете пояснението за вход/изход от [последната задача от миналия път](../week12/#4). **Пример:** diff --git a/src/teaching/upp-2023/week2/revision.md b/src/teaching/upp-2023/week2/revision.md index ebf6db6..73e897f 100644 --- a/src/teaching/upp-2023/week2/revision.md +++ b/src/teaching/upp-2023/week2/revision.md @@ -1,20 +1,20 @@ # Преговор - УПП, Седмица 2, 13.10.2023 -&&presentation +&.presentation -&&clide &¢ered +&[title # Конвертиране на данни, побитови оператори, условни оператори -&&/centered &&/clide +&] -&&slide +&[slide ## Конвертиране на данни -&&lineb3 +&.br3 - Неявно (скрито, експлицитно): компилаторът сам се досеща да промени типа @@ -30,13 +30,13 @@ int m = (int)a + (int)b; ``` -&&/slide +&] -&&slide +&[slide -&&lineb5 +&.br5 - Със загуба на информация (от по-голям тип в по-малък) @@ -52,11 +52,11 @@ long b = a; ``` -&&/slide +&] -&&slide +&[slide ## Побитови оператори @@ -67,7 +67,7 @@ **Означавам побитовите числа с водеща буква "b"!** Тоест, числото `b1001` е двоичното число `1001`, което е десетичното число `9`. -&&lineb3 +&.br3 - Отрицание/негация, `~`: обръща 0 в 1 и 1 в 0 @@ -75,11 +75,11 @@ ~ b0010 = b1101 ``` -&&/slide +&] -&&slide +&[slide - Побитово "и", `&`: за два бита, ако и двете са 1, връща 1, иначе връща 0 @@ -102,11 +102,11 @@ b0011 ^ b0101 = b0110 ``` -&&/slide +&] -&&clide &&font27 +&[middle27 - Побитово отместване на ляво, `<<`: отмества всеки бит с n позиции на ляво Винаги "запълва" с нули (няма разлика между логическо и аритметично ляво отместване) @@ -128,11 +128,11 @@ b1010 >> 3 = b0001 или пък b1111 ``` -&&/font &&/clide +&] -&&clide +&[middle Примери с код: @@ -156,19 +156,19 @@ int r4 = (unsigned int)b >> 1; // 2 int r5 = (unsigned int)-b >> 1; // 2147483645 ``` -&&/clide +&] -&&slide +&[slide ## Логически оператори Много приличат на побитовите, обаче побитовите работят върху битове, докато логическите работят върху bool. -&&lineb4 +&.br4 - `!`: обръща `true` във `false` и обратно @@ -177,11 +177,11 @@ int r5 = (unsigned int)-b >> 1; // 2147483645 ! false // true ``` -&&/slide +&] -&&clide +&[middle - `&&`: "логическо и", ако и двете стойности са `true`, тогава и резултатът е `true` @@ -199,11 +199,11 @@ int r5 = (unsigned int)-b >> 1; // 2147483645 false || false // false ``` -&&/clide +&] -&&slide +&[slide ## Условни конструкции @@ -225,11 +225,11 @@ int r5 = (unsigned int)-b >> 1; // 2147483645 dootherthing; ``` -&&/slide +&] -&&clide &&font25 +&[middle25 - `if-else`: работи като `if`, обаче след къдравите скоби добавяме `else { ... }`. @@ -256,11 +256,11 @@ int r5 = (unsigned int)-b >> 1; // 2147483645 dootherthing; ``` -&&/font &&/clide +&] -&&slide &&font25 +&[slide25 - благодарение на изпускането на къдрави скоби, можем да пишем @@ -290,11 +290,11 @@ int r5 = (unsigned int)-b >> 1; // 2147483645 } ``` -&&/font &&/slide +&] -&&slide +&[slide - `expression` винаги се конвертира до тип `bool` (ако е нужно) **Никога не правете такива неща:** @@ -320,11 +320,11 @@ int r5 = (unsigned int)-b >> 1; // 2147483645 Просто правите `bool a = ! expression;` -&&/slide +&] -&&slide +&[slide - Тернарен оператор: ако искате да имате такава условна конструкция като част от израз (който взема стойност) използвате @@ -348,11 +348,11 @@ int r5 = (unsigned int)-b >> 1; // 2147483645 std::cout << ((grade < 300) ? 2.0 : grade / 100.0); ``` -&&/slide +&] -&&clide &&font27 +&[middle27 - `switch`: приема стойност и изпълнява случая, при който стойността съвпада с определената @@ -377,12 +377,12 @@ int r5 = (unsigned int)-b >> 1; // 2147483645 Без `break` изпълнението продължава към следващия `case` -&&/font &&/clide +&] -&&clide +&[middle ```cpp char characterInput; @@ -395,4 +395,4 @@ switch(characterInput) { } ``` -&&/clide +&] diff --git a/src/teaching/upp-2023/week3/revision.md b/src/teaching/upp-2023/week3/revision.md index cb0ac61..6e684cc 100644 --- a/src/teaching/upp-2023/week3/revision.md +++ b/src/teaching/upp-2023/week3/revision.md @@ -2,16 +2,16 @@ &&presentation -&&clide &&font35 &¢ered +&[title35 # Цикли, assert -&&/centered &&/font &&/clide +&] -&&slide &&font25 +&[slide25 ## Бележки от миналия път @@ -42,11 +42,11 @@ bool b = !condition; ``` -&&/font &&/slide +&] -&&clide +&[middle - второ: @@ -64,15 +64,15 @@ a >= '0' && a <= '9' ``` -&&/clide +&] -&&slide +&[slide ## С/без загуба на данни -&&lineb3 +&.br3 Получи се малко разногласие между това, което Ивана ви е казала и това което аз ви казах. В края на деня, **конвертиране от int към unsigned int не губи информация!** @@ -83,11 +83,11 @@ Тоест, конвертирания при които не губиш битове, нямаш загуба на данни. -&&/slide +&] -&&slide +&[slide ## 2s compliment @@ -109,11 +109,11 @@ 000 0 ``` -&&/slide +&] -&&clide +&[middle Това работи, обаче имаме един гигантски проблем: събирането не работи! От математика знаем, че "2 - 1 = 2 + (-1)", тоест би трябвало да можем да съберем побитово 2 и -1 и да получим 1. @@ -133,11 +133,11 @@ Да не говорим, че ние имаме -0, което не ни трябва много. -&&/clide +&] -&&clide +&[middle Нека да помислим пак, да вземем само положителните: @@ -156,11 +156,11 @@ Нека тогава "-1 = 111". -&&/clide +&] -&&slide +&[slide Правейки същото за "2 + -2", намираме че @@ -186,11 +186,11 @@ 100 не сме го използвали, обаче намерихме отрицателното число за всяко положително. Да видим как работим с него, побитово "100 + 001 = 101", тоест "x + 1 = -3", следователно x ще бъде -4. -&&/slide +&] -&&clide +&[middle Това е идеята на "complements", дефинираме отрицателни числа, така че да използваме едно и също събиране между положителни и отрицателни. @@ -212,15 +212,15 @@ 11111111111111111111111111111110 ``` -&&/clide +&] -&&slide +&[slide ## Цикли -&&lineb4 +&.br4 - `while` цикъл @@ -232,11 +232,11 @@ "условие" е булева стойност, като ако е `false` цикъла спира, докато ако е `true` "тяло" се изпълнява и после пак се проверява условие -&&/slide +&] -&&clide +&[middle - Може да си го представите като @@ -258,11 +258,11 @@ ... ``` -&&/clide +&] -&&slide +&[slide - `do-while` цикъл, като `while`, но "тяло" се изпълнява поне един път @@ -289,11 +289,11 @@ ... ``` -&&/slide +&] -&&clide +&[middle - `for` цикъл @@ -307,11 +307,11 @@ "условие" се изпълнява преди всяка итерация, като ако е `false` цикъла спира, докато ако е `true` продължава "инкрементация" се изпълнява след края на всяка итерация -&&/clide +&] -&&slide +&[slide - Може да си представяте, че това на практика извършва: @@ -336,11 +336,11 @@ ... ``` -&&/slide +&] -&&clide +&[middle - или използвайки `while` цикъл: @@ -352,36 +352,36 @@ } ``` -&&/clide +&] -&&slide +&[slide ### Ключови думи -&&lineb3 +&.br3 - `break`: моментално прекратява изпълнението на цикъла При `for` цикли инкрементацията не се изпълнява след `break` -&&lineb2 +&.br2 - `continue`: продължи след края на сегашната итерация; тоест изпълнението на тяло се прекратява и започваме нова итерация При `for` цикли директно отива на инкрементация -&&/slide +&] -&&slide +&[slide ## Assert -&&lineb3 +&.br3 Понякога е полезно да тестваме нашия код вътре в самия код. Тоест, искаме на конкретно място в кода да проверим нещо. @@ -394,4 +394,4 @@ assert(condition); Използва се повече като програмистки уред, тоест ако програмата спре заради `assert`, това е защото има някаква програмистка грешка. -&&/slide +&] diff --git a/src/teaching/upp-2023/week4/revision.md b/src/teaching/upp-2023/week4/revision.md index b5de82d..3650875 100644 --- a/src/teaching/upp-2023/week4/revision.md +++ b/src/teaching/upp-2023/week4/revision.md @@ -1,16 +1,16 @@ # Преговор - УПП, Седмица 4, 27.10.2023 -&&presentation +&.presentation -&&clide &&font35 &¢ered +&[title35 # Функции и алгоритмични задачи -&&/centered &&/font &&/clide +&] -&&slide &&font27 +&[slide27 ## От сега нататък ще направим няколко промени @@ -26,7 +26,7 @@ - Ще може да предавате задания след срока! Искам да решите колкото се може повече вкъщи. -&&/font &&/slide +&] @@ -34,7 +34,7 @@ -&&slide +&[slide ## 2s compliment @@ -56,11 +56,11 @@ 000 0 ``` -&&/slide +&] -&&clide +&[middle Това работи, обаче имаме един гигантски проблем: събирането не работи! От математика знаем, че "2 - 1 = 2 + (-1)", тоест би трябвало да можем да съберем побитово 2 и -1 и да получим 1. @@ -80,11 +80,11 @@ Да не говорим, че ние имаме -0, което не ни трябва много. -&&/clide +&] -&&clide +&[middle Нека да помислим пак, да вземем само положителните: @@ -103,11 +103,11 @@ Нека тогава "-1 = 111". -&&/clide +&] -&&slide +&[slide Правейки същото за "2 + -2", намираме че @@ -133,11 +133,11 @@ 100 не сме го използвали, обаче намерихме отрицателното число за всяко положително. Да видим как работим с него, побитово "100 + 001 = 101", тоест "x + 1 = -3", следователно x ще бъде -4. -&&/slide +&] -&&clide +&[middle Това е идеята на "complements", дефинираме отрицателни числа, така че да използваме едно и също събиране между положителни и отрицателни. @@ -159,7 +159,7 @@ 11111111111111111111111111111110 ``` -&&/clide +&] diff --git a/src/teaching/upp-2023/week6/index.md b/src/teaching/upp-2023/week6/index.md index 991f987..34c3f53 100644 --- a/src/teaching/upp-2023/week6/index.md +++ b/src/teaching/upp-2023/week6/index.md @@ -189,7 +189,7 @@ $ 1 1 |6 1 3 7 3 0 958|959| |17 5 9 8 6 1 8 3 9 5 9 9 2 7 8 0 91461 772000|863461| -&&question Какво прави последната програма? +&:question Какво прави последната програма? **Бонус:** направете програми за симулаторния компютър, които diff --git a/src/teaching/upp-2023/week7/index.md b/src/teaching/upp-2023/week7/index.md index 329581c..b216992 100644 --- a/src/teaching/upp-2023/week7/index.md +++ b/src/teaching/upp-2023/week7/index.md @@ -10,7 +10,7 @@ GitHub classroom: [classroom.github.com/a/m5M2_CWD](https://classroom.github.com Направете функция, която получава два двуизмерни координата, покомпонентно ги сумира и връща резултатните координати. Няма как функцията да върне две стойности, затова добаваете още два аргумента, които да са указатели към променливи в които да запазим сумираните координати. -&&warn **Трябва** да използвате референции вместо указатели! +&:warn **Трябва** да използвате референции вместо указатели! От входа получавате два координата, след това връщате тяхната покомпонентна сума **използвайки функцията**. @@ -31,7 +31,7 @@ GitHub classroom: [classroom.github.com/a/m5M2_CWD](https://classroom.github.com Ако буквата е `a`, `b` или `c`, тогава този продукт става "сегашния" продукт. Ако буквата е `S`, тогава намаляте бройката на сегашния продукт с 1, а ако е `R` - увеличаваме с 10. -&&warn **НЕ** може да използвате масиви! **Трябва** действията на `S` и `R` да се изкарат във функции! +&:warn **НЕ** може да използвате масиви! **Трябва** действията на `S` и `R` да се изкарат във функции! Когато получите `$`, изкарвате броя на всеки продукт и спирате програмата. @@ -46,7 +46,7 @@ GitHub classroom: [classroom.github.com/a/m5M2_CWD](https://classroom.github.com В началото получавате буква - тя съответства на дадена **функция**, след това получавате 5 числа с плаваща запетая. След всяко въведено трябва да изкарате резултата от съответната функция при подадено входното число. -&&warn **Трябва** да използвате указател към функция! +&:warn **Трябва** да използвате указател към функция! Буквите съответстват на следните функции: diff --git a/src/teaching/upp-2023/week8/index.md b/src/teaching/upp-2023/week8/index.md index f3ab415..561dc71 100644 --- a/src/teaching/upp-2023/week8/index.md +++ b/src/teaching/upp-2023/week8/index.md @@ -2,7 +2,7 @@ GitHub classroom: [classroom.github.com/a/Big7FRUG](https://classroom.github.com/a/Big7FRUG) -&&warn **Трябва** да използвате възможно най-малко памет във всички задачи! +&:warn **Трябва** да използвате възможно най-малко памет във всички задачи! ## Задача 1 @@ -77,7 +77,7 @@ GitHub classroom: [classroom.github.com/a/Big7FRUG](https://classroom.github.com Друг начин по който да го разберем, е че първото число е на първа позиция, второто число е на последната, третото число е на втора позиция, четвъртото е на предпоследна и так. нат. Обаче ние не знаем финалния размер на масива, затова се нуждаем от логиката с чертата. -&&important Моля не правете решенето със запазване на входа и разместване на елементите +&:important Моля не правете решенето със запазване на входа и разместване на елементите Напомням, че тази права само си я представяте. В началото масива е с размер 2. diff --git a/src/teaching/upp-2023/week9/index.md b/src/teaching/upp-2023/week9/index.md index 86e7cca..557b89a 100644 --- a/src/teaching/upp-2023/week9/index.md +++ b/src/teaching/upp-2023/week9/index.md @@ -2,7 +2,7 @@ GitHub classroom: [classroom.github.com/a/lGXxCRZO](https://classroom.github.com/a/lGXxCRZO) -&&warn Освен ако не е казано друго, може да зачитате, че максималната дължина на един низ е 1024 знака. +&:warn Освен ако не е казано друго, може да зачитате, че максималната дължина на един низ е 1024 знака. ## Задача 1 @@ -21,7 +21,7 @@ GitHub classroom: [classroom.github.com/a/lGXxCRZO](https://classroom.github.com Изкарайте на екрана втората половина от низа и след това директно долепена първата половина. Ако низа е с нечетна дължина, зачитаме средния елемент като част от втората половина. -&&important Трябва да използвате динамична памет +&:important Трябва да използвате динамична памет **Примери:** -- cgit v1.3.1-23-gd82d From 809ea814d498f94164fe4ea6fd71a143bb43c3c6 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Mon, 26 Feb 2024 09:26:31 +0200 Subject: (src) Updated index pages to MEL format --- src/blog.md | 26 +++++++++++++------------- src/blog/index.md | 26 +++++++++++++------------- src/misc.md | 4 ++-- src/misc/index.md | 4 ++-- src/preserved-media.md | 4 ++-- src/preserved-media/index.md | 4 ++-- src/preserved-web-pages.md | 2 +- src/preserved-web-pages/index.md | 2 +- src/slides.md | 4 ++-- src/slides/index.md | 4 ++-- src/teaching.md | 4 ++-- src/teaching/index.md | 4 ++-- src/tutorials.md | 32 ++++++++++++++++---------------- src/tutorials/index.md | 32 ++++++++++++++++---------------- 14 files changed, 76 insertions(+), 76 deletions(-) (limited to 'src') diff --git a/src/blog.md b/src/blog.md index ac411a0..b404428 100644 --- a/src/blog.md +++ b/src/blog.md @@ -4,47 +4,47 @@ Articles detailing personal experiences or exploration of certain topics.
-&&gb 20 Feb   [Microsoft and FOSS: a fire to be extinguished](/blog/microsoft-and-foss-extinguish) +&.gb 20 Feb   [Microsoft and FOSS: a fire to be extinguished](/blog/microsoft-and-foss-extinguish) : `Shallow dive` | `Opinion` | `Microsoft` `GitHub` `Linux` `FOSS` #### *2023* -&&gb 30 Aug   [ThinkPad X270 - my favorite machine](/blog/thinkpad-x270-my-favorite-machine) +&.gb 30 Aug   [ThinkPad X270 - my favorite machine](/blog/thinkpad-x270-my-favorite-machine) : `Medium dive` | `Review` | `Lenovo` `ThinkPad` `Yoga` -&&gb 19 July   [Icon fonts aren't evil, you just have to care](/blog/icon-fonts-arent-evil-you-just-have-to-care) +&.gb 19 July   [Icon fonts aren't evil, you just have to care](/blog/icon-fonts-arent-evil-you-just-have-to-care) : `Shallow dive` | `Web development` | `Icon font` `SVG` `Accessibility` `FontForge` -&&bg 14 July   [ФМИ и висшето образование в програмистката индустрия](/blog/fmi-i-vissheto-obrazovanie-v-programistkata-industriq) +&.bg 14 July   [ФМИ и висшето образование в програмистката индустрия](/blog/fmi-i-vissheto-obrazovanie-v-programistkata-industriq) : `Deep dive` | `University` | `FMI` `Education` -&&gb 07 June   [Friendship ended with Funtoo, now Gentoo is my best friend](/blog/friendship-ended-with-funtoo-now-gentoo-is-my-best-friend) +&.gb 07 June   [Friendship ended with Funtoo, now Gentoo is my best friend](/blog/friendship-ended-with-funtoo-now-gentoo-is-my-best-friend) : `Shallow dive` | `Linux` | `Funtoo` `Gentoo` `portage` `packages` `emerge` `ebuild` -&&gb 01 May   [BASH is weird](/blog/bash-is-weird) +&.gb 01 May   [BASH is weird](/blog/bash-is-weird) : `Shallow dive` | `bash` | `Linux` `scripting` -&&gb 18 Apr   [Sane explanation of compilers: Part 1](/blog/sane-explanation-of-compilers/part-1.html) +&.gb 18 Apr   [Sane explanation of compilers: Part 1](/blog/sane-explanation-of-compilers/part-1.html) : `Deep dive` | `Compilers` | `C` `yacc` `bison` `math` `Trees` `Regex` `Grammar` `Languages` -&&gb 13 Jan   [Plan 9 in Linux: Mouse menus](/blog/plan9-in-linux-mouse-menus) +&.gb 13 Jan   [Plan 9 in Linux: Mouse menus](/blog/plan9-in-linux-mouse-menus) : `Medium dive` | `Linux` | `Plan 9` `mouse` `bash` `script` `X11` `openbox` `jgmenu` `plumber` #### *2022* -&&gb 23 Dec   [2.6 years of web design](/blog/2.6-years-of-web-design) +&.gb 23 Dec   [2.6 years of web design](/blog/2.6-years-of-web-design) : `Shallow dive` | `Web design` -&&gb 13 Dec   [When a language forces simpler thinking](/blog/when-a-language-forces-simpler-thinking) +&.gb 13 Dec   [When a language forces simpler thinking](/blog/when-a-language-forces-simpler-thinking) : `Shallow dive` | `Common Lisp` | `Advent of Code` -&&gb 04 Dec   [Taming The Fun-too](/blog/taming-the-fun-too) +&.gb 04 Dec   [Taming The Fun-too](/blog/taming-the-fun-too) : `Story` | `Funtoo` | `Linux` `Gentoo` `packages` -&&gb 10 Sep   [Encrypted email](/blog/encrypted-email) +&.gb 10 Sep   [Encrypted email](/blog/encrypted-email) : `Medium dive` | `Email` | `Encryption` `Security` `PGP` `S/MIME` `Protonmail` `Tutanota` #### *2020* -&&gb 20 May   [Mundus: My first shot at game development](/blog/mundus-first-shot-at-gamedev) +&.gb 20 May   [Mundus: My first shot at game development](/blog/mundus-first-shot-at-gamedev) : `Deep dive` | `Gamedev` | `2D` `Sandbox` `Crafting` `Building` `Fighting` `GtkSharp 2.0` `C#` diff --git a/src/blog/index.md b/src/blog/index.md index ac411a0..b404428 100644 --- a/src/blog/index.md +++ b/src/blog/index.md @@ -4,47 +4,47 @@ Articles detailing personal experiences or exploration of certain topics.
-&&gb 20 Feb   [Microsoft and FOSS: a fire to be extinguished](/blog/microsoft-and-foss-extinguish) +&.gb 20 Feb   [Microsoft and FOSS: a fire to be extinguished](/blog/microsoft-and-foss-extinguish) : `Shallow dive` | `Opinion` | `Microsoft` `GitHub` `Linux` `FOSS` #### *2023* -&&gb 30 Aug   [ThinkPad X270 - my favorite machine](/blog/thinkpad-x270-my-favorite-machine) +&.gb 30 Aug   [ThinkPad X270 - my favorite machine](/blog/thinkpad-x270-my-favorite-machine) : `Medium dive` | `Review` | `Lenovo` `ThinkPad` `Yoga` -&&gb 19 July   [Icon fonts aren't evil, you just have to care](/blog/icon-fonts-arent-evil-you-just-have-to-care) +&.gb 19 July   [Icon fonts aren't evil, you just have to care](/blog/icon-fonts-arent-evil-you-just-have-to-care) : `Shallow dive` | `Web development` | `Icon font` `SVG` `Accessibility` `FontForge` -&&bg 14 July   [ФМИ и висшето образование в програмистката индустрия](/blog/fmi-i-vissheto-obrazovanie-v-programistkata-industriq) +&.bg 14 July   [ФМИ и висшето образование в програмистката индустрия](/blog/fmi-i-vissheto-obrazovanie-v-programistkata-industriq) : `Deep dive` | `University` | `FMI` `Education` -&&gb 07 June   [Friendship ended with Funtoo, now Gentoo is my best friend](/blog/friendship-ended-with-funtoo-now-gentoo-is-my-best-friend) +&.gb 07 June   [Friendship ended with Funtoo, now Gentoo is my best friend](/blog/friendship-ended-with-funtoo-now-gentoo-is-my-best-friend) : `Shallow dive` | `Linux` | `Funtoo` `Gentoo` `portage` `packages` `emerge` `ebuild` -&&gb 01 May   [BASH is weird](/blog/bash-is-weird) +&.gb 01 May   [BASH is weird](/blog/bash-is-weird) : `Shallow dive` | `bash` | `Linux` `scripting` -&&gb 18 Apr   [Sane explanation of compilers: Part 1](/blog/sane-explanation-of-compilers/part-1.html) +&.gb 18 Apr   [Sane explanation of compilers: Part 1](/blog/sane-explanation-of-compilers/part-1.html) : `Deep dive` | `Compilers` | `C` `yacc` `bison` `math` `Trees` `Regex` `Grammar` `Languages` -&&gb 13 Jan   [Plan 9 in Linux: Mouse menus](/blog/plan9-in-linux-mouse-menus) +&.gb 13 Jan   [Plan 9 in Linux: Mouse menus](/blog/plan9-in-linux-mouse-menus) : `Medium dive` | `Linux` | `Plan 9` `mouse` `bash` `script` `X11` `openbox` `jgmenu` `plumber` #### *2022* -&&gb 23 Dec   [2.6 years of web design](/blog/2.6-years-of-web-design) +&.gb 23 Dec   [2.6 years of web design](/blog/2.6-years-of-web-design) : `Shallow dive` | `Web design` -&&gb 13 Dec   [When a language forces simpler thinking](/blog/when-a-language-forces-simpler-thinking) +&.gb 13 Dec   [When a language forces simpler thinking](/blog/when-a-language-forces-simpler-thinking) : `Shallow dive` | `Common Lisp` | `Advent of Code` -&&gb 04 Dec   [Taming The Fun-too](/blog/taming-the-fun-too) +&.gb 04 Dec   [Taming The Fun-too](/blog/taming-the-fun-too) : `Story` | `Funtoo` | `Linux` `Gentoo` `packages` -&&gb 10 Sep   [Encrypted email](/blog/encrypted-email) +&.gb 10 Sep   [Encrypted email](/blog/encrypted-email) : `Medium dive` | `Email` | `Encryption` `Security` `PGP` `S/MIME` `Protonmail` `Tutanota` #### *2020* -&&gb 20 May   [Mundus: My first shot at game development](/blog/mundus-first-shot-at-gamedev) +&.gb 20 May   [Mundus: My first shot at game development](/blog/mundus-first-shot-at-gamedev) : `Deep dive` | `Gamedev` | `2D` `Sandbox` `Crafting` `Building` `Fighting` `GtkSharp 2.0` `C#` diff --git a/src/misc.md b/src/misc.md index caf61d7..876a4ee 100644 --- a/src/misc.md +++ b/src/misc.md @@ -6,8 +6,8 @@ Other types of content I've made, including documents, images, videos and web de #### 2022 -&&ft-text 19.09   [Университетски бележки](/misc/universitetski-belejki) +&.ft-text 19.09   [Университетски бележки](/misc/universitetski-belejki) : Различни материали, които съм правил през следването ми във ФМИ -&&ft-photo 16.07   [Layout engines and browsers](/files/misc/Layout%20engines%20and%20browsers.svg) +&.ft-photo 16.07   [Layout engines and browsers](/files/misc/Layout%20engines%20and%20browsers.svg) : A diagram which roughly outlines the main layout engines throughout the web's history diff --git a/src/misc/index.md b/src/misc/index.md index caf61d7..876a4ee 100644 --- a/src/misc/index.md +++ b/src/misc/index.md @@ -6,8 +6,8 @@ Other types of content I've made, including documents, images, videos and web de #### 2022 -&&ft-text 19.09   [Университетски бележки](/misc/universitetski-belejki) +&.ft-text 19.09   [Университетски бележки](/misc/universitetski-belejki) : Различни материали, които съм правил през следването ми във ФМИ -&&ft-photo 16.07   [Layout engines and browsers](/files/misc/Layout%20engines%20and%20browsers.svg) +&.ft-photo 16.07   [Layout engines and browsers](/files/misc/Layout%20engines%20and%20browsers.svg) : A diagram which roughly outlines the main layout engines throughout the web's history diff --git a/src/preserved-media.md b/src/preserved-media.md index 30c8782..c7ada8e 100644 --- a/src/preserved-media.md +++ b/src/preserved-media.md @@ -6,8 +6,8 @@ If you are an owner of something listed here, [contact me](/about) and I'll remo
-&&ft-zip 22.09.2022   [Reconstructed source](/files/media/BrilliantButtonMaker-LucaZappa-updated.zip) of Luca Zappa's Brilliant Button Maker +&.ft-zip 22.09.2022   [Reconstructed source](/files/media/BrilliantButtonMaker-LucaZappa-updated.zip) of Luca Zappa's Brilliant Button Maker : Using what archive.org had, I reconstructed most of the source code for the "Brilliant Button Maker" by [Luca Zappa](https://www.linkedin.com/in/lucazappa/). I also host it [here](https://hob.syndamia.com/brilliant-button-maker/). -&&ft-text 14.10.1991   [Прибор электроизмерительный комбинированный типа 43208-У](/files/media/43208-%D0%A3/43208-%D0%A3.pdf) +&.ft-text 14.10.1991   [Прибор электроизмерительный комбинированный типа 43208-У](/files/media/43208-%D0%A3/43208-%D0%A3.pdf) : A scanned manual (in Russian) for the Soviet Analog Multimeter [43208-У](http://radioamator.ru/izmereniya/multimetry-testery/221-kombinirovannyj-pribor-43208-u-osobennosti-skhemy-i-remonta) diff --git a/src/preserved-media/index.md b/src/preserved-media/index.md index 30c8782..c7ada8e 100644 --- a/src/preserved-media/index.md +++ b/src/preserved-media/index.md @@ -6,8 +6,8 @@ If you are an owner of something listed here, [contact me](/about) and I'll remo
-&&ft-zip 22.09.2022   [Reconstructed source](/files/media/BrilliantButtonMaker-LucaZappa-updated.zip) of Luca Zappa's Brilliant Button Maker +&.ft-zip 22.09.2022   [Reconstructed source](/files/media/BrilliantButtonMaker-LucaZappa-updated.zip) of Luca Zappa's Brilliant Button Maker : Using what archive.org had, I reconstructed most of the source code for the "Brilliant Button Maker" by [Luca Zappa](https://www.linkedin.com/in/lucazappa/). I also host it [here](https://hob.syndamia.com/brilliant-button-maker/). -&&ft-text 14.10.1991   [Прибор электроизмерительный комбинированный типа 43208-У](/files/media/43208-%D0%A3/43208-%D0%A3.pdf) +&.ft-text 14.10.1991   [Прибор электроизмерительный комбинированный типа 43208-У](/files/media/43208-%D0%A3/43208-%D0%A3.pdf) : A scanned manual (in Russian) for the Soviet Analog Multimeter [43208-У](http://radioamator.ru/izmereniya/multimetry-testery/221-kombinirovannyj-pribor-43208-u-osobennosti-skhemy-i-remonta) diff --git a/src/preserved-web-pages.md b/src/preserved-web-pages.md index 9b8d3b2..db3fa83 100644 --- a/src/preserved-web-pages.md +++ b/src/preserved-web-pages.md @@ -6,5 +6,5 @@ If you are an owner of something listed here, [contact me](/about) and I'll remo
-&&ft-browser 2005   [Brilliant Button Maker](https://hob.syndamia.com/brilliant-button-maker/) by Luca Zappa   [source code](https://syndamia.com/files/hob/BrilliantButtonMaker-LucaZappa-updated.zip) +&.ft-browser 2005   [Brilliant Button Maker](https://hob.syndamia.com/brilliant-button-maker/) by Luca Zappa   [source code](https://syndamia.com/files/hob/BrilliantButtonMaker-LucaZappa-updated.zip) : A nice web button maker from the 2000s, written in PHP. Since it was no longer available, I found and fixed up most of the PHP that archive.org saved. diff --git a/src/preserved-web-pages/index.md b/src/preserved-web-pages/index.md index 9b8d3b2..db3fa83 100644 --- a/src/preserved-web-pages/index.md +++ b/src/preserved-web-pages/index.md @@ -6,5 +6,5 @@ If you are an owner of something listed here, [contact me](/about) and I'll remo
-&&ft-browser 2005   [Brilliant Button Maker](https://hob.syndamia.com/brilliant-button-maker/) by Luca Zappa   [source code](https://syndamia.com/files/hob/BrilliantButtonMaker-LucaZappa-updated.zip) +&.ft-browser 2005   [Brilliant Button Maker](https://hob.syndamia.com/brilliant-button-maker/) by Luca Zappa   [source code](https://syndamia.com/files/hob/BrilliantButtonMaker-LucaZappa-updated.zip) : A nice web button maker from the 2000s, written in PHP. Since it was no longer available, I found and fixed up most of the PHP that archive.org saved. diff --git a/src/slides.md b/src/slides.md index 11b802b..0a23cca 100644 --- a/src/slides.md +++ b/src/slides.md @@ -6,10 +6,10 @@ These are the different presentations I've made and possibly presented. #### *2023* -&&gb 19 Jan   [Linuxgraphy by Strabo](./linuxgraphy-by-strabo)   *Last presented: 22.01.2023* +&.gb 19 Jan   [Linuxgraphy by Strabo](./linuxgraphy-by-strabo)   *Last presented: 22.01.2023* : A presentation talking about some of the history of UNIX and how Linux works #### *2022* -&&gb 27 Sep   [Demo presentation](./demo)   *Won't be presented* +&.gb 27 Sep   [Demo presentation](./demo)   *Won't be presented* : Showcase of my presentation system diff --git a/src/slides/index.md b/src/slides/index.md index 11b802b..0a23cca 100644 --- a/src/slides/index.md +++ b/src/slides/index.md @@ -6,10 +6,10 @@ These are the different presentations I've made and possibly presented. #### *2023* -&&gb 19 Jan   [Linuxgraphy by Strabo](./linuxgraphy-by-strabo)   *Last presented: 22.01.2023* +&.gb 19 Jan   [Linuxgraphy by Strabo](./linuxgraphy-by-strabo)   *Last presented: 22.01.2023* : A presentation talking about some of the history of UNIX and how Linux works #### *2022* -&&gb 27 Sep   [Demo presentation](./demo)   *Won't be presented* +&.gb 27 Sep   [Demo presentation](./demo)   *Won't be presented* : Showcase of my presentation system diff --git a/src/teaching.md b/src/teaching.md index e1e9092..c36de4d 100644 --- a/src/teaching.md +++ b/src/teaching.md @@ -4,8 +4,8 @@ This is a list of all the subjects I've taught professionally.
-&&bg 2023-2024   [З520 Обектно-ориентрано програмиране - практикум, КН, 8 група](/teaching/oop-2023) +&.bg 2023-2024   [З520 Обектно-ориентрано програмиране - практикум, КН, 8 група](/teaching/oop-2023) : Хоноруван преподавател във [ФМИ](https://www.fmi.uni-sofia.bg/) на специалност [Компютърни науки](https://www.fmi.uni-sofia.bg/bg/kompyutrni-nauki) -&&bg 2023-2024   [3107 Увод в програмирането - практикум, КН, 8 група](/teaching/upp-2023) +&.bg 2023-2024   [3107 Увод в програмирането - практикум, КН, 8 група](/teaching/upp-2023) : Хоноруван преподавател във [ФМИ](https://www.fmi.uni-sofia.bg/) на специалност [Компютърни науки](https://www.fmi.uni-sofia.bg/bg/kompyutrni-nauki) diff --git a/src/teaching/index.md b/src/teaching/index.md index e1e9092..c36de4d 100644 --- a/src/teaching/index.md +++ b/src/teaching/index.md @@ -4,8 +4,8 @@ This is a list of all the subjects I've taught professionally.
-&&bg 2023-2024   [З520 Обектно-ориентрано програмиране - практикум, КН, 8 група](/teaching/oop-2023) +&.bg 2023-2024   [З520 Обектно-ориентрано програмиране - практикум, КН, 8 група](/teaching/oop-2023) : Хоноруван преподавател във [ФМИ](https://www.fmi.uni-sofia.bg/) на специалност [Компютърни науки](https://www.fmi.uni-sofia.bg/bg/kompyutrni-nauki) -&&bg 2023-2024   [3107 Увод в програмирането - практикум, КН, 8 група](/teaching/upp-2023) +&.bg 2023-2024   [3107 Увод в програмирането - практикум, КН, 8 група](/teaching/upp-2023) : Хоноруван преподавател във [ФМИ](https://www.fmi.uni-sofia.bg/) на специалност [Компютърни науки](https://www.fmi.uni-sofia.bg/bg/kompyutrni-nauki) diff --git a/src/tutorials.md b/src/tutorials.md index 1cbf84d..bfd957d 100644 --- a/src/tutorials.md +++ b/src/tutorials.md @@ -6,58 +6,58 @@ Educational articles with the sole goal of explaining technologies, processes or #### *2023* -&&gb 16 Dec   [Fix "qc timeout" kernel log error](/tutorials/fix-qc-timeout) +&.gb 16 Dec   [Fix "qc timeout" kernel log error](/tutorials/fix-qc-timeout) : `Linux` | `kernel` | `libata` `qc` `logs` `DMA` -&&gb 28 Jun   [Fix networked Brother printers not working in Linux](/tutorials/fix-network-brother-printers) +&.gb 28 Jun   [Fix networked Brother printers not working in Linux](/tutorials/fix-network-brother-printers) : `Linux` | `CUPS` | `Printers` `Brother` `Network` `avahi` -&&gb 14 Jun   [Fix "exec /gns3/init.sh: no such file or directory"](/tutorials/gns3-initsh-no-such-file) +&.gb 14 Jun   [Fix "exec /gns3/init.sh: no such file or directory"](/tutorials/gns3-initsh-no-such-file) : `Linux` | `GNS3` | `Docker` `busybox` -&&gb 26 Apr   [Install drivers for Epson scanners](/tutorials/install-drivers-for-epson-scanners) +&.gb 26 Apr   [Install drivers for Epson scanners](/tutorials/install-drivers-for-epson-scanners) : `Linux` | `SANE` | `Scanners` `Epson` `epkowa` `iscan` -&&gb 25 Apr   [Managing Android apps with ADB (and without root)](/tutorials/managing-apps-with-adb-without-root) +&.gb 25 Apr   [Managing Android apps with ADB (and without root)](/tutorials/managing-apps-with-adb-without-root) : `Android` | `ADB` | `Apps` `Linux` `Windows` -&&gb 01 Jan   [virt-manager freezing up when clicking Browse in any window](/tutorials/virt-manager-freeze-on-browse) +&.gb 01 Jan   [virt-manager freezing up when clicking Browse in any window](/tutorials/virt-manager-freeze-on-browse) : `Linux` | `virt-manager` | `QEMU/KVM` `libvirt` `Linux` `GTK` #### *2022* -&&gb 16 Sep   [How to encrypt email](/tutorials/how-to-encrypt-email) +&.gb 16 Sep   [How to encrypt email](/tutorials/how-to-encrypt-email) : `All` | `Email` | `PGP` `S/MIME` `Email Client` `Gmail` `Outlook` `Protonmail` -&&gb 30 Jul   [Fix "No frame buffer" error in Plan 9](/tutorials/fix-no-frame-buffer-plan9) +&.gb 30 Jul   [Fix "No frame buffer" error in Plan 9](/tutorials/fix-no-frame-buffer-plan9) : `Plan 9` | `Configuration` | `QEMU/KVM` `Linux` `monitor` -&&gb 30 Jul   [Install Plan 9 with virt-manager](/tutorials/install-plan9-with-virt-manager) +&.gb 30 Jul   [Install Plan 9 with virt-manager](/tutorials/install-plan9-with-virt-manager) : `Plan 9` | `Installation` | `Setup` `QEMU/KVM` `virt-manager` `Linux` #### *2021* -&&gb 01 Nov   [How to turn off notifications on Windows](/tutorials/turn-off-notifications-windows) +&.gb 01 Nov   [How to turn off notifications on Windows](/tutorials/turn-off-notifications-windows) : `Windows 10` | `Settings` | `Notifications` -&&gb 01 Nov   [How to disable Sticky Keys prompt](/tutorials/disable-sticky-keys-popup) +&.gb 01 Nov   [How to disable Sticky Keys prompt](/tutorials/disable-sticky-keys-popup) : `Windows` | `Settings` | `Sticky Keys` -&&gb 26 Oct   [How to remove Windows Weather Widget](/tutorials/remove-weather-widget) +&.gb 26 Oct   [How to remove Windows Weather Widget](/tutorials/remove-weather-widget) : `Windows 10` | `Settings` | `Taskbar` `Weather Widget` -&&gb 04 Oct   [Windows Run dialog](/tutorials/windows-run-dialog) +&.gb 04 Oct   [Windows Run dialog](/tutorials/windows-run-dialog) : `Windows` | `Commands` | `Run` `Settings` -&&gb 03 Oct   [How to export Skype data](/tutorials/export-skype) +&.gb 03 Oct   [How to export Skype data](/tutorials/export-skype) : `Skype` | `Export` | `Archive` `skype-parser` #### *2020* -&&gb 24 Jul   [How to use Jira](/tutorials/how-to-use-jira) +&.gb 24 Jul   [How to use Jira](/tutorials/how-to-use-jira) : `Project Management` | `Jira` | `Agile` `Issue tracking` `Bug tracking` `Kanban` `Atlassian` -&&gb 21 May   [Connect to Mysql in .NET and Entity Framework](/tutorials/connect-to-mysql-in-dotnet-ef) +&.gb 21 May   [Connect to Mysql in .NET and Entity Framework](/tutorials/connect-to-mysql-in-dotnet-ef) : `ASP.Net` | `MySQL` | `Entity Framework` `Pomelo` diff --git a/src/tutorials/index.md b/src/tutorials/index.md index 1cbf84d..bfd957d 100644 --- a/src/tutorials/index.md +++ b/src/tutorials/index.md @@ -6,58 +6,58 @@ Educational articles with the sole goal of explaining technologies, processes or #### *2023* -&&gb 16 Dec   [Fix "qc timeout" kernel log error](/tutorials/fix-qc-timeout) +&.gb 16 Dec   [Fix "qc timeout" kernel log error](/tutorials/fix-qc-timeout) : `Linux` | `kernel` | `libata` `qc` `logs` `DMA` -&&gb 28 Jun   [Fix networked Brother printers not working in Linux](/tutorials/fix-network-brother-printers) +&.gb 28 Jun   [Fix networked Brother printers not working in Linux](/tutorials/fix-network-brother-printers) : `Linux` | `CUPS` | `Printers` `Brother` `Network` `avahi` -&&gb 14 Jun   [Fix "exec /gns3/init.sh: no such file or directory"](/tutorials/gns3-initsh-no-such-file) +&.gb 14 Jun   [Fix "exec /gns3/init.sh: no such file or directory"](/tutorials/gns3-initsh-no-such-file) : `Linux` | `GNS3` | `Docker` `busybox` -&&gb 26 Apr   [Install drivers for Epson scanners](/tutorials/install-drivers-for-epson-scanners) +&.gb 26 Apr   [Install drivers for Epson scanners](/tutorials/install-drivers-for-epson-scanners) : `Linux` | `SANE` | `Scanners` `Epson` `epkowa` `iscan` -&&gb 25 Apr   [Managing Android apps with ADB (and without root)](/tutorials/managing-apps-with-adb-without-root) +&.gb 25 Apr   [Managing Android apps with ADB (and without root)](/tutorials/managing-apps-with-adb-without-root) : `Android` | `ADB` | `Apps` `Linux` `Windows` -&&gb 01 Jan   [virt-manager freezing up when clicking Browse in any window](/tutorials/virt-manager-freeze-on-browse) +&.gb 01 Jan   [virt-manager freezing up when clicking Browse in any window](/tutorials/virt-manager-freeze-on-browse) : `Linux` | `virt-manager` | `QEMU/KVM` `libvirt` `Linux` `GTK` #### *2022* -&&gb 16 Sep   [How to encrypt email](/tutorials/how-to-encrypt-email) +&.gb 16 Sep   [How to encrypt email](/tutorials/how-to-encrypt-email) : `All` | `Email` | `PGP` `S/MIME` `Email Client` `Gmail` `Outlook` `Protonmail` -&&gb 30 Jul   [Fix "No frame buffer" error in Plan 9](/tutorials/fix-no-frame-buffer-plan9) +&.gb 30 Jul   [Fix "No frame buffer" error in Plan 9](/tutorials/fix-no-frame-buffer-plan9) : `Plan 9` | `Configuration` | `QEMU/KVM` `Linux` `monitor` -&&gb 30 Jul   [Install Plan 9 with virt-manager](/tutorials/install-plan9-with-virt-manager) +&.gb 30 Jul   [Install Plan 9 with virt-manager](/tutorials/install-plan9-with-virt-manager) : `Plan 9` | `Installation` | `Setup` `QEMU/KVM` `virt-manager` `Linux` #### *2021* -&&gb 01 Nov   [How to turn off notifications on Windows](/tutorials/turn-off-notifications-windows) +&.gb 01 Nov   [How to turn off notifications on Windows](/tutorials/turn-off-notifications-windows) : `Windows 10` | `Settings` | `Notifications` -&&gb 01 Nov   [How to disable Sticky Keys prompt](/tutorials/disable-sticky-keys-popup) +&.gb 01 Nov   [How to disable Sticky Keys prompt](/tutorials/disable-sticky-keys-popup) : `Windows` | `Settings` | `Sticky Keys` -&&gb 26 Oct   [How to remove Windows Weather Widget](/tutorials/remove-weather-widget) +&.gb 26 Oct   [How to remove Windows Weather Widget](/tutorials/remove-weather-widget) : `Windows 10` | `Settings` | `Taskbar` `Weather Widget` -&&gb 04 Oct   [Windows Run dialog](/tutorials/windows-run-dialog) +&.gb 04 Oct   [Windows Run dialog](/tutorials/windows-run-dialog) : `Windows` | `Commands` | `Run` `Settings` -&&gb 03 Oct   [How to export Skype data](/tutorials/export-skype) +&.gb 03 Oct   [How to export Skype data](/tutorials/export-skype) : `Skype` | `Export` | `Archive` `skype-parser` #### *2020* -&&gb 24 Jul   [How to use Jira](/tutorials/how-to-use-jira) +&.gb 24 Jul   [How to use Jira](/tutorials/how-to-use-jira) : `Project Management` | `Jira` | `Agile` `Issue tracking` `Bug tracking` `Kanban` `Atlassian` -&&gb 21 May   [Connect to Mysql in .NET and Entity Framework](/tutorials/connect-to-mysql-in-dotnet-ef) +&.gb 21 May   [Connect to Mysql in .NET and Entity Framework](/tutorials/connect-to-mysql-in-dotnet-ef) : `ASP.Net` | `MySQL` | `Entity Framework` `Pomelo` -- cgit v1.3.1-23-gd82d From 330c2abd3d2137811bbaa9c2c1dd7c170b88b2f7 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Mon, 26 Feb 2024 09:35:16 +0200 Subject: (slides) Updated slides to MEL format --- src/slides/demo/index.md | 96 ++++---- src/slides/linuxgraphy-by-strabo/index.md | 383 +++++++++++++++--------------- 2 files changed, 241 insertions(+), 238 deletions(-) (limited to 'src') diff --git a/src/slides/demo/index.md b/src/slides/demo/index.md index ebe95bb..c9e26de 100644 --- a/src/slides/demo/index.md +++ b/src/slides/demo/index.md @@ -2,12 +2,14 @@ This is a small presentation, explaining how my custom system for making presentations works. -&&presentation +&:important This page is [due for rework](/rework.html), I've switched to MEL from ftags -&&clide &&font35 &¢ered +&.presentation + +&[title35 # My presentation system -&&font18 *Syndamia AT [syndamia.com](https://syndamia.com)* &&/font +&(font18 *Syndamia AT [syndamia.com](https://syndamia.com)* &) Before we go any further, click the **icon in the middle** right above this rectangle, to the left. @@ -15,15 +17,15 @@ Now the presentation should fill out the entire page. On the bottom right are yo Press the *right arrow* in the controls to go to the next slide. -&&/centered &&/font &&/clide +&] -&&slide &&font27 +&[slide27 # Key bindings -&&lineb3 +&.br3 |Action |Keyboard keys | |--------------------|-------------------------------------------------| @@ -34,15 +36,15 @@ Press the *right arrow* in the controls to go to the next slide. |Go to first slide | Home | |Go to last slide | End | -&&/font &&/slide +&] -&&slide +&[slide # Introduction -&&lineb1 +&.br1 I created a simple system for making presentations with slides in them. The gist of it is: different [Markdown](https://en.wikipedia.org/wiki/Markdown) paragraphs are put into a rectangle, each rectangle representing a slide, with some added options for layout and format. @@ -54,11 +56,11 @@ Each ftag is a "marker" that gets replaced by some other text (usually [HTML tag An easy example is the image of the Great Britain flag (part of [Flags.awk](https://gitlab.com/Syndamia/syndamiadotcom/-/blob/master/awk-edits/Flags.awk), not the presentation system!): typing out &&GB (in lowecase), gets replaced by the actual image - &&gb. -&&/slide +&] -&&slide +&[slide ## Why? @@ -74,11 +76,11 @@ An easy example is the image of the Great Britain flag (part of [Flags.awk](http Creating ftags that are transformed to DZSlide HTML is possible, but at that point I should just make my own system. + and pretty much everything else falls into either category -&&/slide +&] -&&slide +&[slide # Formatting @@ -87,7 +89,7 @@ To summarize, each slide is wrapped in `&&slide` and `&&/slide` (or `&&clide` an And they can work together in most different combination. -&&lineb1 +&.br1 Though, remember that everything gets translated to HTML, so don't do (even if it works) @@ -97,39 +99,39 @@ Though, remember that everything gets translated to HTML, so don't do (even if i Enough talking, here are examples! -&&/slide +&] -&&slide +&[slide -&&font18 Font-size 18px &&/font -&&font20 Font-size 20px &&/font &&font22 Font-size 22px &&/font &&font25 Font-size 25px &&/font +&(font18 Font-size 18px &) +&(font20 Font-size 20px &) &(font22 Font-size 22px &) &(font25 Font-size 25px &) Font-size 30px (default) -&&font35 Font-size 35px &&/font +&(font35 Font-size 35px &) -&&lineb5 +&.br5 -&&fright +&(fright This text is floated to the right -&&/fright +&) -&&lineb2 +&.br2 -&¢ered While this one is centered &&/centered +&(centered While this one is centered &) -&&lineb2 +&.br2 -&&fright Floated right
Floated right
Floated right &&/fright +&(fright Floated right
Floated right
Floated right &) But you may realize that text floated to the right will make other text wrap around it! Maybe this should be changed? -&&/slide +&] -&&slide &&font18 +&[slide18 The source Markdown for the predvious slide (without the pipes to the left) is: @@ -161,40 +163,40 @@ Maybe this should be changed? &&/slide ``` -&&/font &&/slide +&] -&&clide &&table +&[middle &{row You can also easily tabularize -&&cont &&fright +&{column &(fright - List Element 1 - List Element 2 -&&/fright &&/cont +&) &} -&&tarow +&.newrow **any** sort of content -&&/table +&} -&&lineb1 +&.br1 -&&ftable +&{sqrow So you can very easily put images next to your text -&¢ered ![](/tutorials/fix-no-frame-buffer-plan9/img/rio-default-login.png =120x) &&/centered +&(centered ![](/tutorials/fix-no-frame-buffer-plan9/img/rio-default-login.png =120x) &) -&&/table &&/clide +&} &] -&&slide &&font18 +&[slide18 The source Markdown for the predvious slide (without the pipes to the left) is: @@ -227,11 +229,11 @@ So you can very easily put images next to your text &&/table &&/clide ``` -&&/font &&/slide +&] -&&slide &&font27 +&[slide27 # Other features @@ -248,18 +250,16 @@ Everything is contained in 3 files: [Presentation.awk](https://gitlab.com/Syndam `Presentation.awk` handles replacement of ftags (only in `/talks` pages!). `presentation.js` is inserted into the HTML by `&&presentation`, and handles the navigation bar as well as insertion of `presentation.css` (the overall presentation-specific styling). -&&/font &&/slide +&] -&&clide +&[title -&¢ered # Thats All. Thank you for your time! -&&/centered -&&fright &&font18 +&(fright &(font18 *P.S. Press the same button (next to the print button) with which you started presenting, to stop presenting ;)* -&&/font &&/fright +&) &) -&&/clide +&] diff --git a/src/slides/linuxgraphy-by-strabo/index.md b/src/slides/linuxgraphy-by-strabo/index.md index 196df80..5780cfa 100644 --- a/src/slides/linuxgraphy-by-strabo/index.md +++ b/src/slides/linuxgraphy-by-strabo/index.md @@ -10,52 +10,54 @@ ### Presented at -&&bg Unofficial [FMI](https://fmi.uni-sofia.bg/en) Computer Science Discord server   *04.03.2023 || 14:50 - 17:20* +&.bg Unofficial [FMI](https://fmi.uni-sofia.bg/en) Computer Science Discord server   *04.03.2023 || 14:50 - 17:20* : In front of a tiny audience of other uni students. Exact revision [here](https://gitlab.com/Syndamia/syndamiadotcom/-/blob/6feed223ff48fe00cf12fcd63f3f56179c298cae/src/talks/linuxgraphy-by-strabo/index.md). -&&bg Unofficial [FMI](https://fmi.uni-sofia.bg/en) Computer Science Discord server   *22.01.2023 || 18:00 - 21:00* +&.bg Unofficial [FMI](https://fmi.uni-sofia.bg/en) Computer Science Discord server   *22.01.2023 || 18:00 - 21:00* : In front of a tiny audience of other uni students. Exact revision [here](https://gitlab.com/Syndamia/syndamiadotcom/-/blob/6eb7a8fff01c6814253a0e738efb53734d297be9/src/talks/linuxgraphy-by-strabo/index.md). -&&presentation +&.presentation -&&clide &¢ered +&[title # Linuxgraphy by Strabo *Made by [Syndamia](https://syndamia.com)* -&&lineb4 &&ftable +&.br4 +&{sqrow -&&lineb1 +&.br1 -&&font22 +&(font22 2000 years ago [Strabo](https://en.wikipedia.org/wiki/Strabo) published [Geography](https://en.wikipedia.org/wiki/Geography), in which he laid out the world as it was known to the Romans and Greeks. -&&lineb1 +&.br1 Today, I'll lay out Linux as it is known to me. -&&/font +&) ![](https://upload.wikimedia.org/wikipedia/commons/thumb/e/ed/Strabo.jpg/199px-Strabo.jpg) -&&lineb1 +&.br1 -&&/table &&/centered &&/clide +&} &] -&&slide &&font35 +&[slide35 # Contents -&&ftable &&cont +&{sqrow +&{column 1. Historical context 2. Structure of UNIX-likes 1. Shell 2. UNIX-style file system 2. Kernel -&&lineb2 +&.br2 3. Linux from the inside 1. Shells 2. Files and directories @@ -63,7 +65,7 @@ Today, I'll lay out Linux as it is known to me. 4. System management 4. Software licensing -&&/cont &&cont +&} &{column 5. What makes up a useful OS 1. Bootloader @@ -71,20 +73,20 @@ Today, I'll lay out Linux as it is known to me. 2. Package manager 3. Desktop manager 6. War on distros -&&lineb4 +&.br4 7. Demos - virtual machine and setup from zero -&&/cont &&/table +&} &} -&&/font &&/slide +&] -&&slide +&[slide # 1. Historical context -&&lineb1 +&.br1 #### 1945 - 1955 @@ -101,15 +103,15 @@ Computers became faster, but a lot of time was spend on managing jobs. Jobs were loaded in series ([batches](https://en.wikipedia.org/wiki/Batch_processing)). When the current job finished, memory would be dumped and the next one would automatically be loaded and started. -&&/slide +&] -&&slide +&[slide #### 1960s -&&lineb1 +&.br1 Peripherals (tapes, punch cards, ...) were extremely slow. [Multiprogramming](https://en.wikipedia.org/wiki/Computer_multitasking#Multiprogramming): the current job is waiting for a peripheral, another job would be started. @@ -122,15 +124,15 @@ A computer system now had to support: - Storage organization, also following the rise of disks - Data communication links (often phone lines) -&&lineb1 +&.br1 More and more business started using computers, thanks to [minicomputers](https://en.wikipedia.org/wiki/Minicomputer), so demand for OS software increased. -&&/slide +&] -&&slide +&[slide #### 1964 - 1969 @@ -145,112 +147,113 @@ Some of it's novel ideas include, but are not limited to: - [Hierarchical file system](https://en.wikipedia.org/wiki/Directory_%28computing%29): Arbitrary directories with subdirectories, rather than just having files next to each other or having directories which could only contain files. - [Command processor](https://en.wikipedia.org/wiki/Shell_%28computing%29) (that is separated from the OS): More on that later -&&/slide +&] -&&slide +&[slide #### 1969: Death of Multics and birth of UNIX Ultimately Multics grew too large, becoming unusable and unmaintainable. In the beginning, programming was done mostly by [Bell Labs](https://en.wikipedia.org/wiki/Bell_Labs), with [Ken Thompson](https://en.wikipedia.org/wiki/Ken_Thompson) being one of the developers. -&&lineb1 &&ftable +&.br1 +&{sqrow -&&font18 +&(font18 ![](https://upload.wikimedia.org/wikipedia/commons/f/f8/Ken-Thompson-2019.png =160x) *Ken Thompson image by National Inventors Hall of Fame* ![](https://upload.wikimedia.org/wikipedia/commons/1/1b/Ken_Thompson_and_Dennis_Ritchie--1973.jpg) *Ken Thompson and Dennis Ritchie in 1973* -&&/font +&) -&&cont +&{column Thompson still had some desire to work on operating systems, after Bell Labs pulled out. The tools he made while rewriting [his own video game](https://en.wikipedia.org/wiki/Space_Travel_%28video_game%29) on a PDP-7 lead to a whole operating system: UNIX. Based, expanded on and improved upon many of Multic's ideas, UNIX became the father of modern OSs. -&&/cont +&} -&&/table &&/slide +&} &] -&&slide +&[slide # 2. Structure of UNIX-likes Ignoring [standards](https://unix.stackexchange.com/questions/14368/difference-between-posix-single-unix-specification-and-open-group-base-specifi/14415) and [specifications](https://unix.stackexchange.com/questions/87686/what-makes-an-operating-system-unix-like), in my opinion, from the point of a user, a UNIX-like OS has the following components: -&&lineb2 +&.br4 1. **shell**: A programmable replaceable command-line interpreter, with utilities for managing the whole system and support for pipelines and I/O redirection 2. **UNIX-style file system**: [Filesystem](https://en.wikipedia.org/wiki/Unix_filesystem) as a single rooted tree, objects (nodes) in the file system are [inodes](https://en.wikipedia.org/wiki/Inode) and an inode can be [(at least)](https://en.wikipedia.org/wiki/Unix_file_types) either a regular file, directory or devices. Permissions per users and group. 3. **kernel**: Program that manages all communication and operations between the hardware and software -&&lineb4 +&.br4 -&&font18 *For now we'll generally just look over some of the common stuff and go into detail later, while in Linux.* &&/font +&(font18 *For now we'll generally just look over some of the common stuff and go into detail later, while in Linux.* &) -&&/slide +&] -&&slide &&font35 +&[slide35 ## 2.1. shell -&&lineb2 &&ftable +&.br2 &{sqrow -&&cont +&{column The operating system is divided into layers, [like an onion](https://youtu.be/-FtCTW2rVFM?t=57). Only the kernel has access to the hardware. shells and executables (binaries) have access to the kernel. shells provide user interfaces, [both](http://en.wikipedia.org/wiki/Shell_%28computing%29) command-line and graphical. While on the topic of UNIX, we'll only discuss the former. -&&/cont +&} -&¢ered ![](./img/unix-layers.png) &&/centered +&(centered ![](./img/unix-layers.png) &) -&&/table &&/font &&/slide +&} &] -&&slide +&[slide ### Command-line shells Command-line shells operate solely with text, often only with ASCII characters. Usually connecting to a computer (to the shell) is said to be done with either a "terminal" ("console") or "teleprinter" ("teletype"). -&&table +&{row Video displays became widely available in the late 1970s, so before that access was done with a "teleprinter", a typewriter-printer combo. -&&font18 +&(font18 ![](https://upload.wikimedia.org/wikipedia/commons/thumb/d/df/ASR-33_at_CHM.agr.jpg/1280px-ASR-33_at_CHM.agr.jpg =860x) *Teletype Model 33 by [Arnold Reinhold](https://commons.wikimedia.org/wiki/User:ArnoldReinhold)* -&&/font +&) -&&tarow +&.newrow With the advent of computer displays, teleprinters were replaced with terminals, video display-keyboard combo. Thanks to the widely popular [VT100](https://en.wikipedia.org/wiki/VT100), almost all terminals support [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code). -&&font18 +&(font18 ![](https://upload.wikimedia.org/wikipedia/commons/thumb/9/99/DEC_VT100_terminal.jpg/675px-DEC_VT100_terminal.jpg?20131106192408 =860x) *DEC VT100 by [Jason Scott](https://www.flickr.com/people/54568729@N00)* -&&/font +&) -&&/table &&/slide +&} &] -&&slide +&[slide Today we don't usually use such specialised hardware, but the names persist with slightly different meanings. @@ -264,11 +267,11 @@ Today we don't usually use such specialised hardware, but the names persist with - ssh, a program to remotely connect to a device's shell, establishes a pseudoterminal. Your local terminal thinks it's connected to a local shell and vice versa with the remote shell, however the pty in between handles the true communication. -&&/slide +&] -&&clide +&[middle ### Command location and parameters @@ -284,11 +287,11 @@ Options usually start with a hyphen `-` (like `-c` or `-current-time`) and often Newer conventions also allow start with two hyphens `--` (`--current-time`), though if shown as-is indicate the rest is a string. More rarely you might see `--OPTION=VALUE` or just `OPTION=VALUE`. -&&/clide +&] -&&clide +&[middle ### Thompson shell @@ -308,11 +311,11 @@ The two major features that every other shell supports are: command1 [args...] | command2 [args...] | ... ``` -&&/clide +&] -&&slide +&[slide ## 2.2. UNIX-style file system @@ -322,17 +325,17 @@ The two major features that every other shell supports are: ![](./img/unix-dir-tree.png) -&&/slide +&] -&&clide +&[middle ### Attributes of an inode - [file type](https://en.wikipedia.org/wiki/Unix_file_types): Each inode represents some sort of file (data), but a "file" can also be a directory or device, so we need to know how to handle it. There are 7 main types (but there can exist more, depending on OS): - &&lineb1 + &.br1 + **regular**: just a plain old file + **directory**: as explained, a file containing hard links to other files. Each directory is allowed to appear *only once* in a single parent. + **symbolic link**: points to any file (or directory). It contains the (relative) path to that object (as a simple string), so a symlink not could even be valid. @@ -343,11 +346,11 @@ The two major features that every other shell supports are: exec(/bin/mprog); -> Executes /usr/local/bin/mprog ``` -&&/clide +&] -&&slide +&[slide + **FIFO special**: aka [named pipe](https://en.wikipedia.org/wiki/Named_pipe), a special type of regular file, where at any moment only one process can read from it and one can write to it. It takes the concept of shell pipes to inter-process communication. @@ -370,11 +373,11 @@ The two major features that every other shell supports are: CharacterSpecial << 1 ; CharacterSpecial >> var ``` -&&/slide +&] -&&clide +&[middle + **sockets**: file for inter-process communication. Compared to FIFO specials, they can be used by more than two processes, used in both directions and support [file descriptors](https://en.wikipedia.org/wiki/File_descriptor) and packets @@ -387,15 +390,15 @@ The two major features that every other shell supports are: \-read--> [Process C] ``` -&&/clide +&] -&&slide +&[slide #### Side-step into users and groups -&&lineb3 +&.br3 A user in UNIX is essentially a small collection of data, most important of it being a **unique ID** (number), a **name** (string), a **group id** (number; files created by the user are in that group) and a **password**. @@ -404,16 +407,16 @@ Groups are also small collections of data, but much simpler, comprised only of a User with ID 0 is called root, it is the "system administrator", all actions made by the system itself are done as that user. Every user has their own "home" folder (under "/home/USERNAME/", except for root, which is "/root/"), in which they store personal files, as well as user-specific configuration files. -&&/slide +&] -&&slide +&[slide - [file permissions](https://en.wikipedia.org/wiki/File_system_permissions): control the freedom of a user to read (navigate for directories), change and execute files File permissions are split into three sets: what the **owner** can do, what **group** members can do and what **anyone else** can do. Each set contains a mix of three permissions: **r**ead, **w**rite and e**x**ecute, and each set stores some combination of them. - &&lineb1 + &.br1 Each is represented by a bit in the order above (`101` means you *can* read, *cannot* write, *can* execute) and the overall permissions are often shown as a three digit number or character string. Example: `111101100` will be shown as `754` or `rwxr-xr--` @@ -421,15 +424,15 @@ Every user has their own "home" folder (under "/home/USERNAME/", except for root - User ID of owner, Group ID, file size and timestamps -&&/slide +&] -&&slide +&[slide ## 2.3. Kernel -&&font18 &&lineb1 &&/font +&(font18 &.br1 &) The kernel has the core functionality of the operating system and bridges the gap between programs and hardware. Some important subsystems include scheduling, file, device, process and memory management. @@ -437,23 +440,23 @@ Some important subsystems include scheduling, file, device, process and memory m To preserve the [everything is a file](https://en.wikipedia.org/wiki/Everything_is_a_file) methodology, devices and processes can be handled as files (inside `/dev` and `/proc`). They (most of the time, in modern kernels) aren't actual files on a hard drive, but "virtual" files, where operations on them are handled in a different manner than normal by the kernel. -&&lineb2 +&.br2 -&&font35 Linux is **not** an operating system, it is a kernel!!! &&/font +&(font35 Linux is **not** an operating system, it is a kernel!!! &) -&&lineb2 +&.br2 Two of the important things a kernel does is manage **processes** and **memory**. -&&/slide +&] -&&slide &&font35 +&[slide35 ### 2.3.1 Processes -&&lineb1 +&.br1 A program is some collection of code and other data, stored in a file (or noncompiled code). A process is the program in motion, the program itself *alongside* certain system states. @@ -465,11 +468,11 @@ The system states include (but are not limited to): - [file descriptors](https://en.wikipedia.org/wiki/File_descriptor), unique identifiers for files -&&/font &&/slide +&] -&&clide &&font35 +&[middle35 On a multitasking (multiprocessing) system, which is any modern desktop system, multiple processes are always running "at once". @@ -478,11 +481,11 @@ All "waiting" processes are put in a prioritized queue ([run queue](https://en.w Stopping is either done by the process itself (more on that later), or by the system when the process has been actively running for too much time. -&&/font &&/clide +&] -&&slide &&font35 +&[slide35 #### Process Control Block @@ -497,11 +500,11 @@ A PCB's data can be split into three categories: A process can be **forked**, meaning a new process is created, with the same underlying code (but not process states and ...). -&&/font &&/slide +&] -&&clide &&font35 +&[middle35 #### Process states @@ -511,11 +514,11 @@ A process can be **forked**, meaning a new process is created, with the same und - **Blocked**: When a process cannot continue without external change, usually when waiting for an I/O device. - **Terminated**: The process has either completed execution or has been killed. The process itself is called a ["zombie process"](https://en.wikipedia.org/wiki/Zombie_process) (until it is removed). -&&/font &&/clide +&] -&&clide &&font35 +&[middle35 #### Exit status @@ -525,15 +528,15 @@ For all intents and purposes, this number is an 8bit unsigned integer, meaning i Pretty much universally, an exit code of 0 signifies a successful termination, and anything else specifies some sort of error code. Different programs specify the meaning of an exit code in different ways, some assign each number to a specific error, other use the bits representing the number as flags. -&&/font &&/clide +&] -&&slide &&font35 +&[slide35 ### 2.3.2 Memory management -&&lineb2 +&.br2 In ye olde days, you would save a bit of memory for the operating system and give all of the rest to the current process ([monoprogramming](https://en.wiktionary.org/wiki/monoprogramming)), which we wait until completion. @@ -541,34 +544,34 @@ This doesn't allow for context switching (disks are slow) and a blocked state fo Some bad ideas include: depending on the code of all processes to not use the same addresses, use only [relative addresses](https://en.wikipedia.org/wiki/Position-independent_code) (`-fPIC` option in `gcc`) or use a [table](https://en.wikipedia.org//wiki/Relocation_%28computing%29#Relocation_table) that the kernel fills out with addresses. -&&/font &&/slide +&] -&&slide &&font35 +&[slide35 ### Virtual memory -&&lineb2 +&.br2 -&&fright +&{fright ![](./img/virtual-memory-by-Ehamberg.png) -&&font18 *Image by [Ehamberg](https://commons.wikimedia.org/wiki/File:Virtual_memory.svg)* &&/font -&&/fright +&(font18 *Image by [Ehamberg](https://commons.wikimedia.org/wiki/File:Virtual_memory.svg)* &) +&} A program (process) works with some (sequential) addresses, and the OS (with the help of [hardware](https://en.wikipedia.org/wiki/Memory_management_unit)) translates/maps the process' addresses (logical/[virtual addresses](https://en.wikipedia.org/wiki/Virtual_address_space)) to real ones (physical addresses). Simplified memory management for the program, protected address space for each process and improved flexibility. -&&/font &&/slide +&] -&&slide &&font35 +&[slide35 #### Segmentation (without paging) -&&lineb2 +&.br2 Initially, virtual memory was implemented with segmentation, where a process' memory is divided into segments for code, stack, heap, etc. Each segment is given a chunk of contiguous memory, which can be resized, and addresses are defined as the base segment (physical) address with an offset. @@ -576,15 +579,15 @@ Each segment is given a chunk of contiguous memory, which can be resized, and ad In the modern day, segmentation isn't used by itself, since resizing segments could require reordering of memory and [external fragmentation](https://en.wikipedia.org/wiki/Fragmentation_%28computing%29#External_fragmentation), where there simply isn't enough contiguous memory, could occur. -&&/font &&/slide +&] -&&slide &&font35 +&[slide35 #### Paging -&&lineb3 +&.br3 The virtual and physical memory is divided into fixed-sized chunks of consecutive addresses. A virtual memory chunk is called a **page**, while a physical memory chunk is called a (page) **frame**. @@ -593,11 +596,11 @@ Usually both have the same size of (at least) 4 KiB. Every process has a [page table](https://en.wikipedia.org/wiki/Page_table), which maps the process' pages to system frames. Thus every memory address is translated from it's page location to a frame location. -&&/font &&/slide +&] -&&slide &&font35 +&[slide35 Advantages include: @@ -612,11 +615,11 @@ Disadvantages include: - longer memory access, because of the page table - [internal fragmentation](https://en.wikipedia.org/wiki/Fragmentation_%28computing%29#Internal_fragmentation), where one or multiple pages might be partially empty, leaving free space that cannot be used -&&/font &&/slide +&] -&&slide +&[slide # 3. Linux from the inside @@ -625,7 +628,7 @@ Enough theory, time to have some fun and learn Linux! We'll be using [Linux Minimal Live](https://ivandavidov.github.io/minimal/#home) (just a bootable ISO) because it's: - very small, comprised of only the Linux kernel, GNU C library and Busybox -- made by a fellow Bulgarian &&bg +- made by a fellow Bulgarian ![](/img/bg.svg =30) We're going to explore and look around the following stuff: @@ -634,11 +637,11 @@ We're going to explore and look around the following stuff: - **Common configuration files**: Relevant configuration files, their purpose and syntax - **System management**: Other commands with which to modify your system -&&/slide +&] -&&clide &&font18 +&[middle18 #### If you're following at home @@ -654,15 +657,15 @@ That is because, out of the box, MLL doesn't really support secure connections ( The script, in summary, installs bash, coreutils and shadow "packages" (from [http://s.minos.io/archive/bifrost/x86\_64](http://s.minos.io/archive/bifrost/x86_64)) to /usr/local/bin, creates /etc/passwd, /etc/bashrc and /etc/profile with some values in them and starts bash. -&&/font &&/clide +&] -&&slide +&[slide ## 3.1. Shells -&&lineb2 +&.br2 ### Variables and data types @@ -676,11 +679,11 @@ name=value Where `name` is either a combination of letters (upper and lower case), numbers and the underscore character, which cannot begin with a number, or one of select few **positional** and **special** parameters. -&&/slide +&] -&&slide &&font35 +&[slide35 #### Positional and special parameters @@ -696,11 +699,11 @@ Some of the [special parameters](https://www.gnu.org/savannah-checkouts/gnu/bash `value`, without any special surrounding characters (more on that later), is treated as a string (but it mustn't have spaces!), however it may also be omitted, in which case it is the empty string `""`. -&&/font &&/slide +&] -&&slide &&font35 +&[slide35 #### Data types @@ -716,11 +719,11 @@ An indexed array can also be created by specifying the value at any index: name[index]=value ``` -&&/font &&/slide +&] -&&slide +&[slide #### Mixing types and operations @@ -734,11 +737,11 @@ name=value |integer| |empty string, but sometimes value |value |value when index is 0, empty string otherwise| |array | |operation is done on element at index 0|operation is done on element at index 0|value | -&&/slide +&] -&&slide +&[slide #### Parameter expansion @@ -755,11 +758,11 @@ Some parameter expansions in bash: - `${parameter/pattern/string}` return a string, where every match on pattern is replaced by string - `${name[@]}` a (space separated) sequence of indices from 0 to length (for defined values) of array name -&&/slide +&] -&&slide +&[slide #### Arithmetic expansion @@ -779,11 +782,11 @@ Some useful expressions are: Expressions work with both variable names and integers. -&&/slide +&] -&&clide +&[middle ### Bourne shell @@ -801,11 +804,11 @@ Most modern shells support a lot of the more defying features of the [Bourne She + `fg`: resume the last job to be put in the background and make it the current job with which we're interacting + `jobs`: list all active (background) jobs -&&/clide +&] -&&clide +&[middle -   + Every job is identified with a **Job ID** (number), which you can use by prepending a percentage sign. Example, to resume the job with JID 4: @@ -819,11 +822,11 @@ Most modern shells support a lot of the more defying features of the [Bourne She + `kill`: send a signal to the process or job. Then that process will have to handle it accordingly. Common ones are `-KILL` to immediately stop the process, `-QUIT` to quit it, `-ABRT` to cancel the current action, `-TERM` shut down (orderly), `-STOP` shut down (forcefully) -&&/clide +&] -&&clide &&font27 +&[middle27 - [heredoc](https://en.wikipedia.org/wiki/Here_document): File literal, meaning it is a user "string" which is interpreted as a file + start with `<< NAME`, where NAME can be anything you want, it is used to mark the beginning and end of a heredoc. `<<` is also a redirection symbol @@ -843,10 +846,10 @@ Most modern shells support a lot of the more defying features of the [Bourne She + `expr1 || expr2`: Run expr2 if expr1 exited unsuccessfully + `expr1 ; expr2`: Run expr2 after expr1 (sequential execution) -&&/font &&/clide +&] -&&clide &&font27 +&[middle27 - [redirection](https://en.wikipedia.org/wiki/Redirection_%28computing%29): Outside of having `<` and `>` for I/O redirection, often there is also + `>>`: Acts like `>`, putting text into a file, but rather than overwriting everything, it appends it @@ -865,11 +868,11 @@ Most modern shells support a lot of the more defying features of the [Bourne She * `N Master Boot Record -> Active Parition -> Bootloader -> - Active partition: MBR loads and runs code from the beginning of the partition (boot sector), which starts the bootloader - [Bootloader](https://en.wikipedia.org/wiki/Bootloader): the first complex program, which manages kernels, shows a menu, allows for debugging and so on -&&/slide +&] -&&clide +&[middle The BIOS is baked into the motherboard, the MBR is pretty universal (and it's less than 512 bytes) and the kernel we know and love. @@ -1206,11 +1209,11 @@ GRUB_CMDLINE_LINUX_DEFAULT="" GRUB_GFXMODE=640x480 ``` -&&/clide +&] -&&slide &&font27 +&[slide27 ## 5.2. Init system @@ -1233,15 +1236,15 @@ ExecStart=/usr/local/sbin/script.sh WantedBy=multi-user.target ``` -&&/font &&/slide +&] -&&slide +&[slide ## 5.3. Package manager -&&lineb1 +&.br1 Programs are just executable files, usually placed in a specific folder, like `/usr/bin`. @@ -1254,11 +1257,11 @@ Updating all of them means replacing all of the binaries, means tracking where e On modern systems, managing binaries is automated by an application called a package manager. -&&/slide +&] -&&clide &&font35 +&[middle35 Additional benefits of package management automation include: @@ -1268,7 +1271,7 @@ Additional benefits of package management automation include: - version caveats - (indirectly) improved stability because of maintainer compatibility checks -&&lineb1 +&.br1 ``` apt install PKG @@ -1276,18 +1279,18 @@ apt remove PKG apt upgrade ``` -&&/font &&/clide +&] -&&slide +&[slide ## 5.4. Window systems A widow system is your graphical shell: the graphical way to interact with your computer (the kernel). It's main components are: -&&lineb1 +&.br1 - **Window manager**: the overall system with which you create, remove, resize and work with windows. They are generally separated into two types: + *Stacked*: this is what you know, windows are just rectangles floating about, and can be put one over each other @@ -1295,11 +1298,11 @@ It's main components are: - **Compositor**: adds an unseen window buffer, allowing additional processing, before a window is shown. This powers transparency, animation effects and more. - **Session manager**: graphical application that manages the window managers (outside WMs), think of it as a login window -&&/slide +&] -&&slide &&font27 +&[slide27 # 6. War on distros @@ -1317,15 +1320,15 @@ We haven't touched too much, but Linux distributions aren't limited to desktop o 1. [AOSP](https://en.wikipedia.org/wiki/Android_%28operating_system%29#AOSP): the base of the whole Android operating system 2. [OpenWRT](https://en.wikipedia.org/wiki/OpenWrt): a router operating system -&&/font &&/slide +&] -&&slide &&font35 +&[slide35 # 7. Demos - virtual machine and setup from zero -&&lineb2 +&.br2 Now for the best part: we'll be installing a Linux distribution on a virtual machine and then directly on a laptop, running Windows 10! @@ -1333,19 +1336,19 @@ I've chosen to install [Linux Mint](https://linuxmint.com/), since it is general Currently there won't be an official recording of the process, you should've been here live! -&&/font &&/slide +&] -&&clide &&font35 &¢ered +&[title35 # Thank you for your time -&&/centered &&/font &&/clide +&] -&&slide &&font18 +&[slide18 # Sources @@ -1376,4 +1379,4 @@ They served as personal educational and reference tools. Images on slides "2.1. shell" and "2.2. UNIX-style file system" are made by me and [licensed as content](/license.html). The script [mll-set.sh](http://syndamia.com/talks/linuxgraphy-by-strabo/mll-set.sh) is licensed under MIT (though I don't see it as substatial enough to be licensed under anything). -&&/font &&/slide +&] -- cgit v1.3.1-23-gd82d From 12dc8126f06844e6fc330dd811bfbc0552cd5c1c Mon Sep 17 00:00:00 2001 From: Syndamia Date: Mon, 26 Feb 2024 09:38:12 +0200 Subject: (misc/ub) Converted to MEL format --- src/misc/universitetski-belejki/index.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/misc/universitetski-belejki/index.md b/src/misc/universitetski-belejki/index.md index 8e1ed85..560e63e 100644 --- a/src/misc/universitetski-belejki/index.md +++ b/src/misc/universitetski-belejki/index.md @@ -13,20 +13,20 @@ ### Алгебра 1 -&&ft-text [Разписани теми за устен изпит](/files/misc/uni-notes/algebra1/topics.pdf)   [източник](https://gitlab.com/Syndamia/uni-projects/-/blob/main/Year%201/Algebra/Topics/) [\*](#*) +&.ft-text [Разписани теми за устен изпит](/files/misc/uni-notes/algebra1/topics.pdf)   [източник](https://gitlab.com/Syndamia/uni-projects/-/blob/main/Year%201/Algebra/Topics/) [\*](#*) : Всичките теми, които имах да разписвам за устния изпит. Нещата са взети кажи-речи директно от лекции. ### Диференциално и интегрално смятане 1 -&&ft-text [Записки върху материала](/files/misc/uni-notes/dis1/notes.pdf)   [източник](https://gitlab.com/Syndamia/uni-projects/-/blob/main/Year%201/Calculus/) [\*](#*) +&.ft-text [Записки върху материала](/files/misc/uni-notes/dis1/notes.pdf)   [източник](https://gitlab.com/Syndamia/uni-projects/-/blob/main/Year%201/Calculus/) [\*](#*) : Главните дефиниции, формулировки на теореми и формули, които поне аз сметнах за достатъчни по ДИС 2. Обхваща материала от лекция 1 до 13 включително. -&&ft-text [Основни доказателства](/files/misc/uni-notes/dis1/notes-appendix.pdf)   [източник](https://gitlab.com/Syndamia/uni-projects/-/blob/main/Year%201/Calculus/) [\*](#*) +&.ft-text [Основни доказателства](/files/misc/uni-notes/dis1/notes-appendix.pdf)   [източник](https://gitlab.com/Syndamia/uni-projects/-/blob/main/Year%201/Calculus/) [\*](#*) : По-важните доказателства от лекции, като съм се опитал да ги формулирам по по-разбираем за мен начин. Не е завършено, напълно обхваща само лекции 1 до 5 и от части лекции 6, 8 и 9. ### Дискретни структури -&&ft-text [Записки върху материала](/files/misc/uni-notes/dstr/notes.pdf)   [източник](https://gitlab.com/Syndamia/uni-projects/-/blob/main/Year%201/Discrete%20math/) [\*](#*) +&.ft-text [Записки върху материала](/files/misc/uni-notes/dstr/notes.pdf)   [източник](https://gitlab.com/Syndamia/uni-projects/-/blob/main/Year%201/Discrete%20math/) [\*](#*) : Съществените за мен дефиниции, формулировки на теореми и формули. Обхваща лекции 1 до 7 включително.
-- cgit v1.3.1-23-gd82d From b8ba55f4cb4a32348db427682fb6d18718f5327c Mon Sep 17 00:00:00 2001 From: Syndamia Date: Mon, 26 Feb 2024 09:38:26 +0200 Subject: (te/oop-2023/w1) Converted exercises to MEL format --- src/teaching/oop-2023/week1/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/teaching/oop-2023/week1/index.md b/src/teaching/oop-2023/week1/index.md index 008e8dd..c38f0c0 100644 --- a/src/teaching/oop-2023/week1/index.md +++ b/src/teaching/oop-2023/week1/index.md @@ -9,7 +9,7 @@ GitHub classroom: [classroom.github.com/a/UPJOzHty](https://classroom.github.com Имплементирайте функция `concatString`, която приема две структури от този тип и връща низ, пак в същата структура, който е конкатенация (слепване) на първите два низа. -&&question Има ли значение дали типовете на аргументите, или на върнатата стойност, са референции или указатели (или нито едното)? +&:question Има ли значение дали типовете на аргументите, или на върнатата стойност, са референции или указатели (или нито едното)? В самия код тествайте функциите (не е нужен потребителски вход). -- cgit v1.3.1-23-gd82d From 5b177a7f7b75183cdd2fd92b7868cbe871863263 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Mon, 26 Feb 2024 09:38:40 +0200 Subject: (te/upp-2023/w3) Converted revision to MEL format --- src/teaching/upp-2023/week3/revision.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/teaching/upp-2023/week3/revision.md b/src/teaching/upp-2023/week3/revision.md index 6e684cc..b1dab08 100644 --- a/src/teaching/upp-2023/week3/revision.md +++ b/src/teaching/upp-2023/week3/revision.md @@ -1,6 +1,6 @@ # Преговор - УПП, Седмица 3, 20.10.2023 -&&presentation +&.presentation &[title35 -- cgit v1.3.1-23-gd82d From 804677a5f7649f9b78cced7381d0b1029b5be680 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Mon, 26 Feb 2024 09:39:01 +0200 Subject: (tutorials/fqc) Converted post to MEL format --- src/tutorials/fix-qc-timeout/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/tutorials/fix-qc-timeout/index.md b/src/tutorials/fix-qc-timeout/index.md index fe93cdf..9b02a48 100644 --- a/src/tutorials/fix-qc-timeout/index.md +++ b/src/tutorials/fix-qc-timeout/index.md @@ -37,7 +37,7 @@ libata.force=3.01:nodmalog ## Explanation -&&important The following is how I understand the issue, but I did not find definitive proof thats exactly what happens. +&:important The following is how I understand the issue, but I did not find definitive proof thats exactly what happens. Take this section with a grain of salt. A harddrive can support [dma transfers](https://en.wikipedia.org/wiki/Direct_memory_access), normally the CPU would handle data transfer from the harddrive to the system memory (RAM), meaning it asks for a bit of data, waits, when the data comes, puts it in memory, then asks for next bit and so on. -- cgit v1.3.1-23-gd82d From 8d84c03574f122fbac78e5dba083e96bc59dff76 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Mon, 26 Feb 2024 09:54:16 +0200 Subject: (awk-edits/MEL-Pres) Renamed certain CSS classes to be more verbose --- awk-edits/MEL-Presentation.awk | 18 +++++----- src/presentation.css | 76 +++++++++++++++++++++--------------------- 2 files changed, 47 insertions(+), 47 deletions(-) (limited to 'src') diff --git a/awk-edits/MEL-Presentation.awk b/awk-edits/MEL-Presentation.awk index b179502..cabc928 100644 --- a/awk-edits/MEL-Presentation.awk +++ b/awk-edits/MEL-Presentation.awk @@ -25,13 +25,12 @@ BEGIN { MEL["slide" fontSizes[ind], MELOPEN] = "
" MEL["slide" fontSizes[ind], MELCLOSE] = "
" - MEL["middle" fontSizes[ind], MELOPEN] = "
" + MEL["middle" fontSizes[ind], MELOPEN] = "
" MEL["middle" fontSizes[ind], MELCLOSE] = "
" - MEL["title" fontSizes[ind], MELOPEN] = "
" + MEL["title" fontSizes[ind], MELOPEN] = "
" MEL["title" fontSizes[ind], MELCLOSE] = "
" - MEL["centered" fontSizes[ind], MELOPEN] = "
" - MEL["centered" fontSizes[ind], MELCLOSE] = "
" + standardPresentationTag("centered" fontSizes[ind], "centered" fontClass) } # refer to definition of fontSizes[0] @@ -70,22 +69,23 @@ BEGIN { # for (i = 1; i <= 9; i++) { - MEL["br" i, MELINSERT] = "
" + MEL["br" i, MELINSERT] = "
" } for (i = 5; i <= 95; i++) { - standardPresentationTag("width" i "%") + standardPresentationTag("width" i "%", "width" i "per") } # # Ordinary # - standardPresentationTag("fright") + standardPresentationTag("fright", "float-right") standardPresentationTag("column") } -function standardPresentationTag(name) { - MEL[name, MELOPEN] = "
" +function standardPresentationTag(name, class) { + if (class == "") class = name + MEL[name, MELOPEN] = "
" MEL[name, MELCLOSE] = "
" } diff --git a/src/presentation.css b/src/presentation.css index cc82b04..7dbb26a 100644 --- a/src/presentation.css +++ b/src/presentation.css @@ -62,18 +62,18 @@ } .slide .h-anchor, .slide .gap, .slide .gap-small { display: none; } - .clide { display: flex; flex-direction: column; } - .clide > * { flex: 1; } + .centered-slide { display: flex; flex-direction: column; } + .centered-slide > * { flex: 1; } .centered, - .centered .width5, .centered .width10, .centered .width15, .centered .width20, - .centered .width25, .centered .width30, .centered .width35, .centered .width40, - .centered .width45, .centered .width50, .centered .width55, .centered .width60, - .centered .width65, .centered .width70, .centered .width75, .centered .width80, - .centered .width85, .centered .width90, .centered .width95 + .centered .width5per, .centered .width10per, .centered .width15per, .centered .width20per, + .centered .width25per, .centered .width30per, .centered .width35per, .centered .width40per, + .centered .width45per, .centered .width50per, .centered .width55per, .centered .width60per, + .centered .width65per, .centered .width70per, .centered .width75per, .centered .width80per, + .centered .width85per, .centered .width90per, .centered .width95per { margin-left: auto; margin-right: auto; text-align: center; } - .fright { float: right; text-align: right; } - * + .fright { margin-left: 1em; } + .float-right { float: right; text-align: right; } + * + .float-right { margin-left: 1em; } .layout-table { margin: 0; @@ -100,35 +100,35 @@ .font27 { font-size: 27px; } .font35 { font-size: 35px; } - .lineb1 { padding: 0.5em; } - .lineb2 { padding: 1.0em; } - .lineb3 { padding: 1.5em; } - .lineb4 { padding: 2.0em; } - .lineb5 { padding: 2.5em; } - .lineb6 { padding: 3.0em; } - .lineb7 { padding: 3.5em; } - .lineb8 { padding: 4.0em; } - .lineb9 { padding: 4.5em; } - - .width5 { width: 5%; } - .width10 { width: 10%; } - .width15 { width: 15%; } - .width20 { width: 20%; } - .width25 { width: 25%; } - .width30 { width: 30%; } - .width35 { width: 35%; } - .width40 { width: 40%; } - .width45 { width: 45%; } - .width50 { width: 50%; } - .width55 { width: 55%; } - .width60 { width: 60%; } - .width65 { width: 65%; } - .width70 { width: 70%; } - .width75 { width: 75%; } - .width80 { width: 80%; } - .width85 { width: 85%; } - .width90 { width: 90%; } - .width95 { width: 95%; } + .br1 { padding: 0.5em; } + .br2 { padding: 1.0em; } + .br3 { padding: 1.5em; } + .br4 { padding: 2.0em; } + .br5 { padding: 2.5em; } + .br6 { padding: 3.0em; } + .br7 { padding: 3.5em; } + .br8 { padding: 4.0em; } + .br9 { padding: 4.5em; } + + .width5per { width: 5%; } + .width10per { width: 10%; } + .width15per { width: 15%; } + .width20per { width: 20%; } + .width25per { width: 25%; } + .width30per { width: 30%; } + .width35per { width: 35%; } + .width40per { width: 40%; } + .width45per { width: 45%; } + .width50per { width: 50%; } + .width55per { width: 55%; } + .width60per { width: 60%; } + .width65per { width: 65%; } + .width70per { width: 70%; } + .width75per { width: 75%; } + .width80per { width: 80%; } + .width85per { width: 85%; } + .width90per { width: 90%; } + .width95per { width: 95%; } /* Presenting mode -- cgit v1.3.1-23-gd82d From 807f91c5df8cece094e8c1ceba604d6a7f438026 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Mon, 26 Feb 2024 09:54:36 +0200 Subject: (presentation.css) Minor styling adjustments --- src/presentation.css | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/presentation.css b/src/presentation.css index 7dbb26a..01b1a6f 100644 --- a/src/presentation.css +++ b/src/presentation.css @@ -3,11 +3,11 @@ .slide { box-sizing: border-box; height: 210mm; - padding: 1em; + padding: 30px; width: 297mm; /* Size of landscape A4 paper */ font-size: 30px; transform-origin: 0 0; - margin-bottom: 1em; + margin-bottom: 30px; } .absolute-slide { border: none !important; @@ -53,7 +53,7 @@ .slide > div:only-child > ol:first-child > li:first-child > *:first-child { margin-top: 0; } - .slide ul, .slide ol { padding-inline-start: 30px; } + .slide ul, .slide ol { padding-inline-start: 30px; margin: 0; } .slide .svg { max-height: 1em !important; } .slide h2, .slide h3, .slide h4, .slide h5, .slide h6 { display: block; -- cgit v1.3.1-23-gd82d From f5d1e97bd7facdfbcee835a5e0d851d2c91645b5 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Mon, 26 Feb 2024 21:58:49 +0200 Subject: [favicon] Switched to a 96x96 ICO file, from 512x512 PNG --- src/_header.html | 4 ++-- src/img/favicon.ico | Bin 0 -> 38078 bytes src/img/favicon.png | Bin 3078 -> 0 bytes 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 src/img/favicon.ico delete mode 100644 src/img/favicon.png (limited to 'src') diff --git a/src/_header.html b/src/_header.html index 38046bc..2bac64b 100644 --- a/src/_header.html +++ b/src/_header.html @@ -5,8 +5,8 @@ - - + + diff --git a/src/img/favicon.ico b/src/img/favicon.ico new file mode 100644 index 0000000..79143ba Binary files /dev/null and b/src/img/favicon.ico differ diff --git a/src/img/favicon.png b/src/img/favicon.png deleted file mode 100644 index 01863d8..0000000 Binary files a/src/img/favicon.png and /dev/null differ -- cgit v1.3.1-23-gd82d From a1c2d8fe71cb1585a917424bacd4aed35d389cc2 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Wed, 28 Feb 2024 10:38:40 +0200 Subject: [awk-edits/MEL-Teaching] Added special styles and single line tag for teaching articles --- awk-edits/MEL-Teaching.awk | 8 ++++++++ src/styles.csma | 14 ++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 awk-edits/MEL-Teaching.awk (limited to 'src') diff --git a/awk-edits/MEL-Teaching.awk b/awk-edits/MEL-Teaching.awk new file mode 100644 index 0000000..245d6fa --- /dev/null +++ b/awk-edits/MEL-Teaching.awk @@ -0,0 +1,8 @@ +# .*teaching/.*html + +BEGIN { + usesMEL() + + MEL["solution-link", MELLINEOPEN] = "
<" + MEL["solution-link", MELLINECLOSE] = " >
" +} diff --git a/src/styles.csma b/src/styles.csma index 2b8f9d3..764e2ec 100644 --- a/src/styles.csma +++ b/src/styles.csma @@ -257,6 +257,7 @@ {} {} {} + {} {} @@ -344,6 +345,19 @@ } } +
{ + { + .exercise-solution { + float: right; + font-weight: bold; + } + + /* Slightly smaller than browser defaults https://stackoverflow.com/a/70720104/12036073 https://stackoverflow.com/a/47560151/12036073 */ + h2 ~ .exercise-solution { font-size: 1.4em; margin-top: 0.6em; } + h3 ~ .exercise-solution { font-size: 1.1em; margin-top: 0.8em; } +} +} +
{ { -- cgit v1.3.1-23-gd82d From 74eba1a81037d62ab84fc36ef48d1845996c5e96 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Wed, 28 Feb 2024 10:40:31 +0200 Subject: [te/oop-2023/w1] Added solutions --- src/teaching/oop-2023/index.md | 3 ++- src/teaching/oop-2023/week1/index.md | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/teaching/oop-2023/index.md b/src/teaching/oop-2023/index.md index 4c5e195..214e6f3 100644 --- a/src/teaching/oop-2023/index.md +++ b/src/teaching/oop-2023/index.md @@ -14,4 +14,5 @@ |№|Дата|Материали| |-------|----|---------| -|1 |22.02.2024|[Организационно](./week1/organization.html?a) \|\| [Основни добри софтуерни практики](./week1/good-software.html?a) \|\| [Задачи](./week1/) \|\| [GitHub classroom](https://classroom.github.com/a/UPJOzHty)| +|1 |22.02.2024|[Организационно](./week1/organization.html?a) \|\| [Основни добри софтуерни практики](./week1/good-software.html?a) \|\| [Задачи](./week1/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week01) \|\| [GitHub classroom](https://classroom.github.com/a/UPJOzHty)| +|2 |29.02.2024|[Задачи](./week2/) \|\| [GitHub classroom](https://classroom.github.com/a/3qPsfyyI)| diff --git a/src/teaching/oop-2023/week1/index.md b/src/teaching/oop-2023/week1/index.md index c38f0c0..392b321 100644 --- a/src/teaching/oop-2023/week1/index.md +++ b/src/teaching/oop-2023/week1/index.md @@ -4,6 +4,8 @@ GitHub classroom: [classroom.github.com/a/UPJOzHty](https://classroom.github.com ## Задача 1 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise1.cpp) + Имплементирайте низ чрез структура. В структурата трябва да запазвате указател към низа и неговата дължина. @@ -15,6 +17,8 @@ GitHub classroom: [classroom.github.com/a/UPJOzHty](https://classroom.github.com ## Задача 2 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise2.cpp) + Имплементирайте структура за динамично-заделен масив от целочислени числа. Тя трябва да запазва указател към масива, размера на масива и бройката на елементи в масива. @@ -28,6 +32,8 @@ GitHub classroom: [classroom.github.com/a/UPJOzHty](https://classroom.github.com ## Задача 3 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise3.cpp) + Разглеждате "пакети" (логове) информация от редица датчици. Един пакет запазва времето, когато информацията е била отчетена от датчиците, и стойностите на всички датчици: температура, атмосферно налягане, влажност и надморска височина. Всички типове данни са целочислени. -- cgit v1.3.1-23-gd82d From 9b47a74829cc6310f4c71c29994b5fa9087a32d5 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Thu, 29 Feb 2024 10:15:44 +0200 Subject: [te/oop-2023/w2] Added exercises --- src/teaching/oop-2023/week2/index.md | 176 +++++++++++++++++++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 src/teaching/oop-2023/week2/index.md (limited to 'src') diff --git a/src/teaching/oop-2023/week2/index.md b/src/teaching/oop-2023/week2/index.md new file mode 100644 index 0000000..e6b0ba8 --- /dev/null +++ b/src/teaching/oop-2023/week2/index.md @@ -0,0 +1,176 @@ +# Задачи - ООП, Седмица 2, 29.02.2024 + +GitHub classroom: [classroom.github.com/a/3qPsfyyI](https://classroom.github.com/a/3qPsfyyI) + +## Задача 0 - Преговорна + +Ще работим върху N-мерен [морски шах](https://en.wikipedia.org/wiki/Tic-tac-toe), тоест ще имаме дъска за морски шах, която може да е по-голяма от 3 на 3 (примерно 5 на 5, 7 на 7 и т.н.). +Няма да се занимаваме с проверки дали (и кой) е спечелил след даден ход, интересуваме се само от запазването на данни. + +Основната логика е следната, като във всяка подточка правила по имплементацията са зададени. + +&:warn Не почвайте веднага да имплементирайте, погледнете подточките! + +В началото от входа се въвеждат два реда, всеки съответстващ на имената на даден играч (в тези имена може да има шпации). +Първият играч винаги играе като X, вторият винаги като O. + +След това се въвежда цяло число N, това е размерът на дъската. +Накрая се въвеждат NxN на брой X-ове и O-та. + +За всеки играч трябва съответно да изкарате общия брой X-ове или броя O-та в цялата дъска, както и дължината на най-дългата последователност от Х-ове или О-та в един реда на дъската (примерно за първия играч, търсим реда с най-много последователни X-ове, и изкарваме тяхната бройка). + +**Пример:** + +|Вход|Изход| +|----|-----| +|Emil Petkov
BoburaBG
5
X X O O O
O X O X X
O X X X O
O X X X X
O X O O O
|Emil Petkov: Total - 13, Longest - 4
BoburaBG: Total - 12, Longest - 3| + +### а) без структури + +&:important Решете подточката **без** структури, тоест без знания по ООП + +Имплементирайте **функция** `boardCounts`, която приема дъската и връща по някакъв начин нужните бройки: общ брой X-ове, общ брой O-та, брой X-ове в най-дългата последователност от X-ове в ред, брой O-та в най-дългата последователност от O-та в ред. + +След това имплементирайте фукция `printResult`, която приема имената на двата играча, както и бройките, върнати от `boardCounts`, и изкарва на екрана съобщенията във формата от примера. + +### б) структура за board + +"Слепете" в една съвкупност (структура) указателя към самата дъска за морски шах, както и нейния размер N. +Нека името на структурата да бъде `GameBoard`. + +Обновете `boardCounts`, така че вместо да приема дъската и размера ѝ чрез две променливи, да ги приема чрез една променлива от тип `GameBoard`. + +### в) структура за числата + +"Слепете" в една съвкупност (структура) на име `BoardCounts` четирите променливи, които `boardCounts` връща. + +Обновете `boardCounts` да връща една стойност от тип `BoardCounts`, вместо да връща четирите бройки като отделни числа. +Обновете `printResult` да приема стойност от тип `BoardCounts`, вместо да приема четирите бройки като отделни числа. + +### г) структура за цялата игра + +Сега "слепете" предходните две структури, заедно с имената на нашите играчи, в една голяма обща структура за цялата игра на име `Game`. +Тоест, всичките ни данни: дъската, бройките и имената на играчите, да се намират в `Game`. + +&:important Искам да *композирате*, тоест искам да използвате `GameBoard` и `BoardCounts` структурите в `Game` структурата. + +Обновете `boardCounts` и `printResult`, така че да използват тази структура. + +## Задача 1 - Основи от материала + +Работите върху система за инвентар на книжарница. + +&:warn Не е задължително, но е препоръчително да си направите и една структура `String` с конструктор и деструктор + +Създайте структура `Book` със скрити (private) данни за: + +- заглавие, като един низ +- автори, като масив от низове +- година на публикация, като целочислено число +- цена, като число с плаваща запетая + +За всяка от тях създайте съответните публични селектор (get-ър) и мутатор (set-ър) член-функции (методи). +Set-ърите трябва да записват стойности в данните, само когато съответните проверки са изпълнени: + +- заглавието не може да бъде празния низ +- трябва да има поне един автор, името на даден автор не може да бъде празния низ +- годината на публикация не може да надвишава 2024, не може да е по-малка от -2100 (2100 п.н.е.) и не може да бъде нула +- цената не може да е отрицателна + +Всеки от мутаторите трябва да връща булева стойност, `true` ако проверките са изпълнени (и запазването на данни е извършено) и `false` ако съответната проверка не е изпълнена (и няма промяна в данните). +Създайте съответните конструктори и деструктори. + +След това направете структура `Library`, която държи масив от книги и бройката за всяка книга (отново като скрити данни). +Най-лесния вариант е да имате втори масив, като за всеки индекс в масива с книги, на същия индекс в масива за бройки се намира съответната бройка. +Можете и да го направите чрез структура `Pair` и да имате един масив. + +Като публични методи на `Library` имплементирайте `AddBook`, която вмъква нова книга в масива, и `RemoveBook` която съответно "премахва" книга по заглавие и година. +Допълнително направете член-функция `StockBook`, която приема заглавие на книга, годината ѝ, и цяло число с което наличната бройка се увеличава. +Аналогично направете и `SellBook`. +За всики тези методи трябва да имате съответните проверки: + +- ако напълно идентична книга вече съществува, `AddBook` не трябва да я добавя на ново +- `RemoveBook` не трябва да "гърми" ако книгата не съществува +- бройката на добавени/продадени книги, подадени на `SellBook` и `StockBook`, трябва да бъдат положителни, както и книгите да съществуват + +Аналогично като при `Book`, тези функции трябва да връщат булева стойност, дали проверките са изпълнени. +Не забравяйте за конструктор и деструктор! + +&:question Можете ли да си улесните работата, ако използвате скрити член-функции? + +Не е нужно да правите потребителски вход/изход, но тествайте ръчно кода си в `main`. + +## Задача 2 + +Работите върху система за Excel-ски таблици. +Една клетка може да съдържа някаква числена стойност, или проста формула която определя тази стойност. + +Създайте структура `Cell`, която запазва (скрито) целочислена стойност, знак, който определя опреацията във формулата, и два указателя на `Cell` към двете страни на оператора. +Оператора (знака) може да бъде `+`, `-`, `*` или `/`. + +Идеята е, че ако клетката само запазва стойност, тогава оператора ще бъде нещо празно (терминираща нула например). +Обаче ако се определя от формула, тогава оператора и указателите също ще са попълнени, а запазената стойност ще действа като кеш, тоест вместо всеки път да преизчисляваме стойността когато я искаме, преизчислили сме я веднъж и я запазваме. + +За тази цел имплементирайте публична член-функция `evaluate`, ако не е запазена формула, тя не прави нищо, ако е, прави съответното изчисление и запазва резултата. +Разбира се, направете и мутатори `setValue` и `setFormula`, със съответните проверки. +Не забравяйте за конструктор и деструктор. + +Сега направете структура `Table`, която пази (скрито) двумерен масив от клетки. +Имплементирайте селектор `getCell`, който връща указател на клетка по координати и мутатор `setCell`, който приема клетка и координати в масива. + +&:question Какъв ще е типа на подадената клетка и стойностите в масива? + +Направете метод `updateCell`, чрез която стойностите на клетка по координати могат да бъдат променени, и след това всички клетки в таблицата се преизчисляват. + +Последно, имплементирайте и член-функция `printTable`, която изкарва на екрана цялата таблица, като клетката на индекси 0,0 се намира в горния ляв ъгъл, всички клетки са разделени с `|`. + +Не е нужно да правите потребителски вход/изход, но тествайте ръчно кода си в `main`. + +## Задача 3 + +Изграждате "симулация" за трафик върху секция от магистрала. + +Самата магистрала се характеризира от брой платна (ширина) и дължина. + +Върху магистралата се слагат произволен брой коли. +Всяка кола се определя с координатите си върху магистралата и своета скорост. +Всички коли се движат от "ляво" на "дясно" по магистралата, винаги в едно и също платно, без да могат да се надминават или заобикалят. +Една кола има скорост: число между 0 и 8 включително. + +В началото на симулацията, всяка кола се разпределя по случаен начин върху магистралата, и всяка кола има случайна скорост между 4 и 6 включително. +Разглеждайки от най-десните към най-левите, всяка кола се опитва да се придвижи, като нейната скорост определя с колко клетки надясно ще се мръдне. + +Ако по пътя ѝ няма други коли, тя се премества спокойно. +Ако има, тогава нейната скорост се намалява на половина, и пробва да се придвижи пак. +Ако и с намалената скорост има кола на пътя ѝ, двете коли се удрят, "предната" кола застава на място, "задната" застава директно зад нея и двете получават скорост 0. + +След като една кола успешно се е придвижила напред, тя увеличва своета скорост със случайно количество между 0 и 3. +Ако една кола се е блъснала или просто е спряла (има скорост 0), тогава увеличава своета скорост на единица, и след това продължава както нормално. + +Ако една кола успешно "излиза" от участака на магистралата, тоест тя се опитва да се придвижи някъде след края ѝ, зачитаме че успешно е минала пътя и спираме да я разглеждаме. + +Сами определете как ще изглеждат структурите за колата и магистралата, както и нужните методи. +Имайте предвид, че трябва цялата логика да присъства в тези структури, тоест в `main` трябва да присъства само някакъв инициализиращ код. + +&:important Не е позволено магистралата да бъде двумерна матрица, координатите на всяка кола се пазят в самата кола. + +Накрая пуснете симулацията няколко пъти, на всяко извикване трябва да изкарате на екрана брой получили се сблъсаци, както и броя нужни итерации с които сте обходили всички коли на пътя, докато всички те излязат от магистралата. +Симулации се различават с позиции и началните скорости на колите, бройката коли и размерите на магистралата си стоят. + +## Задача 4 + +Имате фабрика, цялата ѝ структура се разглежда като един конвейер, тоест като една редица машини, всяка от които приема някакъв материал и връща този материал преобразуван. + +Един материал се определя с три целочислени стойности: идентификационен номер, начален тип (тоест като какво се подава) и краен тип (тоест в какво се очаква да се преобразува). + +Една машина се характеризира с ефикасност спрямо материали: представете си една таблица, от едната колона има идентификационни номера на материали, от друга има числа с плаваща запетая, определящи процент ефикасност. +Допълнително за нея знаем колко материал може да преобразува, преди да се нуждае от ремонт. + +Когато даден материал е подаден на машината, тя го преобразува в материал от дадения краен тип. +Типовете на материалите са отделни стойности от идентификационните номера, тоест като е подаден материал, той се превръща в крайния тип, и трябва да намерите на кой материал точва число е началния тип. + +Всички тези данни трябва да са скрити, трябва за съответните структури да присъстват конструктори и деструктори. +Допълнително при машините трябва да има член-функция `convertMaterial`, която получава идентификационен номер на материал и бройка, и връща колко от резултатния материал е успяла да създаде (спрямо ефикасността, закръглена надолу, и дали се нуждае от ремонт по средата на работата). + +Ще получите данни за всички материали и машини, както и задачи, тоест идентификационни номера на начален и краен материал, както и бройката на началния материал. +Трябва да намерите редицата от машини, които ще създадат възможно най-много краен материал. -- cgit v1.3.1-23-gd82d From a0ed1f8c987b514b95eb5110efced612034d433c Mon Sep 17 00:00:00 2001 From: Syndamia Date: Thu, 29 Feb 2024 10:20:09 +0200 Subject: [te/oop-2023] Updated class room, times and added solutions link --- src/teaching/oop-2023/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/teaching/oop-2023/index.md b/src/teaching/oop-2023/index.md index 214e6f3..a7fa78b 100644 --- a/src/teaching/oop-2023/index.md +++ b/src/teaching/oop-2023/index.md @@ -2,13 +2,13 @@ Материали на проведените през 2023/2024 практикуми по Обектно-ориентирано програмиране на Компютърни науки (2 поток), 8 група. -**Зала:** ФМИ 019 || -**Време:** 9:15 - 11:00 || +**Зала:** ФМИ 120 || +**Време:** 13:15 - 15:00 || **Ден:** Четвъртък
**Директни връзки:** [Контакт с мен](../upp-2023/week1/welcome.html?a#section-4) | - +[Решения на задачи](https://github.com/Syndamia/oop-2023-solutions) | [Материали от семинари](https://github.com/Aleksis99/Object-Oriented-Programming_FMI_2023-2024) | [Курс в мудъл](https://learn.fmi.uni-sofia.bg/course/view.php?id=10041) -- cgit v1.3.1-23-gd82d From b213ea1c47183e1fd7a8e322d2081a39de9e2476 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Thu, 29 Feb 2024 16:12:33 +0200 Subject: [te/oop-2023/w3] Added revision exercises --- src/teaching/oop-2023/index.md | 1 + src/teaching/oop-2023/week3/index.md | 55 ++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 src/teaching/oop-2023/week3/index.md (limited to 'src') diff --git a/src/teaching/oop-2023/index.md b/src/teaching/oop-2023/index.md index a7fa78b..1a03672 100644 --- a/src/teaching/oop-2023/index.md +++ b/src/teaching/oop-2023/index.md @@ -16,3 +16,4 @@ |-------|----|---------| |1 |22.02.2024|[Организационно](./week1/organization.html?a) \|\| [Основни добри софтуерни практики](./week1/good-software.html?a) \|\| [Задачи](./week1/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week01) \|\| [GitHub classroom](https://classroom.github.com/a/UPJOzHty)| |2 |29.02.2024|[Задачи](./week2/) \|\| [GitHub classroom](https://classroom.github.com/a/3qPsfyyI)| +|3 |07.03.2024|[Задачи](./week3/)| diff --git a/src/teaching/oop-2023/week3/index.md b/src/teaching/oop-2023/week3/index.md new file mode 100644 index 0000000..9b7a3e6 --- /dev/null +++ b/src/teaching/oop-2023/week3/index.md @@ -0,0 +1,55 @@ +# Задачи - ООП, Седмица 3, 07.03.2024 + + + +## Преговорни + +### Задача 1 - Структури + +Имплементирайте структура `LightBulb`, която запазва идентифициращите данни за една крушка: + +- диаметър и дължина, и двете целочислени стойности +- тип, низ с максимална дължина от 100 знака +- серия, главна буква на латиница + +### Задача 2 - Капсулация + +Имплементирайте структура `Alarm`, която съдържа скрити следните данни: + +- име на модел, низ с максимална дължина от 1024 знака +- пин код, целочислено число +- ревизия на модела, число с плаваща запетая + +За всяка данна трябва да създадете съответните get-ъри и set-ъри, публични член-функции които съответно връщат и записват всяка от изброените скрити стойности. + +При set-ърите имплементирайте следните проверки: + +- името на модела може да има само главни букви +- пин кода трябва да бъде 4 цифри (нули са позволени) +- ревизията трябва да бъде положително число + +### Задача 3 - Капсулация с динамична памет + +Имплементирайте структура `Person`, която запазва двете имена на човек, възраст като целочислено число и неговия имейл. +Имената и имейла могат да имат произволна дължина. + +Направете конструктор, който приема възрастта и тези три низа, и копира стойностите им в динамичната памет. +Също напишете и деструктор, който коректно трие нужните данни. + +### Задача 4 - Динамично-заделени структури в други структури + +Имплементирайте структура `Bus`, която запазва публично капацитета хора и километража на един автобус. + +Имплементирайте структура `BusWarehouse`, която запазва динамично-заделен масив от автобуси. +Имплементирайте конструктор, който само инициализира нужните данни, и деструктор който трие каквото трябва. + +Имплементирайте член-функция `AddBus`, която добавя автобус в инстанция на `BusWarehouse`. +Може да добавят произволен брой автобуси, тоест вътрешния динамичен масив трябва да променя размера си. + +## Лесни задачи + +*Ще бъдат попълнени в бъдеще* + +## Трудни задачи + +*Ще бъдат попълнени в бъдеще* -- cgit v1.3.1-23-gd82d From ccb144815c0697275b318aaa2b11374e5fa16b5a Mon Sep 17 00:00:00 2001 From: Syndamia Date: Thu, 29 Feb 2024 16:46:26 +0200 Subject: [te/oop-2023/w2] Added solutions link and direct solution link for ex 0 --- src/teaching/oop-2023/index.md | 2 +- src/teaching/oop-2023/week2/index.md | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/teaching/oop-2023/index.md b/src/teaching/oop-2023/index.md index 1a03672..f624f7f 100644 --- a/src/teaching/oop-2023/index.md +++ b/src/teaching/oop-2023/index.md @@ -15,5 +15,5 @@ |№|Дата|Материали| |-------|----|---------| |1 |22.02.2024|[Организационно](./week1/organization.html?a) \|\| [Основни добри софтуерни практики](./week1/good-software.html?a) \|\| [Задачи](./week1/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week01) \|\| [GitHub classroom](https://classroom.github.com/a/UPJOzHty)| -|2 |29.02.2024|[Задачи](./week2/) \|\| [GitHub classroom](https://classroom.github.com/a/3qPsfyyI)| +|2 |29.02.2024|[Задачи](./week2/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week02) \|\| [GitHub classroom](https://classroom.github.com/a/3qPsfyyI)| |3 |07.03.2024|[Задачи](./week3/)| diff --git a/src/teaching/oop-2023/week2/index.md b/src/teaching/oop-2023/week2/index.md index e6b0ba8..f5daa11 100644 --- a/src/teaching/oop-2023/week2/index.md +++ b/src/teaching/oop-2023/week2/index.md @@ -4,6 +4,8 @@ GitHub classroom: [classroom.github.com/a/3qPsfyyI](https://classroom.github.com ## Задача 0 - Преговорна +&::solution-link [Решения](https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise0.cpp) + Ще работим върху N-мерен [морски шах](https://en.wikipedia.org/wiki/Tic-tac-toe), тоест ще имаме дъска за морски шах, която може да е по-голяма от 3 на 3 (примерно 5 на 5, 7 на 7 и т.н.). Няма да се занимаваме с проверки дали (и кой) е спечелил след даден ход, интересуваме се само от запазването на данни. -- cgit v1.3.1-23-gd82d From c63ef7a07a29a8c75a67b64e62c8fa09a9946611 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Thu, 29 Feb 2024 18:16:21 +0200 Subject: [te/oop-2023/w2] Added solution link to exercise 2 --- src/teaching/oop-2023/week2/index.md | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src') diff --git a/src/teaching/oop-2023/week2/index.md b/src/teaching/oop-2023/week2/index.md index f5daa11..12cce24 100644 --- a/src/teaching/oop-2023/week2/index.md +++ b/src/teaching/oop-2023/week2/index.md @@ -60,6 +60,8 @@ GitHub classroom: [classroom.github.com/a/3qPsfyyI](https://classroom.github.com ## Задача 1 - Основи от материала +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise1.cpp) + Работите върху система за инвентар на книжарница. &:warn Не е задължително, но е препоръчително да си направите и една структура `String` с конструктор и деструктор -- cgit v1.3.1-23-gd82d From 08987b8621277fe293007e39f1b50f2c89e4b42c Mon Sep 17 00:00:00 2001 From: Syndamia Date: Fri, 1 Mar 2024 04:49:54 +0200 Subject: [te/oop-2023/w2] Added subpoint solution link --- src/teaching/oop-2023/week2/index.md | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'src') diff --git a/src/teaching/oop-2023/week2/index.md b/src/teaching/oop-2023/week2/index.md index 12cce24..7c15b2c 100644 --- a/src/teaching/oop-2023/week2/index.md +++ b/src/teaching/oop-2023/week2/index.md @@ -29,6 +29,8 @@ GitHub classroom: [classroom.github.com/a/3qPsfyyI](https://classroom.github.com ### а) без структури +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise0.cpp#L3-L83) + &:important Решете подточката **без** структури, тоест без знания по ООП Имплементирайте **функция** `boardCounts`, която приема дъската и връща по някакъв начин нужните бройки: общ брой X-ове, общ брой O-та, брой X-ове в най-дългата последователност от X-ове в ред, брой O-та в най-дългата последователност от O-та в ред. @@ -37,6 +39,8 @@ GitHub classroom: [classroom.github.com/a/3qPsfyyI](https://classroom.github.com ### б) структура за board +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise0.cpp#L85-L166) + "Слепете" в една съвкупност (структура) указателя към самата дъска за морски шах, както и нейния размер N. Нека името на структурата да бъде `GameBoard`. @@ -44,6 +48,8 @@ GitHub classroom: [classroom.github.com/a/3qPsfyyI](https://classroom.github.com ### в) структура за числата +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise0.cpp#L168-L255) + "Слепете" в една съвкупност (структура) на име `BoardCounts` четирите променливи, които `boardCounts` връща. Обновете `boardCounts` да връща една стойност от тип `BoardCounts`, вместо да връща четирите бройки като отделни числа. @@ -51,6 +57,8 @@ GitHub classroom: [classroom.github.com/a/3qPsfyyI](https://classroom.github.com ### г) структура за цялата игра +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise0.cpp#L257-L300) + Сега "слепете" предходните две структури, заедно с имената на нашите играчи, в една голяма обща структура за цялата игра на име `Game`. Тоест, всичките ни данни: дъската, бройките и имената на играчите, да се намират в `Game`. -- cgit v1.3.1-23-gd82d From 3bb126f0ea52bf6c42ff6d569a83cf81ca5b4af0 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Mon, 4 Mar 2024 15:29:57 +0200 Subject: [te/oop-2023/w3] Updated wording on revision exercises and added easy exercises --- src/teaching/oop-2023/week3/index.md | 85 +++++++++++++++++++++++++++++------- 1 file changed, 69 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/teaching/oop-2023/week3/index.md b/src/teaching/oop-2023/week3/index.md index 9b7a3e6..9e947c8 100644 --- a/src/teaching/oop-2023/week3/index.md +++ b/src/teaching/oop-2023/week3/index.md @@ -6,21 +6,21 @@ ### Задача 1 - Структури -Имплементирайте структура `LightBulb`, която запазва идентифициращите данни за една крушка: +Имплементирайте структура `Lightbulb`, която запазва идентифициращите данни за една крушка: -- диаметър и дължина, и двете целочислени стойности -- тип, низ с максимална дължина от 100 знака -- серия, главна буква на латиница +- диаметър и дължина: и двете са целочислени стойности +- тип: низ с максимална дължина от 100 знака +- серия: буква на латиница ### Задача 2 - Капсулация -Имплементирайте структура `Alarm`, която съдържа скрити следните данни: +Имплементирайте структура `Alarm`, която съдържа следните **скрити** данни: -- име на модел, низ с максимална дължина от 1024 знака -- пин код, целочислено число -- ревизия на модела, число с плаваща запетая +- име на модел: низ с максимална дължина от 1024 знака +- пин код: целочислено число +- ревизия на модела: число с плаваща запетая -За всяка данна трябва да създадете съответните get-ъри и set-ъри, публични член-функции които съответно връщат и записват всяка от изброените скрити стойности. +За всяка данна трябва да създадете съответните get-ъри и set-ъри: публични член-функции, които съответно връщат и записват всяка от изброените скрити стойности. При set-ърите имплементирайте следните проверки: @@ -28,28 +28,81 @@ - пин кода трябва да бъде 4 цифри (нули са позволени) - ревизията трябва да бъде положително число +Ако дадена проверка не е изпълнена, не записвате новата стойност (и оставяте старата). + ### Задача 3 - Капсулация с динамична памет Имплементирайте структура `Person`, която запазва двете имена на човек, възраст като целочислено число и неговия имейл. -Имената и имейла могат да имат произволна дължина. +Имената и имейла са низвое с произволна дължина. -Направете конструктор, който приема възрастта и тези три низа, и копира стойностите им в динамичната памет. +Направете конструктор, който приема възрастта и тези три низа, и **копира** стойностите им в динамичната памет. Също напишете и деструктор, който коректно трие нужните данни. ### Задача 4 - Динамично-заделени структури в други структури -Имплементирайте структура `Bus`, която запазва публично капацитета хора и километража на един автобус. +Имплементирайте структура `Bus`, която публично запазва капацитета хора и километража на един автобус. Имплементирайте структура `BusWarehouse`, която запазва динамично-заделен масив от автобуси. -Имплементирайте конструктор, който само инициализира нужните данни, и деструктор който трие каквото трябва. +В конструктора се въвежда максималния брой автобуси, който може един `BusWarehouse` да съдържа. -Имплементирайте член-функция `AddBus`, която добавя автобус в инстанция на `BusWarehouse`. -Може да добавят произволен брой автобуси, тоест вътрешния динамичен масив трябва да променя размера си. +Имплементирайте конструктор, който само инициализира нужните данни, и деструктор който трие каквото трябва. +Имплементирайте член-функция `AddBus`, която добавя автобус в инстанция на `BusWarehouse`, ако има място за него. ## Лесни задачи -*Ще бъдат попълнени в бъдеще* +### Задача 5 + +Имплементирайте структура `Car`, всяка кола пази скрито своя модел като низ с произволна дължина, брой врати и брой седалки като целочислени числа. +Направете съответните get-ъри, set-ъри, конструктор и деструктор. + +Имплементирайте структура `TrafficJam`, която пази произволно дълга редица коли в задръстване. +Направете и член-функция `AddCar`, която вмъква кола в края на редицата. +Тази функция може да се извиква произволен брой пъти, затова имплементирайте и оразмеряване на вътрешната редица. + +`TrafficJam` трябва да има конструктор, деструктор и тази член-функция. + +### Задача 6 + +Ще работите с N-мерна шахматна дъска. + +Направете структура `ChessPiece`, която запазва цвета и типа на фигурата от шах, като първото е целочислена стойност, второто е буква. + +Направете структура `ChessBoard`, която по подадено N в конструктора създава шахматна дъска с размер NxN с **указатели** към съответните фигури на дъската. +Разбира се, някои от тези указатели трябва да сочат към някакви създадени шахматни фигури. + +При създаване на дъската, трябва да подредите фигурите. +На най-долните два реда присъстват белите фигури, на най-горните два - черните. +За дъска 8х8, фигурите са подредени както нормално: + +![](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 празни места, бяла пешка, бял кон. + +Ако N не е поне 5, програмата ви трябва да хвърли грешка. +Не забравяйте да напишете и деструктор. + +## Задача 7 + +"Моделирайте" (тоест сами се сетете за типовете данни и нужните структури) един град със следните харакетристики. + +В града имате два типа сгради: жилищни и търговски. + +- Жилищните се харакетиризират с цена на апратамент, бройката етажи, количеството хора, които се побират на един етаж (една стойност за всички етажи) и дали имат мазе, паркомясто и/или таван. +- Търговските се характеризират с цена на магазин, бройка етажи с паркинг, бройка етажи с магазини и максимално количество магазини, които се побират на един етаж (една стойност за всички етажи). + +Градът трябва да пази всички отделни сгради, като допълнително за всяка жилищна трябва да съхранява общата бройка жители, a за всяка търговска - общата бройка отворени магазини. +Освен това трябва да се съхрани и нещо като карта на всичките сгради: допускаме Старозагоско/Манхатънско подреждане на сградите, тоест всички сгради се намират върху някаква "решетка". + +&:question Познавате ли структурата `Pair`? + +Имплементирайте възможност за построяване и събаряне на сгради. +Направете нужните проверки на всички данни: цената да не е отрицателна, бройката жители да не надвишава капацитета на сградата и так. нат. ## Трудни задачи *Ще бъдат попълнени в бъдеще* + +## Признания + +Изображението на шахматната дъска от chess.com, направено от Hfjhjoiijklij4 за [Уикипедия](https://commons.wikimedia.org/w/index.php?curid=106440749) под лиценз CC BY-SA 4.0 -- cgit v1.3.1-23-gd82d From bcd505c99768fd641e21a37970323089cb7f5b78 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Wed, 6 Mar 2024 16:24:57 +0200 Subject: [te/oop-2023/w3] Added hard exercises and added another simple exercise --- src/teaching/oop-2023/week3/index.md | 55 ++++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/teaching/oop-2023/week3/index.md b/src/teaching/oop-2023/week3/index.md index 9e947c8..68e226f 100644 --- a/src/teaching/oop-2023/week3/index.md +++ b/src/teaching/oop-2023/week3/index.md @@ -82,7 +82,20 @@ Ако N не е поне 5, програмата ви трябва да хвърли грешка. Не забравяйте да напишете и деструктор. -## Задача 7 +### Задача 7 + +Имате затворени интервали от целочислени числа. +Разглеждаме смесване на интервали: + +- смеската на допиращи се интервали е тяхното слепване, тоест смеската на `[0, 3]` и `[3, 5]` е `[0, 5]` +- смеската на препокриващи се интервали е тяхното обединение, тоест смеската на `[0, 5]` и `[3, 8]` е `[0, 8]` + +В противен случай не можем да смесим интервалите (примерно не можем да смесим `[0, 3]` и `[4, 8]`). + +Започвайки от някакво множество с интервали, смесете колкото се може повече от тях и изкарайте всичките резултатни интервали, които не могат повече да се смесят. +Използвайте структури и член-функции. + +### Задача 8 "Моделирайте" (тоест сами се сетете за типовете данни и нужните структури) един град със следните харакетристики. @@ -101,7 +114,45 @@ ## Трудни задачи -*Ще бъдат попълнени в бъдеще* +### Задача 9 + +Ще разглеждаме нещо като UNIX-базирана файлова система. + +Един файл във файловата система се характеризира с идентификационен номер (цяло неотрицателно число), брой твърди връзки (пак цяло неотрицателно число), тип (определен от цяло число) и данни (масив от цели числа). +Ще разглеждаме два типа файлове: нормални и директории. + +В нормалните файлове, данните се интерпретират като една редица от числа. + +Директориите запазват имена на файлове (кодирани в числа, по начин който вие решите) и съответните им идентификационни номера. +Нека имената да са закодирани на четните индекси в данните, докато идентификационните номера: нечетните. +Когато една директория е запазила име към някакъв файл, броят твърди връзки на съответния файл се увеличава. + +Имплементирайте файловата система, чрез нея трябва да можем да създадем или изтрием файлове. +При изтриване на файл, броят твърди връзки към него се намалява. +Ако той стане нула, паметта за файла се освобождава. + +Във файловата система, всички файлове са подредени на случаен принцип (затова използваме идентификационен номер, вместо индекс в масив). +Винаги започваме с една празна начална директория. + +Двете функции, за създаване и изтриване, трябва да приемат масив от низове, който определя път от директории към желания файл, започвайки от началния файл. +Тоест, ако бяха подадени низовете `Documents`, `Personal`, `Health`, `receipt.txt`, тогава от началния файл намираме името `Documents` и "влизаме" в директорията със съответния идентификационен номер, в нея намираме името `Personal` и так. нат. + +### Задача 10 + +Намираме се в равнината, при която всички (двуизмерни) координати са **целочислени**. + +В нея имаме стъклени панели (прави отсечки), дефинирани с координатите на двете им крайни точки. +Допълнително всеки панел си има свой цвят (като проценти, между 0 и 1, от цветовете червено, зелено и синьо) и прозрачност (като процент, между 0 и 1). + +Също имаме и един лъч, той се характеризира с началния си координат и единичен двуизмерен вектор, определящ неговата посока на движение. +Този лъч не се пречупва и винаги се движи напред (преместването на лъча се извършва чрез `позиция = позиция + посока`). + +Чрез този лъч трябва да изкарате композитния цвят, след като лъча е минал през всички стъклени панели пред него. +Нека също композитния цвят винаги да има 100% прозрачност. + +Примерно, ако лъча премине през един панел с цветови проценти `0,1,0` и прозрачност `0.5` и още един панел с цветови проценти `0,1,1` и прозрачност `0.5`, тогава композитния цвят е `0,1,0.5`. + +&:question Колко структури ще ви трябват? ## Признания -- cgit v1.3.1-23-gd82d From 390478e4c14f54c084fdec77aaa74412f43c9285 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Wed, 6 Mar 2024 16:25:28 +0200 Subject: [te/oop-2023/w3] Added hidden GitHub classroom links --- src/teaching/oop-2023/index.md | 4 +++- src/teaching/oop-2023/week3/index.md | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/teaching/oop-2023/index.md b/src/teaching/oop-2023/index.md index f624f7f..774c82a 100644 --- a/src/teaching/oop-2023/index.md +++ b/src/teaching/oop-2023/index.md @@ -16,4 +16,6 @@ |-------|----|---------| |1 |22.02.2024|[Организационно](./week1/organization.html?a) \|\| [Основни добри софтуерни практики](./week1/good-software.html?a) \|\| [Задачи](./week1/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week01) \|\| [GitHub classroom](https://classroom.github.com/a/UPJOzHty)| |2 |29.02.2024|[Задачи](./week2/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week02) \|\| [GitHub classroom](https://classroom.github.com/a/3qPsfyyI)| -|3 |07.03.2024|[Задачи](./week3/)| +|3 |07.03.2024|[Задачи](./week3/) + + diff --git a/src/teaching/oop-2023/week3/index.md b/src/teaching/oop-2023/week3/index.md index 68e226f..f560b6c 100644 --- a/src/teaching/oop-2023/week3/index.md +++ b/src/teaching/oop-2023/week3/index.md @@ -1,6 +1,6 @@ # Задачи - ООП, Седмица 3, 07.03.2024 - + ## Преговорни -- cgit v1.3.1-23-gd82d From 0f33cbbae4e23f3f00f11ba3ac70dce6ddc4c14b Mon Sep 17 00:00:00 2001 From: Syndamia Date: Thu, 7 Mar 2024 07:29:50 +0200 Subject: [te/oop-2023/w3] Made classroom links visible --- src/teaching/oop-2023/index.md | 4 +--- src/teaching/oop-2023/week3/index.md | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/teaching/oop-2023/index.md b/src/teaching/oop-2023/index.md index 774c82a..dda1df9 100644 --- a/src/teaching/oop-2023/index.md +++ b/src/teaching/oop-2023/index.md @@ -16,6 +16,4 @@ |-------|----|---------| |1 |22.02.2024|[Организационно](./week1/organization.html?a) \|\| [Основни добри софтуерни практики](./week1/good-software.html?a) \|\| [Задачи](./week1/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week01) \|\| [GitHub classroom](https://classroom.github.com/a/UPJOzHty)| |2 |29.02.2024|[Задачи](./week2/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week02) \|\| [GitHub classroom](https://classroom.github.com/a/3qPsfyyI)| -|3 |07.03.2024|[Задачи](./week3/) - - +|3 |07.03.2024|[Задачи](./week3/) \|\| [GitHub classroom](https://classroom.github.com/a/KPMqXsFp)| diff --git a/src/teaching/oop-2023/week3/index.md b/src/teaching/oop-2023/week3/index.md index f560b6c..3d73a17 100644 --- a/src/teaching/oop-2023/week3/index.md +++ b/src/teaching/oop-2023/week3/index.md @@ -1,6 +1,6 @@ # Задачи - ООП, Седмица 3, 07.03.2024 - +GitHub classroom: [classroom.github.com/a/KPMqXsFp](https://classroom.github.com/a/KPMqXsFp) ## Преговорни -- cgit v1.3.1-23-gd82d From 2a2047450282f66156bec11ee5f6ab3fadf36f29 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Thu, 7 Mar 2024 20:00:51 +0200 Subject: [te/oop-2023/w3] Added solutions to some exercises --- src/teaching/oop-2023/week3/index.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'src') diff --git a/src/teaching/oop-2023/week3/index.md b/src/teaching/oop-2023/week3/index.md index 3d73a17..be8d3b7 100644 --- a/src/teaching/oop-2023/week3/index.md +++ b/src/teaching/oop-2023/week3/index.md @@ -6,6 +6,8 @@ GitHub classroom: [classroom.github.com/a/KPMqXsFp](https://classroom.github.com ### Задача 1 - Структури +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week03/Exercise1.cpp) + Имплементирайте структура `Lightbulb`, която запазва идентифициращите данни за една крушка: - диаметър и дължина: и двете са целочислени стойности @@ -14,6 +16,8 @@ GitHub classroom: [classroom.github.com/a/KPMqXsFp](https://classroom.github.com ### Задача 2 - Капсулация +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week03/Exercise2.cpp) + Имплементирайте структура `Alarm`, която съдържа следните **скрити** данни: - име на модел: низ с максимална дължина от 1024 знака @@ -32,6 +36,8 @@ GitHub classroom: [classroom.github.com/a/KPMqXsFp](https://classroom.github.com ### Задача 3 - Капсулация с динамична памет +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week03/Exercise3.cpp) + Имплементирайте структура `Person`, която запазва двете имена на човек, възраст като целочислено число и неговия имейл. Имената и имейла са низвое с произволна дължина. @@ -40,6 +46,8 @@ GitHub classroom: [classroom.github.com/a/KPMqXsFp](https://classroom.github.com ### Задача 4 - Динамично-заделени структури в други структури +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week03/Exercise4.cpp) + Имплементирайте структура `Bus`, която публично запазва капацитета хора и километража на един автобус. Имплементирайте структура `BusWarehouse`, която запазва динамично-заделен масив от автобуси. @@ -52,6 +60,8 @@ GitHub classroom: [classroom.github.com/a/KPMqXsFp](https://classroom.github.com ### Задача 5 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week03/Exercise5.cpp) + Имплементирайте структура `Car`, всяка кола пази скрито своя модел като низ с произволна дължина, брой врати и брой седалки като целочислени числа. Направете съответните get-ъри, set-ъри, конструктор и деструктор. @@ -63,6 +73,8 @@ GitHub classroom: [classroom.github.com/a/KPMqXsFp](https://classroom.github.com ### Задача 6 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week03/Exercise6.cpp) + Ще работите с N-мерна шахматна дъска. Направете структура `ChessPiece`, която запазва цвета и типа на фигурата от шах, като първото е целочислена стойност, второто е буква. @@ -84,6 +96,8 @@ GitHub classroom: [classroom.github.com/a/KPMqXsFp](https://classroom.github.com ### Задача 7 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week03/Exercise7.cpp) + Имате затворени интервали от целочислени числа. Разглеждаме смесване на интервали: -- cgit v1.3.1-23-gd82d From 56accd0a95cb7146ad3ad82bb7c3e6593b7d4973 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Mon, 11 Mar 2024 15:04:53 +0200 Subject: [te/oop-2023/w3] Added solution in index page --- src/teaching/oop-2023/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/teaching/oop-2023/index.md b/src/teaching/oop-2023/index.md index dda1df9..17584ba 100644 --- a/src/teaching/oop-2023/index.md +++ b/src/teaching/oop-2023/index.md @@ -16,4 +16,4 @@ |-------|----|---------| |1 |22.02.2024|[Организационно](./week1/organization.html?a) \|\| [Основни добри софтуерни практики](./week1/good-software.html?a) \|\| [Задачи](./week1/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week01) \|\| [GitHub classroom](https://classroom.github.com/a/UPJOzHty)| |2 |29.02.2024|[Задачи](./week2/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week02) \|\| [GitHub classroom](https://classroom.github.com/a/3qPsfyyI)| -|3 |07.03.2024|[Задачи](./week3/) \|\| [GitHub classroom](https://classroom.github.com/a/KPMqXsFp)| +|3 |07.03.2024|[Задачи](./week3/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week03) \|\| [GitHub classroom](https://classroom.github.com/a/KPMqXsFp)| -- cgit v1.3.1-23-gd82d From 48207d01afce05df90f498cf59985645f113042f Mon Sep 17 00:00:00 2001 From: Syndamia Date: Wed, 13 Mar 2024 10:32:01 +0200 Subject: (te/oop-2023/w4) Added revison and simple exercises --- src/teaching/oop-2023/week4/index.md | 71 ++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/teaching/oop-2023/week4/index.md (limited to 'src') diff --git a/src/teaching/oop-2023/week4/index.md b/src/teaching/oop-2023/week4/index.md new file mode 100644 index 0000000..db15412 --- /dev/null +++ b/src/teaching/oop-2023/week4/index.md @@ -0,0 +1,71 @@ +# Задачи - ООП, Седмица 4, 14.03.2024 + + + +## Преговорни + +### Задача 1 - Капсулация + +Имплементирайте структура `Smartphone`, която запазва **скрито**: + +- марка, низ с максимална дължина от 128 знака +- модел, низ с максимална дължина от 512 знака +- година на произвеждане, неотрицателно целочислено число +- резолюция на камера, число с плаваща запетая (обозначаващо мегапиксели) + +За всяка стойност напревете съответните get-ъри и set-ъри, правейки следните проверки при set-ърите: + +- марката и моделът не могат да бъдат празни низове, или пък да надвишават максималната дължина +- годината трябва да бъде между 2000 и 2024 +- резолюцията не може да бъде отрицателна (може да бъде нула, което показва, че смартфонът няма камера) + +При неизпълнено условие, хвърляте грешка. + +### Задача 2 - Капсулация с динамична памет + +Имплементирайте структура `Bee`, която запазва възрастта на пчела чрез число с плаваща запетая и типа пчела с буква. + +Имплементирайте структура `BeeHive`, която запазва динамично-заделен масив с всички реещи се пчели и друг динамично-заделен масив с всички яйца в кошера. +Размерите на двата масива се подават на конструктора. +Имплементирайте нужните конструктор и деструктор. + +## Лесни задачи + +### Задача 3 + +Имплементирайте структура `Paper`, която запазва своето текстово съдържание като низ от максимум 1024 знака и положително цяло число, определящо номера на страницата. + +От входа получавате на един ред цялото текстото съдържание за един обект от тип `Paper` и на следващия ред - бройките копия `N` на дадения обект. + +Създайте `Paper` обект със съответното съдържание и номер на страницата `1`. +Създайте динамично-заделен масив от `Paper` с размер `N`, като първия му елемент е новосъздадения обект, докато останалите са **копия** на първия обект. + +При всяко копие, трябва да увеличите номера на страницата. +Имплементирейте логиката чрез копиращ конструктор. + +### Задача 4 + +Създайте структура `DynamicString`, чиито конструктор приема низ с терминираща нула, заделя точно толкова динамична памет, колкото е нужно да се запази целия низ и копира буквите на низа в тази памет. +Имплементирайте оператор равно. + +&:question Какви данни трябва `DynamicString` да запазва скрито? + +&:question Какво трябва оператор равно да направи, ако записваме в `DynamicString` с вече заделена памет? + Тоест ако имахме: + `DynamicString s1("Hello"); DynamicString s2("World"); s2 = s1;` + +### Задача 5 + +Имплементирайте структура `TVProgram`, която запазва името на предаването като низ от максимум 1024 знака, начало на излъчване и край на излъчване като неотрицателни целочислени числа (като примерно 1347 е един часа и 47 минути следобед). +Имплементирайте конструктор, деструктор, оператор равно и копиращ конструктор. + +Имплементирайте структура `TVChannel`, която запазва динамично заделен масив от `TVProgram`, размера на динамично заделената памет и броя "ненулеви" елементи (програми, добавени с `AddProgram`). + +Имплементирайте нейн метод `AddProgram`, който приема `TVProgram` **по копие** и го вмъква на последната свободна позиция в масива. +Ако масива е пълен, трябва да го "оразмерите" (да направите нов, по-голям масив, да копирате данните от стария в новия, да изтриете стария и да обновите указателя да сочи към новия). + +&:question Кога използвате копиращия конструктор на `TVProgram` и кога използвате оператор равно? + +## Трудни задачи + +*Ще бъдат попълнени в бъдеще* -- cgit v1.3.1-23-gd82d From 0e3952ad2952b2f396f3969c6dc1e0e025a60cfa Mon Sep 17 00:00:00 2001 From: Syndamia Date: Wed, 13 Mar 2024 10:33:23 +0200 Subject: (te/oop-2023/w4) Added link on index page --- src/teaching/oop-2023/index.md | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/teaching/oop-2023/index.md b/src/teaching/oop-2023/index.md index 17584ba..eabcada 100644 --- a/src/teaching/oop-2023/index.md +++ b/src/teaching/oop-2023/index.md @@ -17,3 +17,4 @@ |1 |22.02.2024|[Организационно](./week1/organization.html?a) \|\| [Основни добри софтуерни практики](./week1/good-software.html?a) \|\| [Задачи](./week1/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week01) \|\| [GitHub classroom](https://classroom.github.com/a/UPJOzHty)| |2 |29.02.2024|[Задачи](./week2/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week02) \|\| [GitHub classroom](https://classroom.github.com/a/3qPsfyyI)| |3 |07.03.2024|[Задачи](./week3/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week03) \|\| [GitHub classroom](https://classroom.github.com/a/KPMqXsFp)| +|4 |14.03.2024|[Задачи](./week4/) | -- cgit v1.3.1-23-gd82d From 2a17c8d1a276baafab373d8a40771a365a96864d Mon Sep 17 00:00:00 2001 From: Syndamia Date: Thu, 14 Mar 2024 10:19:34 +0200 Subject: (te/oop-2023/w4) Added hard exercise --- .../oop-2023/week4/img/Rotation_matrix.png | Bin 0 -> 12305 bytes src/teaching/oop-2023/week4/index.md | 31 ++++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 src/teaching/oop-2023/week4/img/Rotation_matrix.png (limited to 'src') diff --git a/src/teaching/oop-2023/week4/img/Rotation_matrix.png b/src/teaching/oop-2023/week4/img/Rotation_matrix.png new file mode 100644 index 0000000..76faa6f Binary files /dev/null and b/src/teaching/oop-2023/week4/img/Rotation_matrix.png differ diff --git a/src/teaching/oop-2023/week4/index.md b/src/teaching/oop-2023/week4/index.md index db15412..ac0190c 100644 --- a/src/teaching/oop-2023/week4/index.md +++ b/src/teaching/oop-2023/week4/index.md @@ -68,4 +68,33 @@ ## Трудни задачи -*Ще бъдат попълнени в бъдеще* +### Задача 6 + +Ще разработим (изключително груба) симулация на вселената. +За нас, гравитацията няма да бъде сила, която просто привлича тела към себе си, а сила която кара телата около нея да се въртят ("орбитират") в перфектен кръг. +Имаме много звезди и една планета, като звездите са винаги неподвижни, а планетата се влияе от тях. + +Гравитационното привличане на звезда в своя център се определя от ъгъла θmax (в градуси). +Планетата се върти около една звезда, използвайки стандартната матрица за ротация: + +![](./img/Rotation_matrix.png) + +Ъгълът на въртене θ, спрямо разстоянието до една звезда, се определя чрез [закона на обратните квадрати](https://en.wikipedia.org/wiki/Inverse-square_law), тоест в зависимост от разстоянието `d` между центъра на звездата и центъра на планетата, то истинският ъгъл на завъртане е θ = θmax * 1 / d^2. + +Допълнително, ако имаме повече от една звезда, тогава ще използваме θ' = max(θi - average(θ1, ..., θn)), където θi е намереният ъгъл θ за i-тата звезда и имаме n на брой звезди. + +Ефектът на това е, че ако имаме две звезди на еднакво разстояние с еднакъв ъгъл, тогава планетата е неподвижна, а ако някоя планета е с малко по-близка, тогава се върти около нея и то съвсем бавно. + +Приемаме, че отнема единица време планетата да се завърти с ъгъл θ', без значение размера на ъгъла. +Целта на задачата е да върнете при коя звезда и за колко единици време планетата е успяла да извърши пълна ротация (разбира се, θ' и планетата може да се измени след всяка ротация). + +Имплементирайте структури: + +- `Matrix2x2` и `Matrix2x1`, чиито стойности са числа с плаваща запетая, и с член функции за събиране и умножение (не оператор+, оператор\*) +- `Coordinate`, която запазва (**не наследява**) точките в пространството като `Matrix2x1` и имплементира събиране, умножение и разстояние между координати и матрици +- `Star`, запазваща координатата на своя център (`Matrix2x1`) и ъгълът θmax като число с плаваща запетая. + Имплементирайте и метод, който приема планета и връща ъгълът θ. +- `Planet`, запазваща своите координати (`Matrix2x1`) и изминалото време (тоест колко пъти се е движела от началото на симулацията). + Имплементирайте метод `OrbitPlanet`, която приема планета и ъгъл θ', и се завърта около нея. +- `Universe`, запазваща всички звездите и планетата. + Имплементирайте метод `FullOrbit`, която връща звездата около която планетата е успяла да извърши пълна ротация и времето за което това се е случило. -- cgit v1.3.1-23-gd82d From 750b7119ddeeb6216b22ea12ca3d64d13e9fd1af Mon Sep 17 00:00:00 2001 From: Syndamia Date: Thu, 14 Mar 2024 10:22:27 +0200 Subject: [te/oop-2023/w4] Added GitHub classroom link --- src/teaching/oop-2023/index.md | 2 +- src/teaching/oop-2023/week4/index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/teaching/oop-2023/index.md b/src/teaching/oop-2023/index.md index eabcada..bee4615 100644 --- a/src/teaching/oop-2023/index.md +++ b/src/teaching/oop-2023/index.md @@ -17,4 +17,4 @@ |1 |22.02.2024|[Организационно](./week1/organization.html?a) \|\| [Основни добри софтуерни практики](./week1/good-software.html?a) \|\| [Задачи](./week1/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week01) \|\| [GitHub classroom](https://classroom.github.com/a/UPJOzHty)| |2 |29.02.2024|[Задачи](./week2/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week02) \|\| [GitHub classroom](https://classroom.github.com/a/3qPsfyyI)| |3 |07.03.2024|[Задачи](./week3/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week03) \|\| [GitHub classroom](https://classroom.github.com/a/KPMqXsFp)| -|4 |14.03.2024|[Задачи](./week4/) | +|4 |14.03.2024|[Задачи](./week4/) \|\| [GitHub classroom](https://classroom.github.com/a/qa_FfWeG)| diff --git a/src/teaching/oop-2023/week4/index.md b/src/teaching/oop-2023/week4/index.md index ac0190c..e0d2aff 100644 --- a/src/teaching/oop-2023/week4/index.md +++ b/src/teaching/oop-2023/week4/index.md @@ -1,6 +1,6 @@ # Задачи - ООП, Седмица 4, 14.03.2024 - +GitHub classroom: [classroom.github.com/a/qa_FfWeG](https://classroom.github.com/a/qa_FfWeG) ## Преговорни -- cgit v1.3.1-23-gd82d From 8556561ee5afbe490a45d22071073e02ffa97117 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Sun, 17 Mar 2024 18:23:32 +0200 Subject: [te/oop-2023/w1] Added solution links to exercises 4 and 5 --- src/teaching/oop-2023/week1/index.md | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'src') diff --git a/src/teaching/oop-2023/week1/index.md b/src/teaching/oop-2023/week1/index.md index 392b321..df05b2e 100644 --- a/src/teaching/oop-2023/week1/index.md +++ b/src/teaching/oop-2023/week1/index.md @@ -51,11 +51,15 @@ GitHub classroom: [classroom.github.com/a/UPJOzHty](https://classroom.github.com ## Задача 4 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise4.cpp) + Направете структура за съхранение на полети[^sabre]. Трябва да запазите имената на началния и крайния град като низове (допускаме, че няма шпации в имената на градовете), часът на излитане и на кацане в целочислен формат (като на циферблат на дигитален часовник, без разделителното двоеточие) и цената на полета в тип с плаваща запетая (в долари). ### а) въвеждане +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise4.cpp#L15-L36) + От входа получавате N, това определя броя полети, които трябва да се добавят в системата. Всеки полет е редица от 5 стойности, в реда в който са дефинирани. @@ -71,6 +75,8 @@ GitHub classroom: [classroom.github.com/a/UPJOzHty](https://classroom.github.com ### б) търсене +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise4.cpp#L38-L247) + След като се въведат всички полети, получавате от входа два низа - имена на градове. Трябва да изкарате най-евтиния, и след него най-бързия, вариант за пътуване от първия град към втория. @@ -86,6 +92,8 @@ GitHub classroom: [classroom.github.com/a/UPJOzHty](https://classroom.github.com ## Задача 5 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week01/Exercise5.cpp) + Имате система за потребители, всеки потребител си има име и приятели (един приятел е **указател към потребител**). В началото се въвежда N, това е броят потребители в системата. -- cgit v1.3.1-23-gd82d From 6f537598356223c19078cacd54e0b6d3b19e76f0 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Wed, 20 Mar 2024 12:35:12 +0200 Subject: [te/oop-2023/w2] Added solution link to exercises 2-4 --- src/teaching/oop-2023/week2/index.md | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src') diff --git a/src/teaching/oop-2023/week2/index.md b/src/teaching/oop-2023/week2/index.md index 7c15b2c..f8f27d9 100644 --- a/src/teaching/oop-2023/week2/index.md +++ b/src/teaching/oop-2023/week2/index.md @@ -114,6 +114,8 @@ Set-ърите трябва да записват стойности в данн ## Задача 2 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise2.cpp) + Работите върху система за Excel-ски таблици. Една клетка може да съдържа някаква числена стойност, или проста формула която определя тази стойност. @@ -140,6 +142,8 @@ Set-ърите трябва да записват стойности в данн ## Задача 3 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise3.cpp) + Изграждате "симулация" за трафик върху секция от магистрала. Самата магистрала се характеризира от брой платна (ширина) и дължина. @@ -171,6 +175,8 @@ Set-ърите трябва да записват стойности в данн ## Задача 4 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week02/Exercise4.cpp) + Имате фабрика, цялата ѝ структура се разглежда като един конвейер, тоест като една редица машини, всяка от които приема някакъв материал и връща този материал преобразуван. Един материал се определя с три целочислени стойности: идентификационен номер, начален тип (тоест като какво се подава) и краен тип (тоест в какво се очаква да се преобразува). -- cgit v1.3.1-23-gd82d From 4dfab36628c4a0c0cf75c31ec95ed70c508f9457 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Wed, 20 Mar 2024 12:35:49 +0200 Subject: [te/ooop-2023/w3] Added solution link for exercise 8 --- src/teaching/oop-2023/week3/index.md | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src') diff --git a/src/teaching/oop-2023/week3/index.md b/src/teaching/oop-2023/week3/index.md index be8d3b7..c9b4963 100644 --- a/src/teaching/oop-2023/week3/index.md +++ b/src/teaching/oop-2023/week3/index.md @@ -111,6 +111,8 @@ GitHub classroom: [classroom.github.com/a/KPMqXsFp](https://classroom.github.com ### Задача 8 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week03/Exercise8.cpp) + "Моделирайте" (тоест сами се сетете за типовете данни и нужните структури) един град със следните харакетристики. В града имате два типа сгради: жилищни и търговски. -- cgit v1.3.1-23-gd82d From bac3c32d7475ef0c64a5ed80c7ef87ddc03508f7 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Wed, 20 Mar 2024 13:22:08 +0200 Subject: [te/oop-2023/w4] Added solution links to exercises 1-5 --- src/teaching/oop-2023/week4/index.md | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'src') diff --git a/src/teaching/oop-2023/week4/index.md b/src/teaching/oop-2023/week4/index.md index e0d2aff..b89a7a6 100644 --- a/src/teaching/oop-2023/week4/index.md +++ b/src/teaching/oop-2023/week4/index.md @@ -6,6 +6,8 @@ GitHub classroom: [classroom.github.com/a/qa_FfWeG](https://classroom.github.com ### Задача 1 - Капсулация +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week04/Exercise1.cpp) + Имплементирайте структура `Smartphone`, която запазва **скрито**: - марка, низ с максимална дължина от 128 знака @@ -23,6 +25,8 @@ GitHub classroom: [classroom.github.com/a/qa_FfWeG](https://classroom.github.com ### Задача 2 - Капсулация с динамична памет +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week04/Exercise2.cpp) + Имплементирайте структура `Bee`, която запазва възрастта на пчела чрез число с плаваща запетая и типа пчела с буква. Имплементирайте структура `BeeHive`, която запазва динамично-заделен масив с всички реещи се пчели и друг динамично-заделен масив с всички яйца в кошера. @@ -33,6 +37,8 @@ GitHub classroom: [classroom.github.com/a/qa_FfWeG](https://classroom.github.com ### Задача 3 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week04/Exercise3.cpp) + Имплементирайте структура `Paper`, която запазва своето текстово съдържание като низ от максимум 1024 знака и положително цяло число, определящо номера на страницата. От входа получавате на един ред цялото текстото съдържание за един обект от тип `Paper` и на следващия ред - бройките копия `N` на дадения обект. @@ -45,6 +51,8 @@ GitHub classroom: [classroom.github.com/a/qa_FfWeG](https://classroom.github.com ### Задача 4 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week04/Exercise4.cpp) + Създайте структура `DynamicString`, чиито конструктор приема низ с терминираща нула, заделя точно толкова динамична памет, колкото е нужно да се запази целия низ и копира буквите на низа в тази памет. Имплементирайте оператор равно. @@ -56,6 +64,8 @@ GitHub classroom: [classroom.github.com/a/qa_FfWeG](https://classroom.github.com ### Задача 5 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week04/Exercise5.cpp) + Имплементирайте структура `TVProgram`, която запазва името на предаването като низ от максимум 1024 знака, начало на излъчване и край на излъчване като неотрицателни целочислени числа (като примерно 1347 е един часа и 47 минути следобед). Имплементирайте конструктор, деструктор, оператор равно и копиращ конструктор. -- cgit v1.3.1-23-gd82d From 37df2313c8c25930a7609b69208647d565b48ce0 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Wed, 20 Mar 2024 18:17:42 +0200 Subject: [te/oop-2023/w4] Added solutions link on index page --- src/teaching/oop-2023/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/teaching/oop-2023/index.md b/src/teaching/oop-2023/index.md index bee4615..9485dca 100644 --- a/src/teaching/oop-2023/index.md +++ b/src/teaching/oop-2023/index.md @@ -17,4 +17,4 @@ |1 |22.02.2024|[Организационно](./week1/organization.html?a) \|\| [Основни добри софтуерни практики](./week1/good-software.html?a) \|\| [Задачи](./week1/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week01) \|\| [GitHub classroom](https://classroom.github.com/a/UPJOzHty)| |2 |29.02.2024|[Задачи](./week2/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week02) \|\| [GitHub classroom](https://classroom.github.com/a/3qPsfyyI)| |3 |07.03.2024|[Задачи](./week3/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week03) \|\| [GitHub classroom](https://classroom.github.com/a/KPMqXsFp)| -|4 |14.03.2024|[Задачи](./week4/) \|\| [GitHub classroom](https://classroom.github.com/a/qa_FfWeG)| +|4 |14.03.2024|[Задачи](./week4/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week04) \|\| [GitHub classroom](https://classroom.github.com/a/qa_FfWeG)| -- cgit v1.3.1-23-gd82d From d33e90e556ccd73af0cdae306e732eb33d0f8079 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Wed, 20 Mar 2024 18:21:54 +0200 Subject: [te/oop-2023/w5] Added revision and easy exercises --- src/teaching/oop-2023/index.md | 1 + src/teaching/oop-2023/week5/index.md | 97 ++++++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 src/teaching/oop-2023/week5/index.md (limited to 'src') diff --git a/src/teaching/oop-2023/index.md b/src/teaching/oop-2023/index.md index 9485dca..a7f84be 100644 --- a/src/teaching/oop-2023/index.md +++ b/src/teaching/oop-2023/index.md @@ -18,3 +18,4 @@ |2 |29.02.2024|[Задачи](./week2/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week02) \|\| [GitHub classroom](https://classroom.github.com/a/3qPsfyyI)| |3 |07.03.2024|[Задачи](./week3/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week03) \|\| [GitHub classroom](https://classroom.github.com/a/KPMqXsFp)| |4 |14.03.2024|[Задачи](./week4/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week04) \|\| [GitHub classroom](https://classroom.github.com/a/qa_FfWeG)| +|5 |15.03.2024|[Задачи](./week5/) | diff --git a/src/teaching/oop-2023/week5/index.md b/src/teaching/oop-2023/week5/index.md new file mode 100644 index 0000000..e608428 --- /dev/null +++ b/src/teaching/oop-2023/week5/index.md @@ -0,0 +1,97 @@ +# Задачи - ООП, Седмица 5, 21.03.2024 + + + +## Преговорни + +### 1 задача - Капсулация с динамична памет + +Пациент в болница се характеризира с идентификационен номер (неотрицателно целочислено число) и име (низ от максимум 1024 знака). +Една болница има максимален капацититет на болни, които може да държи (максимален брой легла за тях). + +Конструктора за болницата приема максималния капацитет, като структурата за болницата пази всичките си пациенти. +Имплементирайте методи `AddPatient`, който добавя нов пациент и `RemovePatient`, който го премахва от болницата. + +Не е нужно данните за пациентите да са скрити, но данните в болницата трябва да са. + +### 2 задача - Копиращ конструктор и оператор= + +Имплементирайте структура `FloatArray`, която запазва динамично-заделен масив от `float` стойности. +Размерът на масива се подава в конструктора. + +Имплементирайте копиращ конструктор, оператор= и get-ър/set-ър за елемент на индекс `i`. + +## Лесни задачи + +### 3 задача + +Имейл се характеризира с две стойности: адресът от който е изпратен (низ с максимална дължина от 128 знака) и съдържание (низ с неограничен размер). +Съобщението се подава като указател към знак, и трябва да заделите точно толкова динамична памет, колкото ви трябва за целия текст. + +Имплементирайте голяма четворка за имейла. + +### 4 задача + +Имплементирайте структура за касов бон, която запазва скрит динамично-заделен масив от цени (числа с плаваща запетая). +Можете да добавяте неограничен брой цени в края на касовия бон (ако масива е пълен, създавате по-голям и пренасяте стойностите). +Можете да премахвате цени според индекс (и всички следващи се преместват с една позиция назад). + +Имплементирайте тези функционалности в методи. +Имплементирайте голяма четворка. + +### 5 задача + +Един контролен списък (checklist) пази няколко неща: булева стойност, дали е избран или не, текстово съдържание (низ с "произволна" дължина) и масив от контролни списъци (всеки списък от този масив ще наричам "подсписък" за удобство). +Нека текстовото съдържание да не може да се редактира (задава се в конструктора и няма set-ър). + +Имплементирайте добавяне и премахване на подсписък, както и придвижване на подсписък с една позиция наляво или надясно. +Имплементирайте голяма четворка. + +### 6 задача + +Имате телефонен указател, който запазва масив от имена (низове). +В началото винаги започва празен. +Имплементирайте голяма четворка. + +Имплементирайте метод `InsertPerson`, който вмъква ново име в указателя, като вмъкването запазва сортировка по азбучен ред. +Тоест ако указателя беше `{ "Atanas", "Yavor" }`, тогава след вмъкване на `Boris` ще имаме `{ "Atanas", "Boris", "Yavor" }`. + +&:important Имплементирайте вмъкване, запазващо "сортираност" без функция за сортиране! + +### 7 задача + +Имплементирайте структура водомер, която скрито запазва отчетеното количество вода (double). +Има **единствено** конструктор по подразбиране, при който отчетеното количество е нула, метод `AddWater`, който увеличава брояча с подаденото количество вода и метод `Print`, който изкарва стойността на брояча на екрана. +Имплементирайте голяма четворка (когато е нужно). + +Имплементирайте структура сграда, която има инсталирани подаден брой водомери. + +Имплементирайте метод `SimulateDay`, който "симулира" ден в сградата - към всички датчици се добавят между 0 и 0.42 вода (разглеждаме само числа с максимум 3 цифри след запетаята). +Количеството е случайно за всеки ден. + +Имплементирайте метод `SimulateMonth`, който "симулира" 30 дена в сградата, като на всеки 5 дена се прави "отчет" - всичките водомери се **копират** и запазват във вътрешен масив. +На края на месеца изкарайте на екрана, на един ред, всичките водомери от първите дни (първи ден на първи отчет, първи ден на втори отчет, ...), вторите дни, ... + +### 8 задача + +Една интернет заявка се характеризира с тип (низ от максимум 4 знака), версия на протокола (положително число с плаваща запетая) и идентификатор (буква). +Нека тези данни да са скрити, като единствено могат да се set-нат от конструктора (тоест няма set-ъри, но има get-ъри) и е имлементирана голяма четворка (когато е нужно). + +Интернет сървър обработва интернет заявки, като всяка получена заявка я запазва в нормалните логове (динамично-заделен масив със заявки) **и** в логовете за грешки (друг динамично-заделен масив със заявки). + +Разглеждаме четири типа заявки: `GET`, `HEAD`, `POST` и `PUT`. +За всяка сървърът съдържа динамично-заделен масив от низове. +Имплементирайте методи за добавяне на низ към всеки тип. +Ако съответния масив от низове е пълен, тогава трябва да го уголемите. + +Имплементирайте метод `HandleRequest`, който приема интернет заявка **по копие**, запазва я в нормалните логове и връща първия низ от масива на съответния тип, който започва с идентификатор-буквата. +Ако такъв низ не съществува, тогава връща низа "Bad request" и добавя заявката **и** в логовете за грешки. + +Размерите на логовете се подават на конструктора. +По принцип добавяте нови заявки в края на лога. +Логовете са циклични, тоест ако един лог е запълен, тогава трябва да почнете да презаписвате от началото. +Имплементирайте голяма четворка. + +## Трудни задачи + +*Ще се добавят в бъдеще* -- cgit v1.3.1-23-gd82d From d707a5b69a026de271913732c8bcb11cb2888e96 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Thu, 21 Mar 2024 08:56:09 +0200 Subject: [te/oop-2023/w5] Added github classroom link --- src/teaching/oop-2023/index.md | 2 +- src/teaching/oop-2023/week5/index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/teaching/oop-2023/index.md b/src/teaching/oop-2023/index.md index a7f84be..b08a7e6 100644 --- a/src/teaching/oop-2023/index.md +++ b/src/teaching/oop-2023/index.md @@ -18,4 +18,4 @@ |2 |29.02.2024|[Задачи](./week2/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week02) \|\| [GitHub classroom](https://classroom.github.com/a/3qPsfyyI)| |3 |07.03.2024|[Задачи](./week3/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week03) \|\| [GitHub classroom](https://classroom.github.com/a/KPMqXsFp)| |4 |14.03.2024|[Задачи](./week4/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week04) \|\| [GitHub classroom](https://classroom.github.com/a/qa_FfWeG)| -|5 |15.03.2024|[Задачи](./week5/) | +|5 |15.03.2024|[Задачи](./week5/) \|\| [GitHub classroom](https://classroom.github.com/a/42ZZ56Mg)| diff --git a/src/teaching/oop-2023/week5/index.md b/src/teaching/oop-2023/week5/index.md index e608428..b4805b3 100644 --- a/src/teaching/oop-2023/week5/index.md +++ b/src/teaching/oop-2023/week5/index.md @@ -1,6 +1,6 @@ # Задачи - ООП, Седмица 5, 21.03.2024 - +GitHub classroom: [classroom.github.com/a/42ZZ56Mg](https://classroom.github.com/a/42ZZ56Mg) ## Преговорни -- cgit v1.3.1-23-gd82d From 9657dd2330bff4c58bbdf84fb2340b4a110f8212 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Thu, 21 Mar 2024 10:27:50 +0200 Subject: [te/oop-2023/w5] Added hard exercise --- src/teaching/oop-2023/week5/index.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/teaching/oop-2023/week5/index.md b/src/teaching/oop-2023/week5/index.md index b4805b3..7507384 100644 --- a/src/teaching/oop-2023/week5/index.md +++ b/src/teaching/oop-2023/week5/index.md @@ -94,4 +94,8 @@ GitHub classroom: [classroom.github.com/a/42ZZ56Mg](https://classroom.github.com ## Трудни задачи -*Ще се добавят в бъдеще* +### 9 задача + +Имате точки в равнината. +Намерете най-малкия полукръг, който съдържа половината точки в себе си. +Точки върху ръбовете на полукръга се броят като част от кръга. -- cgit v1.3.1-23-gd82d From 8da0a08204c85edf0e39394141ce16f7bdbbe86a Mon Sep 17 00:00:00 2001 From: Syndamia Date: Thu, 21 Mar 2024 13:11:20 +0200 Subject: [te/oop-2023/w5] Updated description of last exercise --- src/teaching/oop-2023/week5/index.md | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/teaching/oop-2023/week5/index.md b/src/teaching/oop-2023/week5/index.md index 7507384..1c16102 100644 --- a/src/teaching/oop-2023/week5/index.md +++ b/src/teaching/oop-2023/week5/index.md @@ -99,3 +99,4 @@ GitHub classroom: [classroom.github.com/a/42ZZ56Mg](https://classroom.github.com Имате точки в равнината. Намерете най-малкия полукръг, който съдържа половината точки в себе си. Точки върху ръбовете на полукръга се броят като част от кръга. +Центърът на полукръгът трябва да съвпада с някоя от точките. -- cgit v1.3.1-23-gd82d From b5723e47e9734554605f413151dbf729d55dbfd5 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Wed, 27 Mar 2024 21:19:59 +0200 Subject: [te/oop-2023/w5] Fixed date --- src/teaching/oop-2023/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/teaching/oop-2023/index.md b/src/teaching/oop-2023/index.md index b08a7e6..8f3858e 100644 --- a/src/teaching/oop-2023/index.md +++ b/src/teaching/oop-2023/index.md @@ -18,4 +18,4 @@ |2 |29.02.2024|[Задачи](./week2/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week02) \|\| [GitHub classroom](https://classroom.github.com/a/3qPsfyyI)| |3 |07.03.2024|[Задачи](./week3/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week03) \|\| [GitHub classroom](https://classroom.github.com/a/KPMqXsFp)| |4 |14.03.2024|[Задачи](./week4/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week04) \|\| [GitHub classroom](https://classroom.github.com/a/qa_FfWeG)| -|5 |15.03.2024|[Задачи](./week5/) \|\| [GitHub classroom](https://classroom.github.com/a/42ZZ56Mg)| +|5 |21.03.2024|[Задачи](./week5/) \|\| [GitHub classroom](https://classroom.github.com/a/42ZZ56Mg)| -- cgit v1.3.1-23-gd82d From 4c212663b278cc3a2cfeffbe65b1961a57235b40 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Wed, 27 Mar 2024 21:47:39 +0200 Subject: [te/oop-2023/w6] Added exercises --- src/teaching/oop-2023/index.md | 1 + src/teaching/oop-2023/week6/index.md | 83 ++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 src/teaching/oop-2023/week6/index.md (limited to 'src') diff --git a/src/teaching/oop-2023/index.md b/src/teaching/oop-2023/index.md index 8f3858e..6d5156d 100644 --- a/src/teaching/oop-2023/index.md +++ b/src/teaching/oop-2023/index.md @@ -19,3 +19,4 @@ |3 |07.03.2024|[Задачи](./week3/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week03) \|\| [GitHub classroom](https://classroom.github.com/a/KPMqXsFp)| |4 |14.03.2024|[Задачи](./week4/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week04) \|\| [GitHub classroom](https://classroom.github.com/a/qa_FfWeG)| |5 |21.03.2024|[Задачи](./week5/) \|\| [GitHub classroom](https://classroom.github.com/a/42ZZ56Mg)| +|6 |28.03.2024|[Задачи](./week6/) | diff --git a/src/teaching/oop-2023/week6/index.md b/src/teaching/oop-2023/week6/index.md new file mode 100644 index 0000000..893013a --- /dev/null +++ b/src/teaching/oop-2023/week6/index.md @@ -0,0 +1,83 @@ +# Задачи - ООП, Седмица 6, 28.03.2024 + + + +&:warn В задачите за файлове имплементирайте нужните проверки за съществуване на файлове. + +## Преговорни + +### 1 задача - Копиращ конструктор и оператор= + +Имплементирайте структура `WoodenPlank`, която скрито запазва ширина, дължина и височина на дъската (целочислено), цената ѝ (число с плаваща запетая) и типа дърво (низ с максимум 1024 знака). + +Имплементирайте get-ъри, set-ъри, копиращ конструктор, оператор= + +### 2 задача - Голяма четворка + +Имплементирайте структура `DynamicString`, която скрито запазва указател към низ (в динамичната памет) и неговия размер. + +Имплементирайте голяма четворка. + +## Лесни задачи + +### 3 задача + +Имплементирайте програма, която отваря файл (създава го, ако вече не е създаден) и вкарва текста "Hello World!" във файла. +Името на файла се подава от стандартния вход на един ред. + +### 4 задача + +Имплементирайте програма, която приема име на файл от стандартния вход. +Изкарайте последния ред от файла. + +Разделяме редове със знака `\n`. + +### 5 задача + +Имплементирайте програма, която приема име на файл от стандартния вход. +Изкарайте броя редове и броя думи във файла. + +### 6 задача + +От стандартния вход получавате числата m и n, както и името на файл (на свой си ред). +Изкарайте на екрана от m-тата до n-тата буква (включително) от всеки ред във файла. +Първата буква на един ред е на индекс 1. + +### 7 задача + +От стандартния вход получавате, на два отделни реда, две имена на файлове. +Вмъкнете съдържанието на втория файл по средата на първия файл. + +### 8 задача + +Имплементирайте структура `FileBuffer`, която в конструктора си приема име на файл, отваря го и запазва (копира) цялото му съдържание в динамичната памет. + +&:question Кога трябва да затворим файла? + +Имплементирайте голяма четворка. + +### 9 задача + +Имплементирайте структура `Person`, която приема име на човек (низ с максимална дължина от 1024 знака) и неговата възраст (целочислена стойност). +Имплементирайте методи `Save` и `Load`, които съответно запазват/прочитат данните в (двоичен) файл с подадено име. + +## Трудни задачи + +### 10 задача + +Имплементирайте структура `Table`, която запазва произволен брой колони и редове с низови стойности. +Броя редове/колони може да се уразмерява по време на изпълнение. +Имплементирайте голяма четворка. + +Имплементирайте методи `AddRow` и `AddColumn`, които вмъкват подадените стойности като нов ред/колона на дадения индекс. +Аналогично имплементирайте методи `RemoveRow` и `RemoveColumn`. +**Чрез всички тези** имплементирайте метода `ModifyValue`, който променя стойността на клетката на дадените индекси. + +Имплементирайте методи `Save` и `Load`, които запазват/зреждат таблицата в/от файл с подадено име, в текстовия CSV формат (всеки ред в таблицата е ред във файла, всички стойности в реда от таблицата са разделени със запетая в реда във файла). + +### 11 задача + +Имплементирайте структура `City`, която запазва името на даден град (низ с максимална дължина от 1024 знака) и масив от указатели към други градове, които са негови съседи. +Имплементирайте методи `AddNeighbour` и `RemoveNeighbour` (броя съседи може да се променя), както и голяма четворка. + +Имплементирайте методи `Save` и `Load`, които запазват/зреждат всичките достижими градове от сегашния в/от (бинарен) файл с подадено име. -- cgit v1.3.1-23-gd82d From cb553764936a4941bbdf34ff515bcf50596c42e3 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Wed, 27 Mar 2024 21:52:31 +0200 Subject: [te/oop-2023/w6] Minor wording and formatting adjustments --- src/teaching/oop-2023/week6/index.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/teaching/oop-2023/week6/index.md b/src/teaching/oop-2023/week6/index.md index 893013a..2ac6f68 100644 --- a/src/teaching/oop-2023/week6/index.md +++ b/src/teaching/oop-2023/week6/index.md @@ -2,7 +2,7 @@ -&:warn В задачите за файлове имплементирайте нужните проверки за съществуване на файлове. +&:warn В задачите за файлове имплементирайте всички нужни проверки и затваряния ## Преговорни @@ -30,7 +30,7 @@ Имплементирайте програма, която приема име на файл от стандартния вход. Изкарайте последния ред от файла. -Разделяме редове със знака `\n`. +Редовете са разделени със знака `\n`. ### 5 задача @@ -39,18 +39,18 @@ ### 6 задача -От стандартния вход получавате числата m и n, както и името на файл (на свой си ред). -Изкарайте на екрана от m-тата до n-тата буква (включително) от всеки ред във файла. -Първата буква на един ред е на индекс 1. +От стандартния вход получавате, на два отделни реда, две имена на файлове. +Вмъкнете съдържанието на втория файл по средата на първия файл. ### 7 задача -От стандартния вход получавате, на два отделни реда, две имена на файлове. -Вмъкнете съдържанието на втория файл по средата на първия файл. +От стандартния вход получавате числата m и n, както и името на файл (на свой си ред). +Изкарайте на екрана от m-тата до n-тата буква (включително) от всеки ред във файла. +Първата буква на един ред е на индекс 1. ### 8 задача -Имплементирайте структура `FileBuffer`, която в конструктора си приема име на файл, отваря го и запазва (копира) цялото му съдържание в динамичната памет. +Имплементирайте структура `FileBuffer`, която в конструктора си приема име на файл, отваря го и запазва (копира) цялото му съдържание в динамичната памет (с указател член-данна). &:question Кога трябва да затворим файла? @@ -81,3 +81,4 @@ Имплементирайте методи `AddNeighbour` и `RemoveNeighbour` (броя съседи може да се променя), както и голяма четворка. Имплементирайте методи `Save` и `Load`, които запазват/зреждат всичките достижими градове от сегашния в/от (бинарен) файл с подадено име. +Подсказвам, че не можете да запазите указателите ей-така. -- cgit v1.3.1-23-gd82d From e20e3a7b4961aec18be4e00db6a298c68ed0fc81 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Thu, 28 Mar 2024 09:47:48 +0200 Subject: [te/oop-2023/w5] Added solution link to exercises 1-7 --- src/teaching/oop-2023/index.md | 2 +- src/teaching/oop-2023/week5/index.md | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/teaching/oop-2023/index.md b/src/teaching/oop-2023/index.md index 6d5156d..411fd7f 100644 --- a/src/teaching/oop-2023/index.md +++ b/src/teaching/oop-2023/index.md @@ -18,5 +18,5 @@ |2 |29.02.2024|[Задачи](./week2/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week02) \|\| [GitHub classroom](https://classroom.github.com/a/3qPsfyyI)| |3 |07.03.2024|[Задачи](./week3/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week03) \|\| [GitHub classroom](https://classroom.github.com/a/KPMqXsFp)| |4 |14.03.2024|[Задачи](./week4/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week04) \|\| [GitHub classroom](https://classroom.github.com/a/qa_FfWeG)| -|5 |21.03.2024|[Задачи](./week5/) \|\| [GitHub classroom](https://classroom.github.com/a/42ZZ56Mg)| +|5 |21.03.2024|[Задачи](./week5/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week05) \|\| [GitHub classroom](https://classroom.github.com/a/42ZZ56Mg)| |6 |28.03.2024|[Задачи](./week6/) | diff --git a/src/teaching/oop-2023/week5/index.md b/src/teaching/oop-2023/week5/index.md index 1c16102..be66316 100644 --- a/src/teaching/oop-2023/week5/index.md +++ b/src/teaching/oop-2023/week5/index.md @@ -6,6 +6,8 @@ GitHub classroom: [classroom.github.com/a/42ZZ56Mg](https://classroom.github.com ### 1 задача - Капсулация с динамична памет +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week05/Exercise1.cpp) + Пациент в болница се характеризира с идентификационен номер (неотрицателно целочислено число) и име (низ от максимум 1024 знака). Една болница има максимален капацититет на болни, които може да държи (максимален брой легла за тях). @@ -16,6 +18,8 @@ GitHub classroom: [classroom.github.com/a/42ZZ56Mg](https://classroom.github.com ### 2 задача - Копиращ конструктор и оператор= +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week05/Exercise2.cpp) + Имплементирайте структура `FloatArray`, която запазва динамично-заделен масив от `float` стойности. Размерът на масива се подава в конструктора. @@ -25,6 +29,8 @@ GitHub classroom: [classroom.github.com/a/42ZZ56Mg](https://classroom.github.com ### 3 задача +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week05/Exercise3.cpp) + Имейл се характеризира с две стойности: адресът от който е изпратен (низ с максимална дължина от 128 знака) и съдържание (низ с неограничен размер). Съобщението се подава като указател към знак, и трябва да заделите точно толкова динамична памет, колкото ви трябва за целия текст. @@ -32,6 +38,8 @@ GitHub classroom: [classroom.github.com/a/42ZZ56Mg](https://classroom.github.com ### 4 задача +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week05/Exercise4.cpp) + Имплементирайте структура за касов бон, която запазва скрит динамично-заделен масив от цени (числа с плаваща запетая). Можете да добавяте неограничен брой цени в края на касовия бон (ако масива е пълен, създавате по-голям и пренасяте стойностите). Можете да премахвате цени според индекс (и всички следващи се преместват с една позиция назад). @@ -41,6 +49,8 @@ GitHub classroom: [classroom.github.com/a/42ZZ56Mg](https://classroom.github.com ### 5 задача +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week05/Exercise5.cpp) + Един контролен списък (checklist) пази няколко неща: булева стойност, дали е избран или не, текстово съдържание (низ с "произволна" дължина) и масив от контролни списъци (всеки списък от този масив ще наричам "подсписък" за удобство). Нека текстовото съдържание да не може да се редактира (задава се в конструктора и няма set-ър). @@ -49,6 +59,8 @@ GitHub classroom: [classroom.github.com/a/42ZZ56Mg](https://classroom.github.com ### 6 задача +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week05/Exercise6.cpp) + Имате телефонен указател, който запазва масив от имена (низове). В началото винаги започва празен. Имплементирайте голяма четворка. @@ -60,6 +72,8 @@ GitHub classroom: [classroom.github.com/a/42ZZ56Mg](https://classroom.github.com ### 7 задача +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week05/Exercise7.cpp) + Имплементирайте структура водомер, която скрито запазва отчетеното количество вода (double). Има **единствено** конструктор по подразбиране, при който отчетеното количество е нула, метод `AddWater`, който увеличава брояча с подаденото количество вода и метод `Print`, който изкарва стойността на брояча на екрана. Имплементирайте голяма четворка (когато е нужно). -- cgit v1.3.1-23-gd82d From 935e50a2404b0016ead34193fd514033171adf1e Mon Sep 17 00:00:00 2001 From: Syndamia Date: Thu, 28 Mar 2024 09:52:23 +0200 Subject: [te/oop-2023/w6] Added github classroom link --- src/teaching/oop-2023/index.md | 2 +- src/teaching/oop-2023/week6/index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/teaching/oop-2023/index.md b/src/teaching/oop-2023/index.md index 411fd7f..e1f4981 100644 --- a/src/teaching/oop-2023/index.md +++ b/src/teaching/oop-2023/index.md @@ -19,4 +19,4 @@ |3 |07.03.2024|[Задачи](./week3/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week03) \|\| [GitHub classroom](https://classroom.github.com/a/KPMqXsFp)| |4 |14.03.2024|[Задачи](./week4/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week04) \|\| [GitHub classroom](https://classroom.github.com/a/qa_FfWeG)| |5 |21.03.2024|[Задачи](./week5/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week05) \|\| [GitHub classroom](https://classroom.github.com/a/42ZZ56Mg)| -|6 |28.03.2024|[Задачи](./week6/) | +|6 |28.03.2024|[Задачи](./week6/) \|\| [GitHub classroom](https://classroom.github.com/a/rzSTn5pu)| diff --git a/src/teaching/oop-2023/week6/index.md b/src/teaching/oop-2023/week6/index.md index 2ac6f68..c531669 100644 --- a/src/teaching/oop-2023/week6/index.md +++ b/src/teaching/oop-2023/week6/index.md @@ -1,6 +1,6 @@ # Задачи - ООП, Седмица 6, 28.03.2024 - +GitHub classroom: [classroom.github.com/a/rzSTn5pu](https://classroom.github.com/a/rzSTn5pu) &:warn В задачите за файлове имплементирайте всички нужни проверки и затваряния -- cgit v1.3.1-23-gd82d From 3f639e21eb1a5bcf2f238294d92ed97e6a07e261 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Wed, 3 Apr 2024 17:50:39 +0300 Subject: [te/oop-2023/w6] Added solutions --- src/teaching/oop-2023/index.md | 2 +- src/teaching/oop-2023/week6/index.md | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/teaching/oop-2023/index.md b/src/teaching/oop-2023/index.md index e1f4981..942c082 100644 --- a/src/teaching/oop-2023/index.md +++ b/src/teaching/oop-2023/index.md @@ -19,4 +19,4 @@ |3 |07.03.2024|[Задачи](./week3/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week03) \|\| [GitHub classroom](https://classroom.github.com/a/KPMqXsFp)| |4 |14.03.2024|[Задачи](./week4/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week04) \|\| [GitHub classroom](https://classroom.github.com/a/qa_FfWeG)| |5 |21.03.2024|[Задачи](./week5/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week05) \|\| [GitHub classroom](https://classroom.github.com/a/42ZZ56Mg)| -|6 |28.03.2024|[Задачи](./week6/) \|\| [GitHub classroom](https://classroom.github.com/a/rzSTn5pu)| +|6 |28.03.2024|[Задачи](./week6/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week06) \|\| [GitHub classroom](https://classroom.github.com/a/rzSTn5pu)| diff --git a/src/teaching/oop-2023/week6/index.md b/src/teaching/oop-2023/week6/index.md index c531669..c5bd777 100644 --- a/src/teaching/oop-2023/week6/index.md +++ b/src/teaching/oop-2023/week6/index.md @@ -8,12 +8,16 @@ GitHub classroom: [classroom.github.com/a/rzSTn5pu](https://classroom.github.com ### 1 задача - Копиращ конструктор и оператор= +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week06/Exercise01.cpp) + Имплементирайте структура `WoodenPlank`, която скрито запазва ширина, дължина и височина на дъската (целочислено), цената ѝ (число с плаваща запетая) и типа дърво (низ с максимум 1024 знака). Имплементирайте get-ъри, set-ъри, копиращ конструктор, оператор= ### 2 задача - Голяма четворка +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week06/Exercise02.cpp) + Имплементирайте структура `DynamicString`, която скрито запазва указател към низ (в динамичната памет) и неговия размер. Имплементирайте голяма четворка. @@ -22,11 +26,15 @@ GitHub classroom: [classroom.github.com/a/rzSTn5pu](https://classroom.github.com ### 3 задача +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week06/Exercise03.cpp) + Имплементирайте програма, която отваря файл (създава го, ако вече не е създаден) и вкарва текста "Hello World!" във файла. Името на файла се подава от стандартния вход на един ред. ### 4 задача +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week06/Exercise04.cpp) + Имплементирайте програма, която приема име на файл от стандартния вход. Изкарайте последния ред от файла. @@ -34,22 +42,30 @@ GitHub classroom: [classroom.github.com/a/rzSTn5pu](https://classroom.github.com ### 5 задача +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week06/Exercise05.cpp) + Имплементирайте програма, която приема име на файл от стандартния вход. Изкарайте броя редове и броя думи във файла. ### 6 задача +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week06/Exercise06.cpp) + От стандартния вход получавате, на два отделни реда, две имена на файлове. Вмъкнете съдържанието на втория файл по средата на първия файл. ### 7 задача +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week06/Exercise07.cpp) + От стандартния вход получавате числата m и n, както и името на файл (на свой си ред). Изкарайте на екрана от m-тата до n-тата буква (включително) от всеки ред във файла. Първата буква на един ред е на индекс 1. ### 8 задача +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week06/Exercise08.cpp) + Имплементирайте структура `FileBuffer`, която в конструктора си приема име на файл, отваря го и запазва (копира) цялото му съдържание в динамичната памет (с указател член-данна). &:question Кога трябва да затворим файла? @@ -58,6 +74,8 @@ GitHub classroom: [classroom.github.com/a/rzSTn5pu](https://classroom.github.com ### 9 задача +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week06/Exercise09.cpp) + Имплементирайте структура `Person`, която приема име на човек (низ с максимална дължина от 1024 знака) и неговата възраст (целочислена стойност). Имплементирайте методи `Save` и `Load`, които съответно запазват/прочитат данните в (двоичен) файл с подадено име. -- cgit v1.3.1-23-gd82d From c2e4d7c2c124f71c768072d8ccbe17aa8e06fa2c Mon Sep 17 00:00:00 2001 From: Syndamia Date: Wed, 3 Apr 2024 18:57:22 +0300 Subject: [awk-edits/Pagenav] Added breadcrumbs navigation --- awk-edits/Pagenav.awk | 28 ++++++++++++++++++++++++++-- src/styles.csma | 5 ++++- 2 files changed, 30 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/awk-edits/Pagenav.awk b/awk-edits/Pagenav.awk index 14772ef..3b05c10 100644 --- a/awk-edits/Pagenav.awk +++ b/awk-edits/Pagenav.awk @@ -16,10 +16,34 @@ nopagenav == 0 && /

" ORS \ +" Reading: " (int(words / 180) + 1) " min || Created: " created " || Edited: " edited "" ORS \ +" || GitLab source" ORS \ +"

" + + # Breadcrumbs element + sub(/\/[^/]*$/, "", path) + foldersLen = split(path, folders, "/") + + href = ".." + breadcrumb = " » " folders[foldersLen] "" + for (i = foldersLen-1; i > 0; i--) { + breadcrumb = " » " "" folders[i] "" breadcrumb + href = "../" href + } + breadcrumb = \ +"
" ORS \ +" " breadcrumb ORS \ +"
" + + # Pagenav element $0 = $0 ORS \ "
" ORS \ -" Reading: " (int(words / 180) + 1) " min || Created: " created " || Edited: " edited "" ORS \ -" || GitLab source" ORS \ + stats ORS \ + breadcrumb ORS \ "
" nopagenav = 1 diff --git a/src/styles.csma b/src/styles.csma index 764e2ec..29d63fe 100644 --- a/src/styles.csma +++ b/src/styles.csma @@ -320,8 +320,11 @@ font-size: 0.8em; margin: 0 0 3rem 2rem; } - #pagenav > * { white-space: nowrap; } + #pagenav strong, #pagenav a { white-space: nowrap; } #pagenav + h2, #pagenav + h3, #pagenav + h4 { margin-top: 0; } + + #pagenav-breadcrumb { font-weight: bold; } + #pagenav-breadcrumb em { font-weight: normal; } } } -- cgit v1.3.1-23-gd82d From 90e1b53bbe01d52eec7ef821eb9e40e69fa6f0ca Mon Sep 17 00:00:00 2001 From: Syndamia Date: Thu, 4 Apr 2024 08:13:25 +0300 Subject: [te/oop-2023/w7] Added exercises and github classroom link --- src/teaching/oop-2023/index.md | 1 + src/teaching/oop-2023/week7/index.md | 67 ++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 src/teaching/oop-2023/week7/index.md (limited to 'src') diff --git a/src/teaching/oop-2023/index.md b/src/teaching/oop-2023/index.md index 942c082..78775d6 100644 --- a/src/teaching/oop-2023/index.md +++ b/src/teaching/oop-2023/index.md @@ -20,3 +20,4 @@ |4 |14.03.2024|[Задачи](./week4/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week04) \|\| [GitHub classroom](https://classroom.github.com/a/qa_FfWeG)| |5 |21.03.2024|[Задачи](./week5/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week05) \|\| [GitHub classroom](https://classroom.github.com/a/42ZZ56Mg)| |6 |28.03.2024|[Задачи](./week6/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week06) \|\| [GitHub classroom](https://classroom.github.com/a/rzSTn5pu)| +|7 |04.04.2024|[Задачи](./week7/) \|\| [GitHub classroom](https://classroom.github.com/a/vvZENbkX)| diff --git a/src/teaching/oop-2023/week7/index.md b/src/teaching/oop-2023/week7/index.md new file mode 100644 index 0000000..59e0f2d --- /dev/null +++ b/src/teaching/oop-2023/week7/index.md @@ -0,0 +1,67 @@ +# Задачи - ООП, Седмица 7, 04.04.2024 + +GitHub classroom: [classroom.github.com/a/vvZENbkX](https://classroom.github.com/a/vvZENbkX) + +## Преговорни + +### Задача 1 - Голяма петица + +Една съставка е композирана от низ (с максимална дължина от 511 знака) определящ името ѝ и грамаж (число с плаваща запетая). + +Създайте клас `Recipe`, към който могат да се прибавят и премахват произволен брой съставки. +Имплементирайте голяма петица (голяма четворка плюс move семантики) за него. + +### Задача 2 - Работа с файлове + +От един ред на входа получавате името на текстови файл. +Изкарайте на екрана средната една трета от файла, като буквите са в обратен ред. + +## Лесни задачи + +### Задача 3 + +Имплементирайте клас `Thermometer`, който запазва максималната и минималната възможна температура за измерване, както и сегашната температура, всичките които са цели неотрицателни числа. + +Имплементирайте методи `SaveText` и `LoadText`, които съответно записват и четат (тоест член-данните стават равни на тези от файла) данните си в/от **текстови** файл с подадено име. +Аналогично имплементирайте `SaveBinary` и `LoadBinary`, които работят с **двоични** файлове. + +### Задача 4 + +Имплементирайте клас `Street`, който запазва скрито името на улицата като низ с произволна дължина и номер като цяло число. +Имплементирайте голяма петица. + +Имплементирайте методите `SaveText`, `LoadText`, `SaveBinary`, `LoadBinary`. + +### Задача 5 + +За един транспортен билет е нужно скрито да пазим началната и крайната дестинация като динамично-заделени низове с произволна дължина, неговата цена като число с плаваща запетая и идентификационен номер като цяло неотрицателно число. + +Имплементирайте голяма петица и четирите функции за запазване и четене от файлове на съответния клас. + +### Задача 6 + +Имплементирайте клас `Matrix`, който запазва стойностите на матрица 2 на 2. +Предефинирайте операторите за инкрементиране, декрементиране, събиране, изваждане, умножение и вход/изход от/към поток. + +### Задача 7 + +Имплементирайте клас `Paragraph`, който съдържа текст с много редове в него. +Текстът се запазва като низ с произволна дължина, а редовете се разделят със знака `'\n'`. +Имплементирайте голяма петица. + +Имплементирайте операторите за събиране, които копират текстът от подадения параграф и го вмъкват в края на сегашния; оператор[] който връща начален указател на i-тия ред; операторите за (лексикографско) сравнение; вход/изход от/към поток. + +## Трудни задачи + +### Задача 8 + +Имплементирайте клас `MatrixNМ`, който запазва стойностите на матрица с N реда и M колони (подадени на конструктор). +Имплементирайте голяма петица. + +Имплементирайте операторите за събиране, изваждане, умножение и деление (нека да дефинираме деление на две матрици като умножението на първата матрица по транспонираната втората матрица върху детерминантата ѝ). +Ако някоя операция не е възможна, върнете съответна стойност по подразбиране. + +Имплементирайте оператор[], като индекса i е числена конкатенация на двете координати, разделени с нула (тоест ако искаме стойността на ред 27 и колона 9, тогава ще въведем индекса 2709). +Имплементирайте оператори за равенство, инкрементиране, декрементиране, побитово отместване (прилага се върху всяка стойност в матрицата), логически (&& връща true само ако двете матрици са равни, || връща true ако имат еднакви размерности и съществува поне един равен елемент на еднакви индекси). + +Имплементирайте четирите функции за записване и четене от файлове. -- cgit v1.3.1-23-gd82d From da73fd7c9dc11e796d39066ffcc86f64cf945848 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Thu, 4 Apr 2024 10:27:09 +0300 Subject: [te/oop-2023/w7] Minor wording changes --- src/teaching/oop-2023/week7/index.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/teaching/oop-2023/week7/index.md b/src/teaching/oop-2023/week7/index.md index 59e0f2d..e5df84f 100644 --- a/src/teaching/oop-2023/week7/index.md +++ b/src/teaching/oop-2023/week7/index.md @@ -43,11 +43,15 @@ GitHub classroom: [classroom.github.com/a/vvZENbkX](https://classroom.github.com Имплементирайте клас `Matrix`, който запазва стойностите на матрица 2 на 2. Предефинирайте операторите за инкрементиране, декрементиране, събиране, изваждане, умножение и вход/изход от/към поток. +Имплементирайте четирите функции за записване и четене от файлове. + ### Задача 7 Имплементирайте клас `Paragraph`, който съдържа текст с много редове в него. Текстът се запазва като низ с произволна дължина, а редовете се разделят със знака `'\n'`. + Имплементирайте голяма петица. +Имплементирайте четирите функции за записване и четене от файлове. Имплементирайте операторите за събиране, които копират текстът от подадения параграф и го вмъкват в края на сегашния; оператор[] който връща начален указател на i-тия ред; операторите за (лексикографско) сравнение; вход/изход от/към поток. @@ -56,12 +60,12 @@ GitHub classroom: [classroom.github.com/a/vvZENbkX](https://classroom.github.com ### Задача 8 Имплементирайте клас `MatrixNМ`, който запазва стойностите на матрица с N реда и M колони (подадени на конструктор). + Имплементирайте голяма петица. +Имплементирайте четирите функции за записване и четене от файлове. Имплементирайте операторите за събиране, изваждане, умножение и деление (нека да дефинираме деление на две матрици като умножението на първата матрица по транспонираната втората матрица върху детерминантата ѝ). Ако някоя операция не е възможна, върнете съответна стойност по подразбиране. Имплементирайте оператор[], като индекса i е числена конкатенация на двете координати, разделени с нула (тоест ако искаме стойността на ред 27 и колона 9, тогава ще въведем индекса 2709). Имплементирайте оператори за равенство, инкрементиране, декрементиране, побитово отместване (прилага се върху всяка стойност в матрицата), логически (&& връща true само ако двете матрици са равни, || връща true ако имат еднакви размерности и съществува поне един равен елемент на еднакви индекси). - -Имплементирайте четирите функции за записване и четене от файлове. -- cgit v1.3.1-23-gd82d From ad363ab3b9a1a154a109042a92d4b7400549ebf8 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Thu, 4 Apr 2024 20:13:39 +0300 Subject: [te/oop-2023/w7] Added solutions --- src/teaching/oop-2023/index.md | 2 +- src/teaching/oop-2023/week7/index.md | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/teaching/oop-2023/index.md b/src/teaching/oop-2023/index.md index 78775d6..5ed7b8a 100644 --- a/src/teaching/oop-2023/index.md +++ b/src/teaching/oop-2023/index.md @@ -20,4 +20,4 @@ |4 |14.03.2024|[Задачи](./week4/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week04) \|\| [GitHub classroom](https://classroom.github.com/a/qa_FfWeG)| |5 |21.03.2024|[Задачи](./week5/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week05) \|\| [GitHub classroom](https://classroom.github.com/a/42ZZ56Mg)| |6 |28.03.2024|[Задачи](./week6/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week06) \|\| [GitHub classroom](https://classroom.github.com/a/rzSTn5pu)| -|7 |04.04.2024|[Задачи](./week7/) \|\| [GitHub classroom](https://classroom.github.com/a/vvZENbkX)| +|7 |04.04.2024|[Задачи](./week7/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week07) \|\| [GitHub classroom](https://classroom.github.com/a/vvZENbkX)| diff --git a/src/teaching/oop-2023/week7/index.md b/src/teaching/oop-2023/week7/index.md index e5df84f..0eb3899 100644 --- a/src/teaching/oop-2023/week7/index.md +++ b/src/teaching/oop-2023/week7/index.md @@ -6,6 +6,8 @@ GitHub classroom: [classroom.github.com/a/vvZENbkX](https://classroom.github.com ### Задача 1 - Голяма петица +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week07/Exercise1.cpp) + Една съставка е композирана от низ (с максимална дължина от 511 знака) определящ името ѝ и грамаж (число с плаваща запетая). Създайте клас `Recipe`, към който могат да се прибавят и премахват произволен брой съставки. @@ -13,6 +15,8 @@ GitHub classroom: [classroom.github.com/a/vvZENbkX](https://classroom.github.com ### Задача 2 - Работа с файлове +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week07/Exercise2.cpp) + От един ред на входа получавате името на текстови файл. Изкарайте на екрана средната една трета от файла, като буквите са в обратен ред. @@ -20,6 +24,8 @@ GitHub classroom: [classroom.github.com/a/vvZENbkX](https://classroom.github.com ### Задача 3 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week07/Exercise3.cpp) + Имплементирайте клас `Thermometer`, който запазва максималната и минималната възможна температура за измерване, както и сегашната температура, всичките които са цели неотрицателни числа. Имплементирайте методи `SaveText` и `LoadText`, които съответно записват и четат (тоест член-данните стават равни на тези от файла) данните си в/от **текстови** файл с подадено име. @@ -27,6 +33,8 @@ GitHub classroom: [classroom.github.com/a/vvZENbkX](https://classroom.github.com ### Задача 4 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week07/Exercise4.cpp) + Имплементирайте клас `Street`, който запазва скрито името на улицата като низ с произволна дължина и номер като цяло число. Имплементирайте голяма петица. @@ -34,12 +42,16 @@ GitHub classroom: [classroom.github.com/a/vvZENbkX](https://classroom.github.com ### Задача 5 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week07/Exercise5.cpp) + За един транспортен билет е нужно скрито да пазим началната и крайната дестинация като динамично-заделени низове с произволна дължина, неговата цена като число с плаваща запетая и идентификационен номер като цяло неотрицателно число. Имплементирайте голяма петица и четирите функции за запазване и четене от файлове на съответния клас. ### Задача 6 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week07/Exercise6.cpp) + Имплементирайте клас `Matrix`, който запазва стойностите на матрица 2 на 2. Предефинирайте операторите за инкрементиране, декрементиране, събиране, изваждане, умножение и вход/изход от/към поток. -- cgit v1.3.1-23-gd82d From 11e6606e2960c8693048cd3230cb794c064a6346 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Thu, 11 Apr 2024 10:38:12 +0300 Subject: [te/oop-2023/w8] Added exercises and github classroom link --- src/teaching/oop-2023/index.md | 1 + src/teaching/oop-2023/week8/index.md | 152 +++++++++++++++++++++++++++++++++++ 2 files changed, 153 insertions(+) create mode 100644 src/teaching/oop-2023/week8/index.md (limited to 'src') diff --git a/src/teaching/oop-2023/index.md b/src/teaching/oop-2023/index.md index 5ed7b8a..039e302 100644 --- a/src/teaching/oop-2023/index.md +++ b/src/teaching/oop-2023/index.md @@ -21,3 +21,4 @@ |5 |21.03.2024|[Задачи](./week5/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week05) \|\| [GitHub classroom](https://classroom.github.com/a/42ZZ56Mg)| |6 |28.03.2024|[Задачи](./week6/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week06) \|\| [GitHub classroom](https://classroom.github.com/a/rzSTn5pu)| |7 |04.04.2024|[Задачи](./week7/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week07) \|\| [GitHub classroom](https://classroom.github.com/a/vvZENbkX)| +|8 |11.04.2024|[Задачи](./week8/) \|\| [GitHub classroom](https://classroom.github.com/a/7d0MBjcK)| diff --git a/src/teaching/oop-2023/week8/index.md b/src/teaching/oop-2023/week8/index.md new file mode 100644 index 0000000..3e3897a --- /dev/null +++ b/src/teaching/oop-2023/week8/index.md @@ -0,0 +1,152 @@ +# Задачи - ООП, Седмица 8, 11.04.2024 + +GitHub classroom: [classroom.github.com/a/7d0MBjcK](https://classroom.github.com/a/7d0MBjcK) + +## Преговорни + +### Задача 1 - Голяма петица + +Имплементирайте клас `StreetList`, който запазва имената на улици (низове с произволна дължина) в динамичен масив. +Може да се добавят нови имена в края на списъка, като съответния (вътрешен) масив трябва да се уголеми. + +Имплементирайте голяма петица за класа. + +### Задача 2 - Файлове и класове + +Имплементирайте клас `Person`, който запазва трите имена (низове с произволна дължина) и идентификационния номер (цяло неотрицателно число) на човек. +Имплементирайте голяма петица. + +Имплементирайте методи `SaveText` и `LoadText`, които съответно записват и четат (тоест член-данните стават равни на тези от файла) данните си в/от **текстови** файл с подадено име. +Аналогично имплементирайте `SaveBinary` и `LoadBinary`, които работят с **двоични** файлове. + +## Лесни + +### Задача 3 + +Имплементирайте клас `FloatArray`, който съдържа списък с числа с плаваща запетая. +Може да добавяте нови числа в края на този списък. +Имплементирйате голяма петица. + +Имплементирайте оператори: + +- += и +, които конкатенират два FloatArray-я. += вмъква елементите от десния масив в края на левия, + връща нов масив в който първо са елементите от левия масив и след тях са тези от десния. +- += и +, които приемат FloatArray и число (с плаваща запетая) и го прибавят към всеки елемент на FloatArray-я +- [], които връщат референция към елементът на подадения индекс. При невалиден хвърлят грешка. +- == и !=, които сравняват два FloatArray-я покомпонентно. Ако се различават по брой елементи или чиито стойности се различават в един и същ индекс, то те не са равни. +- <<, който вмъква всички стойности в подадения поток, разделени с шпация +- >>, който презаписва всички стойности, четейки от подадени поток, в който всички стойности са раздлени с шпация + +### Задача 4 + +Имплементирайте класът и неговите оператори от предходната задача като темплейтен (шаблонен) клас с име `DynamicArray`. +Очевидно шаблонния тип определя типа на списъка с елементи. + +### Задача 5 + +Имплементирайте шаблонната структура `Pair`, която приема два типа и запазва по една стойност от всеки тип. + +### Задача 6 + +Имплементирайте клас `NumberInput`, който запазва целочислена стойност. +В конструктора се подава минимална и максимална възможна стойност, след това (все още в конструктора) се изкарва на екрана съответно съобщение и се приема потребителски вход. +Ако той не е валиден или е извън подадения обхват, трябва да хвърлите грешка. + +В main създайте обект от този клас. +Ако се хвърли грешка, прихванете я, изкарайте на екрана съответното съобщение и пробвайте пак. +Това се повтаря докато обекта не е успешно създаден, което като се случи изкарвате въведената стойност по две. + +### Задача 7 + +Имплементирайте клас `UserError`, чиято употреба е да се хвърля като грешка. +За тази цел нека да запазва два низа, които се приемат в конструктора: името на клас и името на член-данната. + +Имплементирайте голяма петица и оператор<<, който изкарва съобщение в подадения поток с информация за класа и член-данната. +Следете бройката на създадени `UserError` инстанции в самия клас (статична променлива) и имплементирате нужната (статична) член-функция, която връща този брой. + +Преобразувайте последната задача, така че да хвърля грешка от този клас. +В края на програмата изкарайте колко грешки са се хвърлили **използвайки статичните членове на UserError**. + +## Трудни задачи + +### Задача 8 + +Имплементирайте шаблонен клас `UserInput`, който запазва стойност от подадения тип. +Ако типа е указател, тогава заделяте динамична памет за един такъв елемент. +За проверка на типа използвайте [partial template specialization](https://en.cppreference.com/w/cpp/language/partial_specialization). + +В шаблона (`template <...>`) се приема указател към валидираща функция, която приема стойността от съответния тип и връща булева стойност. +В конструктора се приема от входа нужната стойност и ако стойността е неуспешно приета или валидиращата функция върне false, тогава хвърляте грешка. +Ако типа е указател, не забравяйте да освободите паметта. + +В класа следете статично за броя пъти когато е хвърлена грешка. + +### Задача 9 + +&:important В тази задача се изикват помощни класове, прочетете цялото условие преди имплементиране! + +Имплементирайте шаблонен клас `Dictionary`, който запазва два динамично-заделени масива: първия е със стойност от подадения тип, втория е с низове. +Низовете ще се използват за индексиране, вместо числа. +Разбира се, очаквайте да може да се уразмерява. +Имплементирайте голяма петица. + +Имплементирайте оператор: + +- <<=, който вмъква всички стойности от десния `Dictionary` в левия +- [], който приема низ и връща референция "към" стойността. + Ако няма записана стойност на съответния индекс, тогава връщате референция в която може да се запише стойност. +- [], който приема число, което се конвертира до низ и работи както предходния оператор +- [], който приема низове (или числа), разделени със запетая и връща "масив" само с тези стойности +- delete, който приема стойност, върната от оператор[] и "премахва" съответната стойност от `Dictionary` +- префиксен++, префиксен+ и префиксен-, които ще се използват за итериране. + - ++ връща инкрементира индекса на сегашната стойност. + Ако индекса е равен на броя запазени стойности, тогава става нула. + По подразбиране индекса е броя. + Връща true ако след инкрементиране индекса не е броя. + - + връща референция към стойността на сегашния индекс + - - връща сегашния (низов) индекс +- ->, такъв че можем да правим `a->(&func1)->(&func2)` и `a->[&func3]->[&func4]`. + Върху всяка двойка индекс-стойност се прилагат &func1 и &func2 (приемат индекс и стойност като параметри), които връщат нова стойност, заместваща сегашната. + &func3, &func4 аналогично приемат индекс и стойност, но връщат нов индекс. + +В края на задачата трябва да можете да правите: + +```cpp +int doubleUp(const char* index, int value) { + return value * 2; +} +int sumIndexValue(const char* index, int value) { + return atoi(index) + value; +} +const char* indToName(const char* index, int value) { + if (strcmp(index, "2")) { + return "two"; + } + return index; +} + +int main() { + Dictionary a; + a["first"] = 8; + a[2] = 13; + a[89] = -68; + + Dictionary b; + b["wow"] = 99; + b["nth"] = 773; + + a <<= b; + + /* някакъв тип */ two = a["first", 2]; + + delete a["wow"]; + + a->(&doubleUp)->(&sumIndexValue)->[&indToName]; + + while (++a) { + std::cout << +a << " at " << -a << ","; + /* Ще изкара на конзолата: + * 16 at first,52 at two,-12104 at 89,1546 at nth, + */ + } +} +``` -- cgit v1.3.1-23-gd82d From 398ccf01d01096afba6b53bc2b782e2e92375c83 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Thu, 11 Apr 2024 12:10:44 +0300 Subject: [te/oop-2023/w8] Slight rewording and reordering --- src/teaching/oop-2023/week8/index.md | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/teaching/oop-2023/week8/index.md b/src/teaching/oop-2023/week8/index.md index 3e3897a..3d93c0a 100644 --- a/src/teaching/oop-2023/week8/index.md +++ b/src/teaching/oop-2023/week8/index.md @@ -23,6 +23,10 @@ GitHub classroom: [classroom.github.com/a/7d0MBjcK](https://classroom.github.com ### Задача 3 +Имплементирайте шаблонната структура `Pair`, която приема два типа и запазва по една стойност от всеки тип. + +### Задача 4 + Имплементирайте клас `FloatArray`, който съдържа списък с числа с плаваща запетая. Може да добавяте нови числа в края на този списък. Имплементирйате голяма петица. @@ -32,19 +36,16 @@ GitHub classroom: [classroom.github.com/a/7d0MBjcK](https://classroom.github.com - += и +, които конкатенират два FloatArray-я. += вмъква елементите от десния масив в края на левия, + връща нов масив в който първо са елементите от левия масив и след тях са тези от десния. - += и +, които приемат FloatArray и число (с плаваща запетая) и го прибавят към всеки елемент на FloatArray-я - [], които връщат референция към елементът на подадения индекс. При невалиден хвърлят грешка. -- == и !=, които сравняват два FloatArray-я покомпонентно. Ако се различават по брой елементи или чиито стойности се различават в един и същ индекс, то те не са равни. +- == и !=, които сравняват два FloatArray-я покомпонентно. + Ако се различават по брой елементи или ако имат две различни стойности на еднакъв индекс, тогава не са равни. - <<, който вмъква всички стойности в подадения поток, разделени с шпация -- >>, който презаписва всички стойности, четейки от подадени поток, в който всички стойности са раздлени с шпация +- >>, който презаписва всички стойности, разделени с шпация, четейки от подадени поток -### Задача 4 +### Задача 5 Имплементирайте класът и неговите оператори от предходната задача като темплейтен (шаблонен) клас с име `DynamicArray`. Очевидно шаблонния тип определя типа на списъка с елементи. -### Задача 5 - -Имплементирайте шаблонната структура `Pair`, която приема два типа и запазва по една стойност от всеки тип. - ### Задача 6 Имплементирайте клас `NumberInput`, който запазва целочислена стойност. @@ -53,14 +54,14 @@ GitHub classroom: [classroom.github.com/a/7d0MBjcK](https://classroom.github.com В main създайте обект от този клас. Ако се хвърли грешка, прихванете я, изкарайте на екрана съответното съобщение и пробвайте пак. -Това се повтаря докато обекта не е успешно създаден, което като се случи изкарвате въведената стойност по две. +Това се повтаря докато обекта не е успешно създаден, след което изкарвате въведената стойност по две. ### Задача 7 Имплементирайте клас `UserError`, чиято употреба е да се хвърля като грешка. За тази цел нека да запазва два низа, които се приемат в конструктора: името на клас и името на член-данната. -Имплементирайте голяма петица и оператор<<, който изкарва съобщение в подадения поток с информация за класа и член-данната. +Имплементирайте голяма петица и оператор<<, който изкарва съобщение с информация за класа и член-данната в подадения поток. Следете бройката на създадени `UserError` инстанции в самия клас (статична променлива) и имплементирате нужната (статична) член-функция, която връща този брой. Преобразувайте последната задача, така че да хвърля грешка от този клас. -- cgit v1.3.1-23-gd82d From 7f41e8381c291c227a4cd8df99f5d0edae5ddae7 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Wed, 17 Apr 2024 22:08:44 +0300 Subject: [te/oop-2023/w9] Added exercises --- src/teaching/oop-2023/index.md | 1 + src/teaching/oop-2023/week9/index.md | 104 +++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 src/teaching/oop-2023/week9/index.md (limited to 'src') diff --git a/src/teaching/oop-2023/index.md b/src/teaching/oop-2023/index.md index 039e302..be1fd3c 100644 --- a/src/teaching/oop-2023/index.md +++ b/src/teaching/oop-2023/index.md @@ -22,3 +22,4 @@ |6 |28.03.2024|[Задачи](./week6/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week06) \|\| [GitHub classroom](https://classroom.github.com/a/rzSTn5pu)| |7 |04.04.2024|[Задачи](./week7/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week07) \|\| [GitHub classroom](https://classroom.github.com/a/vvZENbkX)| |8 |11.04.2024|[Задачи](./week8/) \|\| [GitHub classroom](https://classroom.github.com/a/7d0MBjcK)| +|9 |18.04.2024|[Задачи](./week9/) | diff --git a/src/teaching/oop-2023/week9/index.md b/src/teaching/oop-2023/week9/index.md new file mode 100644 index 0000000..0138320 --- /dev/null +++ b/src/teaching/oop-2023/week9/index.md @@ -0,0 +1,104 @@ +# Задачи - ООП, Седмица 9, 18.04.2024 + +На днешното упражнение ще решаваме [задачата от Контролно 1](https://learn.fmi.uni-sofia.bg/mod/resource/view.php?id=311448), затова задачите ще са в същия дух (макар и да не включват най-новия материал). + + + +## Преговорни + +### Задача 1 - Голяма петица + +Реализирайте клас Printer, който съдържа модел като низ с произволна дължина и брой принтирани страници като неотрицателно цяло число. +Имплементирайте голяма петица. + +### Задача 2 - Файлове и класове + +Реализирайте клас Date, който съдържа номера на деня, месеца и годината в три отделни целочислени член-данни. +Имплементирайте член-методи `storeText`, `storeBinary`, които съответно запазват данните в текстов файл (във формата "YEAR MONTH DAY") и в двоичен файл с подадени имена. +Аналогично имплементирайте `loadText` и `loadBinary`, които презаписват член-данните с тези от подадените (имена на) файлове. + +В главната функция създайте 5 дати, запазете всяка в **един и същ текстов файл**, след това прочетете датите в **нови** 5 променливи и изкарайте датите в обратен ред. + +## Лесни + +### Задача 3 + +Реализирайте клас Train, който съдържа: + +- модел като низ с максимална дължина от 127 знака +- идентификационен номер на релсовата линия върху която се намира, като целочислена неотрицателна стойност +- име на текстов файл, съдържащ всички райони от сегашната релсова линия, всеки на нов ред. + Самото име представяйте като низ с произволна дължина. +- сегашна локация (район) от релсовата линия като низ с произволна дължина. + Тази локация не се подава, и при създаване на обекта винаги е първата във файла. + +Имплементирайте методите: + +- от голямата петица +- `TransferNextRegion`, който променя сегашната локация на следващата по ред в текстовия файл (чието име е подадено в конструктор). + Ако няма следващо по ред, тогава локацията да си остане същата и да се хвърли грешка. + Ако се срещнат проблеми с файла, хвърлете грешка. +- `SwitchRailLine`, който приема идентификационен номер на релсовата линия и име на текстов файл, и променя вътрешните стойности. + Съответно локацията трябва да бъде първата в подадения файл. + Ако се срещнат проблеми с файла, хвърлете грешка. + +Реализирайте клас TrainNetwork, който съдържа: + +- идентификационен код, като низ с максимална дължина от 7 знака +- масив, запазващ максимум 511 влака (типа се оставя по ваша преценка) + +За този клас имплементирайте методите: + +- `HaveCollided`, който приема индекс на два влака и връща дали са се блъснали. + Това се случва ако в една и съща релсова линия и един и същи регион, когато регионът не е последния възможен. +- `RunTrains`, който придвижва напред всички влакове, докато не стигнат финалната си възможна дестинация. + Влакове които са се ударили не се придвижват напред. + Връщате броя ударили се влакове. + +Да се имплементира главна функция, в която приемате име на двоичен файл от потребителя. +В този файл имате някакъв брой редици с идентификационен номер на релсова линия, брой локации върху съответната линия и всички локации като нормални низове, разделени с нови редове. + +Допълнително в главната функция приемайте от потребителя влаковете, като имената на текстовите файлове се избират от програмата (**НЕ** от потребителя) според идентификационния номер на релсовата линия и информацията във файла с редиците. +**Не може да променяте Train класа!** + +Последно в главната функция създайте обект от тип TrainNetwork и изкарайте резултата от `RunTrains` на екрана. + +## Трудни + +### Задача 4 + +Реализирайте клас Car, в който се запазват: + +- марка като низ с максимум 31 знака +- модел като низ с произволна дължина +- брой седалки като положително цяло число +- гладност на човека на всяка седлка като целочислен масив с размер броя седалки + +Имплементирайте методи: + +- от голямата петица +- `AddPassenger`, който добавя нов човек на дадения индекс на седалка +- `RemovePassenger`, който премахва човека от дадения индекс +- `TotalHunger`, който връща общото количество гладност в колата +- `StoreData`, който запазва всички данни от колата в **двоичен** файл с подадено име +- `LoadData`, който презаписва всички данни с тези от подадения по име **двоичен** файл + +Реализирайте клас DriveThrough, в който се запазват: + +- име на ресторант, към който е свързано съответния проход, като низ с произволна дължина +- коли на опашка, като масив с коли с произволна дължина + +Имплементирайте методи: + +- от голяма петица +- `QueueUp`, който приема кола и я вкарва в края на опашката. + Разбира се, масивът се уголемява ако е нужно. +- `Serve`, който изпълнява поръчката на най-предната кола в опашката. + За единица глад, ресторанта може да сготви достатъчно храна (за да нахрани клиента с "единица" храна) за единици време между половината от дължината на името на ресторанта и три пъти дължината на името на ресторанта време. + Максималното възможно количество време за изпълнение на поръчката варира и според броя коли в опашка: ако са под 6 на брой, тогава тогава се увеличава с 10%, а ако са над 10 тогава се намалява с по 5% за всяка кола след десетата. +- `EfficiencyService`, който изпълнява поръчките на всички коли в опашката и връща средно колко време е отнело на поръчка. +- `StoreData`, който запазва всички данни в **текстов** файл с подадено име +- `LoadData`, който презаписва всички данни с тези от подадения по име **текстов** файл + +Имплементирайте главна функция, в която от потребителския вход приемате име на текстов файл. +Създайте обект от тип DriveThrough, който да запълни своите стойности с тези от подадения файл и изкарайте на екрана стойността от `EfficiencyService`. -- cgit v1.3.1-23-gd82d From d4a10114fcdffa8a96d9ae9b99c7f068644c4b1b Mon Sep 17 00:00:00 2001 From: Syndamia Date: Thu, 18 Apr 2024 07:36:26 +0300 Subject: [te/oop-2023/w9] Added github classroom link --- src/teaching/oop-2023/index.md | 2 +- src/teaching/oop-2023/week9/index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/teaching/oop-2023/index.md b/src/teaching/oop-2023/index.md index be1fd3c..214d365 100644 --- a/src/teaching/oop-2023/index.md +++ b/src/teaching/oop-2023/index.md @@ -22,4 +22,4 @@ |6 |28.03.2024|[Задачи](./week6/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week06) \|\| [GitHub classroom](https://classroom.github.com/a/rzSTn5pu)| |7 |04.04.2024|[Задачи](./week7/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week07) \|\| [GitHub classroom](https://classroom.github.com/a/vvZENbkX)| |8 |11.04.2024|[Задачи](./week8/) \|\| [GitHub classroom](https://classroom.github.com/a/7d0MBjcK)| -|9 |18.04.2024|[Задачи](./week9/) | +|9 |18.04.2024|[Задачи](./week9/) \|\| [GitHub classroom](https://classroom.github.com/a/wlL1oUg2)| diff --git a/src/teaching/oop-2023/week9/index.md b/src/teaching/oop-2023/week9/index.md index 0138320..d7fe679 100644 --- a/src/teaching/oop-2023/week9/index.md +++ b/src/teaching/oop-2023/week9/index.md @@ -2,7 +2,7 @@ На днешното упражнение ще решаваме [задачата от Контролно 1](https://learn.fmi.uni-sofia.bg/mod/resource/view.php?id=311448), затова задачите ще са в същия дух (макар и да не включват най-новия материал). - +GitHub classroom: [classroom.github.com/a/wlL1oUg2](https://classroom.github.com/a/wlL1oUg2) ## Преговорни -- cgit v1.3.1-23-gd82d From a106e34b1230a8a215ff117900395bd54de1c490 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Mon, 22 Apr 2024 17:36:04 +0300 Subject: (te/oop-2023/w8) Added solution links --- src/teaching/oop-2023/index.md | 2 +- src/teaching/oop-2023/week8/index.md | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/teaching/oop-2023/index.md b/src/teaching/oop-2023/index.md index 214d365..7e801a0 100644 --- a/src/teaching/oop-2023/index.md +++ b/src/teaching/oop-2023/index.md @@ -21,5 +21,5 @@ |5 |21.03.2024|[Задачи](./week5/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week05) \|\| [GitHub classroom](https://classroom.github.com/a/42ZZ56Mg)| |6 |28.03.2024|[Задачи](./week6/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week06) \|\| [GitHub classroom](https://classroom.github.com/a/rzSTn5pu)| |7 |04.04.2024|[Задачи](./week7/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week07) \|\| [GitHub classroom](https://classroom.github.com/a/vvZENbkX)| -|8 |11.04.2024|[Задачи](./week8/) \|\| [GitHub classroom](https://classroom.github.com/a/7d0MBjcK)| |9 |18.04.2024|[Задачи](./week9/) \|\| [GitHub classroom](https://classroom.github.com/a/wlL1oUg2)| +|8 |11.04.2024|[Задачи](./week8/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week08) \|\| [GitHub classroom](https://classroom.github.com/a/7d0MBjcK)| diff --git a/src/teaching/oop-2023/week8/index.md b/src/teaching/oop-2023/week8/index.md index 3d93c0a..be78f9f 100644 --- a/src/teaching/oop-2023/week8/index.md +++ b/src/teaching/oop-2023/week8/index.md @@ -6,6 +6,8 @@ GitHub classroom: [classroom.github.com/a/7d0MBjcK](https://classroom.github.com ### Задача 1 - Голяма петица +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week08/Exercise1.cpp) + Имплементирайте клас `StreetList`, който запазва имената на улици (низове с произволна дължина) в динамичен масив. Може да се добавят нови имена в края на списъка, като съответния (вътрешен) масив трябва да се уголеми. @@ -13,6 +15,8 @@ GitHub classroom: [classroom.github.com/a/7d0MBjcK](https://classroom.github.com ### Задача 2 - Файлове и класове +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week08/Exercise2.cpp) + Имплементирайте клас `Person`, който запазва трите имена (низове с произволна дължина) и идентификационния номер (цяло неотрицателно число) на човек. Имплементирайте голяма петица. @@ -23,10 +27,14 @@ GitHub classroom: [classroom.github.com/a/7d0MBjcK](https://classroom.github.com ### Задача 3 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week08/Exercise3.hpp) + Имплементирайте шаблонната структура `Pair`, която приема два типа и запазва по една стойност от всеки тип. ### Задача 4 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week08/Exercise4.cpp) + Имплементирайте клас `FloatArray`, който съдържа списък с числа с плаваща запетая. Може да добавяте нови числа в края на този списък. Имплементирйате голяма петица. @@ -43,11 +51,15 @@ GitHub classroom: [classroom.github.com/a/7d0MBjcK](https://classroom.github.com ### Задача 5 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week08/Exercise5.hpp) + Имплементирайте класът и неговите оператори от предходната задача като темплейтен (шаблонен) клас с име `DynamicArray`. Очевидно шаблонния тип определя типа на списъка с елементи. ### Задача 6 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week08/Exercise6.cpp) + Имплементирайте клас `NumberInput`, който запазва целочислена стойност. В конструктора се подава минимална и максимална възможна стойност, след това (все още в конструктора) се изкарва на екрана съответно съобщение и се приема потребителски вход. Ако той не е валиден или е извън подадения обхват, трябва да хвърлите грешка. @@ -58,6 +70,8 @@ GitHub classroom: [classroom.github.com/a/7d0MBjcK](https://classroom.github.com ### Задача 7 +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week08/Exercise7.cpp) + Имплементирайте клас `UserError`, чиято употреба е да се хвърля като грешка. За тази цел нека да запазва два низа, които се приемат в конструктора: името на клас и името на член-данната. -- cgit v1.3.1-23-gd82d From 36f7053671b13e2bb5c9d9e229de3ebe8eb86e73 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Mon, 22 Apr 2024 17:39:25 +0300 Subject: [te/oop-2023/w9] Added solutions to what is done --- src/teaching/oop-2023/index.md | 2 +- src/teaching/oop-2023/week9/index.md | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/teaching/oop-2023/index.md b/src/teaching/oop-2023/index.md index 7e801a0..0a1a871 100644 --- a/src/teaching/oop-2023/index.md +++ b/src/teaching/oop-2023/index.md @@ -21,5 +21,5 @@ |5 |21.03.2024|[Задачи](./week5/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week05) \|\| [GitHub classroom](https://classroom.github.com/a/42ZZ56Mg)| |6 |28.03.2024|[Задачи](./week6/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week06) \|\| [GitHub classroom](https://classroom.github.com/a/rzSTn5pu)| |7 |04.04.2024|[Задачи](./week7/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week07) \|\| [GitHub classroom](https://classroom.github.com/a/vvZENbkX)| -|9 |18.04.2024|[Задачи](./week9/) \|\| [GitHub classroom](https://classroom.github.com/a/wlL1oUg2)| |8 |11.04.2024|[Задачи](./week8/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week08) \|\| [GitHub classroom](https://classroom.github.com/a/7d0MBjcK)| +|9 |18.04.2024|[Задачи](./week9/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week09) \|\| [GitHub classroom](https://classroom.github.com/a/wlL1oUg2)| diff --git a/src/teaching/oop-2023/week9/index.md b/src/teaching/oop-2023/week9/index.md index d7fe679..db2b6c3 100644 --- a/src/teaching/oop-2023/week9/index.md +++ b/src/teaching/oop-2023/week9/index.md @@ -2,17 +2,23 @@ На днешното упражнение ще решаваме [задачата от Контролно 1](https://learn.fmi.uni-sofia.bg/mod/resource/view.php?id=311448), затова задачите ще са в същия дух (макар и да не включват най-новия материал). +Решението, което писахме по време на практикума, с някои разширения и коментари, може да намерите [тук](https://github.com/Syndamia/oop-2023-solutions/tree/main/week09/Exam1). + GitHub classroom: [classroom.github.com/a/wlL1oUg2](https://classroom.github.com/a/wlL1oUg2) ## Преговорни ### Задача 1 - Голяма петица +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week09/Exercise1) + Реализирайте клас Printer, който съдържа модел като низ с произволна дължина и брой принтирани страници като неотрицателно цяло число. Имплементирайте голяма петица. ### Задача 2 - Файлове и класове +&::solution-link [Решение](https://github.com/Syndamia/oop-2023-solutions/blob/main/week09/Exercise2) + Реализирайте клас Date, който съдържа номера на деня, месеца и годината в три отделни целочислени член-данни. Имплементирайте член-методи `storeText`, `storeBinary`, които съответно запазват данните в текстов файл (във формата "YEAR MONTH DAY") и в двоичен файл с подадени имена. Аналогично имплементирайте `loadText` и `loadBinary`, които презаписват член-данните с тези от подадените (имена на) файлове. -- cgit v1.3.1-23-gd82d From 0171aca46821934e6a63e313c49b40d75287ebd6 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Wed, 24 Apr 2024 21:18:37 +0300 Subject: [te/oop-2023/w10] Added exercises --- src/teaching/oop-2023/index.md | 1 + src/teaching/oop-2023/week10/index.md | 126 ++++++++++++++++++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 src/teaching/oop-2023/week10/index.md (limited to 'src') diff --git a/src/teaching/oop-2023/index.md b/src/teaching/oop-2023/index.md index 0a1a871..de91fbf 100644 --- a/src/teaching/oop-2023/index.md +++ b/src/teaching/oop-2023/index.md @@ -23,3 +23,4 @@ |7 |04.04.2024|[Задачи](./week7/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week07) \|\| [GitHub classroom](https://classroom.github.com/a/vvZENbkX)| |8 |11.04.2024|[Задачи](./week8/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week08) \|\| [GitHub classroom](https://classroom.github.com/a/7d0MBjcK)| |9 |18.04.2024|[Задачи](./week9/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week09) \|\| [GitHub classroom](https://classroom.github.com/a/wlL1oUg2)| +|10|25.04.2024|[Задачи](./week10/) | diff --git a/src/teaching/oop-2023/week10/index.md b/src/teaching/oop-2023/week10/index.md new file mode 100644 index 0000000..6788593 --- /dev/null +++ b/src/teaching/oop-2023/week10/index.md @@ -0,0 +1,126 @@ +# Задачи - ООП, Седмица 10, 25.04.2024 + + + +## Преговорни + +&:warn Моля, не отделяйте на преговорните задачи повече от 30мин + +### Задача 1 - Шаблони + +Реализирайте шаблонен клас `Array`, който запазва динамично-заделен и оразмеряем масив от елементи с подаден тип. +Имплементирайте голяма четворка. + +### Задача 2 - Оператори + +За предходния шаблонен клас имплементирайте оператори: + +- [], който връща рефернция към елемента на подадения индекс +- == и !=, които сравняват поелементно +- +, += които конкатенират (слепват) два масива + +### Задача 3 - Грешки + +Имплементирайте функция, която приема име на текстов файл и изкарва на екрана първия ред от него. +Ако файлът не може да бъде отворен, хвърлете грешка - низ. +Ако във файлът няма други редове (няма знакът `'\n'`), тогава върнете число - размерът на файла. + +В главната функция, приемете името на файла от потребителския вход и извикайте функцията. +Ако файлът не може да бъде отворен, тогава изкарайте хвърлената грешка на терминала и приключете програмата (успешно). +Ако няма други редове в него, тогава изкарайте съобщението "In X characters, there is no newline!", където X е хвърленото число, и приемете пак име на файла от потребителския вход. + +## Лесни + +### Задача 4 + +Реализирайте клас `Time24`, който запазва час и минути (в 24-часов формат) в две отделни целичислени член-данни. +Имплементирайте член-функция `Print24`, която изкарва часа на екрана в 24-часов формат. +Нека конструкторът му приема две целочислени променливи, една за часа и втора за минутите. + +Реализирайте негов наследник `Time12`, който имплементира метод `Print12`, принтиращ часа в 12-часов формат. +Имплементирайте и негов конструктор, който приема две целочислени променливи (една за часа и една за минутите), заедно с булева променлива описваща дали часа е следобеден или не. + +### Задача 5 + +Реализирайте клас `FN`, който запазва факултетен номер като неотрицателно цяло число от 5 цифри. +Реализирайте негов наследник `ModernFN`, който запазва и начален низ, състоящ се от цифра, две букви и още две цифри. + +Имплементирайте конструктори, като този на `FN` приема число, докато този на `ModernFN` приема низ, състоящ се от целия факултетен номер (и трябва да конвертирате последните 5 цифри). +Имплементирайте метод `PrintOldFN` на класа `FN` и метод `PrintNewFN` на класа `ModernFN`, които изкарват целия факултетен номер на съответния клас. + +### Задача 6 + +Реализирайте клас `Grade`, който запазва оценка (от 2 до 6) като неотрицателна целочислена член-данна. +Реализирайте и негов наследник `GradeWithName`, който запазва и името на оценката като низ с произволна дължина. + +Конструктора на `Grade` приема само числовата стойност, докато този на наследника приема и името на оценката. +Имплементирайте голяма петица на `GradeWithName`. + +### Задача 7 + +Реализирайте клас `String`, който запазва низ с произволна дължина. +Имплементирайте голяма петица и член-функция `At`, която приема индекс и връща референция към буквата на този индекс (при невалиден индекс хвърляте грешка). + +Реализирайте негов наследник `FileString`, който запазва и името на текстов файл като низ с произволна дължина. +Ако е нужно, имплементирайте голяма петица. + +Самия низ в `FileString` е първия низ (начало първата буква и край `'\n'`) от файла с подадено име. + +Имплементирайте метод `ChangeAt`, който приема индекс и нова буква, променя буквата на дадения индекс с подадената и обновява файла със запазеното име. + +### Задача 8 + +Реализирайте клас `User`, който запава име и парола като два низа с произволна дължина. +Реализирайте негов наследник `Moderator`, който запазва и подпис, който също е низ с произволна дължина. +Реализирайте наследник `Administrator` на `Moderator`, който запазва и оразмеряващ се масив от цели числа. + +Идеята е, че всяко действие от модератор или администратор се "подписва" публично (за да се знае, че той го е направил, дори да си смени името), а за администратор допълнително пазим масив от идентификатори на форуми, които администрира. + +За всеки клас имплементирайте голяма петица и гетъри и сетъри за името и паролата, когато е нужно. +За `Moderator` имплементирайте гетър за подписа, но без сетър. +За `Administrator` имплементирайте методи за добавяне и премахване на идентификатор на форум. + +### Задача 9 + +Реализирайте клас `CommunicationPacket`, който запазва начален и краен адрес като две неотрицателни цели числа, заедно с трето число за размера на данните. +В този клас никога няма данни, затова размера винаги е нула. + +Реализирайте негови наследници `StringPacket` и `IntPacket`, където първия запазва и низ с произволна дължина (и дължината му е размера на данните) докато втория запазва и едно цяло число (и размера на `int` е размера на данните). + +Размерът не се подава на конструктори, а се изчислява в конструктори. +Имплементирайте голяма петица и конструктори с нужните параметри. + +### Задача 10 + +Реализирайте клас `String`, който запазва низ с произволна дължина, и имплементира оператори ==, !=, + (който връща нов низ с конкатенацията на двата низа). + +Реализирайте негов наследник `ModifiableString`, който имплементира оператор[] (връщащ референция към буквата на дадения индекс) и оператор+=. + +Реализирайте наследник на `ModifiableString`, `ShowableString`, който имплементира оператори << и >>. +Реализирайте наследник на `ModifiableString`, `SaveableString`, който имплементира методи write и read, приемащи име на двоичен файл и записващи или четещи низа от този файл. + +За всички класове имплементирайте голяма петица, когато е нужно. + +## Трудни + +### Задача 11 + +Реализирайте шаблонен клас `Array`, който запазва оразмеряем масив с елементи от подаден тип. +Имплементирайте оператор== и оператор!=, заедно с метод `isEmpty`. +Концептуално идеята е, че този масив не може да се променя след като му се въведат стойностите от конструктора. + +Реализирайте негов наследник `PrintableArray`, който имплементира оператори << и >>. +Реализирайте наследник `SaveableArray` на `Array`, който имплементира методи write и read, приемащи име на файл и булева стойност дали е двоичен или не, и съответно прочитат или запазват елементите от този масив във файла. + +Реализирайте трети наследник, `ModifiableArray`, на `Array`, в който са имплементирани член-функции: + +- `push`, която приема елемент и го вмъква в (десния) края на масива +- `pop`, който премахва елемент от (десния) края на масива +- `last`, който връща последния елемент от масива + +Може да се налага масива да се оразмерява. +Като подсказка, имплементирайте си метод, наличен за класа и наследници, който вмъква елемент на произволен индекс. + +Реализирайте наследник `IndexableArray` на `ModifiableArray`, който имплементира оператор[]. +Ако индекса е след края, тогава "вмъквате" елементи по подразбиране между края и подадения индекс, и връщате елемента от сега новия край. +Реализирайте наследник `FrontableArray` на `ModifiableArray`, който имплементира методи `pushf` и `popf`, който работят като `push` и `pop`, но с елемента в началото на масива (първия елемент). -- cgit v1.3.1-23-gd82d From eeb389f1eff8fe0be45c2bf5a4e752454419c669 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Thu, 25 Apr 2024 08:43:27 +0300 Subject: [te/oop-2023/w10] Made minor wording improvements to exercises and added GH classroom link --- src/teaching/oop-2023/index.md | 2 +- src/teaching/oop-2023/week10/index.md | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/teaching/oop-2023/index.md b/src/teaching/oop-2023/index.md index de91fbf..8036126 100644 --- a/src/teaching/oop-2023/index.md +++ b/src/teaching/oop-2023/index.md @@ -23,4 +23,4 @@ |7 |04.04.2024|[Задачи](./week7/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week07) \|\| [GitHub classroom](https://classroom.github.com/a/vvZENbkX)| |8 |11.04.2024|[Задачи](./week8/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week08) \|\| [GitHub classroom](https://classroom.github.com/a/7d0MBjcK)| |9 |18.04.2024|[Задачи](./week9/) \|\| [Решения](https://github.com/Syndamia/oop-2023-solutions/tree/main/week09) \|\| [GitHub classroom](https://classroom.github.com/a/wlL1oUg2)| -|10|25.04.2024|[Задачи](./week10/) | +|10|25.04.2024|[Задачи](./week10/) \|\| [GitHub classroom](https://classroom.github.com/a/PbkITWhF)| diff --git a/src/teaching/oop-2023/week10/index.md b/src/teaching/oop-2023/week10/index.md index 6788593..d73913b 100644 --- a/src/teaching/oop-2023/week10/index.md +++ b/src/teaching/oop-2023/week10/index.md @@ -1,6 +1,6 @@ # Задачи - ООП, Седмица 10, 25.04.2024 - +GitHub classroom: [classroom.github.com/a/PbkITWhF](https://classroom.github.com/a/PbkITWhF) ## Преговорни @@ -15,7 +15,7 @@ За предходния шаблонен клас имплементирайте оператори: -- [], който връща рефернция към елемента на подадения индекс +- [], който връща референция към елемента на подадения индекс - == и !=, които сравняват поелементно - +, += които конкатенират (слепват) два масива @@ -23,11 +23,11 @@ Имплементирайте функция, която приема име на текстов файл и изкарва на екрана първия ред от него. Ако файлът не може да бъде отворен, хвърлете грешка - низ. -Ако във файлът няма други редове (няма знакът `'\n'`), тогава върнете число - размерът на файла. +Ако във файлът няма други редове (няма знакът `'\n'`), тогава хвърлете грешка число - размерът на файла. В главната функция, приемете името на файла от потребителския вход и извикайте функцията. Ако файлът не може да бъде отворен, тогава изкарайте хвърлената грешка на терминала и приключете програмата (успешно). -Ако няма други редове в него, тогава изкарайте съобщението "In X characters, there is no newline!", където X е хвърленото число, и приемете пак име на файла от потребителския вход. +Ако няма други редове в него, тогава изкарайте съобщението "In X characters, there is no newline!", където X е хвърленото число, и пробвайте да приемете пак име на файла от потребителския вход. ## Лесни @@ -43,9 +43,9 @@ ### Задача 5 Реализирайте клас `FN`, който запазва факултетен номер като неотрицателно цяло число от 5 цифри. -Реализирайте негов наследник `ModernFN`, който запазва и начален низ, състоящ се от цифра, две букви и още две цифри. +Реализирайте негов наследник `ModernFN`, който запазва и начален (префиксен) низ, състоящ се от цифра, две букви и още две цифри. -Имплементирайте конструктори, като този на `FN` приема число, докато този на `ModernFN` приема низ, състоящ се от целия факултетен номер (и трябва да конвертирате последните 5 цифри). +Имплементирайте конструктори, като този на `FN` приема число, докато този на `ModernFN` приема низ, състоящ се от целия факултетен номер (и трябва да конвертирате последните 5 цифри към число). Имплементирайте метод `PrintOldFN` на класа `FN` и метод `PrintNewFN` на класа `ModernFN`, които изкарват целия факултетен номер на съответния клас. ### Задача 6 @@ -94,7 +94,7 @@ Реализирайте клас `String`, който запазва низ с произволна дължина, и имплементира оператори ==, !=, + (който връща нов низ с конкатенацията на двата низа). -Реализирайте негов наследник `ModifiableString`, който имплементира оператор[] (връщащ референция към буквата на дадения индекс) и оператор+=. +Реализирайте негов наследник `ModifiableString`, който имплементира оператор[] (връщащ референция към буквата на дадения индекс) и оператор+=. Реализирайте наследник на `ModifiableString`, `ShowableString`, който имплементира оператори << и >>. Реализирайте наследник на `ModifiableString`, `SaveableString`, който имплементира методи write и read, приемащи име на двоичен файл и записващи или четещи низа от този файл. @@ -123,4 +123,4 @@ Реализирайте наследник `IndexableArray` на `ModifiableArray`, който имплементира оператор[]. Ако индекса е след края, тогава "вмъквате" елементи по подразбиране между края и подадения индекс, и връщате елемента от сега новия край. -Реализирайте наследник `FrontableArray` на `ModifiableArray`, който имплементира методи `pushf` и `popf`, който работят като `push` и `pop`, но с елемента в началото на масива (първия елемент). +Реализирайте наследник `FrontableArray` на `ModifiableArray`, който имплементира методи `pushf` и `popf`, които работят като `push` и `pop`, но с елемента в началото на масива (първия елемент). -- cgit v1.3.1-23-gd82d From 3c54c1adbf08d5b548fd96d1c0524d880c39b3d6 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Wed, 1 May 2024 13:21:08 +0300 Subject: [_header] Improvements to formatting when there is no CSS --- src/_header.html | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/_header.html b/src/_header.html index 2bac64b..817318c 100644 --- a/src/_header.html +++ b/src/_header.html @@ -36,7 +36,7 @@ +
+ +
+