Summary Files Commits Branches @commit @diff @stats
path: root / src / teaching / upp-2023 / week3 / revision.md
diff options
context:
space:
mode:
1 files changed, 268 insertions, 0 deletions
-rw-r--r--src/teaching/upp-2023/week3/revision.md268
diff --git a/src/teaching/upp-2023/week3/revision.md b/src/teaching/upp-2023/week3/revision.md
new file mode 100644
index 0000000..0ef3687
--- /dev/null
+++ b/src/teaching/upp-2023/week3/revision.md
@@ -0,0 +1,268 @@
+# Преговор - УПП, Седмица 3, 20.10.2023
+
+&&presentation
+
+&&clide &&centered
+
+# Цикли, assert
+
+&&/centered &&/clide
+
+
+
+
+&&slide &&font25
+
+## Бележки от миналия път
+
+- Видях две груби грешки в предадените решения, първо:
+
+ ```cpp
+ bool b;
+ if (condition) b = true;
+ ```
+
+ Грешно е, понеже `condition` сам по себе си е от тип bool, с този `if` буквално не правите нищо.
+ Правилния вариант е:
+
+ ```cpp
+ bool b = condition;
+ ```
+
+ Аналогично за:
+
+ ```cpp
+ bool b;
+ if (!condition) b = true;
+ ```
+
+ правилното е:
+
+ ```cpp
+ bool b = !condition;
+ ```
+
+&&/font &&/slide
+
+
+
+&&clide
+
+- второ:
+
+ ```cpp
+ a >= 48 && a <= 57
+ ```
+
+ Всяка буква действително съответства на определено число, дефинирано от ASCII стандарта.
+ Наистина '0' е 48 и '9' е 57, обаче от вас **не** се очаква да помните ASCII таблицата!
+ Също, ако не знаеш наизуст кои буква са тези числа, този израз е много неясен.
+
+ Правилния вариант е просто да направите сравнения с буквите, все пак C++ ги "конвертира" (много грубо казано) към съответните ASCII стойности:
+
+ ```cpp
+ a >= '0' && a <= '9'
+ ```
+
+&&/clide
+
+
+
+&&slide
+
+## С/без загуба на данни
+
+&&lineb3
+
+Получи се малко разногласие между това, което Ивана ви е казала и това което аз ви казах.
+В края на деня, **конвертиране от int към unsigned int не губи информация!**
+
+Цитирайки 4то издание на "The C++ Programming Language" глава 10.5:
+
+> A conversion is value-preserving if you can convert a value and then convert the result back to it's original type and get the original value
+
+Тоест, конвертирания при които не губиш битове, нямаш загуба на данни.
+
+&&/slide
+
+
+
+&&slide
+
+## Цикли
+
+&&lineb4
+
+- `while` цикъл
+
+ ```cpp
+ while (условие) {
+ тяло
+ }
+ ```
+
+ "условие" е булева стойност, като ако е `false` цикъла спира, докато ако е `true` "тяло" се изпълнява и после пак се проверява условие
+
+&&/slide
+
+
+
+&&clide
+
+- Може да си го представите като
+
+ ```cpp
+ if (условие) {
+ тяло
+ }
+ else {
+ спри
+ }
+
+
+ if (условие) {
+ тяло
+ }
+ else {
+ спри
+ }
+ ...
+ ```
+
+&&/clide
+
+
+
+&&slide
+
+- `do-while` цикъл, като `while`, но "тяло" се изпълнява поне един път
+
+ ```cpp
+ do {
+ тяло
+ } while (условие);
+ ```
+
+ Нашият аналог е:
+
+ ```cpp
+ тяло
+
+ if (условие) {
+ тяло
+ }
+ else {
+ спри
+ }
+
+
+ if (условие) {
+ ...
+ ```
+
+&&/slide
+
+
+
+&&clide
+
+- `for` цикъл
+
+ ```cpp
+ for (инициализация; условие; инкрементация) {
+ тяло
+ }
+ ```
+
+ "инициализация" се изпълнява само веднъж, преди всичко останало в цикъла
+ "условие" се изпълнява преди всяка итерация, като ако е `false` цикъла спира, докато ако е `true` продължава
+ "инкрементация" се изпълнява след края на всяка итерация
+
+&&/clide
+
+
+
+&&slide
+
+- Може да си представяте, че това на практика извършва:
+
+ ```cpp
+ инициализация
+
+ if (условие) {
+ тяло
+ }
+ else {
+ спри
+ }
+
+ инкрементация
+
+ if (условие) {
+ тяло
+ }
+ else {
+ спри
+ }
+ ...
+ ```
+
+&&/slide
+
+
+
+&&clide
+
+- или използвайки `while` цикъл:
+
+ ```cpp
+ инициализация
+ while (условие) {
+ тяло
+ инкрементация
+ }
+ ```
+
+&&/clide
+
+
+
+&&slide
+
+### Ключови думи
+
+&&lineb3
+
+- `break`: моментално прекратява изпълнението на цикъла
+
+ При `for` цикли инкрементацията не се изпълнява след `break`
+
+&&lineb2
+
+- `continue`: продължи след края на сегашната итерация; тоест изпълнението на тяло се прекратява и заповаме нова итерация
+
+ При `for` цикли директно отива на инкрементация
+
+&&/slide
+
+
+
+&&slide
+
+## Assert
+
+
+&&lineb3
+
+Понякога е полезно да тестваме нашия код вътре в самия код.
+Тоест, искаме на конкретно място в кода да проверим нещо.
+
+```cpp
+assert(condition);
+```
+
+Ако `condition` е `true`, нищо не се случва, обаче ако е `false` програмата моментално прекратява изпълнение.
+
+Използва се повече като програмистки уред, тоест ако програмата спре заради `assert`, това е защото има някаква програмистка грешка.
+
+&&/slide