Skip to main content

0144366

Page 1

Obsah Úvodem Komu je kniha určena Forma výkladu Konkrétní postup výuky Příklady ke knize

Kapitola 1 Co je to počítačové programování Co je to program a jak ho vytvořit Nádražní automat Fotbal se hraje týmově Volba správné varianty Digitální budík – pravidelně opakovaná, jednotvárná činnost Stavíme odrazový můstek programování ze čtyř základních kamenů

Kdo je programátor Za prvé – Rozbor problému Za druhé – Návrh funkčního a efektivního řešení Za třetí – Realizace řešení Za čtvrté – Sledování funkčnosti a vyladění řešení Závěrem k práci programátora

Příkazy Co je to příkaz a proč je tak důležitý Příkazy samy o sobě nejsou všemocné Náš první příkaz pro počítač

Algoritmus Co musí splňovat algoritmus a proč K čemu se hodí nesprávně fungující algoritmus Složitost algoritmu Tvoříme algoritmy s nízkou složitostí K čemu je dobrý algoritmus s vysokou složitostí Důležité algoritmy – seřadíme fotbalové hráče podle velikosti

OBSAH

K1620.indd 3

9 9 9 10 11

13 13 13 15 15 16 17

18 18 20 24 25 25

26 26 30 31

32 33 35 35 37 38 39

3

5.2.2009 10:56


Jak to funguje v počítači Dorozumívání programátora s počítačem

Kapitola 2 První krůčky velkého programátora

43 43

Spuštění vývojového prostředí

46

Zdrojový kód a jeho překlad

46

Seznámení s vývojovým prostředím jazyka Pascal První pokus Provádění programu Co když uděláme chybu Krokujeme program Pracujeme s okny vývojového prostředí Hledáme zadaný text ve všech souborech adresáře Změna aktuálního adresáře pro ukládání a vyhledávání Kopírování textu z/do Windows

Píšeme úhledně Zarovnání Komentáře

Kapitola 3 Jak využít paměť počítače Proměnná Paměť počítače je jako knihovna Výpis obsahu proměnné I uživatel může udělit proměnné hodnotu Jak nejlépe pojmenovat proměnnou Proč se proměnná jmenuje proměnná K čemu ještě využijeme proměnné

Datový typ Co je to datový typ a k čemu je dobrý Řetězce (datový typ String) Krátce k jednotlivým znakům (datový typ char) Celá čísla (datový typ integer) Desetinná čísla (datový typ real) Pravda versus Nepravda (datový typ boolean) Složené datové typy

K1620.indd 4

42

Stažení a instalace překladače

Jak to celé funguje Klíčová slova

4

41

47 47

48 49 51 52 53 54 56 57 57

58 58 60

63 63 64 65 65 66 67 71

71 71 72 74 75 76 77 79

OBSAH

5.2.2009 10:56


Kapitola 4 Rozhodujeme v podmínkách

85

Využíváme výsledky Příklady v jazyce Pascal Opačný případ Elegantní řešení dvou možností Více příkazů u jedné podmínky Vnořený if – jde to i bez něho Přísná logika Výběr z několika možností

85 86 87 87 88 89 90 92

Kapitola 5 Opakujeme v cyklech

95

Horká voda na tři nápoje Jak to funguje Jak vypadá chybně napsaný cyklus Zkusme cyklus vzhůru nohama Určíme počet průchodů cyklem Možnosti kombinací: žlutý nebo červený Spojení několika cyklů dohromady

96 98 99 100 102 104 107

Kapitola 6 Jednoduché i složitější programy

109

Hry s řetězci Obrácení řetězce Hledání řetězce v textu Náhrada textu za jiný – delší i kratší

Čtení ze souboru a zápis do souboru Vytváříme textový soubor a zapisujeme do něho Čteme z textového souboru

Hry s čísly Rekurze a králíci Náhoda je … Prvočísla Složitost algoritmu

Závěrem ke kapitole plné praktického programování

OBSAH

K1620.indd 5

110 110 115 120

126 126 129

132 132 137 140 144

146

5

5.2.2009 10:56


Kapitola 7 Využíváme složené datové typy Pracujeme s polem Las Vegas v české kotlině Seřadíme prvky pole podle velikosti Seřadíme písmena podle abecedy Řecký zlatokop prvočísel

Tvoříme jednoduchou databázi Co je to databáze a jak ji v Pascalu vytvořit Malá půjčovna filmů Vyhledávání v databázi

Ukazatele – směrovky k opravdovým hodnotám K čemu jsou ukazatele dobré Nicku, máš prázdný zásobník Postav se do fronty na náboje

Kapitola 8 Využití dříve napsaných programů Jarda umí sečíst dvě čísla – využíváme funkce

