zde - Univerzita Karlova

zde - Univerzita Karlova zde - Univerzita Karlova

24.02.2015 Views

Algoritmy ve výuce na střední škole 1 Hashim Habiballa, PřF OU Ostrava 2 Antonín Jančařík, PedF UK Praha 3 Abstrakt. Příspěvek ukazuje spojení teoretické (matematické) informatiky s algoritmizací a praxí. Zvolená úloha jasně ukazuje význam teoretických disciplín, konkrétně teorie formálních jazyků a automatů, pro schopnost středoškolských studentů naučit se návrhu efektivních algoritmů. Tato úloha zahrnuje pro informační technologie a programování nezbytnou syntaktickou analýzu a překlad. Vybraný příklad jazyka aritmetických výrazů je navíc vhodný pro výuku v rámci matematiky, neboť jde o všeobecně používaný matematický aparát. Úvod V dnešní době se ve výuce informatiky na střední škole bohužel často projevuje trend klesající odborné úrovně. Jde zejména o výuku orientovanou na aplikační programy, bez důrazu na principy informatiky, zahrnující především algoritmy a teoretické disciplíny zkoumající související pojmy, jako je teorie formálních jazyků a automatů, formální logika nebo vyčíslitelnost a složitost. Tento článek navazuje na některé již uveřejněné materiály, viz např. [8], [9], [10]. Úloha, kterou přinášíme, má hodně společného s typickou úlohou v informatické praxi, a tou je překlad, resp. interpretace, nějakého zdrojového kódu (programu) do jiného jazyka (včetně optimalizací vzniklého kódu). S tímto se setkáváme prakticky každodenně (otázkou je, zda si to uvědomujeme). Samozřejmě nejprve informatika asi napadne úloha typu – programuji řešení zadaného úkolu v nějakém programovacím jazyce (např. Pascalu) a pak použiji překladač, který mi vyrobí kód v nějakém počítačově použitelném formátu (třeba .exe soubor pro počítač typu PC pod platformou MS-DOS). Nemusí však jít jen o tento „programátorský případ. Aniž si to mnohdy uvědomujeme, pokud prohlížíme libovolnou webovou stránku, tak náš webový prohlížeč získává z daného URL kód v jazyce HTML. Ten by samozřejmě pro člověka asi nebyl na čtení to nejlepší. Proto prohlížeč musí PŘELOŽIT a interpretovat tento kód tak, 1 Příspěvek byl vypracován s podporou grantu GAČR 406/05/P561. 2 e-mail: habiballa@volny.cz, www: http://www.volny.cz/habiballa/ 3 e-mail: antonin.jancarik@pedf.cuni.cz 104

aby byl pro člověka příjemný. Jde o zobrazení různých velikostí písma, tabulek, obrázků, pozadí stránek atd. Jakkoliv to vypadá naprosto přirozeně, při zkoumání principů a metod programů pro tuto činnost zjistíme, že to není až tak triviální činnost a souvisí neoddělitelně právě s teorií formálních jazyků. I zdánlivě jednoduchá součást tohoto procesu je bez dobré znalosti pojmů a postupů, které přináší teorie formálních jazyků a automatů, takřka neřešitelný úkol. Touto jednoduchou úlohou, se kterou se nyní důkladně seznámíme a ukážeme si její obecně použitelné řešení, je kontrola, překlad a vyhodnocení aritmetického výrazu. Úlohu si samozřejmě pro naše účely výkladu algoritmů zjednodušíme oproti klasickým programovacím jazykům, kde můžeme používat reálná čísla v různých tvarech nebo číselné proměnné. To ale nijak nesnižuje obecnost principů, které se zde naučíme. Aritmetickým výrazem budeme myslet řetězce s číslicemi 0–9, operace sčítání a násobení, +, ∗, lze používat i pomocné symboly závorek (, ). Na místě operandu může stát struktura obecně stejného typu, jako jsme právě definovali (výraz lze vnořit do výrazu). Příkladem budiž velmi jednoduchý výraz 5 + 3 ∗ 2, jehož hodnotu lehce spočítáme. Uvědomíme si prioritu operátorů a nejprve spolu vynásobíme 3 ∗ 2=6atentomezivýsledek pak použijeme při operaci s nejnižší prioritou 5 + 6 = 11. Tato jednoduchost je však jen zdáním, uvědomme si, že počítač pracuje s datovými strukturami bez „lidského vidění. To zahrnuje velmi rychlé vyhodnocení hierarchie formule. Navíc tento postup předpokládá, že ve výrazu není žádná syntaktická chyba (např. chybějící párová závorka). Takovou chybu by musel člověk rovněž odhalit. Poznámka. Zobecnění na složitější operandy, jako jsou reálná čísla, není principiálně problém – stačí během analýzy nevytvářet jen znaky jako výstup, ale struktury obsahující přímo reálné číslo. Stejně tak lze navázat i jinými operacemi. Takovéto výrazy jsou nedílnou součástí každého vyššího procedurálního programovacího jazyka (řešení všech problémů obvykle stavíme na správně formulovaných podmínkách a aritmetických výpočtech). Samozřejmě úloha má ještě důležitou část, která je již za hranicí tohoto článku – jsou jím různé optimalizace kódu; lze např. u logických podmínek vyhodnotit, zda formule není platná či nesplnitelná, případně ji značně zmenšit. Ale jak tuto činnost překladače – programy – realizují? Uvažujeme-li jako lidé s inteligencí a schopností číst text nejen lineárně 105

