Programování 2 - cvičení - NMIN112 1. Úvodní informace Dotazy: ke cvičení? případně ještě k podmínkám zápočtu? k přednášce? 2. Hvězdičky pokračování (Labyrintem algoritmů) Pozorovani: měli jsme 3 meta-typy chování funkci složitosti: a) přesně spočítáme , b) aproximujem c) omezíme mezí (horší či lepší než to nebude) 2.1 Který algoritmus je lepší? 2.2 Kuchařka pro výpočet složitosti 3. Asymptotické složitosti 3.2 Definice 3.3 Příklady: Mějme funkce f,g: N+ -> R dokažte nebo vyvraťte následující tvrzení: n2 -6n + 4 = O(n2) n2 = O(n3) n3 = O(n2) f = O(g) -> g = OMEGA(f) f = O(g), g = O(h) -> f = O(h) f = O(g), h = O(g) -> f+h = O(g) f = O(g), h = O(g) -> f.h = O(g) 4. Style Guide: o čem to je? co vše se mimo jiné řeší? není to dogma, jsou to doporučení; mají svě klady i zápory; jazykově a kulturně závislé PEP 8 – Style Guide for Python Code: https://peps.python.org/pep-0008/ Google Python Style Guide: https://google.github.io/styleguide/pyguide.html namming convention (var, fce, const, class, ..) blank lines delim, delim, line function length Příště - základní postupy při ladění programů - model view architekture Programování 3.0 Mejme celociselnou matici ve (zjednodusenem) Matlab formatu ulozenou v souboru (na jednom radku), vytvorte funkci, ktera soucasne: - matici ze standardniho vstupu nacte, - naparsuje a ulozi do nested listu (2D/nested listu) a - vytiskne (s.split(), s.strip(), s.strip(" abc"), s.strip(" []"), "".join(["a","b"]), "xxxx".join(["a","b"]), s.replace("[","")) https://ksvi.mff.cuni.cz/~dingle/2022-3/prog_1/notes_4.html Priklad zjednodusene matice: "[1,2,3,4;5,5,5,5]" 3.2 Předchozí a předpokladejme že matice v souboru můze byt prolozena ruznym mnozstvym mezer Priklad matice: " [ 1, 2 , 3,4 ; 5, 5 ,5 , 5 ] " 3.3 Předchozí a predpokladejte ze matice v souboru nemusi byt ulozena na jednom radku Priklad matice: " [ 1, 2 , 3 ,4 ; 5, 5 ,5 , 5 ] " 3.5 Predchozi a tisknuty vystup "hezky"* naformatujte (fString) *hezky = zarovnane doprava, predpokladejte ze cisla nebudou vetsi nezli 6 cislic Napr. 0 1 22 111 11 111 11 11 1 Poznamky: - zacit s funkci ktera cte ze stdin (vice radku) a vraci jeden slozeny string - cviceni je na dekompozici kodu resp. moduly; opakova top-down a bottom-up pristupu - dekompozice top-down napr. read_parse_print_matrix: -- read(...) -- parse(...) -- print(...) a dale napr parse(...): -- zbavit se hranatych zavorek -- rozdelit na jednolive radky -- radky rozdelit podle jednotlivych prvku v radku (rozdelit na sloupce) -- orezat a pretypovat - pouziti konstant pro delimitry ve vstupnim stringu - a nebo cely kod parsovani napsat do # [item for item in matrix_string_with_brackets.strip("][ ").split(ROW_DELIM)] [[int(item.strip()) for item in row.split(COL_DELIM)] for row in matrix_string_with_brackets.strip("][ ").split(ROW_DELIM)] 6. Loupání matice 6.1 Loupaní matice - v implementaci použijte for/while cykly Matici z předchozího příkladu "oloupejte"* a výsledné hodnoty vypište na konzoli. Loupání začněte v pravém horním rohu a pokračujte ve směru hodinových ručiček. (*loupání = loupáte/ořezáváte matici vrstvu po vrstvě, z vnějšího okraje k vnitřními; jako byste rozbalovali šnečí ulitu) Matice: 1 2 3 4 5 6 7 8 9 10 11 12 Jak vypadá její oloupaný tisk? Výstup "oloupané" matice: 4 8 12 11 10 9 5 1 2 3 7 6 6.2 Loupaní matice - Předchozí a místo tisku oloupané matice napište funkci vracející list hodnot "oloupané" matice 6.4 Loupaní matice - v implementaci použijte rekurzi