148 153 157 161

168 169 171 174

175 176 180 184

189 189 192

I Karel umí sčítat – využíváme procedury Globální a lokální proměnné

192 193

Voláme funkci – ta volá funkci – ta volá… Faktoriál Králík znovu zasahuje Šifrujeme zprávy

Využíváme funkce jiných programátorů Zastavit losování Sestavíme si vlastní knihovnu Všechny dostupné funkce a procedury překladače Free Pascal

Závěr a další osudy programátorů Po odložení této knihy – nejen další jazyky Algoritmy a datové struktury Lepší zdrojové kódy Do praxe

K1620.indd 6

147

Krátká odbočka: argumenty versus parametry

Svážeme proměnné dohromady pomocí volání odkazem

6

147

194

196 196 197 199

202 203 207 216

217 217 217 218 218

OBSAH

5.2.2009 10:56


Příloha A Druhy programovacích jazyků a doporučená literatura Mít či nemít překladač Jazyk C C++ Jazyk C# Visual Basic Java

Jde to i bez překladu Shell a Bash Python JavaScript PHP

Když se myslí jazykem Imperativní jazyky Logické jazyky Funkcionální jazyky

Závěrem

Příloha B Opakování nejdůležitějších pravidel a pojmů Postup při psaní programů Pravidla dobrého programátora Komentáře Pomocné výpisy Přehlednost napsaného kódu Recyklace Složitost algoritmu Využití vhodných datových typů

Souhrn operátorů Logické operátory Porovnávání čísel Číselné operace Znakové operace

Příloha C Slovníček pojmů Algoritmus Aplikace ASCII tabulka OBSAH

K1620.indd 7

219 219 219 220 220 221 221

222 223 223 224 224

225 225 225 226

227

229 229 229 230 230 230 230 230 231

231 231 232 232 233

235 235 235 236

7

5.2.2009 10:56


Databáze Datová struktura Datový typ Deklarace Dynamická datová struktura Eratosthenovo síto Faktoriál Fibonacciho posloupnost Funkce Globální proměnná Inicializace Klíčové slovo Knihovna Komentář Kompilátor Logické operátory Lokální proměnná nil Ordinální datový typ Procedura Programovací jazyk Proměnná Prvočíslo Překladač Rekurze Složitost Strojový kód Uživatel Uživatelské rozhraní Volání hodnotou Volání odkazem Vývojář Vývojové prostředí Zdrojový kód

Rejstřík

8

K1620.indd 8

236 236 236 237 237 237 238 238 238 238 239 239 239 240 240 240 240 241 241 241 241 241 241 242 242 242 242 242 243 243 243 243 243 243

245

OBSAH

5.2.2009 10:56


Úvodem Programování se rychle stalo jedním z nejdůležitějších oborů lidské činnosti. Počítačem se dnes řídí téměř vše: od digitálních hodinek, mobilních telefonů a praček, přes požární systémy či ovládání světel až po letadla nebo kosmické rakety. Stěrače v autě například umějí reagovat na sílu deště a podle toho samy určují frekvenci stírání okna. Jízda je pak pohodlnější, a tím i bezpečnější. Díky ulehčení a zpříjemnění všeho, co děláme, se kvalitně vytvořené počítačové programy dostávají čím dál blíž našemu praktickému životu. Jak brzo uvidíme, umět programy vytvářet není vůbec těžké. Je pouze třeba osvojit si jistý způsob myšlení, který je nám ovšem už dávno vlastní. Stačí ho jen využít. Pokud navíc zjistíme, jak s počítačem komunikovat, máme ho v hrsti – bude dělat, co mu přikážeme.

Komu je kniha určena Učebnice je pro všechny, kteří mají nějakou zkušenost s počítači, ale o programování zatím vůbec nic nevědí. Příručka je určena každému, kdo se chce naučit základním dovednostem a technikám programování, ale i těm čtenářům, které programování zajímá jen jako silný fenomén dnešní doby. Pro počítačové programování totiž platí: I

nezáleží na věku, ve kterém začneme programovat,

I

nezáleží ani na výši vzdělání, protože v programování jde pouze o způsob přemýšlení a dorozumění se s počítačem,

I

nikdy není pozdě s programováním začít.

Pro výuku z této publikace potřebujeme jen dvě věci: počítač a chuť učit se novým věcem.

Forma výkladu Všechny důležité dovednosti i znalosti si osvojíme doslova krok za krokem a bez zabíhání do zbytečně komplikovaných a nepotřebných detailů. Celý výklad se totiž drží několika základních pravidel: I

začneme zcela od nuly,

I

pomalu se budeme učit přemýšlet jako programátor,

I

naučíme se mluvit s počítačem tak, aby nás poslouchal,

ÚVODEM

