Co bylo na minulých přednáškách =============================== 23.04.2026: * Dekompozice, Objektový návrh, Obrázky a UML, guruové a rady starších - proč - dekompozice - příklad abstrakce a interface: soubory - příklad abstrakce a interface: relační databáze a jazyk SQL - objektový návrh - vztahy tříd, kompozice, agregace... ISA-vztah - 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 se stahováním webu - 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...) // = TADY si vzpomeneme na "Dependency Inversion Principle" // a použijeme raději třídu/interface než konkrétní typ - Návrhové vzory (příklad: vzor Observer) //- Entity-Relationship - ER-diagram - interface v jazyku C#, násobná dědičnost (diamond problem) 16.04.2026: * 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#: - Thread, .Start() - počet jader - //může být jinak rychlé v Debug a Build režimu - race-condition - Lock - ...deadlock - kdy použít vlákno (aby nezamrzlo GUI) * GUI aplikace s více okny: - Show() vs. ShowDialog() - Button.DialogResult - AcceptButton / CancelButton - událost FormClosing 09.04.2026: Zkoušky * jak budou probíhat * potřebné znalosti z jiných předmětů - vnější třídění - zlehka: (a,b)-stromy/B-stromy (předpokládám, že budou v ADS) * jak vypadá písemka - příklad: program na počítání počtu způsobů překládání papíru - příklad: program na kontrolu řešení Úlohy s poštou 02.04.2026: 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 - zvětšení - deformace - barevná složka - světlost – převod na šedou - práh - algoritmus Distribuce chyby * Font * jak označit obdélník (a kopírovat část Bitmapy) * snímek obrazovky 26.3.2026: 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 * hra odebírání zápalek - vyhrávací pozice * hra odebírání zápalek - počet různých her * mat králem a věží 19.3.2026: 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 * rychlé vytváření prototypů aplikací * Příklad: Kalkulačka 12.3.2026: 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í vypisovaných zpráv - přehledná vstupní data - abstraktní třída Proces a polymorfismus při zpracování událostí * VisualStudio: - 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) - nullable references - co to je - nastavení v projektu - nastavení ve zdrojovém souboru - anotace ? a ! 5.3.2026: Diskrétní simulace: * úloha s hromadou písku * Simulace spojitá vs. diskrétní, model Program: - Model - Kalendar - Udalost - TypUdalosti - C# enum - Auto * 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čů C# a Visual Studio: - více souborů v projektu - rozdělení práce mezi třídy - using pro vytváření alias-ů - enum - generování konstruktoru - Debug.Assert - odvození třídy a přepsán virtuální metody - volání konstruktoru předka - code-snippets (Console.WriteLine, for, switch) - přejmenovávání 26.2.2026: * pole * new 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 * 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() //- …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 19.2.2026: * 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), abychom ho dokázali upravovat a nerozbít - 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ů * soubor - projekt - solution * VisualStudio a jeho příjemné vlastnosti * Příklad: Čtečka čísel 6.1.2026: Ještě k funkcím: * funkce v proměnných a jako parametry - příklad: funkce pro hlášení chyby //* odbočka: pořadí vyhodnocování OPERANDŮ (a proč na tom záleží) * lambda funkce * closure * dekorátory: - princip - předávání parametrů pomocí (*args, **kwargs) - příklady dekorátorů: //- @kresli: zobrazovat (rekurzivní) volání //- @doba: měřit čas - @pamatuj: memoizace * generátory a iterátory * context manager, with * jaký by měl být zdrojový kód (podle různých zdrojů) * problém dvou loupežníků: - ...rekurzivně - ...s dekorátorem pamatuj (memoizace) - a heuristika 16.12.2025: Balíček matplotlib: * knihovna, 23 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: srovnání rychlosti různých implementací fronty (list, lazy-delete-list, LSS, deque) modul NumPy: * knihovna, 19 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, 18 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: vyhledání spojení * příklad: hra s odebíráním čísel - implementace pomocí algoritmu minimax - implementace pomocí algoritmu negamax - složitost - ukládání výsledků (memoizace) a složitost - pozor: začínajícího hráče nelze porazit! 10.12.2024: Testy podruhé: * modul unittest - testovací případ - class TestCase(unittest.testCase): - def test.... - assertEqual, self.assertRaises = očekávaná výjimka - pozitivní a negativní testy - TDD: Test Driven Development - CI: Continuous Integration * unittest ve Visual-Studiu Příklad: Hra s odebíráním čísel - rekurze, minimax, negamax a memoizace 9.12.2025: 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í Příklad na rekurzi - problém dvou loupežníků 2.12.2025: 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 - pozitivní a negativní testy - TDD: Test Driven Development - CI: Continuous Integration * unittest ve Visual-Studiu * jak testovat - okrajové případy! Formátování kódu neboli Coding style * proč * budou domácí úkoly zaměřené na kvalitu kódu (pojmenování proměnných, DRY a dekompozice) 25.11.2025: * Chyby: syntaktické, běhové, sémantické * Ad syntaktické: - typové anotace v Pythonu, mypy, ukázka ve VisualStudiu * Ad běhové: - 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í * Ad sémantické: - 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 //- TDD: test-driven-development * příklad PocetDnu( d1,m1,r1, d2,m2,r2 ) * list/set/dict/tuple-comprehensions 18.11.2025: * "funkce" int(), str() apod. jsou ve skutečnosti konstruktory nových objektů * příklad dědičnosti - velká želva - vztah IS-A a vztah HAS-A * práce se soubory - komplikace: vícebajtové znaky - parametr "encoding" - komplikace: nejednotné konce řádek CR-LF, CR, LF - proč je potřeba zavírat soubory * funkce typu string - užitečnost .format() - šablony výstupu * assignment expression (walrus operator) * dekompozice, objektový návrh * příklad: nejčastější slova pomocí objektů - pro každou činnost zvolíme takový objekt, jaký právě teď potřebujeme, třeba čtení ze stringu, z klávesnice, ze souboru... - dependency injection - is-a NEBO has-a 11.11.2025: * Spojový seznam (jednosměrný, lineární) - Prvek - vytvoření - projití - přidání na začátek - mazání prvního prvku ---------------------------------------------- * odbočka: příkaz assert, Python i jiné jazyky ---------------------------------------------- - přidání na konec - ...když si pamatujeme, kde je konec - mazání posledního prvku (složitost lineární!) - jak reprezentovat FRONTU pomocí LSS? * 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() - komu patří funkce (instanci, třídě, statická) - komu patří proměnná (instanci, třídě) - Zapouzdření/Encapsulation - zveřejňovat co nejméně! - konvence s _... a __... v Pythonu 4.11.2025: * návrh programu shora (dekompozice) a ladění zdola (když něco napíšeme, tak to hned vyzkoušíme) * 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 bychom mohli zrychlit 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) - konstruktor * Dynamické proměnné - ukazatel - Halda - Garbage collector * Spojový seznam (jednosměrný, lineární) - Prvek - vytvoření - projití 14.10.2025: Funkce (podprogramy) * příklad tabulka násobilky - 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 * Příklad: nejčastější slova v přečteném textu - rozklad na pod-úlohy 1) co potřebujeme? 2) jak to můžeme získat? - návrh "shora", ladění jednotlivých funkcí "zdola" 7.10.2025: Složitější datové typy * Objekty, zatím jen povrchě * Proměnná - je to ODKAZ na hodnotu (budu připomínat ještě mockrát, zdroj chyb!) - porovnávání hodnot (==) a porovnávání odkazů (is) * String - přístup ke znaku - neměnný – dosadit do znaku nelze - slice - kód znaku, kódování * List * For-cyklus * Range * Příklad: - čtení čísla ze stringu pomocí Hornerova schématu - hledání údajů ve zdrojovém kódu webové stránky pomocí split(). 30.09.2025: * 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ápočtový test, zápočtový program - 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 = potřebujeme kompromis * od začátku: * Hodnoty, typy - Čísla - Int, float * Jednoduché příklady: - test prvočíselnosti * Příběh strašlivý o funkci jménem LeftPad.