Úvod 1 2 3 4 Příklady Testy

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