K1620.indd 9

9

5.2.2009 10:56


I

vždy upozorníme na užitečné tipy a na možná úskalí,

I

text doplňuje mnoho názorných obrázků,

I

snadnému pochopení pomáhá i přímé propojení textu s probíraným jevem na obrázku,

I

na konci budeme znát všechny nejdůležitější programátorské techniky,

I

tyto techniky budeme umět použít v programátorské praxi.

V textu se vyskytuje několik speciálních odstavců, které mají za úkol doplnit základní výklad o další užitečné, podstatné či prostě zajímavé okolnosti:

Poznámka: Poskytuje rozšiřující informace na okraj.

Tip: Doplňuje výklad o zajímavou a prospěšnou informaci.

Důležité: Informace, které byste si měli zapamatovat.

Řešení problému: Pokud hrozí, že se v některém postupu mohou objevit potíže, tento odstavec na ně upozorní a vysvětlí, jak je řešit.

Pro ještě názornější ukázky jsou některé části programových kódů tučně zvýrazněny. Tučnost nemá v programu žádný význam – slouží pouze pro zvýraznění právě probíraného pojmu nebo nějaké důležité techniky.

Konkrétní postup výuky O co při programování jde. Nemůžeme se hned vrhnout ke klávesnici a začít psát programy. Podobně jako plavci si některé základní techniky osvojíme nejprve na břehu. Necháme počítač ještě několik okamžiků vypnutý a v kapitole 1 si povíme o těch nejzásadnějších věcech: jak se má programátor chovat, jaká dodržovat pravidla a také se naučíme první důležité pojmy. Bez těchto základů bychom se do hlubší vody nemohli pustit. Potřebné nástroje a první program. S počítačem je potřeba se nějak dorozumět a v kapitole 2 si řekneme jak. Z Internetu získáme volně dostupný nástroj, který poslouží jako překladač z naší řeči do jazyka počítače a naopak. Druhá kapitola bude opravdu výjimečná, protože právě v ní se to stane poprvé! Dlouho očekávaný, sice prostinký a jednoduchý, ale krásný a plně funkční prográmek konečně spatří světlo světa. V té chvíli se každý z nás stane programátorem. Nebude cesty zpět. Počítačová paměť. Bez paměti bychom to daleko nedotáhli. Plavat už umíme, ale proč to nezkusit lodí? V kapitole 3 se naučíme pracovat s pamětí počítače: zjistíme, jak do ní ukládat věci na pozdější časy a jak je odtud zase získat zpět.

10

K1620.indd 10

ÚVODEM

5.2.2009 10:56


Podmínky a cykly. Dalším krokem na cestě ke skvělým programům bude obyčejné rozhodování a opakování. Zní to jednoduše a je to jednoduché. Přesto jde o nejdůležitější programátorské techniky, bez kterých nelze vyplout na otevřené moře. Podmínky a cykly probereme v kapitolách 4 a 5. Několik jednoduchých programů. Všechno, co již umíme, si prakticky vyzkoušíme na několika programech, ukážeme si pár pěkných triků, jak si zjednodušit práci, budeme vytvářet náhodná čísla a pracovat se soubory. To vše v kapitole 6. Složitější hry s pamětí. Využívat paměť počítače se sice naučíme v kapitole 4, ale na ostřejší kousky si troufneme později. V kapitole 7 se mimo jiné naučíme tvořit seznamy lidí i s jejich základními údaji (číslo telefonu, adresa apod.). Vzájemně provázané údaje budeme ukládat do paměti a také si ukážeme, jak je z ní jednoduše dostávat. Využití dříve napsaných programů. Není třeba hotový program tvořit znovu a znovu. Pokud je funkční a v pořádku, využijme ho. Názorně si vše předvedeme v kapitole 8. V té se dozvíme i to, jak využívat programy, které napsal někdo jiný. Programátoři celého světa spolupracují a napsané programy běžně poskytují.

Příklady ke knize Celý balík všech cvičení z knihy si čtenáři mohou stáhnout z adresy http://knihy.cpress.cz/ k1620 – najdete je na záložce Soubory ke stažení. 1. Kódy si stáhněte a uložte do počítače. 2. Následně balík rozbalte pomocí některého archivačního programu (např. WinRAR – viz www.winrar.cz). 3. Po rozbalení se na disku vytvoří složka Programovani_PUZ, v níž naleznete soubory příkladů uložené v jednotlivých složkách podle kapitol. Ke snadnější orientaci slouží přehledné rozhraní, které spustíte poklepáním na soubor spustit.html v hlavní složce. Dále se řiďte pokyny rozhraní.

ÚVODEM

K1620.indd 11

11

5.2.2009 10:56


Kapitola 4

Rozhodujeme v podmínkách

