M2160 – Úvod do programování II RNDr. Jaroslav PELIKÁN, Ph.D. katedra počítačových systémů a komunikací Fakulta informatiky Masarykovy univerzity Botanická 68a, 602 00 BRNO Kanc.: A209, : +420 – 549 495 751 E-mail: pelikan@fi.muni.cz http://www.fi.muni.cz/usr/pelikan
Cíl předmětu Seznámit studenty s pokročilými technika-mi používanými při návrhu algoritmů a ná-sledné tvorbě programů Na konci tohoto kurzu student bude: znát možnosti využití rekurze umět pracovat s řetězci umět pracovat s daty uloženými v souborech ovládat práci s dynamickými datovými strukturami znát základní principy objektově orientovaného programování 21/11/2017
Organizace předmětu Předmět M2160 má hodinovou dotaci 2/2, tj. 2 hodiny přednáška a 2 hodiny cvičení Rozvrh hodin: 1 přednáška: středa 16:00 – 17:50 (C511) 1 cvičební skupina: středa 14:00 – 15:50 (A215) Předmět je ukončen kolokviem 21/11/2017
Požadavky ke kolokviu Zápočet: „úspěšné“ napsání průběžných písemek splnění všech domácích úkolů (v termínu) maximálně dvě neomluvené neúčasti na cvičení Zápočet musí být zapsán na ISu nejpozději 12 hodin před začátkem kolokvia Kolokvium probíhá ve dvou částech: vypracování programu (na počítači): 90 minut diskuse nad řešeným problémem + další otázky 21/11/2017
Osnova (1) Rekurze Řetězce Datový typ struktura Pojmenované datové typy Datový typ union Práce se soubory: textové soubory binární soubory Dynamické proměnné 21/11/2017
Osnova (2) Dynamické datové struktury: zásobník fronta binární vyhledávací strom Předávání parametrů z příkazové řádky OS Složitost algoritmů Úvod do objektově orientovaného programo-vání – jazyk C# Tvorba aplikací s grafickým uživatelským rozhraním (GUI) 21/11/2017
Literatura (1) Pelikán, Jaroslav: Prezentace k přednáškám z předmětu M2160 Úvod do programování II – http://www.fi.muni.cz/usr/pelikan Herout, Pavel: Učebnice jazyka C, KOPP, České Budějovice 1994 Kernighan, Brian W. – Ritchie, Dennis M.: Programovací jazyk C, Computer Press, Brno 2006 Harbison, Samuel P. – Steele, Guy L. Jr.: Referenční příručka jazyka C, SCIENCE 1996 21/11/2017
Literatura (2) Sharp, John: Microsoft Visual C# 2010, Com-puter Press 2010, ISBN: 978-80-251-3147-3 Petzold, Charles: Programování Microsoft Windows Forms v jazyce C#, Computer Press 2006, ISBN: 80-251-1058-3 Nathan, Adam – Lehenbauer, Daniel: Windows Presentation Foundation Unleashed, Sams Publishing 2007, ISBN: 0-672-32891-7 21/11/2017
Rekurze (1) Schopnost objektů definovat se pomocí sebe sama Jazyk C umožňuje definovat tzv. rekurzivní funkce Říkáme, že funkce je rekurzivní (je defino-vána rekurzivně), jestliže se použití její de-finice vyskytuje uvnitř definice samotné 21/11/2017
Rekurze (2) Základní typy rekurze: přímá: nepřímá: lineární: stromová: funkce volá sama sebe nepřímá: funkce volá jinou funkci, která potom volá opět funkci výchozí lineární: funkce se v jednom průchodu vyvolá jen jednou stromová: funkce se v jednom průchodu vyvolá vícekrát 21/11/2017
Rekurze (3) Výpočet faktoriálu čísla n: lze využít vztahu: 0! = 1 n! = n.(n–1).(n–2). ... .1 = n.(n – 1)! pro n > 0 jedná se o nepříliš vhodné použití rekurze zápis algoritmu pomocí rekurze nebude jedno-dušší než zápis bez ní výsledný program bude pomalejší (způsobeno režií při vyvolávání funkce) 21/11/2017
Rekurze (4) Výpočet NSD čísel m, n: NSD (m,0) = m NSD (m,n) = NSD (n, m mod n) pro n > 0 tento postup redukuje problém nalezení NSD (m, n) na problém nalezení NSD (n, m mod n), kde 0 Ł m mod n < n tento proces musí po konečném počtu kroků vést k NSD (a, b), kde b = 0 vykazuje stejný problém (je pomalejší) jako rekurzivní výpočet faktoriálu 21/11/2017
Rekurze (5) Při použití rekurze je nutné vždy dávat po-zor, aby počet rekurzivních vyvolání funkce (tzv. hloubka rekurze) nebyl příliš vysoký, nebo dokonce nekonečný Je tedy nutné, aby v definici rekurzivní fun-kce byla vždy správně uvedena tzv. ukončo-vací podmínka 21/11/2017
Rekurze (6) Fibonacciho posloupnost: fib1 = fib2 = 1 fibn+2 = fibn+1+ fibn pro n > 0 použití rekurze je naprosto nevhodné protože pro n >1 počet volání roste exponenciálně 21/11/2017
Rekurze (7) Pravidlo: Platí: je-li možné jednoduše použít iterace (zápisu pomocí cyklu), pak se rekurzi vyhneme rekurzi použijeme v případě, že daný problém je definován rekurzivně Platí: každý iterativní algoritmus lze napsat rekurziv-ně a naopak 21/11/2017
Rekurze (8) Problém Hanoiská věž: Odkud Kam Pom Tento problém lze vhodně řešit pomocí rekurze (stromové) 21/11/2017
Rekurze (9) Při použití nepřímé rekurze je nutné, aby jedna z funkcí byla volána dříve než je uvedena její definice V takovém případě musíme ještě dříve než použijme vyvolání dosud nedefinované funkce provést zápis jejího prototypu 21/11/2017
Rekurze (10) void funkceG(double a, int b); void funkceF(int x) { } void funkceG(double a, int b) funkceF(8); 21/11/2017
Hilbertovy křivky (1) Hi – Hilbertova křivka i-tého řádu H1 H2 H3 Hi – Hilbertova křivka i-tého řádu Hi+1 dostaneme kompozicí čtyř křivek Hi po-loviční velikosti, jejich pootočením a spoje-ním třemi úsečkami 21/11/2017
Hilbertovy křivky (2) Označme čtyři části křivky Hi (Hilbertovy křivky nižšího řádu Hi-1) symboly A, B, C, D a spojující přímky šipkou odpovídajícího směru Dostáváme rekurzivní schéma: A: D ¬ A A ® B B: C Ż B ® B A C: B ® C Ż C ¬ D D: A D ¬ D Ż C 21/11/2017