Summary Files Commits Branches @commit @diff @stats
path: root / src
diff options
context:
space:
mode:
Commit40cfbcdf753e5666578796046ca2a5f5772aa0fb (patch)
Author
 Syndamia <kamen@syndamia.com>
2026-02-18 09:13:11 +0200
Committer
 Syndamia <kamen@syndamia.com>
2026-02-18 09:13:11 +0200
Files6a5795ff01cb239aa431144b65a14e05d1c48f2e /src
syndamia.com-40cfbcdf753e5666578796046ca2a5f5772aa0fb.tar
syndamia.com-40cfbcdf753e5666578796046ca2a5f5772aa0fb.tar.gz
syndamia.com-40cfbcdf753e5666578796046ca2a5f5772aa0fb.zip
Parent2bb90e0c338878edf20ff489b655626d7e7d0240 (diff)
feat(teaching/oop-2025/w1): Add materials and exercises
3 files changed, 243 insertions, 0 deletions
-rw-r--r--src/teaching/oop-2025/index.du17
-rw-r--r--src/teaching/oop-2025/week01/index.du147
-rw-r--r--src/teaching/oop-2025/week01/intro.du79
diff --git a/src/teaching/oop-2025/index.du b/src/teaching/oop-2025/index.du
index 52e4b20..e973be0 100644
--- a/src/teaching/oop-2025/index.du
+++ b/src/teaching/oop-2025/index.du
@@ -8,8 +8,25 @@
[=Директни връзки:=]
[url ../upp-2025/week01/introduction.html?a#section-3 Контакт с мен]
+| [url https://github.com/Syndamia/oop-2025-solutions Решения на задачи]
+| [url https://github.com/18ivan18/ObjectOrientedProgramming2026 Материали от семинари]
+| [url https://learn.fmi.uni-sofia.bg/course/view.php?id=12155 Курс в мудъл]
:table_3
|= &#8470;
|= Дата
|= Материали
+
+|: 1
+|: 18.02.2026
+|: Въведение и преговор
+
+|:
+|:
+|:
+[url ./week01/intro.html?a Уводни бележки]
+
+|:
+|:
+|:
+[url ./week01 Задачи]
diff --git a/src/teaching/oop-2025/week01/index.du b/src/teaching/oop-2025/week01/index.du
new file mode 100644
index 0000000..bd2d034
--- /dev/null
+++ b/src/teaching/oop-2025/week01/index.du
@@ -0,0 +1,147 @@
+# Задачи - ООП, Седмица 1, 18.02.2026
+
+'define expected-reading 2 min
+'define created 17 February 2026
+'define edited 18 February 2026
+[$pagenav]
+
+.warn Както винаги, [=НЕ=] може да използвате външни библиотеки и (почти) всичко от стандартната библиотека!
+
+## За решаване
+
+### Задача 1
+
+Реализирайте следните функции:
+
+```c++
+// Създава нова динамично-заделена матрица
+int** newMatrix(unsigned rows, unsigned cols);
+// Изтрива динамично-заделена матрица
+void deleteMatrix(int**& matrix, unsigned rows); // Запишете nullptr в matrix!
+// Връща сумата на всички елементи в матрицата
+int sumMatrix(const int** matrix, unsigned rows, unsigned cols);
+
+Поставете техните имплементации във файл [`matrix.cpp`] и техните дефиниции в [`matrix.h`].
+Естествено, главната функция [=трябва да се намира извън [`arrmath.cpp`]!=]
+
+От входа получавате размерите и стойностите на две матрици с цели числа.
+Изкарайте разликата, между сумата на елементите на първата матрица и на втората матрица.
+
+:table_2
+|= Вход
+|= Изход
+
+|:
+```
+3 3
+1 2 3
+4 5 6
+7 8 9
+4 2
+13 10
+-6 -5
+100 101
+-30 -20
+
+|: -118
+
+.comment 45 - 163 = -118
+
+
+### Задача 2
+
+Реализирайте следните функции:
+
+```c++
+int sum(const int* elements, unsigned length);
+int average(const int* elements, unsigned length);
+int largest(const int* elements, unsigned length);
+int smallest(const int* elements, unsigned length);
+// Връща индекса на първото срещане на elementToSearch
+unsigned findIndex(const int* elements, unsigned length, int elementToSearch);
+
+Поставете техните имплементации в [`arrmath.cpp`] и техните дефиниции в [`arrmath.h`].
+Направете всички нужни проверки за коректност на аргументите на функциите!
+
+От входа получавате цяло неотрицателно число [`N`] и след това [`N`] на брой цели числа.
+
+Трябва да изкарате средното аритметично на всички елементи [*между*] най-малкия и най-големия (включително).
+Ако най-големия и/или най-малкия се среща повече от един път, използвайте неговото първо срещане.
+
+Използвайте максимално функциите от [`arrmath`]!
+
+:table_2
+|= Вход
+|= Изход
+
+|: 5 2 1 3 5 4
+|: 3
+
+|: 6 10 -2 17 0 0 1
+|: 4
+
+|: 8 1 1 1 1 10 10 10 10
+|: 2.8
+
+
+### Задача 3
+
+Реализирайте следните функции във файлове [`stringHelpers.cpp`] и [`stringHelpers.h`]:
+
+```c++
+char* newString(unsigned length);
+char* newString(const char* string);
+char* concatStrings(const char* first, const char* second, const char* separator);
+void deleteString(char*& string); // Запишете nullptr в string!
+
+Реализирайте следните функции във файлове [`ioHelpers.cpp`] и [`ioHelpers.h`]:
+
+```c++
+// Прочита от потребителския вход цяло число между min и max включително,
+// като предоставя prompt преди въведената стойност
+// При невалидна стойност, пита пак за вход
+int readInteger(const char* prompt, int min, int max);
+double readDouble(const char* prompt, double min, double max);
+char* readString(const char* prompt);
+
+За реализацията им използвайте [`stringHelpers`]!
+
+Реализирате система за запазване на ученици.
+Всеки ученик има две имена и оценка (по шестобалната система, между [`2.0`] и [`6.0`]).
+
+Използвайки [`ioHelpers`], поискайте от потребителя брой ученици.
+След това, за всеки ученик, поискайте неговото име, фамилия и оценка (поотделно).
+
+За всеки ученик запазаете името му като един низ във формата [`"<ИМЕ> <ФАМИЛИЯ>"`].
+Не запазвайте име и фамилия като отделни стойности!
+
+Накрая изкарайте данните за всички ученици.
+
+[=Смесен вход/изход:=] [*(удебеления текст е изкаран от програмата, останалото е въведено от потребителя)*]
+```
+[=Number of students:=] 4
+[=First name:=] Ivan
+[=Last name:=] Koprivan
+[=Grade:=] 5.5
+[=First name:=] Dimitar
+[=Last name:=] Stoianov
+[=Grade:=] 3.15
+[=First name:=] Hari
+[=Last name:=] Seldon
+[=Grade:=] 6
+[=First name:=] Richard
+[=Last name:=] Stallman
+[=Grade:=] 4.53
+[=Ivan Koprivan has grade 5.5=]
+[=Dimitar Stoianov has grade 3.15=]
+[=Hari Seldon has grade 6=]
+[=Richard Stallman has grade 4.53=]
+
+
+## За самоподготовка
+
+Пререшете следните задачи от УП [=без да гледате решенията=]:
+.bulleted
+- [url ../../upp-2025/week13/#-21 Седмица 13, Задача 21]
+- [url ../../upp-2025/week10/#-7 Седмица 10, Задача 7]
+- [url ../../upp-2025/week12/#-6 Седмица 12, Задача 6]
diff --git a/src/teaching/oop-2025/week01/intro.du b/src/teaching/oop-2025/week01/intro.du
new file mode 100644
index 0000000..474ffb2
--- /dev/null
+++ b/src/teaching/oop-2025/week01/intro.du
@@ -0,0 +1,79 @@
+# Уводни бележки - ООП, Седмица 1, 18.02.2026
+
+'define expected-reading 1 min
+'define created 17 February 2026
+'define edited 17 February 2026
+[$pagenav]
+
+[$presentation-controller]
+
+:title_slide35
+
+# Уводни бележки по ООП
+
+
+:slide35
+
+## Уроци от УП
+
+[$br2]
+
+:unordered
+
+- [=Решавайте задачи!=]
+ .unordered
+ - По УП са давани >200 задачи (да, много не бяха доизпипани)
+ - Решения ca качвани на >150 задачи
+ - >3700 реда код в решения
+
+- Питайте въпроси, за това ми плащат!
+
+
+
+:slide35
+
+## Относно ООП практикум
+
+[$br3]
+
+:unordered
+
+- Избираема е, няма причина да не я запишете
+ .unordered
+ - Дори да не го направите, пак си идвайте
+
+- Ще го караме по същата схема: задачи и [=решаваме=] на живо
+ .unordered
+ - Ако искате друго, слушам, ще го обсъдим
+
+
+
+:slide35
+
+## Специфики на ООП в C++
+
+[$br1]
+
+:unordered
+
+- ООП не е безплатно! Дори да сте учили [`Java`]/[`C#`]/...
+
+- [`C++`] има много рядко-срещани обектни свойства, като:
+
+ :ordered
+
+ 1. Ръчно менажиране на паметта (и оператори) - няма garbage collector
+
+ 2. Множествено наследяване - наследяване на повече от един клас
+
+ 3. Шаблони - значително по-силни от generics ([url https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern статичен полиморфизъм], [url https://en.wikipedia.org/wiki/Template_metaprogramming#Compile-time_class_generation compile-time рекурсия], ...)
+
+
+
+
+:title_slide35
+
+.p
+Въпроси?
+Коментари?
+Забележки?