4

V předchozí kapitole jsme mimo jiné mluvili o pravdivostních hodnotách, o Pravdě a Nepravdě, o datovém typu boolean a o logických operátorech. Přišli jsme na to, že logické operace nejsou nic tajemného ani složitého, že fungují jako obyčejné sčítání a odčítání. Známe už dokonce i pravidla, podle kterých se logické výrazy zjednodušují. To všechno se nám teď bude hodit. Vše využijeme na skutečných, konkrétních zdrojových kódech.

Využíváme výsledky Podmínky v programování fungují velmi podobně jako v reálném životě: I

pokud získáš míč, utíkej s ním směrem k bráně,

I

když zajde slunce a nastane tma, rozsviť světla,

I

jestli chceš kávu z automatu, zaplať nejprve požadovaný obnos,

I

jestli chceš jít do divadla, vezmi si oblek,

I

pokud chceš jít do bazénu, vezmi si plavky.

Tyto podmínky vypadají vždy stejně: nejprve položíme dotaz, na který existuje jasná odpověď ano, nebo ne. True, nebo False. Potom přichází rozkazovací způsob (příkaz): něco udělej! Celé schéma bychom mohli zapsat takto: Pokud – Podmínka – Pak – Příkaz.

Na schématu je určitě nejdůležitější druhý krok: Podmínka. Podmínkou je výraz typu boolean s hodnotou True nebo False. Je to vlastně docela jednoduché: jestliže podmínka platí, má hodnotu True. Jestliže podmínka neplatí, má hodnotu False. Jde o stejný princip jako v předchozí kapitole u výkladu datového typu boolean. Nyní ovšem využijeme výsledku – využijeme hodnoty daného výrazu. Co to znamená v lidské řeči: využijeme zkrátka oné hodnoty True, či False k provádění nějakých příkazů. Jak? Víme, že výraz „Země obíhá kolem Slunce“ je pravdivý. Má hodnotu True. Můžeme tedy napsat: Pokud Země obíhá kolem Slunce, rozsviť v noci světla. Využili jsme hodnoty True, abychom zadali nějaký jasný příkaz. Výše zmíněné schéma tedy můžeme zapsat také takto: Pokud – True – Pak – Příkaz. Pokud – False – Pak – jiný Příkaz.

Poněkud nepříjemný je ten fakt, že výraz „Země obíhá kolem Slunce“ je pravdivý vždy. Takže příkaz by se vždy provedl. My však budeme chtít zjišťovat stav věcí a podle toho se V Y U Ž Í VÁ M E V ÝS L E D KY

K1620.indd 85

85

5.2.2009 10:56


budeme rozhodovat, jaký příkaz provést. Např. se můžeme ptát: Pokud - Zákazník dostatečný obnos – Vydej mu kávu. Pokud - Zákazník dostatečný obnos Vypiš na display

vhodil peněz – Pak nevhodil peněz – Pak – zprávu.

Tato podmínka neplatí vždy, proto potřebujeme zjišťovat stav věcí. A po tomto zjištění využijeme výsledku, jak ukazuje obrázek 4.1.

Obrázek 4.1. Pokud mám u sebe peníze, koupím si oběd, pokud peníze nemám, půjdu si je do práce vydělat

Příklady v jazyce Pascal Vraťme se k vývojovému prostředí jazyka Pascal a vyzkoušejme, jak to funguje při programování. Napíšeme program, který zjišťuje výsledek podmínky a na základě toho provádí nějaký příkaz. Napišme tento kód: program Podminky; var vek: integer; begin writeln(‘Zadejte svůj věk:‘); readln(vek vek); if vek >= 18 then writeln(‘Jste plnoletý.‘); writeln(‘Pro ukončení stiskněte Enter.‘); readln(); end.

Z dobrého důvodu jsme výše oddělovali všechny čtyři části podmínkového výrazu pomlčkami. Slova Pokud a Pak se v jazyce Pascal píší vždy stejně: if (pokud platí) a then (potom proveď následující příkaz). Po předchozí kapitole jsou první řádky kódu jasné. Proto pouze pro úplnost zopakujeme, že do proměnné vek typu integer (celé číslo) se příkazem readln načte hodnota zadaná uživatelem. Tato hodnota je potom hlavním ukazatelem v následující podmínce. Výraz vek >= 18 znamená „hodnota proměnné vek je větší nebo rovna 18“. Důležitý je samozřejmě i datový typ proměnné. Můžeme testovat rovnost k celému číslu, protože proměnná vek je typu celé číslo. Pokud bychom deklarovali proměnnou jako řetězec (datový typ String), nahlásil by překladač chybu na řádku podmínky: takto nelze testovat velikost řetězce vzhledem k celému číslu. Pokud tedy platí, že hodnota proměnné vek je větší nebo rovna číslu 18, hodnota tohoto výrazu je True. A celý řádek by vypadal takto: if – True – then - příkaz. Pokud je zadaný věk větší nebo roven 18, může se provést příkaz, který na obrazovku vypíše text „Jste plnoletý“.

