21.05.2024: Ř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! * odbočka: vnější třídění * Rada 4.: ...omezte se na řešení v určitém tvaru! * U5: Rozpoznávání znaků * U1: Páková vodovodní baterie - řešení 07.05.2024: * vlákna v C#: - Random NENÍ thread-safe - kdy použít vlákno (aby nezamrzlo GUI) * ještě delegáty (static nebo funkce jedné instance) * příklad zkouškového příkladu - ANKETA - diagram toku dat (data-flow diagram) * Generické metody a třídy - omezení where - interface * Panoptikum OOP jazyků * Hygiena programování - oddělovat činnosti - resources - pracovní deník - gumová kačenka - ToDo-list, bug-list, issue tracker - TRELLO - Kanban - GitHub/GitLab - správa verzí - automatické testy 30.04.2024: * 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 23.04.2024: * 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 - příklad objektového návrhu: úloha s přeléváním vody - jaké třídy - jaké budou mít veřejné funkce - kolik instancí - na co si uděláme vlastní třídu a na co použijeme hotové třídy (fronta, dictionary, tuple...) - Návrhové vzory * C#: Extension methods * C#: property (opakování) 16.04.2024: 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 Floyd-Warshallův algoritmus Dynamické programování * optimální vyhledávací strom a jeho nalezení Spolupráce VisualStudia s GitLabem 09.04.2024: Přednášel dr.Pergel a to o: - výjimkách - automatických testech a jejich podpoře ve VisualStudiu - požadavcích na znalosti vyučované v jiných předmětech 02.04.2024: 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 * Font * výběr části obrázku a kopírování 26.03.2024: Dynamické programování * příklad: počet BVS o N vrcholech * 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 * optimální uzávorkování součinu matic * počet způsobů zaplacení částky mincemi * klávesnice čínského mobilu * mat králem a věží 19.03.2024: 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 prostřednictvím properties a prostřednictvím dbl-click - MessageBox * Sdílení obslužných metod - Sender - Přetypování "(typ)" // nebo "as" - Is - Kalkulačka 12.03.2024: 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) * Ad OOP-design: Jak upravit simulaci s pískem, aby upřednostňovala auta s kratší dobou nakládání - různá možná řešení, výhody a nevýhody. 05.03.2024: 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čů 27.02.2024: Objekty: * proč - organizace kódu, oddělení JAK a CO to dělá, uvažování v pojmech problému * 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 20.02.2024: * 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 (dekompozice) - 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ů ############## HIC SUNT PYTHONES ################################## 09.01.2024: Ještě k funkcím: * funkce v proměnných a jako parametry * odbočka: pořadí vyhodnocování OPERANDŮ (a proč na tom záleží) * odbočka: pojmenované podvýrazy (PEP 572) * lambda funkce * closure * generátory a iterátory * context manager, with * tipy pro psaní hezkého kódu Příklad: Hra 7531 - odebírání zápalek z více hromádek - rekurze - složitost-rychlost-počet volání - zrychlení ukládáním spočítaných výsledků 19.12.2023: Balíček matplotlib: * knihovna, 20 let, podporovaná neziskovou organizací * závislosti * matplotlib.pyplot = interface ala MATLAB * 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 Příklad: * rychlost .append, .pop() a .pop(0) u Listu modul NumPy: * knihovna, 17 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 modul Selenium: * knihovna, 17 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: * příklad hry s odebíráním čísel - minimax a negamax 12.12.2023: 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í 05.12.2023: 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) - cizí kód - bugy, verse - zpětná kompatibilita (MS Excel) - dependency hell * virtuální prostředí - venv Testy podruhé: * modul unittest - testovací případ - class TestCase(unittest.testCase): - def test.... - assertEqual, self.assertRaises = očekávaná výjimka * unittest ve Visual-Studiu 28.11.2023: * 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 Podíl( vstup ) * 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... - (někdy) potřebujeme vracet nejenom výsledek, ale i jak-to-dopadlo - výjmky vs. návratové kódy * příklad PocetDnu( d1,m1,r1, d2,m2,r2 ) - TDD: test-driven-development * list(set, dict, tuple)-comprehensions 14.11.2023: * Objekty v Pythonu - pokračování - 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 - 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! - 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 07.11.2023: * 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 * 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 - Polymorfismus - Abstraktní třída - příklad se zvířaty - Duck typing - kontrola typu (type(),, isinstance() //- 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 31.10.2023: * ten příklad z minula (nejčastější slova): - jaké má části a s jakou složitostí pracují - a co bychom mohli zrychlit (potřebujeme lépe ukládat seznam slov) další složitější datové typy: * tuple (n-tice) * dictionary ...a tím zrychlíme ten program ...a protože ho máme rozdělený do funkcí, tak nám ho ty změny nerozbijí * Objekty - Společně data a funkce (metody) - Proč - příklad objektové dekompozice - program, který tiskne slova do řádek - Pojmy OBJEKT a TŘÍDA - parametr self (může se jmenovat jakkoli jinak) = veřejné a soukromé (v PY ne tak úplně) členy - konstruktor * příklad: čtečka čísel, která už nepotřebuje GLOBÁLNÍ proměnnou (zbytek) * příklad: program, který tiskne slova do řádek 24.10.2023: * příklad na dekompozici (rozklad programu na části): 20 nejčastějších slov - rozmýšlení a návrh pomocí myšmapy - funkce PrectiSlovo(), PridejSlovo( slovo ) a VratNNejcastejsichSlov( N ) - 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 * návrh programu shora (dekompozice) a ladění zdola (když něco napíšeme, tak to hned vyzkoušíme) * funkce a IDE - zásobník volání (call-stack) * zkrácené vyhodnocování logických výrazů ...k čemu je to užitečné a jaká to má rizika (když podmínka volá funkce s vedlejším efektem) 17.10.2023: * 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 * globální proměnné a jak se jim vyhnout 10.10.2023: * převody mezi typy pomocí int() a str() * 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 03.10.2023: * 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