22.05.2023: * (znovu na dotaz) vnější třídění Ř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í 15.05.2023: * příklad zkouškového příkladu - ANKETA - diagram toku dat (data-flow diagram) * Generické metody a třídy - omezení where //- interface * Dekompozice, Objektový návrh, Obrázky a UML, guruové a rady starších - proč - dekompozice - příklad: klient-server a jazyk SQL - 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 - Návrhové vzory * 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 24.04.2023: * 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 * příklad zkouškového příkladu: - pokyny k nákupu a k prodeji cenných papírů (CP) - pro každý CP určete kurz, při kterém se zobchoduje největší počet 17.04.2023: Zkoušky * jak budou probíhat * znalosti z jiných předmětů * jak vypadá písemka - příklad: překládání papíru Výjimky v C# Testy pomocí frameworku ve VisualStudiu - oddělený testovací projekt - třídy a funkce s [atributy] - průzkumník testů Grafika: * snímek obrazovky Dynamické programování * optimální vyhledávací strom a jeho nalezení 27.03.2023: 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 Dynamické programování * počet cest * nákupy v NYC (minimax) * mat K-V x K 20.3.2023: Dynamické programování * příklad: editační vzdálenost a nejdelší společný podřetězec * lehčí příklad: 6 dětí do 3 skupin * jiný lehčí příklad: mrkev a petržel 10 záhonů * ř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 * odebírání zápalek * //mat králem a věží * počet BVS o k vrcholech * optimální uzávorkování součinu matic * //počet cest * //nejdelší cesta 13.3.2023: Programování řízené událostmi (Event-driven programming) * jaké mají programy vstupy (hodnoty, ovládání, GUI, API) * historická odbočka o Xerox PARC * 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 properties a via dbl-click - MessageBox * Sdílení obslužných metod - Sender - Přetypování "(typ)" nebo "as" - Is - Kalkulačka 27.2.2023: Ještě Diskrétní simulace: * 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 - společná metoda log a filtrování vzpisovaných zpráv - přehledná vstupní data * VisualStudio: - struktura soubor-projekt-solution - View / Solution Explorer - jak přidávat soubory do projektu ...a nastavovat, že se mají kopírovat do výstupního adresáře - View / Class View - diagram tříd (Class-Diagram) a jeho provázání se zdrojovým kódem * jazyk C# - System.IO.StreamReader, System.IO.StreamWriter - operátor "is" = instance třídy (nebo podtřídy) 20.02.2023[1]: 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čů 20.02.2023[2]: Objekty: * proč - organizace kódu, oddělení JAK a CO to dělá, uvažování v pojmech problému (co bude dělat auto, když už nezbývá tolik písku, kolik je jeho nosnost) * 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 * sealed 13.02.2023: * 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 Pythonu ev. jiných jazyků 03.01.2023: 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: Hra 7531 - odebírání zápalek z více hromádek - rekurze - složitost-rychlost-počet volání - memoizace 20.12.2022: 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ů * np.linalg - determinant, řešení soustav * Matplotlib & NumPy modul Selenium: * knihovna, 15 let, Google * webdriver ovládající prohlížeč... ...a v různých jazycích knihovny ovládající webdriver * primárně pro testování, ale i pro automatizaci klikání na webu Příklad: * rychlost .append, .pop() a .pop(0) u Listu (a .pop007 - lazy-pop) * modul time() (Standardní knihovna) a obrázky via matplotlib 13.12.2022: 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 - odčítání - násobení - dělení 06.12.2022: Testy: * testovat okrajové případy! 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 - jak vytvořit vlastní balíček - 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 (MS Excel) - dependency hell Testy podruhé: * modul unittest - testovací případ - class TestCase(unittest.testCase): - def test.... - assertEqual, self.assertRaises = očekávaná výjimka * metodika TDD: Test-Driven Development - další druhy testů Minimax: * příklad hry s odebíráním čísel 29.11.2022: * 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í * Testy: * příklad PocetDnu( d1,m1,r1, d2,m2,r2 ) * jak testovat? - 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... 15.11.2022: * ještě k objektům: - proč je potřeba @staticmethod - možnost změnit chování bez (přepisování) zdrojového kódu tak, že vytvoříme novou třídu: - pomocí dědičnosti - pomocí kompozice (obsahuje tu starou) - příklad s želvami * textové soubory - soubory jako abstraktní datový typ - ideální představa... ...a (temná) skutečnost - 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 - znaky versus bajty - kódování, počet bajtů na znak, //endian, BOM - výstup pomocí šablon (funkce format()) * typ je taky objekt * funkce je taky objekt - funkce jako parametr - funkce v proměnných a k čemu se to hodí (možnost dosadit jinou funkci třeba na hlášení chyb) 08.11.2022: * Objekty v Pythonu - znovu a podrobněji - Definice - Funkce a parametr self - 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 - důvod proč objekty: možnost měnit chování bez změny (i bez vlastnictví!) zdrojového kódu odvozením nové třídy a přepsáním (virtuální) funkce - 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 - Polymorfismus - Abstraktní třída - příklad se zvířaty - Duck typing - kontrola typu (type(),, isinstance() - ...typové anotace (někdy jindy) - Zapouzdření – (ne)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: - čtečka, slovník, tiskárna - místo přepisování funkcí odvodíme a použijeme jinou třídu (jiný vstup, lepší tiskárna) = skládání programu z tříd 01.11.2022: * Objekty - Společně data a funkce (metody) - Proč - Pojmy OBJEKT a TŘÍDA - parametr self (může se jmenovat jakkoli jinak) - konstruktor * 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 25.10.2022: * příklad na dekompozici (rozklad programu na části): 20 nejčastějších slov - rozmýšlení a návrh pomocí myšmapy - funkce PrectiSlovo(), ZapocitejSlovo( slovo ) a VytiskniNejcastejsiSlova() - cíl: rozdělit program na části, které budou mít jasné rozhraní (CO dělají) a bude možné měnit jejich implementaci (JAK to dělají) s co nejmenším dopadem na zbytek programu * dokumentační komentáře, funkce help(...) * návrh programu shora (dekompozice) a ladění zdola (když něco napíšeme, tak to hned vyzkoušíme) * zkrácené vyhodnocování logických výrazů ...a k čemu je to užitečné * tuple (n-tice) * dictionary ...a změna implementace funkcí v programu výše 18.10.2022: * funkce (podprogramy) * příklad tabulka násobilky - formát v příkazu print - formátovací řetězce = neučit se, jen vědět, že to existuje - ...nebo si pomoci sám - f-řetězce * 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 11.10.2022: * 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 * Visual Studio, krokování, sledování proměnné, breakpoint 04.10.2022: * 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 - viz Algoritmizace - 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 * Co by taky šlo: - Re-use = používat to, co už je hotovo - cizí části kódu - příklad: graf aktuálních přírůstků COVID-19 (urlrequest, matplotib) - vynalézači kola vs. lepiči a knihovnáři - výpočty „pro sebe“ vs. pgm, který si někdo koupí a za který ručím = potřebujeme kompromis * od začátku: * Hodnoty, typy - Čísla - Int, float * Jednoduché příklady: - sčítání k-tin * Ad knihovny: LeftPad, "Víš, s kým spíš?"