86

K1620.indd 86

KAPITOLA 4 · ROZHODUJEME V PODMÍNKÁCH

5.2.2009 10:56


Poznámka: Příkaz writeln může být buď na stejném řádku (oddělený mezerou od klíčového slova then), nebo na novém řádku, jak to zde máme my. Funkčnost je v obou případech stejná.

Opačný případ Pokud je ovšem zadaný věk menší než 18, co se stane pak? Protože jsme nic takového neurčili, nestane se nic. Program prostě pokračuje dál k následujícímu řádku a vypíše „Pro ukončení stiskněte Enter“. Aby program něco prováděl i v tomto opačném případě, museli bychom to specifikovat. Například takto: if vek < 18 then writeln(‘Nejste plnoletý, nemůžete pít alkohol.’);

Podmínku musíme zapsat ještě před příkaz writeln, který mluví o ukončování, takže celý zdrojový kód by měl vypadat takto: program Podminky1; var vek: integer; begin writeln(‘Zadejte svůj věk:‘); readln(vek); if vek >= 18 then writeln(‘Jste plnoletý.‘); if vek < 18 then writeln(‘Nejste plnoletý, nemůžete pít alkohol.’); writeln(‘Pro ukončení stiskněte Enter.‘); readln(); end.

Elegantní řešení dvou možností V tomto příkladu máme přesně dvě možnosti: buď výraz platí, nebo neplatí. Buď je uživatel plnoletý, nebo není. True, nebo False, nic jiného. Abychom nemuseli vypisovat dva výrazy (pokud výraz platí, potom příkaz; pokud výraz neplatí, potom jiný příkaz), můžeme říci i tohle: Pokud – výraz platí – Potom – příkaz Jinak – jiný příkaz.

Slovo jinak se v programovacím jazyce Pascal řekne stejně jako v angličtině: else. Vložíme nyní slovo else do našeho zdrojového kódu. Bude pak vypadat takto: program Podminky2; var vek: integer; O PA Č N Ý P Ř Í K L A D

K1620.indd 87

Obrázek 4.2. Existují jen dvě možnosti: buď pít alkohol můžeme, nebo nemůžeme.

87

5.2.2009 10:56


begin writeln(‘Zadejte svůj věk:‘); readln(vek); if vek >= 18 then writeln(‘Jste plnoletý.‘) else writeln(‘Nejste plnoletý, nemůžete pít alkohol.‘); writeln(‘Pro ukončení stiskněte Enter.‘); readln(); end.

Všimněme si zejména toho, že před klíčovým slovem else není středník. Jinak ovšem else zastupuje celý řádek if vek < 18 then. Všimněme si také toho, že výraz vek < 18 je přesnou negací výrazu vek >= 18. Jsou totiž jen dvě možnosti: buď je věk větší nebo roven 18, nebo je věk menší než 18. Jiná možnost není, proto můžeme použít slovo else.

Více příkazů u jedné podmínky Pokud bychom chtěli za podmínkovým výrazem zadat více než jeden příkaz, musíme to překladači sdělit. Jinak si bude myslet, že k podmínce patří jen první zadaný příkaz. Jak na to: všechny příkazy, které patří k jedné podmínce, uzavřeme mezi klíčová slova begin a end. program Podminky3; var vek: integer; begin writeln(‘Zadejte svůj věk:‘); readln(vek); if vek >= 18 then begin writeln(‘Jste plnoletý.‘); writeln(‘Můžete pít alkohol veřejně.‘); end else begin writeln(‘Nejste plnoletý.‘); writeln(‘Pijte alkohol jen tajně nebo vůbec.‘); end; writeln(‘Pro ukončení stiskněte Enter.‘); readln(); end.

Opět si můžeme všimnout, že před else není žádný středník. Snadno si domyslíme, jak by to dopadlo, kdybychom dva příkazy writeln neuzavřeli mezi begin a end. Překladač by si myslel, že druhý příkaz writeln už nepatří k oné podmínce a provedl by ho v každém případě. Pokud by uživatel zadal věk 17, výpis na obrazovku bude vypadat takto: Můžete pít alkohol veřejně. Nejste plnoletý. Pijte alkohol jen tajně nebo vůbec. Pro ukončení stiskněte Enter.

To je pochopitelně nesmysl, první a třetí řádek se zcela popírají. Je proto nutné více příkazů za podmínkou uzavírat mezi klíčová slova begin a end.

88

K1620.indd 88

