Lekce 2
Obsah
|
Anotace kapitoly
V této kapitole se seznámíte s použitím elementárních příkazů v programovacím
jazyku FERDA, jak kombinovat jednoduché příkazy do příkazů složených, s
použitím základních postupů při programování - podmínek a cyklů a dále
se seznámíte s řešením některých jednoduchých základních úloh. Pro zjednodušení
zápisů a přehlednost programů si zavedeme pojem procedury a tím se dotkneme
i pojmu procedurální programování. |
Sekvence složených příkazů
Program pro Ferdu (a vůbec vlastně každý program) je sekvence příkazů -
třeba jen jednoho, ale třeba také tisíců. Sekvence je posloupnost příkazů,
ale složený příkaz je též příkaz. Tedy program může obsahovat i sekvence,
v nichž jsou obsaženy složené příkazy. Uvedeme si krátký příklad programu
pro Ferdu, který Ferdu povede k nejbližší zdi, pak se Ferda otočí a zase
půjde zpět. Program je složen ze dvou složených příkazů, které dovedou
Ferdu ke zdi a dvou příkazů elementárních, při kterých se Ferda otočí.
Zeď lze umístit na libovolném místě v dolním řádku města.
Příklad programu:
program sekvence složených příkazů
dokud nebude zed
krok
konec dokud
celem vzad
dokud nebude zed
krok
konec dokud
celem vzad
konec programu
Cykly vložené v sobě
Program může obsahovat cykly, které jsou v sobě vloženy. Počet vložených
cyklů není teoreticky omezen, ale prakticky je konečný i když velmi veliký.
Příklad uvádí úlohu, ve které Ferda prochází dokola okolo města. Vždy když
narazí na zeď udělá vlevo vbok a opět pokračuje k další zdi. Když narazí
na značku skončí činnost. Načrtneme si vývojový diagram programu pro Ferdu.
A nyní převedeme tento vývojový diagram algoritmu do jazyka, kterému Ferda
rozumí.
program cykly v sobě
opakuj
dokud nebude zed
krok
konec dokud
vlevo vbok
az do je znacka
konec programu
Tedy, algoritmus lze vyjádřit různými prostředky, ale konečné vyjádření
algoritmu musí být v jazyku příslušného kompilátoru nebo interpretoru.
Obrázek ukazuje Ferdu na cestě okolo postavených zdí.
Kombinace podmíněných příkazů
Ferda se musí umět rozhodovat podle proměnných podmínek. K tomu slouží
podmíněné příkazy a jejich kombinace. Protože podmíněný příkaz (ať úplný
nebo neúplný) je také příkaz, může být součástí jak sekvencí nebo těla
jiných složených příkazů včetně znovu podmíněného příkazu.
Příklad ukazuje poměrně složité Ferdovo rozhodování. Ferda dojde na
předem určené místo a podle počtu značek buď půjde rovně (je-li tam jedna
značka) nebo zahne doleva (budou - li tam dvě značky a nebo doprava (budou
- li tam tři značky. Poté přejde ke zdi a ukončí program.
Zkuste si nakreslit vývojový diagram této úlohy.
Příklad:
program rozhodování
rem Ferda jde na místo
cyklus 10
krok
konec cyklus
vlevo vbok
krok
rem Ferda se rozhoduje podle počtu značek
kdyz je znacka
kdyz je 1
dokud nebude zed
krok
konec dokud
konec kdyz
kdyz je 2
vlevo vbok
dokud nebude zed
krok
konec dokud
konec kdyz
kdyz je 3
vpravo vbok
dokud nebude zed
krok
konec dokud
konec kdyz
konec kdyz
konec programu
Obrázek ukazuje Ferdu na cestě doprava.
Procedury
V minulém příkladu jste museli psát třikrát tu samou sekvenci příkazů dokud,
totiž zapsat nebo kopírovat příkaz
DOKUD NEBUDE ZED
KROK
KONEC DOKUD
Tento složený příkaz pokaždé vykonává to samé a bylo by dobré, kdyby místo
tohoto příkazu šlo použít příkaz jiný, například KEZDI. Ale Ferda tento
příkaz nezná. Tedy ptáme se, zda by nebylo možné tento příkaz nějakým způsobem
zavést a tím program zestručnit a také zpřehlednit. Program Ferda (všechny
ostatní programy také a šířeji) umožňují toto provést pomocí takzvaných
procedur. Pro Ferdu použijeme dva nové příkazy. Prvním příkazem budeme
definovat nový příkaz a druhý příkaz bude tento nový příkaz provádět. První
příkaz budeme nazývat definice (také deklrace) procedury a druhý
příkaz volání procedury. Definice procedury se provádí v programu
Ferda až za příkazem KONEC PROGRAMU a její struktura je například takováto
DF_KEZDI
DOKUD NEBUDE ZED
KROK
KONEC DOKUD
KONECPROC
Volání procedury se provádí pak příkazem
PROC_KEZDI
Příklad předešlého programu, ale zapsaného pomocí procedury KEZDI.
program rozhodování
rem Ferda jde na místo
cyklus 10
krok
konec cyklus
vlevo vbok
krok
rem Ferda se rozhoduje podle počtu značek
kdyz je znacka
kdyz je 1
proc_kezdi
konec kdyz
kdyz je 2
vlevo vbok
proc_kezdi
konec kdyz
kdyz je 3
vpravo vbok
proc_kezdi
konec kdyz
konec kdyz
konec programu
DF_kezdi
dokud nebude zed
krok
konec dokud
konecproc
Jak zaznamenáme definici a volání procedury pomocí vývojových diagramů
je ukázáno na následujícím obrázku. Vlevo je ukázka zápisu definice procedury
KEZDI a vpravo volání této procedury.
Základní pravidla pro psaní vzájemně do sebe vnořených cyklů je toto:
Konce cyklů se nemohou navzájem překrývat. Tedy jestliže je první hlavičkou
v sekvenci příkazu hlavička cyklu DOKUD, pak konec cyklu KONEC DOKUD bude
poslední v řadě příkazů. Ve vyšším programovacím jazyce pak deklarace a
použití procedur a též funkcí je mnohem širší, ale to až v dalších kapitolách.
Knihovny, moduly, unity
V dosavadních příkladech jste si již zajisté všimli, že se mnohé částečné
sekvence programů (podprogramy, procedury) opakují téměř v každém programu
a tedy je musíme pokaždé psát znovu. Je tedy výhodné mít takové často se
opakující postupy někde uložené a jen doporučit svému programu, aby je
na tomto určitém místě vyhledal. Ferda umí použít svojí knihovnu, kterou
si předem načítá. K tomu aby načetl knihovnu slouží příkaz
USES knihovna
kde knihovna je jméno příslušné knihovny bez přípony souboru. Tedy, jestliže
jsou další příkazy uloženy v určité knihovně se jménem KNIH01.FRL, pak
takzvané "přihrání" nebo vložení či použití (= uses) této knihovny v programu
může vypadat asi takto:
program využití knihovny
uses knih01
dokud nebude 3
reknisioznacku
kezdi
okolo
sikmo
konec dokud
konec programu
Příkazy " reknisioznacku, kezdi, okolo, sikmo" jsou příkazy uložené v příslušné
knihovně. Pokud si knihovnu sami napíšeme, pak známe sémantiku (význam)
těchto příkazů. Mnohem častější je případ, kdy jsou taková knihovny dodány
s programovacím prostředím a dokonce nemusí být ani ve zdrojovém kódu,
ale v OBJ kódu. Pak je třeba mít k příslušné knihovně popis příkazů a nejlépe
nápovědu či příručku pro použití příslušné knihovny.
Jak struktura Ferdovy knihovny vypadá? Malá knihovna se třemi příkazy
může vypadat například takto:
rem knihovna knih01
dvojkrok
rychle
krok
krok
pomalu
konecproc
kezdi
dokud nebude zed
krok
konec dokud
konecproc
nasever
dokud neni sever
vlevo vbok
konec dokud
konecproc
konec knihovny
V knihovně jsou vlastně definovány procedury, ale bez skupiny znaků DF_.
Ferdovo programové prostředí umožňuje nejen použít knihovny hotové, ale
i psaní knihoven vlastních. Vlastní knihovnu musíte uložit do souboru s
příponou FRL (L - library = knihovna) do téhož adresáře, kde se nachází
program Ferda.exe.
Kombinované úlohy
Na závěr této kapitoly jsou zařazeny problémové úlohy, jejichž řešení je
vlastně základem programovacích technik. Těmto technikám bude věnována
speciálně další kapitola.
Kombinovanými úlohami se na tomto místě rozumí úlohy, které komplexně
využívají programovacího jazyka Ferda. Úlohy mohou být různě obtížné podle
složitosti algoritmu. U některých úloh existuje několik algoritmů, jak
požadovaného cíle dosáhnout. Počet takových algoritmů, které dosahují týchž
cílů, jejich efektivita, délka a možnost uskutečnění je obsahem TEORIE
ALGORITMů a zde se tímto problémem nebudeme zabývat.
Na následujícím příkladu si ukážeme postup, jak se řeší několik konkrétních
úkolů.
Příklad 1
Zadání
Ve Ferdově městě je postavena cestička ze značek. Značky jsou uloženy souvisle
pouze ve vodorovných a svislých sloupcích. Na konci cestičky jsou umístěny
tři značky. Ferda vychází po cestičce z domova a sleduje cestu až dorazí
ke třem značkám. Poté program ukončí.
Rozbor (slovní)
Podle předpokladů úlohy má Ferda ověřit, zda se ve směru jeho pochodu nachází
značka. Je-li tato podmínka splněna, může udělat krok. Není - li podmínka
splněna musí pokračování cestičky najít. To provede tak, že se otočí doleva
a zkoumá zda cesta tam je. Je-li na dalším místě značka, pokračuje dál
příkazem krok. Není - li tam značka, musí se FERDA otočit na druhou stranu,
ale ne tam, odkud přišel. Tedy musí udělat čelem vzad a opět zkoumá cestičku.
Je-li přítomna značka, pak může krok udělat. Stoupne - li Ferda na políčko
se třemi značkami, program ukončí. Nebudeme zatím předpokládat, že cestička
byla zadána neregulérně, tedy že vede do zdi, či nemá na konci tři značky
apod. Tedy algoritmus nebude mít ochranu proti chybně zadaným vstupním
datům (takzvaná ochrana vstupních dat nebo ověření platnosti vstupních
dat). Tuto ochranu zavedeme až poté, co ověříme funkčnost základního algoritmu,
který bude bezchybně provádět činnost s ověřenými platnými daty. Tedy Ferdovi
postavíme nejprve správnou cestičku.
Rozbor (vývojový diagram)
Načrtneme si vývojový diagram slovního řešení problému. Na základě rozboru
víme, že využijeme cyklus s podmínkou na konci (JE 3) a podmíněné příkazy
s podmínkou BUDE ZNACKA.
Pokud si tento vývojový diagram projdete zjistíte, že opravdu provádí to
co má, ale že má jednu nevýhodu. Nelze ho přepsat do jazyka Ferda. Proč?
Ve výrazu
KDYZ podminka
prikaz1
JINAK
prikaz2
KONEC KDYZ
se nelze vrátit k příkazu 1, pokud je podmínka neplatná. A to právě
tento vývojový diagram ukazuje. Musíme tedy zvolit vývojové řešení tak,
aby umožňovalo přepis do programovacího jazyka. Tedy řečeno jiným způsobem:
Algoritmus z programovacího jazyka lze vždy převést do vývojového
diagramu. Opačně to obecně nelze provést Opravený vývojový diagram
pak vypadá takto:
a jeho přepis do programovacího jazyka Ferda je pak možný.
Program a data
V této fázi si připravíme zdrojový kód programu. Vlastně ještě jednou přepíšeme
algoritmus buď za pomocí vývojového diagramu nebo přímo ze slovního rozboru.
Vývojové
diagramy sice ulehčují rozbory algoritmů, ale jsou pro zkušené programátory
většinou zbytečné.
program jdipoznačce
opakuj
kdyz bude znacka
krok
jinak
vlevo vbok
kdyz nebude znacka
celem vzad
konec kdyz
konec kdyz
az do je 3
konec programu
Pak v programu MESTO si připravíme libovolnou cestičku ze značek, která
je zakončena třemi značkami.
Odladění a komentáře v programu
Program spustíme. Jen v jednoduchých příkladech se program chová bezchybně
ihned po prvním spuštění. Stará programátorská moudrost praví že v každém
programu je alespoň jedna chyba. Chyby jsou dvojího druhu, a to syntaktické
a sémantické. Syntaktické chyby odhalí interpretor či kompilátor programu
a zobrazí takzvané CHYBOVÉ HLÁŠENÍ KOMPILÁTORU (INTERPRETORU). Většinou
nám toto chybové hlášení umožní syntaktickou chybu ihned nalézt (většinou
se jedná o překlep).
Horší bývají chyby sémantické. Jedná se o chyby, kdy program vykonává
určitou činnost, ale úplně nebo částečně jinou než bylo v zadání úlohy,
kterou má program řešit. Jinak řečeno, napsali jsme program správně, ale
použili jsme špatný algoritmus, který měl vést k řešení úlohy. Tyto sémantické
chyby již interpretor či kompilátor neodhalí a některé z nich se mohou
projevit jako CHYBY BĚHU PROGRAMU čili BĚHOVÉ CHYBY. Pak nezbývá nic jiného
než program kontrolovat příkaz po příkazu a sledovat zda v každém kroku
aktuální příkaz provádí co provádět má. Tomu se říká KROKOVÁNÍ programu.
Ve Ferdovi k tomu slouží tlačítka PAUZA, KROK a POKRAČUJ. Celý postup odstraňování
chyb v programu se říká LADĚNÍ PROGRAMU (anglicky debbuging = odvšivování)
a bývá to časově nejnáročnějąí práce na výrobě programu. Během ladění a
vlastně již při psaní programu je velice výhodné do programu vkládat poznámky
programátora (REM = remark = poznámka), které komentují jednotlivé kroky
či procedury programu. Do hlavičky programu je vhodné vložit úplnou poznámku
o problému, který program řeší, údaje o programátorovi apod. Tyto poznámky
pak velice ulehčí výrobu programátorské dokumentace (je-li vyžadována),
manuálu a nápovědy k programu (u trochu složitějších programů bývá nápověda
vyžadováno vždy). Odladěný program s poznámkami (rem a rekni = tyto poznámky
Ferda zobrazuje v pomocném okně) může vypadat například takto:
program jdipoznačce
rem Ferda prochází město po předem
rem postavených značkách položených ve vodorovných a svislých řadách
rem soubor města je uložen v XXXX.mst
rem autor XXXXX 1.1.2000
rekni Jdu po cestičce
opakuj
kdyz bude znacka
krok
jinak
rekni Točím se a hledám
vlevo vbok
kdyz nebude znacka
celem vzad
konec kdyz
rekni Tak zase jdu dále.
konec kdyz
az do je 3
rekni Veni, Vidi, Vici.
konec programu
Ošetření vstupních dat a zjemnění algoritmu
Jak uvidíme v následující kapitole, řešení složité úlohy se provádí v určitých
krocích. Algoritmus a tedy i program se doplňuje o další příkazy, které
lépe vystihují požadované chování programu, upravuje se vnější podoba programu
a ošetřují se chybně zadané vstupní hodnoty. Tomuto postupu, kde doplňujem
algoritmus tak, aby lépe vyhovoval zadání a doplňujeme dříve nepotřebné
větve programu, říkáme zjemňování algoritmu.
Zde si můžeme ukázat tento postup na tom, že ošetříme program proti chybně
zadané cestičce, po které se má Ferda pohybovat. Ošetření bude takové,
že Ferda pokud narazí na konec cestičky a nebudou tam tři značky upozorní
na chybné zadání. Toto ošetření bude fungovat i jako ochrana proti nárazu
Ferdy do zdi. I takovou cestičku jistě Ferdovi nějaký zlomyslník postaví.
program jdipoznačce
rem Ferda prochází město po předem
rem postavených značkách položených ve vodorovných a svislých řadách
rem soubor města je uložen v XXXX.mst
rem autor XXXXX 1.1.2000
rem verze 1.2
rekni Jdu po cestičce
opakuj
kdyz bude znacka
krok
jinak
rekni Točím se a hledám
vlevo vbok
kdyz nebude znacka
celem vzad
konec kdyz
rem tak tady je ta ochrana
kdyz nebude znacka
rekni Tak takhle by to nešlo
pip
zastav
konec kdyz
rekni Tak zase jdu dále.
konec kdyz
az do je 3
rekni Veni, Vidi, Vici.
konec programu
Dokumentace a archivace
Nejvíce nudnou prací při programování je psaní dokumentace, manuálů a nápovědy
k programům. Profesionální programátor má za úkol vést programovací dokumentaci
podle pokynů šéfprogramátora, každý programátor ke svému programu napíše
soubor CTIMNE.TXT nebo nápovědu. Jinak by jeho program nebylo možné kvalifikovaně
obsluhovat a tak by jeho veškerá práce postrádala smysl. Nejjednodušší
nápovědy jsou psány jako textové soubory, u složitějších nápověd se využívá
různých podpůrných programů včetně HTML dokumentů apod. K elementárním
programům se nápověda nepoužívá a uveřejní se jen komentovaný algoritmus.
Samostatné opakování
Úkoly
1. Ujasněte si jaká nápověda - návod - manuál by byl potřeba právě k programu
JdiPoZnačce.
2. Odhalte chybu v programu
program cykly v sobě
opakuj
dokud nebude zed
krok
vlevo vbok
az do je znacka
konec dokud
konec programu