aby byl pro člověka příjemný. Jde o zobrazení různých velikostí písma,<br />

tabulek, obrázků, pozadí stránek atd. Jakkoliv to vypadá naprosto přirozeně,<br />

při zkoumání principů a metod programů pro tuto činnost zjistíme,<br />

že to není až tak triviální činnost a souvisí neoddělitelně právě s teorií<br />

formálních jazyků. I zdánlivě jednoduchá součást tohoto procesu je bez<br />

dobré znalosti pojmů a postupů, které přináší teorie formálních jazyků<br />

a automatů, takřka neřešitelný úkol.<br />

Touto jednoduchou úlohou, se kterou se nyní důkladně seznámíme a<br />

ukážeme si její obecně použitelné řešení, je kontrola, překlad a vyhodnocení<br />

aritmetického výrazu. Úlohu si samozřejmě pro naše účely výkladu<br />

algoritmů zjednodušíme oproti klasickým programovacím jazykům, kde<br />

můžeme používat reálná čísla v různých tvarech nebo číselné proměnné.<br />

To ale nijak nesnižuje obecnost principů, které se <strong>zde</strong> naučíme. Aritmetickým<br />

výrazem budeme myslet řetězce s číslicemi 0–9, operace sčítání<br />

a násobení, +, ∗, lze používat i pomocné symboly závorek (, ). Na místě<br />

operandu může stát struktura obecně stejného typu, jako jsme právě definovali<br />

(výraz lze vnořit do výrazu). Příkladem budiž velmi jednoduchý<br />

výraz 5 + 3 ∗ 2, jehož hodnotu lehce spočítáme. Uvědomíme si prioritu<br />

operátorů a nejprve spolu vynásobíme 3 ∗ 2=6atentomezivýsledek<br />

pak použijeme při operaci s nejnižší prioritou 5 + 6 = 11. Tato jednoduchost<br />

je však jen zdáním, uvědomme si, že počítač pracuje s datovými<br />

strukturami bez „lidského vidění. To zahrnuje velmi rychlé vyhodnocení<br />

hierarchie formule. Navíc tento postup předpokládá, že ve výrazu<br />

není žádná syntaktická chyba (např. chybějící párová závorka). Takovou<br />

chybu by musel člověk rovněž odhalit.<br />

Poznámka. Zobecnění na složitější operandy, jako jsou reálná čísla,<br />

není principiálně problém – stačí během analýzy nevytvářet jen znaky<br />

jako výstup, ale struktury obsahující přímo reálné číslo. Stejně tak lze<br />

navázat i jinými operacemi.<br />

Takovéto výrazy jsou nedílnou součástí každého vyššího procedurálního<br />

programovacího jazyka (řešení všech problémů obvykle stavíme<br />

na správně formulovaných podmínkách a aritmetických výpočtech). Samozřejmě<br />

úloha má ještě důležitou část, která je již za hranicí tohoto<br />

článku – jsou jím různé optimalizace kódu; lze např. u logických podmínek<br />

vyhodnotit, zda formule není platná či nesplnitelná, případně ji<br />

značně zmenšit. Ale jak tuto činnost překladače – programy – realizují?<br />

Uvažujeme-li jako lidé s inteligencí a schopností číst text nejen lineárně<br />

105

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!