KAPITOLA 4 · ROZHODUJEME V PODMÍNKÁCH

5.2.2009 10:56


Vnořený if – jde to i bez něho Co když se potřebujeme zeptat na dvě věci? Abychom zjistili, jestli uživatel může řídit auto, potřebujeme vědět: I

jestli má řidičský průkaz,

I

jestli právě nepožil alkohol – jestli je střízlivý.

Jak to uděláme: mohli bychom využít vnoření dvou podmínkových výrazů a zeptat se takto: Pokud máte řidičské oprávnění, potom Pokud jste střízlivý, potom Můžete řídit.

Tedy: pokud platí první podmínka, potom – očekáváme příkaz, ale místo něj je tu další podmínka. A pokud platí i tato druhá podmínka, potom teprve vypiš na obrazovku, že uživatel může řídit. Stačí, aby alespoň jedna podmínka neplatila a text „Můžete řídit“ se logicky nemůže vypsat. Ale tohle už přece odněkud známe? Platnost celého tvrzení dává výsledek True, pokud obě obsažená tvrzení dávají také výsledek True. Jde samozřejmě o logický operátor AND známý z předchozí kapitoly. Můžeme tedy obě výše uvedená tvrzení spojit do jednoho a kód bude pracovat úplně stejně jako v předchozím případě: Pokud (máte řidičský průkaz) AND (jste střízlivý) Potom Můžete řídit

Obrázek 4.3. Schéma operátoru AND

Poznámka: Naučme se používat logické operátory místo složitého vnořování! Celý zdrojový kód se stane jednodušším a přehlednějším.

Než se přesuneme k ostatním operátorům, ukažme si jeden příklad v jazyce Pascal pro již zmíněný operátor AND. Program zjišťuje, jestli můžeme přijít na party „pouze pro teenagery“, tedy pokud nám je mezi 13 a 19 lety (anglicky thirteen – nineteen): program TeenAgeParty; {Party pro teenagery} var vek: integer; begin writeln(‘Zadejte svůj věk:’); readln(vek); if (vek > 12) AND (vek < 20) then begin writeln(‘Jste teenager.‘); writeln(‘Račte vstoupit. Dobře se bavte.‘); end; writeln(‘Pro ukončení stiskněte Enter.‘); readln(); end. VNOŘENÝ IF – JDE TO I BEZ NĚHO

K1620.indd 89

89

5.2.2009 10:56


Jednotlivé výrazy je nutné uzavírat do závorek, aby operátor AND věděl, odkud kam je jeden výraz a kde začíná a kde přesně končí druhý výraz. Závorky to přesně ukážou. Pokud program funguje správně, a není důvod, aby nefungoval, zobrazí se po spuštění a po zadání věku okno jako na obrázku 4.4.

Obrázek 4.4. Výpis na obrazovce po zadání věku teenagera

Přísná logika Výsledky výrazů propojených logickými operátory se řídí logikou, kterou už známe z předchozí kapitoly. Spojením několika (i mnoha) výrazů nakonec vždy vzniká jediná hodnota. Ta je rovna buď True, nebo False. Takže celý podmíněný příkaz if – (složený)výraz – then – příkaz(y) má jasnou úlohu: vyhodnotit složené výrazy a přiřknout jim jedinou Pravdu, nebo jedinou Nepravdu. Poté se již chovají stejně, jak kdyby byl mezi klíčová slova if a then umístěný jen jediný výraz. Lze si to vyzkoušet na konkrétním příkladu. Je třeba možné, aby se na party teenagerů dostali výjimečně i oblíbení učitelé Martin (29 let) a Hanka (26 let). Položíme jim tedy kontrolní otázku, na kterou jim předem prozradíme odpověď, aby je dveřní systém při zapsání správné odpovědi vpustil dovnitř. Poznámka: Otázka by měla být trochu nelogická a téměř nesmyslná, aby se správná odpověď nedala jen tak uhádnout. program TeenAgeParty; var vek: integer; odpoved: String; begin writeln(‘Zadejte svůj věk:‘); readln(vek); writeln(‘Kontrolní otázka:‘); writeln(‘Jedna květina bez listu,‘); writeln(‘druhá bez nohy, třetí bez prstu,‘); writeln(‘kolik to dělá celkem dnů.‘); readln(odpoved);

90

K1620.indd 90

KAPITOLA 4 · ROZHODUJEME V PODMÍNKÁCH

5.2.2009 10:56


if (vek > 12) and (vek < 20) or (odpoved = (‘Rovné dva dny‘)) then writeln(‘Můžete vstoupit. Dobře se bavte.‘) else writeln(‘Nemáte oprávnění vstoupit na tuto party.‘); writeln(‘Pro ukončení stiskněte Enter.‘); readln(); end.

