Algoritmy BI-PA1 Programování a Algoritmizace 1 Miroslav Baĺık, Ladislav Vagner a Josef Vogel Katedra teoretické informatiky a Katedra softwarového inženýrství Fakulta informačních technologíı České vysoké učení technické v Praze xvagner@fit.cvut.cz, vogeljos@fit.cvut.cz 3., 5. a 6. října 2017
PA1 - Přednášky 1 Úvod, algoritmy 2 Proměnné, základní vstup a výstup 3 Výrazy 4 Větvení, cykly 5 Funkce 6 Pole, řetězce 7 Struktury, ukazatele #1 8 Ukazatele #2 9 Složitost algoritmů 10 Rekurze 11 Spojové seznamy 12 Stromy, soubory 13 Moduly, ADT M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 2/55
Přehled Algoritmy úvod. Algoritmy vlastnosti, příklady. Programovací jazyky úvod. M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 3/55
Algoritmus Definice: Algoritmus je konečná posloupnost operací vedoucí k vyřešení určité třídy problémů. Algoritmus je tvořen seznamem jednoznačně definovaných příkazů. Algoritmus zajišt uje, že očekávané výsledky budou dosaženy pro jakákoli přípustná vstupní data. Výsledky musí být nalezeny po konečném počtu kroků. M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 4/55
Algoritmus vlastnosti Hromadnost algoritmy jsou určeny pro řešení celé třídy problémů, nikoli pouze pro jediný konkrétní problém. Konkrétní problém (instance problému) je zadána pomocí vstupních dat. Determinovanost každý krok algoritmu je jednoznačně definován. Nemůže zde být nic náhodného. Opakování výpočtu pro stejná vstupní data musí vést ke stejným výsledkům. Resultativnost Každá přípustná vstupní data vedou k požadovaným výsledkům. Konečnost Pro každá přípustná vstupní data se po konečném počtu kroků dojde k výsledkům. M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 5/55
Algoritmus vlastnosti (pokračování) Vstup Konkrétní instance problému je dána vstupními daty. Výstup Požadované výsledky jsou tvořeny výstupními daty. Složitost obvykle nás zajímají algoritmy, které jsou efektivní z hlediska: rychlosti (doba výpočtu), pamět ového prostoru (velikost potřebné paměti). M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 6/55
Jak popsat algoritmus Přirozený jazyk. Vývojový diagram (flowchart). Struktogram (Nassi-Shneidermann diagram). Pseudokód. Programovací jazyk (např. C/C++/Java... ). M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 7/55
Problém #1 planeta Země a myš Předpokládejme, že naše Země je dokonalá koule. Je těsně omotána okolo rovníku zcela nepružnou mašĺı. Když tuto mašli prodloužíme o jeden metr a natáhneme ji rovnoměrně vysoko nad rovník, vznikne jistá mezera. Je třeba určit, zda se pod mašĺı protáhne myš. Dále uvažme obdobný problém pro Měsíc. (obraz Země - NASA) M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 8/55
Řešení #1 (naivní) Řešení pro Zemi: 1 Chytím myš (musí být živá, bude prolézat). 2 Seženu dlouhou mašli. 3 Omotám ji těsně okolo rovníku. 4 Přidám jeden metr. 5 Natáhnu mašli rovnoměrně vysoko nad rovník. 6 Vhodně motivovanou myš požádám, aby zkusila prolézt. 7 Zapíšu výsledek. M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 9/55
Řešení #1 (naivní) - pokračování Modifikace pro Měsíc: 1 Seženu grant. 2 Koupím vesmírnou lod, skafandr pro sebe a myš. 3 Pokračuji jako na Zemi. M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 10/55
Řešení #1 vyhodnocení Skončí? Algoritmus musí skončit v konečném počtu kroků. Tento počet kroků může být značně velký (to závisí na velikosti problému a na jeho složitosti), ale musí být konečný pro každá přípustná vstupní data. M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 11/55
Řešení #1 vyhodnocení Skončí? Algoritmus musí skončit v konečném počtu kroků. Tento počet kroků může být značně velký (to závisí na velikosti problému a na jeho složitosti), ale musí být konečný pro každá přípustná vstupní data. Ano, náš algoritmus skončí. Je deterministický? Každý krok algoritmu musí být jednoznačně a přesně definován; v každé situaci musí být naprosto zřejmé, co a jak se má provést, jak má provádění algoritmu pokračovat. M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 11/55
Řešení #1 vyhodnocení Skončí? Algoritmus musí skončit v konečném počtu kroků. Tento počet kroků může být značně velký (to závisí na velikosti problému a na jeho složitosti), ale musí být konečný pro každá přípustná vstupní data. Ano, náš algoritmus skončí. Je deterministický? Každý krok algoritmu musí být jednoznačně a přesně definován; v každé situaci musí být naprosto zřejmé, co a jak se má provést, jak má provádění algoritmu pokračovat. Náš algoritmus je deterministický, s jistými omezeními. Nemůžeme zajistit deterministické chování myši. M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 11/55
Řešení #1 vyhodnocení (pokračování) Je univerzální? Algoritmy jsou navrhovány nikoli pro řešení jediného problému, ale musí řešit celou třídu problémů. Např. nedává smysl vytvářet algoritmus pro výpočet 7 4, ale algoritmus pro násobení dvou zadaných celých čísel. M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 12/55
Řešení #1 vyhodnocení (pokračování) Je univerzální? Algoritmy jsou navrhovány nikoli pro řešení jediného problému, ale musí řešit celou třídu problémů. Např. nedává smysl vytvářet algoritmus pro výpočet 7 4, ale algoritmus pro násobení dvou zadaných celých čísel. Náš algoritmus je univerzální, muže být použit pro různé vesmírné objekty a různé živočichy. Akceptuje nějaké vstupy? Algoritmy obvykle vyžadují nějaký vstup pro popis instance problému. Tyto vstupy jsou zpracovány na začátku nebo v průběhu provedení algoritmu. Vstupní hodnoty jsou omezeny na určitou množinu povolených vstupů. M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 12/55
Řešení #1 vyhodnocení (pokračování) Je univerzální? Algoritmy jsou navrhovány nikoli pro řešení jediného problému, ale musí řešit celou třídu problémů. Např. nedává smysl vytvářet algoritmus pro výpočet 7 4, ale algoritmus pro násobení dvou zadaných celých čísel. Náš algoritmus je univerzální, muže být použit pro různé vesmírné objekty a různé živočichy. Akceptuje nějaké vstupy? Algoritmy obvykle vyžadují nějaký vstup pro popis instance problému. Tyto vstupy jsou zpracovány na začátku nebo v průběhu provedení algoritmu. Vstupní hodnoty jsou omezeny na určitou množinu povolených vstupů. Ano, náš algoritmus řeší daný problém pro libovolnou myš, Zemi i Měsíc (je dán poloměr). M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 12/55
Řešení #1 vyhodnocení (pokračování) Poskytuje výsledky? Algoritmus bez výsledků není moc užitečný. Alespoň nějaký výsledek je požadován, např. zda problém byl vyřešen. M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 13/55
Řešení #1 vyhodnocení (pokračování) Poskytuje výsledky? Algoritmus bez výsledků není moc užitečný. Alespoň nějaký výsledek je požadován, např. zda problém byl vyřešen. Ano, náš algoritmus má výsledek - odpověd ano či ne. Je efektivní? Algoritmy mohou být neefektivní, pokud provádějí kroky, jež nejsou nezbytné. Neefektivnost může být jakkoli vysoká. Např. algoritmus pro Měsíc může být použit i pro Zemi (grant, skafandr,... ). M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 13/55
Řešení #1 vyhodnocení (pokračování) Poskytuje výsledky? Algoritmus bez výsledků není moc užitečný. Alespoň nějaký výsledek je požadován, např. zda problém byl vyřešen. Ano, náš algoritmus má výsledek - odpověd ano či ne. Je efektivní? Algoritmy mohou být neefektivní, pokud provádějí kroky, jež nejsou nezbytné. Neefektivnost může být jakkoli vysoká. Např. algoritmus pro Měsíc může být použit i pro Zemi (grant, skafandr,... ). Náš algoritmus nepatří mezi efektivní. Dokonce i verze pro Zemi je neefektivní. M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 13/55
Řešení #2 (vylepšené) 1 Zjistíme poloměr vesmírného objektu, necht to je r [metr]. 2 Změřme myš, necht její výška je h [metr]. 3 Vypočteme obvod vesmírného objektu: c = 2πr [metr]. 4 Vypočteme poloměr prodloužené mašle: r b = c+1 2π [metr]. 5 Otestujme, zda r + h r b. Když je nerovnost splněna, je odpověd ano (myš podleze pod mašĺı), jinak je odpověd ne. Není třeba modifikace pro Měsíc, ani pro jiné vesmírné objekty. M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 14/55
Vsuvka otestujte své odhady Předpokládejme stejný problém pro: Měsíc (poloměr 1737 km), Zemi (poloměr 6378 km), Slunce (poloměr 695500 km), Mléčnou dráhu (poloměr přibližně 4.3 10 17 km). a předpokládejme tyto živočichy: mravenec (3 mm), myš (3 cm), kotě (10 cm), pes (50 cm). kůň (2 m). Pro které kombinace bude výsledek ano? M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 15/55
Vsuvka otestujte své odhady objekt mravenec myš kotě pes kůň Měsíc M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 16/55
Vsuvka otestujte své odhady objekt mravenec myš kotě pes kůň Měsíc ano M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 16/55
Vsuvka otestujte své odhady objekt mravenec myš kotě pes kůň Měsíc ano ano M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 16/55
Vsuvka otestujte své odhady objekt mravenec myš kotě pes kůň Měsíc ano ano ano M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 16/55
Vsuvka otestujte své odhady objekt mravenec myš kotě pes kůň Měsíc ano ano ano ne ne Země M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 16/55
Vsuvka otestujte své odhady objekt mravenec myš kotě pes kůň Měsíc ano ano ano ne ne Země ano M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 16/55
Vsuvka otestujte své odhady objekt mravenec myš kotě pes kůň Měsíc ano ano ano ne ne Země ano ano M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 16/55
Vsuvka otestujte své odhady objekt mravenec myš kotě pes kůň Měsíc ano ano ano ne ne Země ano ano ano M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 16/55
Vsuvka otestujte své odhady objekt mravenec myš kotě pes kůň Měsíc ano ano ano ne ne Země ano ano ano ne ne Slunce M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 16/55
Vsuvka otestujte své odhady objekt mravenec myš kotě pes kůň Měsíc ano ano ano ne ne Země ano ano ano ne ne Slunce ano M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 16/55
Vsuvka otestujte své odhady objekt mravenec myš kotě pes kůň Měsíc ano ano ano ne ne Země ano ano ano ne ne Slunce ano ano M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 16/55
Vsuvka otestujte své odhady objekt mravenec myš kotě pes kůň Měsíc ano ano ano ne ne Země ano ano ano ne ne Slunce ano ano ano M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 16/55
Vsuvka otestujte své odhady objekt mravenec myš kotě pes kůň Měsíc ano ano ano ne ne Země ano ano ano ne ne Slunce ano ano ano ne ne Mléčná dráha M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 16/55
Vsuvka otestujte své odhady objekt mravenec myš kotě pes kůň Měsíc ano ano ano ne ne Země ano ano ano ne ne Slunce ano ano ano ne ne Mléčná dráha ano M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 16/55
Vsuvka otestujte své odhady objekt mravenec myš kotě pes kůň Měsíc ano ano ano ne ne Země ano ano ano ne ne Slunce ano ano ano ne ne Mléčná dráha ano ano M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 16/55
Vsuvka otestujte své odhady objekt mravenec myš kotě pes kůň Měsíc ano ano ano ne ne Země ano ano ano ne ne Slunce ano ano ano ne ne Mléčná dráha ano ano ano M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 16/55
Vsuvka otestujte své odhady objekt mravenec myš kotě pes kůň Měsíc ano ano ano ne ne Země ano ano ano ne ne Slunce ano ano ano ne ne Mléčná dráha ano ano ano ne ne Výsledek je stejný pro jakýkoli poloměr objektu. Je tedy poloměr objektu nutný pro výpočet? M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 16/55
Řešení #3 (ještě více vylepšené) V řešení #2, jsme potřebovali porovnat: r + h r b t.j. h r b r kde r b r = 2πr + 1 2π r = r + 1 2π r = 1 2π [metr] Tedy, vše co jsme potřebujeme porovnat: h s 1 2π. Všimněte si, že finální formule neobsahuje vůbec poloměr objektu r. Tedy poloměr objektu je nepotřebný vstupní údaj, který pouze komplikuje a zdržuje výpočet. Podleze každý živočich, jehož výška je menší než 1 2π m 16 cm. M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 17/55
Řešení #3 (ještě více vylepšené) 1 Změřme živočicha, necht je jeho výška h [metr]. 2 Otestujme, zda h 1 2π. Když nerovnost platí, je výsledek ano (živočich může podlézt pod mašĺı), neplatí-li nerovnost, je výsledek ne. Není třeba žádná modifikace pro jiné objekty. M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 18/55
Problém #2 GCD Je třeba najít největší společný dělitel dvou přirozených čísel (Greatest Common Divisor - GCD). GCD čísel x a y je přirozené číslo z, pro které platí: x = z k, k je nějaké přirozené číslo, y = z l, l je nějaké přirozené číslo, z je největší číslo, pro které obě předchozí podmínky platí. Např. největší společný dělitel čísel 6 a 15 je 3. Největší společný dělitel se uplatní například při krácení zlomků. M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 19/55
GCD řešení Problémem je najít největší společný dělitel (GCD) dvou daných přirozených čísel. Vstup: přirozená čísla x a y. Výstup: gcd(x, y). Metoda: 1 Když x < y, nastav d na hodnotu x, jinak nastav d na hodnotu y. 2 Opakuj krok (3) dokud d není dělitelem obou čísel x a y. 3 Zmenši d o 1. 4 Hodnota d je výsledek. Poznámka 1: x, y a d jsou proměnné, jejichž hodnoty jsou uloženy na určitých pamět ových místech. Tyto hodnoty se mohou během výpočtu měnit. Poznámka 2: uvedený algoritmus není efektivní, na prosemináři se seznámíme s algoritmy efektivnějšími. M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 20/55
GCD postup výpočtu Najdi GCD čísel 15 a 6. krok x y d 15 6 počáteční hodnoty (1) 15 6 6 (2) 15 6 6 d není dělitelem x, další krok (3) M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 21/55
GCD postup výpočtu Najdi GCD čísel 15 a 6. krok x y d 15 6 počáteční hodnoty (1) 15 6 6 (2) 15 6 6 d není dělitelem x, další krok (3) (3) 15 6 5 (2) 15 6 5 d není dělitelem y, další krok (3) M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 21/55
GCD postup výpočtu Najdi GCD čísel 15 a 6. krok x y d 15 6 počáteční hodnoty (1) 15 6 6 (2) 15 6 6 d není dělitelem x, další krok (3) (3) 15 6 5 (2) 15 6 5 d není dělitelem y, další krok (3) (3) 15 6 4 (2) 15 6 4 d není dělitelem ani x, ani y, další krok (3) M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 21/55
GCD postup výpočtu Najdi GCD čísel 15 a 6. krok x y d 15 6 počáteční hodnoty (1) 15 6 6 (2) 15 6 6 d není dělitelem x, další krok (3) (3) 15 6 5 (2) 15 6 5 d není dělitelem y, další krok (3) (3) 15 6 4 (2) 15 6 4 d není dělitelem ani x, ani y, další krok (3) (3) 15 6 3 (2) 15 6 3 d je dělitelem obou čísel x a y, další krok (4) M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 21/55
GCD postup výpočtu Najdi GCD čísel 15 a 6. krok x y d 15 6 počáteční hodnoty (1) 15 6 6 (2) 15 6 6 d není dělitelem x, další krok (3) (3) 15 6 5 (2) 15 6 5 d není dělitelem y, další krok (3) (3) 15 6 4 (2) 15 6 4 d není dělitelem ani x, ani y, další krok (3) (3) 15 6 3 (2) 15 6 3 d je dělitelem obou čísel x a y, další krok (4) (4) 15 6 3 d = 3 je výsledek M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 21/55
GCD algoritmus Vývojový diagram Start + - x < y d := x d := y - d is a divisor of both x and y + d := d - 1 gcd := d M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 22/55
GCD algoritmus Struktogram GCD(x,y) yes x < y no d := x d := y repeat until d is a divisor of both x and y d := d - 1 gcd := d M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 23/55
GCD algoritmus Pseudokód GCD(x,y): if ( x < y ) then d := x else d := y while ( d "is not a divisor of" x or d "is not a divisor of" y ) do d := d - 1 GCD := d M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 24/55
GCD algoritmus Pseudokód GCD(x,y): if ( x < y ) then d := x else d := y while ( d "is not a divisor of" x or d "is not a divisor of" y ) do d := d - 1 GCD := d Poznámka: podmínka v cyklu se změnila, využíváme De Morganova vztahu: (A B) = A B M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 24/55
GCD algoritmus Programovací jazyk int gcd ( int x, int y ) { int d; if ( x < y ) d = x; else d = y; while ( x % d!= 0 y % d!= 0 ) d --; return d; } M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 25/55
Problém #3 št astné číslo Št astné číslo je takové kladné celé číslo n, pro které se následujícím postupem dostaneme k hodnotě 1: 1 jednotlivé cifry čísla n umocníme na druhou a sečteme, 2 získáme číslo n 1, 3 pokud n 1 = 1, bylo číslo n št astné, v opačném případě postup opakujeme pro n 1. 4 pokud se postup zacykĺı (dostaneme se k číslu, které jsme již zpracovávali), číslo n není št astné. M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 26/55
Problém #3 št astné číslo Št astné číslo je takové kladné celé číslo n, pro které se následujícím postupem dostaneme k hodnotě 1: 1 jednotlivé cifry čísla n umocníme na druhou a sečteme, 2 získáme číslo n 1, 3 pokud n 1 = 1, bylo číslo n št astné, v opačném případě postup opakujeme pro n 1. 4 pokud se postup zacykĺı (dostaneme se k číslu, které jsme již zpracovávali), číslo n není št astné. Příklad št astného čísla: 7 49 16 + 81 = 97 81 + 49 = 130 1 + 9 + 0 = 10 1 + 0 1 M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 26/55
Št astné číslo Příklad nešt astného čísla: 150 1 + 25 + 0 = 26 4 + 36 = 40 16 + 0 = 16 1 + 36 = 37 9 + 49 = 58 25 + 64 = 89 64 + 81 = 145 1 + 16 + 25 = 42 16 + 4 = 20 4 + 0 = 4 16 M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 27/55
Št astné číslo Dvojková soustava je št astná soustava. Proč? M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 28/55
Št astné číslo Dvojková soustava je št astná soustava. Proč? Proto jsou počítače št astné. M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 28/55
Št astné číslo Dvojková soustava je št astná soustava. Proč? Proto jsou počítače št astné. Proto jsou lidé od počítačů št astní. M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 28/55
Št astné číslo Dvojková soustava je št astná soustava. Proč? Proto jsou počítače št astné. Proto jsou lidé od počítačů št astní. Dokažte. M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 28/55
Št astné číslo algoritmus ishappy ( n ): done := false while not done c := sumdigitsquare (n) if c = 1 then done := true else n := c ishappy := done M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 29/55
Št astné číslo algoritmus ishappy ( n ): done := false while not done c := sumdigitsquare (n) if c = 1 then done := true else n := c ishappy := done Co se stane pro nešt astná čísla? M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 29/55
Št astné číslo algoritmus, oprava ishappy ( n ): done := false while not done c := sumdigitsquare (n) if c = 1 then flag := true done := true else if haveseen (c) then flag := false done := true else n := c ishappy := flag M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 30/55
Št astné číslo algoritmus, oprava ishappy ( n ): done := false while not done c := sumdigitsquare (n) if c = 1 then flag := true done := true else if haveseen (c) then flag := false done := true else n := c ishappy := flag Co je sumdigitsquare a haveseen? M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 30/55
Št astné číslo abstrakce Při návrhu složitějších algoritmů nemusíme vyřešit všechny detaily na jednom místě. Často si pomáháme abstrakcí, kdy detaily řešení nějakého dílčího problému skryjeme (black box) a odkazujeme se na něj vhodným jménem. Odkazované dílčí algoritmy pak popíšeme samostatně. Pokud je rozdělení rozumné, algoritmy jsou kratší a srozumitelnější. Tento princip se uplatňuje i v programování (funkce, procedury, moduly,... ). M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 31/55
Št astné číslo sumdigitsquare sumdigitsquare ( n ): c := countdigits ( n ) sum := 0 i := 0 repeat c times digit := (n / 10 ^ i) mod 10 sum := sum + digit * digit i := i + 1 sumdigitsquare := sum M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 32/55
Št astné číslo countdigits countdigits ( n ): if n < 10 then digits := 1 else if n < 100 then digits := 2 else if...... countdigits := digits M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 33/55
Št astné číslo countdigits countdigits ( n ): if n < 10 then digits := 1 else if n < 100 then digits := 2 else if...... countdigits := digits Pracné, není obecné, kolik je maximum? M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 33/55
Št astné číslo countdigits countdigits ( n ): countdigits := log10 (n) M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 34/55
Št astné číslo countdigits countdigits ( n ): countdigits := log10 (n) Skoro, ale např. pro 12 dostaneme 1 cifru. Zaokrouhlovat nahoru nebo dolů? M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 34/55
Št astné číslo countdigits countdigits ( n ): countdigits := floor ( log10 (n) ) + 1 M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 35/55
Št astné číslo countdigits countdigits ( n ): countdigits := floor ( log10 (n) ) + 1 Logaritmus bývá počítán nepřesně (aproximace pomocí řad). Nešlo by se mu vyhnout? M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 35/55
Št astné číslo countdigits countdigits ( n ): digits := 0 while n > 0 digits := digits + 1 n := floor ( n / 10 ) countdigits := digits M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 36/55
Št astné číslo countdigits countdigits ( n ): digits := 0 while n > 0 digits := digits + 1 n := floor ( n / 10 ) countdigits := digits Nefunguje správně pro n = 0, ale v problému uvažujeme pouze kladná čísla. M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 36/55
Št astné číslo countdigits countdigits ( n ): digits := 0 while n > 0 digits := digits + 1 n := floor ( n / 10 ) countdigits := digits Nefunguje správně pro n = 0, ale v problému uvažujeme pouze kladná čísla. Když už stejně iterujeme přes všechny cifry, nešlo by sloučit sumdigitsquare a countdigits? M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 36/55
Št astné číslo sumdigitsquare, optimalizace sumdigitsquare ( n ): sum := 0 while n > 0 sum := sum + ( n mod 10 ) * ( n mod 10 ) n := floor ( n / 10 ) sumdigitsquare := sum M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 37/55
Št astné číslo haveseen Jak ukládat čísla, která již algoritmus prošel? M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 38/55
Št astné číslo haveseen Jak ukládat čísla, která již algoritmus prošel? Seznam (pole): seznam musíme prohledávat při testování přítomnosti prvku, seznam musíme rozšiřovat při vkládání prvku, musíme kontrolovat duplicity při vkládání. M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 38/55
Št astné číslo haveseen Jak ukládat čísla, která již algoritmus prošel? Seznam (pole): seznam musíme prohledávat při testování přítomnosti prvku, seznam musíme rozšiřovat při vkládání prvku, musíme kontrolovat duplicity při vkládání. Množina: abstrakce, která lépe popisuje požadované chování v algoritmu, operace vkládání a testu přítomnosti jsou množině vlastní. M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 38/55
Št astné číslo algoritmus se množinou ishappy ( n ): done := false seenset := while not done c := sumdigitsquare (n) if c = 1 then flag := true done := true else if c seenset then flag := false done := true else n := c seenset := seenset { c } ishappy := flag M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 39/55
Št astné číslo optimalizace Pokud testujeme, zda n je št astné číslo v desítkové soustavě, pak mohou nastat tyto situace: algoritmus dosáhne hodnoty 1 (číslo je št astné), algoritmus skončí v cyklu 4, 16, 37, 58, 89, 145, 42, 20, 4,... Nemůže nastat situace, kdy algoritmus pro nešt astné číslo skončí v jiném cyklu. Vysvětlení a důkaz je např. na Wikipedii, heslo Happy number. Algoritmu tedy stačí testovat hodnotu 1 (št astné) a 4 (nešt astné). Nemusí se zabývat množinou čísel, která již prošel. Pokud bychom testovali št astná čísla v jiné číselné soustavě (základ rozdílný od 10), tato optimalizace by se nedala použít. M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 40/55
Št astné číslo finální algoritmus ishappy ( n ): done := false while not done c := sumdigitsquare (n) if c = 1 then flag := true done := true else if c = 4 then flag := false done := true else n := c ishappy := flag M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 41/55
Programovací jazyky Programovací jazyky jsou navrženy tak, aby: popsaly výpočetní kroky algoritmů, byly ve formě srozumitelné člověku a současně byly ve formě srozumitelné stroji (počítači). Formální jazyky jsou vytvořeny uměle. Na rozdíl od přirozených jazyků (angličtina, čeština,... ), mají formální jazyky: velmi přesnou gramatiku, žádné nebo jen málo výjimek z obecných pravidel, jen málo jazykových konstruktů (deklarace, příkaz, cyklus, podmínka,... ), potenciálně neomezenou sílu v kombinaci těchto konstruktů. Formální jazyky jsou obvykle založeny na angličtině (s výjimkou APL, který je založen na Klingonštině :-) ). M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 42/55
Programovací jazyky (pokračování) Programovací jazyky nízké úrovně (assembler, strojový kód): velmi jednoduchá struktura, navržená pro konkrétní typ počítače, jednoduché operace (jako přesun obsahu buňky paměti do registru, sečtení obsahu dvou registrů,... ), obtížný pro člověka (zdlouhavý kód i pro jednoduché problémy), náchylný k chybám programátora. Programovací jazyky vysoké úrovně (C, C++, Java, Pascal, Ada,... ): navržené pro člověka, programy jsou kratší, jednodušeji srozumitelné, oddělují programátora od strojově specifických detailů (organizace paměti, instrukční množina, velikost slova,... ), programy nemohou být přímo použity, musí být nejdříve přeloženy do strojového kódu. M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 43/55
Programovací jazyky (pokračování) Imperativní jazyky (procedurální programovací styl): program je sekvence příkazů zpracovávaných v pořadí shora dolů, pro změnu tohoto pořadí slouží cykly a větvení, volání podprogramu mění pořadí zpracování slouží pro vícenásobné použití stejného kódu), návrat z ukončeného podprogramu na příkaz za jeho voláním. Neimperativní jazyky: funkcionální programovací styl, deklarativní programovací styl, více o neimperativních programovacích jazycích později v jiných předmětech (např. BI-PPA). M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 44/55
Programovací jazyky (pokračování) Imperativní jazyky z pohledu programátora: program zpracovává datové objekty různých typů, datové objekty jsou uloženy v proměnných nebo konstantách, proměnné a konstanty jsou reprezentovány svými jmény (jedinečnými identifikátory), program se skládá z deklarací a příkazů, deklarace definuje význam identifikátoru (proměnná, funkce, konstanta,... ). příkaz slouží pro vykonání nějaké akce s datovými objekty (např. mění jeho hodnotu) nebo mění pořadí provádění příkazů. M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 45/55
Programovací jazyky (pokračování) Programovací jazyk: Syntaxe formální způsob, jak psát program: množina pravidel, která definují omezení individuálních konstrukcí a jejich kombinací, obvykle implementována jako gramatika, syntaktické diagramy, BNF Backus-Naurova forma (Backus-Naur form). Sémantika význam jednotlivých syntaktických konstrukcí: obvykle popsaná v textové podobě. M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 46/55
Syntaktické diagramy identifier character character character digit 'A' 'B' 'C' 'Z' digit '0' '1' '2' '9' M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 47/55
BNF Backus-Naurova forma identifier ::= character { digit character } character ::= A B C D... X Y Z digit ::= 0 1 2 3 4 5 6 7 8 9 Legenda: {x} žádný nebo více výskytů x, x y bud x nebo y, [x] x je nepovinné (žádný nebo jeden výskyt). M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 48/55
Interpretace programu input data source code compiler computer internal form interpret computer output data M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 49/55
Kompilace programu do strojového kódu input data source code compiler computer our program in a machine code computer output data M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 50/55
Programovací jazyk C Programovací jazyk C bude použit pro vývoj, implementaci a testování programů v BI-PA1. Programovací jazyk C++ (objektově orientovaná verze jazyka C) bude použita v BI-PA2. Krátká historie jazyka C: 1972 D. Ritchie, Bell Laboratories (AT&T), PDP-11 1973 operační systém UNIX je napsán v jazyku C. 1978 B. Kernighan, D. Ritchie: The C programming language (K&R C) 1982 ANSI working group X3J11 1989 ANSI X3.159-1989 (ANSI C, C89) 1990 adoptováno do ISO/IEC 9899:1990 1999 nová ISO norma: ISO 9899:1999 (C99) 2011 nová ISO norma: ISO 9899:2011 (C11, nezaměňovat s C++ 11) M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 51/55
Otcové jazyka C Brian Wilson Kernighan Denis MacAlistair Ritchie Kenneth Thompson M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 52/55
Programovací jazyk C Výhody jazyka C: programovací jazyk vyšší úrovně, umožňuje i programování nízké úrovně (manipulaci s adresami, ukazatele), optimalizující kompilátory produkují vysoce efektivní strojový kód, programy jsou portabilní mezi různými platformami (pokud nejsou použity platformně závislé triky), syntaxe C je užita mnoha jinými programovacími jazyky (C++, Java, Perl, C#, Javascript,... ). Nevýhody jazyka C: diskutabilní bezpečnostní politika vše je ponecháno na programátorovi, žádné běhové kontroly (indexy v poĺıch, validní ukazatele). M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 53/55
První program v jazyku C #include <stdio.h> int main ( int argc, char * argv[] ) { printf ( "Hello world!\n" ); return 0; } M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 54/55
Otázky a odpovědi Otázky... M. Baĺık, L. Vagner a J. Vogel, ČVUT FIT Algoritmy, BI-PA1 55/55