16.05.2022: Řešení těžkých úloh: * U1: Páková vodovodní baterie * U2: Hezké nakreslení grafu * Rada 1.: Máte-li úlohu, kterou nechcete nebo neumíte řešit… ...řešte jinou úlohu! * U3: Hádání obrázku * Rada 2.: ..zapojte přirozený výběr * Genetické (evoluční) algoritmy - fitness - selekce, křížení, mutace - význam mutace * U4: Broučci * broučci s pamětí * broučci BCY - rodičovské investice * Vsuvka: historka o magnetofonu * Rada 3.: ...podívejte se na ni z odstupu! * Rada 4.: ...omezte se na řešení v určitém tvaru! * U5: Rozpoznávání znaků * U1: Páková vodovodní baterie - řešení 09.05.2022: * zkoušky - vypsané termíny, jak budou probíhat, jak vypadá písemka * příklad zkouškového příkladu - ANKETA - diagram toku dat (data-flow diagram) * vnější třídění (princip, dvoucestné dvoufázové slučování, složitost) * Generické metody a třídy - omezení where - interface * Panoptikum OOP jazyků * Hygiena programování - oddělovat činnosti - resources - pracovní deník - ToDo-list, bug-list, issue tracker - TRELLO - Kanban - GitHub - správa versí - Automatické testy 02.05.2022 * Git ve Visual studiu: - lokální úložiště - Historie, rozdíly, Commit - připojení k GitLabu - access token - Push, Pull, MergeEditor * měření času - DateTime, TimeSpan, měření času - String vs StringBuilder * delegáty - jako proměnná - jako parametr funkce: - +=, -= - anonymní funkce, => * vlákna v C#: - using System.Threading; - Thread, .Start() - počet jader - //může být jinak rychlé v Debug a Build režimu - kdy použít vlákno (aby nezamrzlo GUI) - race-condition - Lock - ...deadlock 25.04.2022: Dekompozice, Objektový návrh, Obrázky a UML, guruové a rady starších * proč * dekompozice * objektový návrh * UML 2 * diagram tříd * diagram stavů * sekvenční diagram * principy a pravidla (SOLID a další) - Single Responsibility Principle - Open–closed principle - Liskov substitution principle - Interface segregation principle - Dependency Inversion Principle - Law of Demeter - DRY - High cohesion, Low coupling * CRC cards * Návrhové vzory 18.04.2022: --- velikonoce --- 11.04.2022: Zkouška * jak vypadá * příklad zkouškového příkladu * myšlenková mapa jako pomůcka na přemýšlení C# * inicializace proměnných (datových polí ve třídě) Grafika: * výběr obdélníka myší * jak překreslovat 04.04.2022: Výjimky v C# Testy - vlastní a pomocí frameworku ve VisualStudiu - oddělený testovací projekt - třídy a funkce s [atributy] - průzkumník testů Dynamické programování - optimální vyhledávací strom 28.03.2022: Grafika v C# (WinForms) * Graphics - Získání - this.CreateGraphics() * Pen - Pens (properties) - New Pen * Color - Připravené (properties) * Pero – ...Cap * PictureBox * Bitmap * Brush - Brushes (properties) - new SolidBrush ! * Color - FromARGB, RGB = vypočítaná barva * Bitmap.GetPixel, SetPixel - kopie - Zmena souradnic - Preklopeni x,y - Zvetseni - deformace - barevna slozka - světlost – převod na šedou - prah - Distribuce chyby * pismo - DrawString - Font - zkopirovat z okna... - vlastni - FontFamily.Families 21.03.2022: Dynamické programování * příklad: editační vzdálenost a nejdelší společný podřetězec * lehčí příklad: mrkev a petržel 10 záhonů * jiný lehčí příklad: 6 dětí do 3 skupin * řešení rozborem případů... * lepší obecný postup - dynamické programování: - zobecnit - určit hodnoty počátečních případů - najít rekurentní vzorec - spočítat * dynamické programování x Rozděl a panuj x memoizace * mat králem a věží * optimální uzávorkování součinu matic * počet BVS o k vrcholech * počet cest * nejdelší cesta 14.03.2022: Programování řízené událostmi (Event-driven programming) * programování řízené událostmi - princip * události – klávesnice, myš * jak probíhá zpracování události - hierarchie - polymorfismus * Visual Studio: - Designer, ToolBox, Property editor * Druhy properties - Oddělení designu a funkčního kódu * Syntaxe: partial class * Vytvoření obslužné procedury via propertie a via dbl-click - MessageBox * Sdílení obslužných metod - Sender - Přetypování "(typ)" nebo "as" - Is - Kalkulačka * aplikace s více okny: vytvoření a zobrazení dalšího okna (.Show()) 07.03.2022: Ještě Diskrétní simulace: * chyba v modelu stěhování písku - pomáhá nám, že (v OOP) můžeme uvažovat v pojmech problému ("co se stane, když ve měste už není žádný písek?") * co bude jinak u jiného modelu - třídy - události - reakce na události = vlastní program je */- pořád stejný * návrh modelu - pomůcka diagram stavů - stavy - přechody mezi nimi - čím jsou způsobeny - co je při nich potřeba udělat * Příklad: obchodní dům * Implementace - přehledná vstupní data * C#: Co je Interface, interface vs. násobná dědičnost, diamond problem 28.2.2022: Diskrétní simulace: * úloha s hromadou písku * Simulace spojitá vs. diskrétní Program: - TypUdalosti - C# enum - Udalost - Kalendar - Auto - Model * Použití simulace pro zkoumání variant a OOP-změna pomocí odvozené třídy = Model2 pro různý počet aut = Model3 pro ruzný počet aut a nakladačů 21.2.2022: Objekty: * deklarace, členské proměnné * inicializace 0 * konstruktor, this - vice konstruktorů //- výchozí konstruktor bez parametrů * Př: Pes, Stekni() * dědičnost - co to je, co se dědí - Př: VelkyPes, : base(…), Stekni() - Problem s konstruktorem //- …implicitní konstruktor mizí ! - konstruktor - base - Problém s přepsanou metodou Stekni2x - virtuální metody, VMT * Polymorfismus - abstraktní metoda, abstraktní třída * Statické členy a třídy * atributy viditelnosti, zapouzdření * properties 14.2.2022: * o čem bude Programování 2 * programování není jen jazyk a algoritmy, ale i to, - jak zvládat velké programy - jak spolupracovat - jak rozkládat program na části (dekomposice) - jaké jsou nástroje nástroje - význam konvencí a zvyklostí - jaké existují metodiky vývoje * objekty (znovu) * jazyk C# a jak se liší od Pythou ev. jiných jazyků 6.1.2022: Ještě k funkcím: * funkce v proměnných a jako parametry - trik s výběrem funkce pomocí dictionary * lambda funkce * closure * generátory a iterátory * jak funguje for-cyklus * context manager, with Příklad: Postupný vývoj programu na porovnávání rychlosti seznamů - požadavky - co potřebujeme ...a kde to najdeme (matplotlib, time, random) - hashovací tabulka a hashovací funkce 16.12.2021: Balíček matplotlib: * knihovna, 20 let, podporovaná neziskovou organizací * závislosti * matplotlib.pyplot = interface ala MATLAB - ne-objektový přístup //- ne-objektový přístup – viz Turtle, turtle.py // (když nemá objekt, tak si ho vytvoří) * plot(), show() - jen y - xy - body místo čar - více grafů - osy = automaticky, axis( [0,10,0,10] ) - popisky os - bar - subplot( sizex-sizey-poradi ) - neblokující show(...) - ukládání obrázku do souboru modul NumPy: * knihovna, 15 let, podporovaná neziskovou organizací * vícerozměrná pole, hodnoty stejného typu * vytvoření pole: - np.array( [1,2,3,4] ) * prvky mají TYP np.dtype * změna typu: af = a.astype( 'float64' ) - np.arrange(20) = vyplní hodnotami - b = np.array([(1.5,2,3), (4,5,6)]) * seznam seznamů = vícerozměrné pole - uvést typ při vytváření - hodnoty * np.zeros * np.ones * np.empty = co, zrovna leží v paměti * default typ = float64 * arange * np.random.random = [0.0, 1.0) - změna tvaru = shape, reshape - operace - maticové operace - dosazení - výběr podle indexů * Matplotlib & NumPy Příklad programování her s úplnou informací: - odebírání čísel zleva/zprava - Minimax - negamax - exponenciální složitost, možné ukládání výsledků (memoizace) 9.12.2021: Dlouhá čísla: * representace - nezáporná x i záporná - se znaménkem x doplněk - celá x desetinná - pevná x pohyblivá řádová čárka - pole x spojový seznam - odpředu x odzadu - obsah jednoho prvku - délka - kolik míst navíc - spočítat a ještě zkusit * příklad e (Leonhard Paul Euler 1707-1783) - odhad počtu kroků - potřebné operace - dosazení - sčítání - dělení integerem - přeskočení nul - test konce * další operace 2.12.2021: Testy: * příklad Hodnota( vyraz ) z minulé přednášky * nahradit ruce * nahradit oči * testovaci funkce a počítání testů a chyb - snadne testovani => hodně testů - testovat okrajové případy - chyby mohou být i v testech... * == unit-testy * nevýhody: - psát si sám porovnávání - testy v deploy-kódu Moduly: * jmenný prostor * dir() * import – možnosti * jak vytvořit modul * proměnná __main__ * Proč vytvářet moduly * cizí moduly: standardní knihovna * balíček - co to je - PyPI * problémy (temná strana) - že se to programování posouvá od "vymysli" k "najdi/nastuduj (a uvěř)" - cizí kód - bugy, verse - zpětná kompatibilita - dependency hell Testy podruhé: * modul unittest - testovací případ - class TestCase(unittest.testCase): - def test.... - assertEqual, assertRaise... * metodika TDD: Test-Driven Development //- pozitivni testy x negativni testy //- failure vs. error * vymýšlení chyb – tester = změna přístupu - self.assertRaises = očekávaná výjimka - další druhy testů 25.11.2021: * Chyby: syntaktické, běhové, sémantické * typové anotace v Pythonu, mypy, ukázka ve VSCode * Výjimky jako zpráva o běhové chybě - jak číst výpis výjimky - co se děje, když nastane výjimka (vynořování ze zásobníku volání a try-bloků) - odchycení výjimky: - try-except - except TYP - více except-bloků - except bez typu (nedělat!) - except – proměnná (lokální v except) - vyvolání: raise - Příklad: existence souboru = používat výjimky jen na výjimečné stavy - finally * vlastní vyvolání výjmky - BaseException - vlastní typy - výjmky vs. návratové kódy * Assert * Defenzivní programování * Příklad na rekurzi: - vyhodnocování výrazu rozkladem na podvýrazy (je tam chyba!) - aritmetický výraz ve stromě, jeho hodnota a stavba ze stringu (rozkladem...) 18.11.2021: * ještě k objektům: - možnost změnit chování bez (přepisování) zdrojového kódu tak, že odvodíme novou třídu - příklad s odvozenou želvou * textové soubory - soubory jako abstraktní datový typ - ideální představa... ...a (temná) skutečnost - znaky versus bajty - kódování, počet bajtů na znak, endian, BOM - různé konce řádek v různých OS - eof - operace s textovými soubory, proč je potřeba je zavírat * textové řetězce obecně a typ string v Pythonu - výstup pomocí šablon (funkce format()) => nové třídy Tiskárna... * funkce v proměnných a k čemu se to hodí (možnost dosadit jinou funkci třeba na hlášení chyb) 11.11.2021: * Objekty v Pythonu - znovu a podrobněji - Definice - Funkce a parametr self - další důvod proč: místo funkce s mnoha parametry se použijí parametry uložené v objektu, kdo je spokojen, nemusí o nich vědět - Konstruktor - Dědičnost - k čemu je dědičnost - násobná dědičnost - nahrazování pomocí interface - co je interface, viz abstraktní datový typ //- volání funkce předka - Polymorfismus - Abstraktní třída - příklad se zvířaty - Duck typing - kontrola typu (type(),, isinstance() - ...typové anotace (někdy jindy) - Zapouzdření – viditelnost atributů - Funkce definované ve třídě: 1) funkce instance/objektu 2) statická funkce 3) funkce třídy - dekorátory (NEBUDU VYSVĚTLOVAT) - parametr cls - TYP je taky objekt - Proměnné definované ve třídě: 1) proměnné instance/objektu 2) proměnné třídy - příklad: počitadlo vytvořených objektů - zmatek: proměnná třídy jako výchozí hodnota proměnné objektu - pokud v něčem nemáte jasno, tak to nepoužívejte! * příklad na objektovou dekompozici: - zdroj dat, tiskárna, počítadlo - místo přepisování funkcí odvodíme a použijeme jinou třídu (jiný vstup, lepší tiskárna) 4.11.2021: * PEP obecně a PEP8 * Dynamické proměnné - ukazatel - Halda - Garbage collector * Spojový seznam (jednosměrný, lineární) - Prvek - vytvoření - projití - přidání na začátek - mazání prvního prvku - přidání na konec - když si pamatujeme, kde je konec - mazání posledního prvku 21.10.2021: * ještě k funkcím: - dokumentační komentáře - help() - IDE: krokování TraceOver/StepInto - IDE: zásobníék volání (CallStack) * zkrácené vyhodnocování logických výrazů ...a k čemu je to užitečné * tuple (n-tice) * dictionary * Objekty - Společně data a funkce (metody) - Proč - Pojmy OBJEKT a TŘÍDA * objektová dekompozice, objektový návrh * Objekty v Pythonu - Definice - Funkce a parametr self - Konstruktor - zapouzdření: - proč zveřejňovat co nejméně - jak je to v Pythonu = __...__ * funkce dir() ...a skryté atributy a metody/funkce 14.10.2021: * funkce (podprogramy) * příklad tabulka násobilky - formát v příkazu print # print( "%3d"% i, end=" " ) = neučit se, jen vědět, že to existuje - f-řetězce a formátování parametrů * Proč používat podprogramy * Co potřebujeme umět - Jak definovat novou funkci - Jak vracet výsledek - Jak popsat parametry (více možností) - Jak volat funkci - Způsoby předávání parametrů - Viditelnost proměnných (a funkcí) //- Funkce B definovaná uvnitř funkce A //- Pořadí hledání významu identifikátoru (pravidlo LEGB) //- Kdy je funkce známá * Příklad: funkce na čtení čísla z více řádek * Příklad: Dvacet nejčastějších slov - návrh programu shora (dekompozice) - ladění zdola (když něco napíšeme, tak to hned vyzkoušíme) 07.10.2021: * Složitější datové typy * Proměnná = ODKAZ na hodnotu = budu připomínat ještě mockrát, zdroj chyb! * String - přístup ke znaku - neměnný – dosadit do znaku nelze - slice * Kód znaku * List * For-cyklus * Range 30.09.2021: * Předmět NPRG030 Programování I. - Zkouška v létě - Zápočet, podmínky určuje cvičící, obecně docházka, DÚs, zápTest, zápPgm - mj-cvičení pro pokročilé * Co to je programování - Algoritmus - Vlastnosti algoritmu - Zápis algoritmu => jazyk * Jazyk Python - verse 3 * Nástroje – překladače interpret… - IDLE - IDLE-Editor, uložení, spuštění - Spuštění .py souboru poklikáním - Visual Studio - Krokování - Náhled proměnné - Watch * print() * dosazení * input() - přetypování * řízení běhu programu - if, while - odsazení: tabulátor x mezery - a problém - VS: Ctrl-R+W = Edit/Advanced/View WhiteSpace //* Jednoduché příklady: // - Čísla 1..100 // - Prvočísla 1..100 * Co by taky šlo: - Re-use = používat to, co už je hotovo - svoje i cizí části kódu - Posun Python – více na výpočty „pro sebe“ než pgm, který si někdo koupí a za který ručím = potřebujeme kompromis * od začátku: * Hodnoty, typy - Čísla - Int, float