Kontroluje se i velikost písmen, takže pokud napíšeme správnou odpověď, ale s malým začátečním písmenem, dveřní systém nás odmítne. Poznámka: Kontrolní otázku i její odpověď jsme převzali z oblíbeného večerníčku Mach a Šebestová, konkrétně z dílu Cizí planeta. Část tohoto dílu můžeme zhlédnout např. zde: http://www.youtube.com/ watch?v=Ly0fgy0QwXw.

Zdrojový kód pro dveřní systém, který jsme právě napsali, má jednu nevýhodu. Kontrolní otázka se pokládá a vyhodnocuje vždy, tzn. i v případě, že chce vstoupit teenager. Lepší by bylo, kdyby systém pokládal otázku jen těm, kteří mezi teenagery nepatří. Jinak se totiž program ptá zbytečně i těch, kteří by mohli bez problémů vstoupit. Této zbytečné a nešikovné složitosti jsme se dopustili vědomě. Šlo nám o demonstraci složeného výrazu a jeho vyhodnocení. Aby se otázka pokládala jen těm, kteří nespadají do věku teenagerů, upravíme zdrojový kód tak, že rozdělíme příchozí na dvě skupiny: teenagery vpustíme bez okolků dovnitř na party, ať se baví. Všem ostatním položíme kontrolní zapeklitou otázku: program TeenAgeParty2; var vek: integer; odpoved: String; begin writeln(‘Zadejte svůj věk:‘); readln(vek); if (vek > 12) and (vek < 20) then writeln(‘Můžete vstoupit. Dobře se bavte.‘) else begin writeln(‘Kontrolní otázka:‘); writeln(‘Jedna květina bez listu,‘); writeln(‘druha bez nohy, třetí bez prstu,‘); writeln(‘kolik to dělá celkem dnů.‘); readln(odpoved); if odpoved = (‘Rovné dva dny‘) then writeln(‘Můžete vstoupit. Dobře se bavte.‘) else writeln(‘Nejste oprávněn vstoupit na tuto party.‘); end; writeln(‘Pro ukončení stiskněte Enter.‘); readln(); end.

PŘÍSNÁ LOGIKA

K1620.indd 91

91

5.2.2009 10:56


Obrázek 4.5. Rozdíl dvou schémat: schéma pro zadávání kontrolní otázky všem příchozím a schéma pro zadávání otázky jen těm, kteří nesplňují požadavek věku teenagera

Nyní už se dveřní systém ptá jen těch, kteří nemají věk teenagerů, jak ukazuje obrázek 4.5. Vraťme se však ke složenému výrazu a všimněme si závorek. Závorky nyní oddělují jen samotné jednoduché výrazy, aby logický operátor věděl, kde začínají a kde končí. Nyní tedy vypadá složený výraz takto: if (vek > 12) and (vek < 20) or (odpoved = (‘Rovné dva dny‘)) then

Můžeme se přesvědčit, že další závorky jsou v tomto případě zbytečné. Oba tyto výrazy dopadnou při vyhodnocování stejně a vpustí dovnitř jen ty, kteří dovnitř smějí (ve výčtu je naznačeno rozložení závorek i rozložení na řádcích): I

(vek > 12) and ((vek < 20) or (odpoved = ('Rovné dva dny'))),

I

((vek > 12) and (vek < 20)) or (odpoved = ('Rovné dva dny')).

Pokud by však byla podmínka vpuštění složitější, dávejme si dobrý pozor právě na závorky. Kdyby záleželo i na jméně, vypadal by výraz takto: if (vek > 12) and (vek < 20) or (odpoved = (‘Rovné dva dny‘)) and (jmeno=Hanka) or (jmeno=Martin) then

Pokud bychom uzavřeli do závorek vše kromě posledního výrazu, (jmeno=Martin), stačilo by ke vstupu zadat jméno Martin a věk nevěk, odpověď neodpověď by se dveřní systém otevřel. Tip: Zkusme si dopsat do zdrojového kódu dotaz na jméno a zkusme ho také zařadit mezi podmínky vpuštění. Ovšem se správným uzávorkováním, tedy tak, aby byla podmínka položena logicky.

Výběr z několika možností Doposud jsme před sebou měli dvě možnosti: buď a nebo. Buď se dveře otevřou, nebo neotevřou, buď řídit můžete, nebo nemůžete. Jenže v životě to bohužel není tak jednoduché,

92

K1620.indd 92

KAPITOLA 4 · ROZHODUJEME V PODMÍNKÁCH

5.2.2009 10:56


často nelze věci rozlišit na černé a bílé, na buď a nebo. Někdy je ve hře celá řada možností, a proto v jazyce Pascal existuje příkaz case. Slovo case znamená anglicky případ a podle toho se používá a chová i v programu. Příklad, který nás napadne hned jako první je samozřejmě nádražní automat: v případě, že cestující stiskl tlačítko pro kávu, dej mu kávu, v případě, že stiskl čaj, dej mu čaj, v případě stisknutí tlačítka horká čokoláda, vydej horkou čokoládu atd. Pokud bychom převedli příklad do jazyka Pascal, vypadal by kód takto: case Tlacitko of 1: begin vydej kávu; writeln(‘Káva je hotová.’); writeln(‘Dobrou chu .’); end; 2: begin vydej čaj; writeln(‘Čaj je hotový.’); writeln(‘Dobrou chu .’); end; 3: begin vydej horkou čokoládu; writeln(‘Čokoláda je hotová.’); writeln(‘Dobrou chu .’); end; end;

Tento kód by se dal přeložit do češtiny takto: I

V případě, že uživatel stiskl číslo 1, vydej kávu.

I

V případě, že uživatel stiskl číslo 2, vydej čaj.

I

V případě, že uživatel stiskl číslo 3, vydej horkou čokoládu.

I

Ve všech případech nezapomeň popřát dobrou chuť.

U příkazu case bohužel nemůžeme před dvojtečku zadat přímo slova „káva“, „čaj“ apod., protože jednotlivé možnosti musí být buď typu integer, nebo char. Tedy mohou zde být buď celá čísla nebo jednotlivé znaky. To pro nás ale není problém. Přiřadíme prostě jednotlivým tlačítkům pořadová čísla a s těmi budeme operovat. Důležité: Příkaz case může pracovat pouze s tzv. ordinálními typy. „Ordinal“ znamená anglicky pořadové číslo, takže ordinální typy jsou takové, které vyjadřují nějaké pořadí. Přesněji jde o takové typy, které jsou omezené, konečné a pro každou hodnotu (s výjimkou krajních hodnot) je jednoznačně určen následník a předchůdce. Typ integer to samozřejmě splňuje. Předchůdce čísla 4 je číslo 3, následovníkem je číslo 5. Datový typ char je ale typu integer velmi podobný, protože každý znak má své pořadové číslo v ASCII tabulce. Takže jednotlivé znaky lze v příkazu case používat také. Typy String nebo real nemají jednoznačně dané předchůdce a následovníky, takže je musíme nahrazovat celými čísly nebo znaky. VÝBĚR Z NĚKOLIKA MOŽNOSTÍ

K1620.indd 93

93

5.2.2009 10:56


Pokud by za dvojtečkou následoval jen jeden příkaz, nemuseli bychom ho uzavírat mezi klíčová slova begin a end. Více příkazů, jak vidíme zde, však uzavřít musíme. Zatím sice nemáme automat, který by opravdu vydával horké nápoje, ale můžeme alespoň simulovat jeho textové výstupy. Buďme důslední a napišme si program na výdej horkých nápojů. Napišme do vývojového prostředí tento kód: program Automat; Obrázek 4.6. Přiřazení pořadových var Tlacitko: integer; čísel jednotlivým tlačítkům na automabegin tu je pro využití příkazu case nutné writeln(‘Dobrý den, vyberte si nápoj.‘); writeln(‘1: Káva.‘); writeln(‘2: Čaj.‘); writeln(‘3: Horká čokoláda.‘); readln(Tlacitko); case Tlacitko of 1: begin writeln(‘Káva je hotová.‘); writeln(‘Dobrou chu .‘); end; 2: begin writeln(‘Čaj je hotový.‘); writeln(‘Dobrou chu .‘); end; 3: begin writeln(‘Čokoláda je hotová.‘); writeln(‘Dobrou chu .‘); end; else writeln(‘Pro výdej nápoje stiskněte 1-3.‘); end; writeln(‘Pokračujte stisknutím klávesy Enter.‘); readln(); end.

Po stisknutí kláves 1–3 se program chová správně. Pokud stiskneme jiné číslo, program správně ohlásí, že jsme se netrefili do tlačítek, nápoj je pouze v rozmezí čísel 1 až 3. A protože je proměnná Tlacitko typu integer, celý program by skončil chybou, pokud bychom nechali načíst např. písmeno „d“, nebo slovo „káva“, zkrátka něco mimo typ integer. Je to stejné, jako když někdo na nádraží nemačká tlačítka 1–3, ale začne třeba do automatu bouchat. Tím se může automat jedině porouchat, ale kávu tím nikdy nevydá.

94

K1620.indd 94

KAPITOLA 4 · ROZHODUJEME V PODMÍNKÁCH

5.2.2009 10:56


Turn static files into dynamic content formats.

Create a flipbook
0144366 by Knižní­ klub - Issuu