´ JAZYK PROGRAMOVACI
KAREL 1987, 2001
Programovacı ´ jayzk KAREL Vejvoda Michal Ing., Rytı ´r ˇ Miroslav Ing. programova ´nı ´, robot Karel
´ V SSM prˇipravila Stanice Mlady´ch Techniku˚ prˇi Pro Centrum pro mla´dezˇ, veˇdu a techniku U ZRP Veˇtrˇnı´ v Cˇeske´m Krumloveˇ. Metodicky´ materia´l pro krouzˇky programova´nı´ s deˇtmi od druhe´ trˇ´ıdy ZSˇ. Autorˇi: Ing. Michal Vejvoda, Ing. Miroslav Rytı´rˇ. ´ V SSM. Pouzˇito materia´lu˚ z VTM ing. Rudolfa Pecinovske´ho, CSc, a materia´lu˚ CMVT U Sazba syte´mem TEX. Program PC-Karel, ktere´mu je cely´ text prˇizpu˚soben, si mu˚zˇete zdarma sta´hnout z internetove´ stra´nky www.pckarel.zde.cz. Verze textu: 2001/10/06. ISBN 99972-03-09-7
´ vodem U Ahoj mladı´ prˇa´tele´ ! Dosta´va´te do rukou tuto knı´zˇku, abyste se mohli sezna´mit s pocˇ´ıtacˇi a jejich programova´nı´m. Programovacı´ jazyk KAREL nenı´ urcˇen k tomu, aby programy v neˇm sestavene´ za va´s rˇesˇili doma´cı´ u´koly. Ale zato se naucˇ´ıte to podstatne´ – programovat. A to dokonce moderneˇ programovat. KAREL ma´ tu vy´hodu, zˇe vesˇkere´ prˇ´ıkazy vidı´te na monitoru pocˇ´ıtacˇe, jak se prova´deˇjı´. Tak snadno prˇijdete na prˇ´ıpadne´ chyby, ktery´ch se prˇi pra´ci dopustı´te. V knı´zˇce rovneˇzˇ nenı´ uvedeno vsˇe, co KAREL doka´zˇe. Je to jen strucˇna´ metodika pro vy´uku zacˇa´tecˇnı´ku˚. Hodneˇ zdaru prˇi pra´ci a trvale´ kamara´dstvı´ va´m prˇejı´ pocˇ´ıtacˇe, programa´torˇi a robot KAREL.
´ vodem U
3
1. KAREL se prˇedstavuje Ahoj kamara´de ! Vı´ta´m teˇ na nasˇ´ı prvnı´ spolecˇne´ schu˚zce. Jmenuji se KAREL. Jsem robot a jme´no KAREL mi dal ucˇitel programova´nı´, autor prvnı´ho programu a knı´zˇky „Karel The Robot“ profesor Richard E. Pettis ze Stanfordske´ univerzity ve Spojeny´ch sta´tech. Sve´ jme´no jsem zı´skal na pocˇest spisovatele Karla Cˇapka, autora divadelnı´ hry R.U.R. – Rossum’s Universal Robots. V by´vale´m Cˇeskoslovensku jsem se poprve´ objevil v Bratislaveˇ za´sluhou docenta Hvorecke´ho, CSc. Pro tebe, kamara´de, a pro cˇeskoslovenske´ mikropocˇ´ıtacˇe realizovali sve´ prˇedstavy o robotu KARLOVI ing. Rudolf Pecinovsky´, CSc, a ing. Toma´sˇ Bartovsky´, CSc. Na pocˇ´ıtacˇ´ıch PC mohu pracovat i dı´ky ing. Jirˇ´ımu Osobovi. V te´to brozˇurˇe vystupuji v prˇedstava´ch vy´tvarnı´ka Vladimı´ra Jira´nka. Doufa´m, zˇe se ti lı´bı´m, a zˇe se na´m spolu bude dobrˇe spolupracovat.
Tak a tady – to je moje meˇsto ! Vı´ta´m teˇ. A jako spra´vny´ hostitel teˇ svy´m domovem provedu. Prˇi kazˇde´m spusˇteˇnı´ teˇ prˇivı´ta´m v leve´m dolnı´m rohu meˇsta. To je mu˚j domov. Jak se ti libı´ ? Me´ meˇsto – to je vlastneˇ sˇachovnice, ktera´ ma´ 10 × 15 polı´cˇek. Jinam nemohu. Na zacˇa´tku je vzˇdy meˇsto pra´zdne´. Uvnitrˇ meˇsta jsem jenom ja´ – robot KAREL. A za´lezˇ´ı na tobeˇ, jak u´tulne´ prostrˇedı´ mi tu vybudujesˇ. A co to tu ma´me ? Spodnı´ rˇa´dek ti bude slouzˇit k tomu, abys mi mohl zada´vat prˇ´ıkazy. Jen nezapomenˇ, zˇe o nicˇem, co jsi napsal, nevı´m, dokud nestisknesˇ kla´vesu Enter (↵). A pisˇ mi, prosı´m, vzˇdy jen jeden prˇ´ıkaz na rˇa´dku, abych se v tom vyznal.
4
Programovacı´ jazyk KAREL
V leve´ cˇa´sti ti zase ja´ budu vypisovat ru˚zne´ veˇci. Ted’ je zde SLOVNIK. Prˇ´ıkazy, ktere´ jsou uvedeny ve slovnı´ku, zna´m. Jsou to veledu˚lezˇita´ slova – moje prˇ´ıkazy. Dokonce si necha´vajı´ hrdeˇ rˇ´ıkat – PRIMITIVA. Nynı´ se o nich dozvı´sˇ neˇco vı´c.
1.1. Primitiva Mily´ zˇa´cˇku posˇkola´cˇku (prominˇ, chteˇl jsem rˇ´ıci chytra´cˇku) – pekelneˇ se soustrˇed’, protozˇe ted’ teˇ sezna´mı´m s velice du˚lezˇity´mi kamara´dy. Jak uzˇ vı´sˇ, rˇ´ıka´me jim PRIMITIVA. Jsou to prˇ´ıkazy, ktera´ ja´ zna´m od narozenı´. Rozdeˇlil jsem si je do trˇ´ı skupin. V prvnı´ skupineˇ jsou prˇ´ıkazy ovla´dacı´. Jsou to: NACTI, ULOZ, SMAZ, KOPENOGRAM, OPRAV, TISKNI, NETISKNI, SLOVNIK, MESTO, ROZKLAD, CHYBA. Do druhe´ skupiny patrˇ´ı prˇ´ıkazy vy´konne´: KROK, VLEVO-VBOK, POLOZ, ZVEDNI. A konecˇneˇ ve trˇetı´ skupineˇ jsou prˇ´ıkazy podminˇujı´cı´: KDYZ, DOKUD, OPAKUJ, KONEC. Jacı´ jsou to uzˇitecˇnı´ a chytrˇ´ı chlapı´ci se dozvı´sˇ o neˇkolik stra´nek da´l. Ted’ti da´m jeden bleskovy´ u´kol. Pozna´sˇ, ktery´ ze za´kladnı´ch prˇ´ıkazu˚ – PRIMITIV – jsem na tabuli vynechal ? PRIMITIVA: OPRAV SLOVNIK NACTI POLOZ MESTO ROZKLAD VLEVO-VBOK OPAKUJ SMAZ KDYZ ULOZ ZVEDNI DOKUD KOPENOGRAM KROK NETISKNI CHYBA TISKNI
Kamara´di, ale vcˇera, to jsem zkusil ! Byl u meˇ Pepı´k, co se spolu taky ucˇ´ıme, a steˇzˇoval si, zˇe dostal ve sˇkole peˇtku z dikta´tu. A prˇitom byl pry´ bez chybicˇky ! Napsal jej u´plneˇ stejneˇ, jak jsme se ucˇili spolu. Byli jsme z toho oba moc smutnı´. Ja´ jsem Pepı´kovi ale vysveˇtlil, zˇe bez ha´cˇku˚ a cˇa´rek mu˚zˇeme psa´t jenom spolu. Panı´ ucˇitelka meˇla pravdu pravdoucı´. V cˇesˇtineˇ musı´me ha´cˇky a cˇa´rky pouzˇ´ıvat. To jenom ja´ ha´cˇky a cˇa´rky neumı´m. Dokonce spolu nebudeme pouzˇ´ıvat ani mala´ pı´smena. Proto i v knı´zˇce ma´te za´pis prˇ´ıkazu˚ tak, jak je pı´sˇe pocˇ´ıtacˇ, velky´mi pı´smeny bez ha´cˇku˚ a cˇa´rek. Nezlobte se proto na meˇ ! Ja´ se to taky jednou naucˇ´ım. Pak si spolu budeme psa´t tak, jak va´s to ucˇ´ı ve sˇkole.
1. KAREL se prˇedstavuje
5
Tak a ted’uzˇ o meˇ vı´sˇ vsˇe, co pro zacˇa´tek potrˇebujesˇ. Vy´znamy jednotlivy´ch primitiv si postupneˇ vysveˇtlı´me. Ale, ale, jak ti kouka´m na nos, tak uzˇ sis je dokonce sa´m vyzkousˇel ! To ti chva´lı´m. Umı´sˇ uzˇ tedy tolik co ja´. Mu˚zˇesˇ si alesponˇ oveˇrˇit, jaky´ jsem poslusˇny´ robot KAREL. Zada´vej mi postupneˇ KROK a VLEVO-VBOK. Nezapomenˇ kazˇdy´ prˇ´ıkaz odeslat kla´vesou Enter (↵). Vidı´sˇ, jak se pohybuji po meˇsteˇ prˇesneˇ podle tvy´ch prˇ´ıkazu˚ ? Ovsˇem kdybys se mnou chteˇl projı´t zdı´, tak teˇ neposlechnu ! Tam prˇece nesmı´m ! Navı´c si vzˇdycky narazı´m nos, pardon, nosnı´ elektronku, a ozna´mı´m ti to. Da´le zna´m jesˇteˇ prˇ´ıkazy POLOZ a ZVEDNI. Prˇ´ıkaz POLOZ mi slouzˇ´ı k tomu, abych ze sve´ho kouzelne´ho bat’u˚zˇku, ktery´ ma´m na za´dech, polozˇil pod sebe prˇi tve´m prˇ´ıkazu znacˇku. Teˇch znacˇek mohu polozˇit na jedno polı´cˇko azˇ deveˇt. A protozˇe prˇ´ıroda ani meˇsto se nesmı´ znecˇisˇt’ovat, tak doka´zˇi zase znacˇky vysbı´rat pomocı´ prˇ´ıkazu ZVEDNI ! Kdyby chteˇl umı´stit na jedno polı´cˇko vı´c nezˇ deveˇt znacˇek, tak ti ozna´mı´m, zˇe Nenı ´ kam poloz ˇit !. Se znacˇkami mohu manipulovat pouze na polı´cˇku, kde pra´veˇ stojı´m. To je velmi du˚lezˇite´, zapamatuj si to ! To to utı´ka´ ! Dalsˇ´ı kus pra´ce je za na´mi ! A jak na´m to uzˇ spolu hezky jde ! Ma´m pravdu, kamara´de ? Zˇe se ti jesˇteˇ nechce koncˇit ? Vı´sˇ co ? Kdyzˇ ti doma zbyde chvilicˇka, mu˚zˇesˇ si zkusit programovat i bez pocˇ´ıtacˇe. Nakresli si na cˇtvrtku papı´ru moje meˇsto. Nebo mu˚zˇesˇ pouzˇ´ıt i norma´lnı´ sˇachovnici a trˇeba figurku koneˇ. Hezkou za´bavu ti prˇeje KAREL.
6
Programovacı´ jazyk KAREL
2. kapitola, ale 1. programa´torska´ Ano, spra´vneˇ, je to nasˇe prvnı´ kapitola, kdy si spolu budeme hra´t. Doted’ to bylo vlastneˇ jen sezna´menı´. Bylo to sice du˚lezˇite´, ale stejneˇ teˇ slysˇ´ım, jak si brouka´sˇ pod nos „...a to byla otrava, uzˇ abychom programovali. . .“ A ted’ ma´sˇ prˇ´ılezˇitost. Otevrˇeme spolu ta tajemna´ dvı´rˇka programova´nı´ a vyda´me se vstrˇ´ıc nezna´my´m koutu˚m pocˇ´ıtacˇove´ho sveˇta. Tak jdeme ! Posledneˇ jsme si zkusili takovou malou procha´zku po meˇsteˇ. Sa´m sis oveˇˇril uzˇ neˇktera´ primitiva. Uzˇ vı´sˇ, zˇe kdyzˇ napı´sˇesˇ na moji zˇa´dost NAPIS PRIKAZ: neˇktery´ zna´my´ prˇ´ıkaz, tak jej provedu. Ted’ ti ale prozradı´m, jak si svoji pra´ci mu˚zˇesˇ ulehcˇit. Zkus napsat trˇeba VL. – a ja´ provedu VLEVO-VBOK. Zkratka musı´ by´t vzˇdy ukoncˇena tecˇkou ! Pozor jenom na jednu veˇc: Ja´ zkratky vybı´ra´m se sve´ho sluvnı´ku. A pokud majı´ neˇktere´ prˇ´ıkazy stejnou zkratku, tak vyberu to, ktere´ je v me´m slovnı´ku umı´steˇno blı´zˇ k zacˇa´tku. Naprˇ´ıklad kdyzˇ zada´sˇ K., tak vyberu KROK a nikoliv KONEC, jak bys trˇeba chteˇl ty. Zrovna tak posloucha´m jen ty prˇ´ıkazy, ktere´ jsou napsa´ny spra´vneˇ. Jen si to zkus, vynechat pomlcˇku ve VLEVO-VBOK. Uvidı´sˇ, jak teˇ neposlechnu ! Uzˇ jsme si rˇekli, zˇe s pomocı´ za´kladnı´ch primitiv se spolu mu˚zˇeme naucˇit dalsˇ´ı prˇ´ıkazy. Jak se ale takovy´ novy´ prˇ´ıkaz deˇla´ ? Je to celkem jednoduche´. Kdyzˇ jsi meˇ nechal jı´t trˇeba z rohu do rohu, tak jsi musel na kazˇdy´ mu˚j krok napsat jeden prˇ´ıkaz KROK. Napisˇ mi nynı´ prˇ´ıkaz, abych provedl dva kroky soucˇasneˇ. Prˇ´ıkaz si nazveme trˇeba DVOJ-KROK. Napisˇ na kla´vesnici DVOJ-KROK. Po stisku Enter (↵) se na obrazovce objevı´: NOVY PRIKAZ DVOJ-KROK ZNAMENA Tı´m se prˇizna´va´m, zˇe tento prˇ´ıkaz dosud nezna´m. A ted’ napisˇ, co ma´m vykonat, abych udeˇlal dva kroky. Pozor ! Nemu˚zˇesˇ prˇece napsat DVA KROKY ! To nejsou slova, ktera´ ma´m ve sve´m slovnı´ku a proto je ani nezna´m. Dva kroky – to je prˇece KROK a KROK. Tak napı´sˇeme KROK a stiskneme Enter (↵). Na obrazovce se objevı´: NOVY PRIKAZ DVOJ-KROK ZNAMENA KROK A nynı´ napı´sˇeme znovu KROK. Po stisku Enter (↵) je na obrazovce napsa´no: NOVY PRIKAZ DVOJ-KROK ZNAMENA KROK KROK
2. kapitola, ale 1. programa´torska´
7
Tı´m ale jesˇteˇ nenı´ prˇ´ıkaz hotov. Musı´sˇ mi rˇ´ıct, zˇe uzˇ nema´m prˇ´ıkaz da´le vykona´vat, zˇe uzˇ ma´m koncˇit. Proto napisˇ KONEC. Prˇ´ıkazem KONEC a odesla´nı´m pomocı´ Enter (↵) novy´ prˇ´ıkaz ukoncˇ´ım. Na obrazovce se objevı´: NOVY PRIKAZ DVOJ-KROK ZNAMENA KROK KROK KONEC A tı´m ma´me na´sˇ prvnı´ novy´ prˇ´ıkaz – vlastneˇ program – hotov. Vı´ to i pocˇ´ıtacˇ, protozˇe na´m na obrazovce rozsvı´tı´ na´pis: ZADEJ PRIKAZ:_ A ted’ mu˚zˇesˇ zadat noveˇ vytvorˇeny´ prˇ´ıkaz DVOJ-KROK. Kdyzˇ jej odesˇlesˇ (Enter ↵), tak udeˇla´m dva kroky. Vid’, zˇe to nic nebylo ? Du˚lezˇite´ je jenom veˇdeˇt, jak na to. A i ostatnı´ spolu zvla´dnem stejneˇ snadno jako DVOJ-KROK. Abychom si spolu rozumeˇli, tak si musı´me jesˇteˇ dnes domluvit neˇkolik pravidel. Stanovı´me si nasˇi „pocˇ´ıtacˇovou gramatiku“. Videˇl jsi sa´m, zˇe neposlechnu, kdyzˇ mi v prˇ´ıkazu (tak, jak jej ma´m ve sve´m slovnı´ku) vynecha´sˇ trˇeba jenom jednu cˇa´rku. Za´pis programu, jak jej upravil pocˇ´ıtacˇ, budeme nazy´vat podle meˇ KARLOVSKY´. Pro lidi je ale uzˇitecˇneˇjsˇ´ı a prˇehledneˇjsˇ´ı za´pis pomocı´ kopenogramu˚. Kopenogramy jsou tou nejprˇehledneˇjsˇ´ı formou, jak program zapsat. A to nejenom pro meˇ, ale i pro pouzˇitı´ v programovacı´m jazyku. Co to tedy kopenogram je ? Vesˇkerou moji cˇinnost mu˚zˇesˇ rozdeˇlit na dva druhy. Bud’ prova´dı´m neˇjaky´ prˇ´ıkaz, nebo se rozhoduji, co budu deˇlat da´l. Kazˇdou cˇinnost kopenogram zna´zornˇuje obde´lnı´kem. V neˇm je pak uveden na´zev prˇ´ıkazu nebo je popsany´. A to bud’ slovy nebo rozepsa´nı´m na jednodusˇsˇ´ı prˇ´ıkazy. Prˇ´ıkaz, ktery´ se da´l jizˇ nerozepisuje, je vhodne´ vybarvit. Jak se kopenogram tvorˇ´ı a jak se jednotlive´ barvy pouzˇ´ıvajı´, ma´sˇ souhrnneˇ uvedeno v prˇ´ıloze 1. Protozˇe ale i cely´ program (prˇ´ıkaz, ktery´ kopenogram definuje) je blok, je i on obde´lnı´kem. Program ma´ ale oproti ostatnı´m prˇ´ıkazu˚m neˇkolik zvla´sˇtnostı´. Jednou z nich je, zˇe mi musı´sˇ rˇ´ıct, ktery´ program se ma´ prove´st. To znamena´, zˇe se musı´ neˇjak jmenovat. V nasˇem prvnı´m prˇ´ıkladu jsme si pojmenovali prˇ´ıkaz DVOJ-KROK. Pak uzˇ mi ozna´mı´sˇ jenom jme´no programu a ja´ pozˇadovany´ prˇ´ıkaz – program – provedu. A ja´ zna´m pouze ty prˇ´ıkazy, ktere´ ma´m uvedeny ve slovnı´ku. Protozˇe je jme´no du˚lezˇite´, tak je i v kopenogramu vyznacˇ´ıme zrˇetelneˇ. Napı´sˇeme jej nahoru a oddeˇlı´me dvojitou cˇa´rou. A dohodneme se, zˇe jme´no programu budeme znacˇit vzˇdy zˇlutou barvou.
8
Programovacı´ jazyk KAREL
DVOJ-KROK
DVOJ-KROK
udeˇlej dva kroky
KROK KROK
DVOJ-KROK ZNAMENA KROK KROK KONEC
A jdeme da´l. Pod jme´nem programu DVOJ-KROK je uveden vlastnı´ prˇ´ıkaz, tedy co to DVOJKROK znamena´. Pro zacˇa´tek jsem ti rozepsal kopenogram dvakra´t. Jednou pomocı´ zna´my´ch prˇ´ıkazu˚ a jednou slovneˇ. Kazˇdy´ takovy´ prˇ´ıkaz je vlastneˇ maly´m programem, ktery´ do meˇ vlozˇil uzˇ mu˚j ta´ta. A protozˇe jsou uva´deˇny pod na´zvem nove´ho programu DVOJ-KROK, rˇ´ıka´me jim taky neˇkdy podprogramy. Ted’ se znovu podı´vej na na´sˇ rozepsany´ kopenogram a na mu˚j za´pis. Nasˇel jsi neˇjaky´ rozdı´l ? Spra´vneˇ. Kopenogram neobsahuje prˇ´ıkaz KONEC. To proto, zˇe konec je tady zna´zorneˇn uzavrˇenı´m do obde´lnı´ku. Podobneˇ si zkusı´me dalsˇ´ı prˇ´ıkazy. Rozmysli si, jak bys mi prˇika´zal, abych udeˇlal trˇeba cˇelem vzad. Spra´vne´ rˇesˇenı´ ti za chvilku prozradı´m. Ale zˇa´dne´ nahlı´zˇenı´ do vy´sledku˚ ! Ani jednı´m ocˇkem ! Takove´ snadne´ vı´teˇzstvı´ by teˇ prˇece ani neteˇsˇilo. Jen ti malinko poradı´m. Zkus si to udeˇlat sa´m – bez pocˇ´ıtacˇe. Uzˇ jsi hotovy´ ? Tak nejdrˇ´ıv prakticky. Postav se a udeˇlej cˇelem vzad. To znamena´, zˇe se naprˇed otocˇ´ısˇ doleva – provedesˇ VLEVO-VBOK. Pak udeˇla´sˇ jesˇteˇ jednou VLEVO-VBOK. Podobneˇ i ja´. Prˇ´ıkaz CELEM-VZAD bude tedy vypadat takto: CELEM-VZAD VLEVO-VBOK VLEVO-VBOK
CELEM-VZAD ZNAMENA VLEVO-VBOK VLEVO-VBOK KONEC
Tak – a uzˇ ma´me druhy´ program. A dokonce je zapsany´ jak v kopenogramu, tak i v karlovske´m za´pisu. Ted’ jej zkus zapsat i do pocˇ´ıtacˇe. Jestli ses jizˇ podı´val vzadu do slovnı´cˇku, tak jsi jisteˇ zjistil, zˇe tam ma´sˇ uvedeny vsˇechny prˇ´ıkazy. Ted’ale bez dı´va´nı´ zkus napsat prˇ´ıkaz, ktery´ by mi rˇekl, jak ma´m udeˇlat vpravo vbok. Nazveme jej VPRAVO-VBOK1. Procˇ je tam ta jednicˇka ? To proto, zˇe si na tomhle prˇ´ıkazu uka´zˇeme, jak je mozˇno nadefinovat prˇ´ıkaz neˇkolika zpu˚soby. Jedna z mozˇny´ch variant je trˇeba: VPRAVO-VBOK1 VLEVO-VBOK VLEVO-VBOK VLEVO-VBOK
VPRAVO-VBOK1 ZNAMENA VLEVO-VBOK VLEVO-VBOK VLEVO-VBOK KONEC
2. kapitola, ale 1. programa´torska´
9
Zkus si jej naprogramovat do pocˇ´ıtacˇe. Kdyzˇ ted’ zada´sˇ VPRAVO-VBOK1, tak poslechnu a udeˇla´m vpravo vbok. Kdo se ale na prˇ´ıkaz podı´va´ trochu pozorneˇji, tak vidı´, zˇe v prˇ´ıkazu je schova´n jizˇ jeden zna´my´ prˇ´ıkaz – CELEM-VZAD. A my jsme si prˇece rˇekli, zˇe mu˚zˇesˇ pouzˇ´ıvat vsˇechny zna´me´ prˇ´ıkazy, ktere´ ma´m ve slovnı´ku. A proto si vytvorˇ´ıme jesˇteˇ jeden prˇ´ıkaz VPRAVO-VBOK2: VPRAVO-VBOK2 CELEM-VZAD VLEVO-VBOK
VPRAVO-VBOK2 ZNAMENA CELEM-VZAD VLEVO-VBOK KONEC
A opeˇt se prˇesveˇdcˇ´ıme, jak jsme programovali. Vidı´sˇ, zˇe i tento prˇ´ıkaz opeˇt pracuje. Takzˇe i tato definice je spra´vna´. Ale podle za´pisu je VPRAVO-VBOK2 jednodusˇsˇ´ı a tedy i z hlediska programova´nı´ spra´vneˇjsˇ´ı. Proto se dohodneme na tom, zˇe pro vsˇechny cˇinnosti si budesˇ vytva´rˇet pomocne´ programy – podprogramy – tam, kde to jen pu˚jde. Jde na´m o to, aby vlastnı´ program byl co nejjednodusˇsˇ´ı. V takove´m programu se i sna´ze hledajı´ chyby. Na tomto kopenogramu vidı´sˇ i dalsˇ´ı zvy´razneˇnı´ – zatı´mco vy´konna´ primitiva, tj. prˇ´ıkazy, ktere´ mohu prˇ´ımo vykonat, jsou vybarveny cˇerveneˇ, slozˇene´ prˇ´ıkazy, u ktery´ch se musı´m podı´vat jak jsou definova´ny, jsou vybarveny ru˚zˇoveˇ. Na za´veˇr te´to lekce si ulozˇ vytvorˇene´ programy pomocı´ prˇ´ıkazu ULOZ. Po napsa´nı´ tohoto prˇ´ıkazu se pocˇ´ıtacˇ zepta´ na jme´no souboru. Zvol trˇeba ZAKLADY. Ahoj prˇ´ısˇteˇ. KAREL.
10
Programovacı´ jazyk KAREL
3. Jesˇteˇ trochu turistiky Tak jak se ti lı´bilo na nasˇ´ı minule´ schu˚zce ? Dnes budeme spolu pokracˇovat jesˇteˇ trochu v turistice. Naprˇed si – po spusˇteˇnı´ KARLA – nahraj prˇ´ıkazy z minule´ schu˚zky. Nahrajesˇ je pomocı´ prˇ´ıkazu NACTI. A ted’ jak na to. Po zada´nı´ (a odesla´nı´ – Enter ↵) prˇ´ıkazu NACTI ti nabı´dnu seznam slovnı´ku˚, ktere´ jsi kdy ulozˇil. No a ty mu˚zˇesˇ vybrat – nejle´pe pomocı´ mysˇi – polozˇku zaklady.kar. Novy´ obsah slovnı´ku ti hned uka´zˇu. To bylo rychle´, co ? Minule to dalo daleko vı´c pra´ce. Nezˇ zacˇneme dneska pracovat, tak si jesˇteˇ spolu zkusı´me trˇi ovla´dacı´ prˇ´ıkazy. Prvnı´ z nich je SLOVNIK. Po zada´nı´ tohoto prˇ´ıkazu prolistuji vsˇechno co zna´m. Jak sa´m vı´sˇ, kdyzˇ mi zada´sˇ zna´my´ prˇ´ıkaz, tak jej hned vykona´m. Kdyzˇ jej ale nezna´m, tak se zepta´m – NOVY PRIKAZ ZNAMENA – a musı´sˇ jej nadefinovat. Prˇi psanı´ se ale dopousˇtı´sˇ mnoha chyb. Proto, aby se daly opravit, ma´m ve sve´m slovnı´ku zabudova´n prˇ´ıkaz CHYBA. Po napsa´nı´ tohoto prˇ´ıkazu zacˇnu rusˇit postupneˇ jednotlive´ prˇ´ıkazy z noveˇ vytva´rˇene´ho prˇ´ıkazu. Rusˇit zacˇ´ına´m vzˇdy od konce. Proto, kdyzˇ udeˇla´sˇ chybu na zacˇa´tku, musı´sˇ zrusˇit i vsˇechny prˇ´ıkazy, ktere´ na´sledovaly. Kdyzˇ uzˇ je noveˇ vytva´rˇeny´ prˇ´ıkaz zrusˇen, rusˇ´ısˇ prˇ´ıkazem CHYBA postupneˇ od konce i prˇ´ıkazy, ktere´ jsi mi drˇ´ıve nadefinoval a uzˇ je ma´m ulozˇeny ve slovnı´ku. Za´kladnı´ prˇ´ıkazy – primitiva – ty ovsˇem zrusˇit nemu˚zˇesˇ. Proto, zˇe rusˇ´ım prˇ´ıkazy vzˇdy od konce, je vy´hodne´, kdyzˇ jsou kra´tke´. Nemusı´sˇ toho tolik psa´t znovu. Pro opravu mu˚zˇesˇ pouzˇ´ıt i prˇ´ıkaz OPRAV – zepta´m se teˇ na jme´no prˇ´ıkazu, ktery´ch chcesˇ opravit a nabı´dnu ti jednoduchy´ textovy´ editor pro opravu prˇ´ıkazu. Opravu ukoncˇ´ısˇ pomocı´ Alt+F4 nebo mysˇ´ı – pak jesˇteˇ stiskni neˇjakou kla´vesu, abych si mohl nacˇ´ıst to, co jsi mi napsal. Tak – a ted’ uzˇ ma´me vsˇechno zavedeno a umı´me opravovat i chyby prˇ´ıkazem CHYBA. Na zacˇa´tku jsme si slı´bili jesˇteˇ trochu turistiky. Aby se na´m dobrˇe chodilo, tak si na to vytvorˇ´ıme nove´ prˇ´ıkazy. Prˇ´ıkaz KROK zna´m od narozenı´, DVOJ-KROK uzˇ ma´me, a tak si vytvorˇ´ıme jesˇteˇ TROJ-KROK a CTYR-KROK. Opeˇt mu˚zˇesˇ tyto nove´ prˇ´ıkazy vytvorˇit neˇkolika zpu˚soby. Uka´zˇeme si to na TROJ-KROKu. pro rozlisˇenı´ si vzˇdy jednotlive´ prˇ´ıkazy ocˇ´ıslujeme. TROJ-KROK1 KROK KROK KROK
TROJ-KROK1 ZNAMENA KROK KROK KROK KONEC
To je ten nejjednodusˇsˇ´ı zpu˚sob. Ty uzˇ ale vı´sˇ, zˇe i kdyzˇ je tohle spra´vny´ prˇ´ıkaz, mu˚zˇesˇ jej napsat jednodusˇeji:
3. Jesˇteˇ trochu turistiky
11
TROJ-KROK2 DVOJ-KROK KROK
TROJ-KROK2 ZNAMENA DVOJ-KROK KROK KONEC
Stejneˇ spra´vny´ je i tento za´pis: TROJ-KROK3 KROK DVOJ-KROK
TROJ-KROK3 ZNAMENA KROK DVOJ-KROK KONEC
Jak sa´m vidı´sˇ, vsˇechny za´pisy jsou spra´vne´ a prˇitom TROJ-KROK2 a TROJ-KROK3 jsou i z hlediska programova´nı´ stejne´. Mneˇ je to jedno, jestli vykona´m naprˇed KROK a potom DVOJ-KROK nebo naopak. Podobny´m zpu˚sobem, ale ve vı´ce varianta´ch je mozˇno zapsat i prˇ´ıkaz pro vykona´nı´ cˇtyrˇ kroku˚. My si uvedeme jenom dveˇ varianty, protozˇe to bychom za chvı´li popsali celou knı´zˇku jenom ru˚zny´mi variantami jednoho prˇ´ıkazu. Teˇch je, jak sa´m vidı´sˇ, mnoho a se slozˇitostı´ prˇ´ıkazu jich prˇiby´va´. Tak tedy CTYR-KROK mu˚zˇeme definovat trˇeba takto: CTYR-KROK1 DVOJ-KROK DVOJ-KROK
CTYR-KROK1 ZNAMENA DVOJ-KROK DVOJ-KROK KONEC
Nebo takto: CTYR-KROK2 TROJ-KROK1 KROK
CTYR-KROK2 ZNAMENA TROJ-KROK1 KROK KONEC
Zato ale na´sledujı´cı´ definice je sˇpatna´: CTYR-KROK3 TROJ-KROK1 DVOJ-KROK POLOZ CELEM-VZAD KROK
CTYR-KROK3 ZNAMENA TROJ-KROK1 DVOJ-KROK POLOZ CELEM-VZAD KROK KONEC
Procˇ je sˇpatna´ ? Vzˇdyt’na tvu˚j prˇ´ıkaz vykona´m pozˇadovane´ cˇtyrˇi kroky doprˇedu ? Ve skutecˇnosti sice udeˇla´m cˇtyrˇi kroky doprˇedu, ale polozˇ´ım prˇi tom i znacˇku a to je u´plneˇ neˇco jine´ho, nezˇ jsme chteˇli. A navı´c meˇ necha´sˇ jı´t doprˇedu o krok vı´c a pak meˇ zbytecˇneˇ vracı´sˇ zpa´tky, a nakonec zu˚stanu otocˇen jinak. Proto, kdyzˇ sis tuhle definici vyzkousˇel, tak ji radeˇji zrusˇ. 12
Programovacı´ jazyk KAREL
Prˇitom kdyzˇ neˇkdy vykona´va´m neˇktere´ pohyby navı´c, nemusı´ to by´t na za´vadu. Zkusı´me si to jesˇteˇ na stare´m zna´me´m prˇ´ıkazu VPRAVO-VBOK, tentokra´t s cˇ´ıslem 3: VPRAVO-VBOK3 CELEM-VZAD CELEM-VZAD CELEM-VZAD VLEVO-VBOK
VPRAVO-VBOK3 ZNAMENA CELEM-VZAD CELEM-VZAD CELEM-VZAD VLEVO-VBOK KONEC
Tady provedu skutecˇneˇ vpravo vbok. Ale navı´c se jesˇteˇ jednou otocˇ´ım kolem dokola. Celkem nic se nedeˇje, jenom mi to trva´ trosˇku de´le. To je ale neˇkdy zˇa´dana´ vlastnost. V neˇktery´ch prˇ´ıpadech totizˇ potrˇebujesˇ, aby program trval delsˇ´ı dobu a tak musı´sˇ pouzˇ´ıt zbytecˇne´ pohyby. Nezˇ je ale pouzˇijesˇ, tak si musı´sˇ by´t jisty´, zˇe ty pohyby navı´c nebudou na za´vadu. Ale co dalsˇ´ı prˇ´ıkaz ? VPRAVO-VBOK4 KROK CELEM-VZAD KROK VLEVO-VBOK
VPRAVO-VBOK4 ZNAMENA KROK CELEM-VZAD KROK VLEVO-VBOK KONEC
Z hlediska toho, zˇe tı´m splnı´m svu˚j u´kol, je i tahle definice spra´vna´. Ale pozor ! Co kdyzˇ budu sta´t prˇed zdı´ ? No tak to prˇece pak u´kol nesplnı´m. Narazı´m a zastavı´m se. Proto definici, ktera´ nevyhovuje za vsˇech okolnostı´, nemu˚zˇeme povazˇovat za spra´vnou. Z toho vsˇeho pro na´s vyply´vajı´ dveˇ za´sady: 1. Nenı´ du˚lezˇite´, jak je slovo nadefinova´no. Du˚lezˇite´ je, aby podle te´to definice za libovolny´ch podmı´nek splnilo svoji u´lohu. 2. Chyby v definici nemusı´ by´t na prvnı´ pohled patrne´. Proto kdyzˇ neˇjake´ slovo nadefinujesˇ, musı´sˇ se prˇesveˇdcˇit, zˇe je nadefinova´no spra´vneˇ. Nechodı´me ale jenom rovneˇ. Cesty majı´ i spoustu zata´cˇek. Proto se ted’ nakonec spolu jesˇteˇ naucˇ´ıme chodit jako ku˚nˇ. Ne sice ten doopravdovy´, ale sˇachovy´. Vı´sˇ jak chodı´ takovy´ ku˚nˇ prˇi hrˇe v sˇachy ? Ne ? Tak on vzˇdy udeˇla´ dva kroky doprˇedu a krok stranou. Je jedno na kterou stranu. To by zase bylo mozˇnostı´, kdybychom si je chteˇli vypsat. Mu˚zˇesˇ se o to pokusit doma. JAKO-KUN DVOJ-KROK VLEVO-VBOK KROK
3. Jesˇteˇ trochu turistiky
JAKO-KUN ZNAMENA DVOJ-KROK VLEVO-VBOK KROK KONEC
13
Protozˇe teˇch mozˇnostı´ je skutecˇneˇ hodneˇ, tak si tady uvedeme kopenogramy jen neˇktery´ch. JAKO-KUN2
JAKO-KUN3
JAKO-KUN4
JAKO-KUN5
KROK KROK VLEVO-VBOK KROK
VPRAVO-VBOK1 KROK VLEVO-VBOK DVOJ-KROK
KROK VLEVO-VBOK DVOJ-KROK
DVOJ-KROK VLEVO-VBOK KROK CELEM-VZAD
A to je jen neˇkolik prˇ´ıkladu˚, jak se takova´ definice mu˚zˇe lisˇit. A vsˇechny jsou spra´vne´. Ve vsˇech prˇ´ıpadech meˇ postavı´sˇ na polı´cˇko, na ktere´ se mu˚zˇe dostat opravdovy´ sˇachovy´ ku˚nˇ. My jsme si totizˇ spolu nerˇekli, kam se ma´m dostat. A proto je mozˇne´ definovat nejen neˇkolik rˇesˇenı´ s jednı´m spra´vny´m vy´sledkem, ale i neˇkolik rˇesˇenı´ s neˇkolika spra´vny´mi vy´sledky. Azˇ jde z toho hlava kolem. Ale vidı´sˇ, zˇe to je celkem snadne´. A na za´veˇr ti prozradı´m jesˇteˇ dva ovla´dacı´ prˇ´ıkazy. Jednı´m z nich je ROZKLAD. V pru˚beˇhu dne jsme si nadefinovali neˇkolik prˇ´ıkazu˚. A uzˇ jsi jisteˇ zapomneˇl, jak je utvorˇen trˇeba TROK-KROK2. Abys to mohl zjistit, k tomu slouzˇ´ı pra´veˇ ROZKLAD. Po jeho zada´nı´ ti pocˇ´ıtacˇ vypı´sˇe dotaz JAKY PRIKAZ ? Ty ted’ napisˇ, jaky´ prˇ´ıkaz chcesˇ rozlozˇit. A na levou stranu obrazovky se vypı´sˇe, jak je prˇ´ıkaz utvorˇen. KOPENOGRAM funguje stejneˇ, jenom mı´sto karlovske´ho za´pisu dostanesˇ kopenogram. Na za´veˇr si smazˇ dnesˇnı´ prˇ´ıkazy a nadefinuj si znovu jenom TROJ-KROK, CTYR-KROK a JAKO-KUN. Kterou z dnesˇnı´ch spra´vny´ch definic si vyberesˇ, to uzˇ za´lezˇ´ı jenom na tobeˇ. Nakonec vsˇechny prˇ´ıkazy ulozˇ pomocı´ prˇ´ıkazu ULOZ s na´zvem turista. Nezapomenˇ, zˇe se ulozˇ´ı pouze ty prˇ´ıkazy, ktere´ ma´sˇ pra´veˇ ve slovnı´ku, a zˇe slovnı´ky nelze pozdeˇji spojovat. Takzˇe pokud chcesˇ mı´t ulozˇeny vsˇechny prˇ´ıkazy od zacˇa´tku, tak je nutne´ je mı´t vsˇechny zarˇazeny ve slovnı´ku, ktery´ ukla´da´sˇ.
14
Programovacı´ jazyk KAREL
4. Ucˇı´me se pracovat: KAREL monte´rem Toulat se po sveˇteˇ, to uzˇ na´m spolu jde. Ale – jak rˇ´ıkajı´ starˇ´ı mudrci – „Pracı´ zˇiv je cˇloveˇk“. Tak se spolu taky naucˇ´ıme pracovat. A kdyzˇ ma´me pracovat, tak aby to za neˇco sta´lo. Proto si postavı´me v na´sledujı´cı´ch kapitola´ch du˚m. Pochopitelneˇ jenom na monitoru. Zacˇneme tı´m nejjednodusˇsˇ´ım. Budeme naprˇed spolu vyra´beˇt panely. Ale protozˇe s holy´ma rukama se teˇzˇko neˇco deˇla´, tak si vyrobı´me jerˇa´b. Jak stavebnı´ jerˇa´b vypada´, to vı´sˇ. Trˇeba jako ten na obra´zku:
Vy´kres jerˇa´bu tady ma´sˇ proto, zˇe nezˇ zacˇneme neˇco deˇlat, tak si to nakreslı´me. Vzˇdyt’i opravdovy´ stavarˇ pracuje podle vy´kresu. Tı´m, zˇe svoji prˇedstavu ma´sˇ prˇed ocˇima na papı´rˇe, se ti bude le´pe deˇlat. Jisteˇ uzˇ teˇ napadlo, jak by se takovy´ jerˇa´b dal ze znacˇek na obrazovce postavit. My ale podle hesla „nechte stroje, at’ to deˇlajı´ za na´s“ pouzˇijeme nove´ primitivum. Je to OPAKUJ. Tohle slovo na´m velmi usnadnı´ pra´ci. Kdy jej budesˇ pouzˇ´ıvat ? Vzˇdy tehdy, kdyzˇ budesˇ neˇktery´ prˇ´ıkaz chtı´t opakovat a budesˇ prˇesneˇ veˇdeˇt kolikra´t. OPAKUJ ma´ totizˇ tu nevy´hodu, zˇe kdybys je pouzˇil neuva´zˇeneˇ, tak by mohlo
4. Ucˇ´ıme se pracovat: KAREL monte´rem
15
dojı´t k hava´rii. Procˇ ? To si uka´zˇeme na prˇ´ıkladu. Zkusı´me si pomocı´ OPAKUJ definovat znovu prˇ´ıkaz CTYR-KROK. Abychom si je odlisˇili, tak pouzˇijeme na´zev 4-KROK: 4-KROK 4 KRAT KROK ↑
4-KROK ZNAMENA OPAKUJ 4 KRAT KROK KONEC KONEC
Vidı´sˇ, zˇe za´pis je jednoduchy´. Jak prˇi neˇm postupujeme ? Kdyzˇ mi zada´sˇ OPAKUJ, zepta´m se teˇ OPAKUJ KOLIKRAT ? Nynı´ musı´sˇ napsat cˇ´ıslo, kolikra´t chcesˇ prˇ´ıkaz opakovat. V nasˇem prˇ´ıpadeˇ 4. No a da´le postupujesˇ, jak uzˇ jsi zvykly´. Pouzˇitı´ OPAKUJ ma´ jesˇteˇ jeden proble´m – sˇpatneˇ se testujı´ podmı´nky. Hrozı´ trˇeba nebezpecˇ´ı, zˇe prˇi vykona´va´nı´ narazı´m do zdi, nebo z jiny´ch du˚vodu˚ nemohu potrˇebny´ pocˇet opakova´nı´ prove´st. Jak na tento proble´m, to si ale ˇ esˇenı´ ma´sˇ uvedeno vysveˇtlı´me pozdeˇji. Ted’ si zkus nadefinovat jesˇteˇ jednou trˇeba 5-KROK. R ve slovnı´ku. Jak vidı´sˇ, pomocı´ OPAKUJ vytva´rˇ´ıme takovy´ kruh. Ukazuje to sˇipka v kopenogramu. Ten kruh – rˇ´ıka´me mu cyklus – ale skoncˇ´ı. Netocˇ´ı se porˇa´d kolem dokola. Ty dokonce prˇesneˇ vı´sˇ kdy. V tomto nasˇem prˇ´ıpadeˇ po cˇtyrˇech krocı´ch. Nejveˇtsˇ´ı takovy´ cyklus, ktery´ dovedu, je 255 opakova´nı´. To je nejveˇtsˇ´ı cˇ´ıslo, ktere´ jsem schopen si zapamatovat. Ty ale jisteˇ umı´sˇ i vysˇsˇ´ı cˇ´ısla a pocˇ´ıtacˇ samozrˇejmeˇ taky. Takove´muto cyklu rˇ´ıka´me cyklus se zna´my´m pocˇtem opakova´nı´. To proto, zˇe ma´me i cykly s nezna´my´m pocˇtem opakova´nı´. Ale o teˇch azˇ jindy. Ted’ale zpa´tky k nasˇemu jerˇa´bu, ktery´ budeme pro stavbu potrˇebovat. Jak sa´m vidı´sˇ na obra´zku, jerˇa´b se skla´da´ z veˇzˇe a ramena. Naprˇed si tedy udeˇla´me programy pro VEZ a pro RAMENO. Veˇzˇ je jednodusˇsˇ´ı, proto s nı´ zacˇneme. Veˇzˇ je vlastneˇ deveˇt polı´cˇek nad sebou vyplneˇny´ch znacˇkami. S pomocı´ OPAKUJ je to hracˇka. Vzˇdy vyplnı´me jedno polı´cˇko a pak prˇejdeme na sousednı´ a to taky vyplnı´me. To cele´ opakujeme deveˇtkra´t. Nezˇ zacˇneme staveˇt, tak si musı´me cele´ meˇsto vypucovat. Prˇi pra´ci musı´ by´t prˇece porˇa´dek. To sa´m dobrˇe vı´sˇ. Vysbı´rat znacˇky mu˚zˇesˇ pomocı´ prˇ´ıkazu ZVEDNI. To je ale prˇi veˇtsˇ´ım mnozˇstvı´ zdlouhave´. Ja´ ti poradı´m kratsˇ´ı zpu˚sob. Poslouzˇ´ı ti k tomu prˇ´ıkaz MESTO. Po jeho zada´nı´ zmizı´m z obrazovky a na jejı´ leve´ straneˇ se uka´zˇ´ı na´zvy povelu˚ s jejichzˇ pomocı´ mu˚zˇesˇ po meˇsteˇ malovat. Mu˚zˇesˇ malovat ru˚zne´ prˇeka´zˇky jako zdi, staveˇt bludisˇteˇ, pokla´dat znacˇky. Prˇ´ıkaz Nove ´ me ˇsto naopak vsˇechno kra´sneˇ vymazˇe a pracovisˇteˇ budesˇ mı´t hezky prˇipravene´. Stiskem kla´vesy Esc (oznacˇene´ jako Konec) se opeˇt na obrazovce objevı´m a mu˚zˇeme zacˇ´ıt. Podle toho, co uzˇ vı´sˇ, snadno vymyslı´sˇ prˇ´ıkaz pro zaplneˇnı´ cele´ho polı´cˇka znacˇkami. Jde jen o to polozˇit pod sebe deveˇt znacˇek. Vı´c se jich prˇece na jedno polı´cˇko nevejde. To uzˇ jsme si rˇekli. Takovy´ prˇ´ıkaz si nazveme trˇeba VYPLN.
16
Programovacı´ jazyk KAREL
VYPLN 9 KRAT POLOZ ↑
VYPLN ZNAMENA OPAKUJ 9 KRAT POLOZ KONEC KONEC
No a ma´me jedno polı´cˇko vyplneˇne´. A postavit VEZ bude znamenat, zˇe musı´me VYPLN deveˇtkra´t opakovat. Ale to snad na jednom polı´cˇku nejde ? Spra´vneˇ ! Proto mi vzˇdy prˇed kazˇdy´m opakova´nı´m da´sˇ prˇ´ıkaz abych poposˇel o jeden KROK. Pozor ! Rˇekli jsme si ale, zˇe musı´sˇ zabra´nit tomu, abych narazil. Proto nezˇ zacˇnu staveˇt VEZ, tak meˇ musı´sˇ natocˇit tak, aby prˇede mnou byl dostatek volne´ho mı´sta. O to se musı´sˇ postarat zatı´m sa´m. Kdyzˇ uzˇ ma´sˇ vsˇe prˇipraveno, tak zacˇneme staveˇt VEZ. Vyplnit polı´cˇko uzˇ umı´sˇ, krok taky. Takzˇe je jenom spojı´me. A VEZ je tady. VEZ 9 KRAT VYPLN KROK ↑
VEZ ZNAMENA OPAKUJ 9 KRAT VYPLN KROK KONEC KONEC
A kus je hotovo. RAMENO – to je obdobne´, jen musı´sˇ vyplnˇovat polı´cˇka vedle sebe. Protozˇe ale zacˇ´ına´sˇ tam, kde koncˇ´ı VEZ, to je nad vrcholkem, musı´sˇ jesˇteˇ prˇejı´t. Podle pla´nu vidı´sˇ, zˇe aby se dostal na vy´chozı´ pozici pro stavbu ramena, tak musı´sˇ udeˇlat VLEVO-VBOK, DVOJ-KROK, VLEVO-VBOK, DVOJ-KROK, VLEVO-VBOK. Kdyzˇ se na tenhle popis podı´va´sˇ, tak vidı´sˇ, zˇe se tam opakuje VLEVO-VBOK, DVOJ-KROK. Ejhle ! A ma´me zase pouzˇitı´ pro OPAKUJ. Potom na´m ale zbyde jeden VLEVO-VBOK. Ten musı´me dodat za OPAKUJ. Ted’ uzˇ na´m dojı´t na urcˇene´ mı´sto nedeˇla´ zˇa´dny´ proble´m. Ma´me tak novy´ prˇ´ıkaz, kde je na´vaznost prˇ´ıma´, ale kromeˇ toho i jeden cyklus se zna´my´m pocˇtem opakova´nı´. Nazveme si jej NA-RAMENO. Na´zev prˇ´ıkazu zada´vej vzˇdy tak, aby i v tom jednoduche´m a kra´tke´m na´zvu bylo ukryto pokud mozˇno co nejprˇesneˇji oznacˇenı´ cˇinnosti. Kdyzˇ zvolı´sˇ trˇeba na´zev NA-MISTO, tak se ti bude za chvı´li ple´st kam ma´sˇ dojı´t. NA-RAMENO 2 KRAT VLEVO-VBOK DVOJ-KROK ↑
VLEVO-VBOK
NA-RAMENO ZNAMENA OPAKUJ 2 KRAT VLEVO-VBOK DVOJ-KROK KONEC VLEVO-VBOK KONEC
4. Ucˇ´ıme se pracovat: KAREL monte´rem
17
A koukej, jak je za´pis kopenogramem prˇehledneˇjsˇ´ı a jednodusˇsˇ´ı. Jak uzˇ sis vsˇimnul, aby se na´m kopenogramy lı´bili, tak si je deˇla´me barevne´. Zvla´sˇt’si oznacˇujeme hezky barvou kazˇdy´ druh cˇinnosti. Jak vidı´sˇ, tak cyklus s urcˇity´m pocˇtem opakova´nı´ oznacˇujeme zeleneˇ. To podle tra´vnı´ku, na ktere´m se mu˚zˇeme hezky probeˇhnout. Ale aby ses nezabeˇhnul ! Jesˇteˇ musı´me setrojit RAMENO. To uzˇ je slozˇiteˇjsˇ´ı. Podle vy´kresu vidı´sˇ, zˇe je tencˇ´ı. Je tam jenom peˇt znacˇek. Proto ma´sˇ prˇ´ıkaz VYPLN5: VYPLN5 5 KRAT POLOZ ↑
VYPLN5 ZNAMENA OPAKUJ 5 KRAT POLOZ KONEC KONEC
Na konci ramene je za´vazˇ´ı. To je vlastneˇ deveˇt znacˇek. Ale prˇes veˇzˇ, ve spoji, uzˇ znacˇky pokla´dat nemu˚zˇesˇ. To bych se ozval, zˇe Nenı ´ kam poloz ˇit. Proto kdyzˇ dojdesˇ k veˇzˇi, tak musı´sˇ udeˇlat dalsˇ´ı krok. Protozˇe se spolu jesˇteˇ neumı´me chovat podle okolnostı´, tak je to zase na tobeˇ. Napisˇ proto prˇ´ıkaz, kde vyplnı´m dveˇ polı´cˇka devı´ti znacˇkami, udeˇla´m krok navı´c a pak vyplnı´m peˇt polı´cˇek trˇemi znacˇkami. A hele, vzˇdyt’ je to lehke´ ! A nara´z ma´m v jednom prˇ´ıkazu spojene´ dva cykly za sebou. Takove´mu spojenı´ se taky rˇ´ıka´ postupne´. To, zˇe ti to zdu˚zarnˇuji, znamena´, zˇe cykly mu˚zˇeme spojovat taky jinak. Jak, to azˇ za chvilicˇku. RAMENO 2 KRAT VYPLN KROK ↑
KROK 5 KRAT VYPLN5 KROK ↑
RAMENO ZNAMENA OPAKUJ 2 KRAT VYPLN KROK KONEC KROK OPAKUJ 5 KRAT VYPLN5 KROK KONEC KONEC
Na prvnı´ pohled vidı´sˇ, zˇe tento prˇ´ıkaz jsou vlastneˇ dva prˇ´ıkazy spojene´ do jednoho. Ale je tu i dalsˇ´ı spojenı´ cyklu˚, nejenom postupne´. Zkus si to vedle na papı´rˇe rozkreslit. Nedı´vej se ale da´l. Zkus si to sa´m. Prˇ´ısˇteˇ se k tomu vra´tı´me.
18
Programovacı´ jazyk KAREL
5. OPAKUJ – budesˇ chytrˇejsˇ´ı Tak jak dopadlo rozkreslenı´ ramene ? Pokud jsi to na´hodou nezvla´dl, tak pouzˇij na´sledujı´cı´ postup: Mı´sto VYPLN pouzˇij jenom primitiv. Zacˇa´tek prˇ´ıkazu RAMENO by pak vypadal takto: RAMENO 2 KRAT 9 KRAT POLOZ ↑
KROK
RAMENO ZNAMENA OPAKUJ 2 KRAT OPAKUJ 9 KRAT POLOZ KONEC KROK KONEC
↑
Takove´mu spojenı´ cyklu˚ rˇ´ıka´me cyklus vnorˇeny´. A protozˇe jsi zˇa´cˇek pozorny´, tak uzˇ sis jisteˇ vsˇimnul dvou veˇcı´. Jednak tento prˇ´ıkaz nenı´ u´plny´. Na pocˇ´ıtacˇi by nefungoval. Procˇ ? Protozˇe pocˇ´ıtacˇ by sta´le cˇekal na ukoncˇenı´. V kopenogramu chybı´ ukoncˇujı´cı´ cˇa´ra a v karlovske´m za´pisu musı´ zacˇ´ınat poslednı´ prˇ´ıkaz pod zacˇa´tkem hlavy programu. Je to jako v matematice se za´vorkami. Tady ZNAMENA a OPAKUJ znamenajı´ tote´zˇ co leve´ za´vorky, KONEC co prave´ za´vorky. A ty uzˇ vı´sˇ, zˇe jich musı´ by´t stejny´ pocˇet. A je ti taky doufa´m jasne´, jak program beˇzˇ´ı. Pro jistotu to slovneˇ popı´sˇu. Jednotlive´ rˇa´dky programu si mu˚zˇesˇ prˇedstavit jako oba´lky, kde je vlozˇen popis prˇ´ıkazu. Podle programu budu pracovat tak, zˇe otevrˇu prvnı´ oba´lku. Tu si otevrˇu v okamzˇiku, kdy stisknesˇ Enter. Je na nı´ napsa´no RAMENO je v nı´ napsa´no, zˇe prvnı´ prˇ´ıkaz je v oba´lce 2. V oba´lce 2 je napsa´no, zˇe ma´m udeˇlat dvakra´t prˇ´ıkazy z oba´lky 3. Do sve´ho za´pisnı´ku si proto napı´sˇu pozna´mku – oba´lka 3 a udeˇla´m dveˇ cˇa´rky a dvojku v oba´lce sˇkrtnu. Po otevrˇenı´ oba´lky 3 se ale dozvı´m, zˇe ma´m udeˇlat deveˇtkra´t prˇ´ıkazy z oba´lky 4. Proto si poznamena´m do za´pisnı´ku k oba´lce 3 deveˇt cˇa´rek a devı´tku v oba´lce sˇkrtnu. Otevrˇu oba´lku 4 a prˇecˇtu si prˇ´ıkaz POLOZ. Tomu rozumı´m a tak polozˇ´ım znacˇku. Pak si otevrˇu oba´lku cˇ´ıslo 5. Tam ma´m lı´stecˇek, zˇe se ma´m vra´tit k oba´lce 3. Podı´va´m se do za´pisnı´ku, kde jsem oba´lku 3 polozˇil a vidı´m u nı´ peˇt cˇa´rek. Jednu si hned umazˇu a podı´va´m se do oba´lky 3. Tam ma´m napsa´no, abych vykonal prˇ´ıkaz z oba´lky 4. Otevrˇu tedy oba´lku 4 . .. A to tak dlouho, celkem deveˇtkra´t, azˇ ma´m vsˇechny cˇa´rky, ktere´ jsem si napsal k oba´lce 3, prˇesˇkrtle´. Pak otevrˇu oba´lku 5. Tam ma´m napsa´no KROK. Udeˇla´m krok a otevrˇu oba´lku 7, kde je napsa´no, abych se podı´val do oba´lky 2. Proto si jednu cˇa´rku v za´pisnı´ku u oba´lky 2 sˇkrtnu a jdu se podı´vat do oba´lky 2. Tam je napsa´no, abych vykonal prˇ´ıkaz z oba´lky 3. Otevrˇu oba´lku 3, do za´pisnı´ku poznamena´m deveˇt cˇa´rek a jdu da´l . . . Tak se zase dostanu k oba´lce 7, prˇesˇkrtnu si druhou cˇa´rku. A ted’ nevı´m co da´l, protozˇe uzˇ nema´m dalsˇ´ı oba´lku, ktera´ by mi rˇekla JSI HOTOV – KONEC. Prˇ´ıkaz nenı´ u´plny´, jak jsme si rˇekli. Ted’ uzˇ se ale musı´me pustit do toho napla´novane´ho jerˇa´bu. Umı´me VEZ, NA-RAMENO a RAMENO. Jesˇteˇ na´m zby´va NA-VEZ – abych se dostal z domecˇku na vhodne´ mı´sto pro stavu jerˇa´bu. Je trˇeba udeˇlat trˇi kroky (TROJ-KROK) a otocˇit se vlevo: 5. OPAKUJ – budesˇ chytrˇejsˇ´ı
19
NA-VEZ TROJ-KROK VLEVO-VBOK
NA-VEZ ZNAMENA TROJ-KROK VLEVO-VBOK KONEC
Tak – a ma´me vsˇe potrˇebne´ pro JERAB: ted’ to jen spra´vneˇ serˇadit: JERAB NA-VEZ VEZ NA-RAMENO RAMENO
20
JERAB ZNAMENA NA-VEZ VEZ NA-RAMENO RAMENO KONEC
Programovacı´ jazyk KAREL
6. Panela´rna Tak co, nebolı´ teˇ ruce, jak jsme staveˇli jerˇa´b ? To byla uzˇ neˇjaka´ pra´ce ! Jen si vzpomenˇ, jak se ti to nejprve zda´lo slozˇite´. A nakonec jsi to zvla´dnul na jednicˇku. Je to tı´m, zˇe uzˇ toho spolu hodneˇ dovedeme. Umı´sˇ uzˇ pouzˇ´ıvat za´kladnı´ primitiva jako je KROK, VLEVO-VBOK, ZVEDNI, POLOZ a KONEC. A co je rovneˇzˇ du˚lezˇite´, umı´sˇ si proble´m rozlozˇit, cˇili – jak odborneˇ rˇ´ıka´me – prove´st dekompozici proble´mu. A ted’ s chutı´ do dalsˇ´ı pra´ce. Pustı´me se do staveˇnı´ domu. Nejprve se pustı´me do jeho prˇ´ıpravy. Zacˇneme nejdu˚lezˇiteˇjsˇ´ı veˇcı´ – takzvanou dekompozicı´ proble´mu. Na´sˇ postup, i kdyzˇ smeˇrˇuje k jednomu cı´li a ma´ jeden vy´sledek, se totizˇ za´sadneˇ lisˇ´ı. Ty prˇi rˇesˇenı´ neˇjake´ho proble´mu musı´sˇ postupovat od nejslozˇiteˇjsˇ´ı veˇci smeˇrem k nejjednodusˇsˇ´ım, ktere´ uzˇ umı´sˇ zvla´dnout. Ja´ ale musı´m kazˇdou u´lohu rˇesˇit smeˇrem od nejjednodusˇsˇ´ıch veˇcı´ k nejslozˇiteˇjsˇ´ı – k vy´sledku u´lohy. Jiny´mi slovy, kdyzˇ rˇesˇ´ısˇ u´lohu ty, tak provedesˇ rozklad zada´nı´ azˇ na primitiva. Ja´ pak zase z jednotlivy´ch primitiv slozˇ´ım dohromady celkove´ rˇesˇenı´. Ale abych ti tu nevykla´dal jen same´ nudne´ definice. Uka´zˇeme si to na prˇ´ıkladu. Chceme postavit du˚m. Vybereme si pro zacˇa´tek neˇjaky´ jednoduchy´. Naprˇ´ıklad tento:
6. Panela´rna
21
Vidı´sˇ, zˇe se jedna´ o skutecˇneˇ velmi jednoduchy´ domek. Pochopitelneˇ bych mohl zvolit i slozˇiteˇjsˇ´ı, ale pro zacˇa´tek na´m stacˇ´ı tento. Postavit du˚m – to je na´sˇ u´kol. Jenzˇe jak zacˇ´ıt ? Postavit cely´ domek najednou, to neumı´me. Proto si du˚m rozdeˇlı´me na jednotlive´ dı´ly. Vidı´sˇ, zˇe se skla´da´ z prˇ´ızemı´, prˇekladu, patra a strˇechy:
strˇecha patro prˇeklad prˇ´ızemı´
panel
panel
okno
okno
panel
dverˇe
panel
okno
panel
Ale i tyto cˇa´sti jsou zatı´m pro tebe prˇ´ılisˇ slozˇite´, abys je rovnou naprogramoval. Zkusı´me to jinak. Vzpomenˇ si jaky´m zpu˚sobem se stavı´ velke´ domy. Uzˇ jsi na to prˇisˇel ? Spra´vneˇ ! Rozlozˇ´ı jednotlive´ cˇa´sti – prˇ´ızemı´, prˇeklad, patro a strˇechu – na jednotlive´ prvky – panely. Kdyzˇ se podı´va´sˇ na obra´zek domu, tak vidı´sˇ, zˇe nejslozˇiteˇjsˇ´ı cˇa´stı´ je prˇ´ızemı´. V prˇ´ızemı´ jsou jak panely plne´, tak i okna a dverˇe. V ostatnı´ch dı´lech domu se nevyskytuje zˇa´dny´ prvek, ktery´ nenı´ pouzˇit v prˇ´ızemı´. Stacˇ´ı, kdyzˇ si spolu rozlozˇ´ıme prˇ´ızemı´.
No a takove´ prˇ´ıkazy uzˇ prˇece dovedesˇ naprogramovat. Vzpomenˇ si na JERAB. Naprˇed ale spolu dokoncˇ´ıme rozklad azˇ do konce. Zacˇneme s panelem. Panel se skla´da´ ze dvou polı´cˇek nad sebou vyplneˇny´ch znacˇkami. Opeˇt pro jednoduchost budeme prˇedpokla´dat, zˇe stavı´me na cˇiste´m stavenisˇti, zˇe nenı´ na stavbeˇ zˇa´dny´ neporˇa´dek. Panel – to je vlastneˇ takova´ veˇzˇ, ktera´ je vysoka´ jenom dveˇ polı´cˇka. tady je: PANEL 2 KRAT VYPLN KROK ↑
22
PANEL ZNAMENA OPAKUJ 2 KRAT VYPLN KROK KONEC KONEC
Programovacı´ jazyk KAREL
Okno je pro tebe slozˇiteˇjsˇ´ı. Vidı´sˇ, zˇe se skla´da´ z jednoho polı´cˇka plne´ho a jednoho pra´zdne´ho. Takzˇe tady nemu˚zˇesˇ pouzˇ´ıt OPAKUJ. Tedy vlastneˇ mu˚zˇesˇ, ale nemeˇlo by to smysl. Mohl bys opakovat KROK, ale to je zbytecˇne´, protozˇe uzˇ ma´sˇ nadefinovany´ prˇ´ıkaz DVOJ-KROK. OKNO VYPLN DVOJ-KROK
OKNO ZNAMENA VYPLN DVOJ-KROK KONEC
Nic zde neopakujeme. Jedna´ se jenom o na´sledne´ spojenı´ dvou jizˇ zna´my´ch prˇ´ıkazu˚. Mu˚zˇesˇ se pta´t, procˇ vzˇdy vycha´zı´m azˇ nad prˇ´ıslusˇny´ panel ? Vzˇdyt’ by tady stacˇilo, abych udeˇlal jenom jeden krok. Ale vzpomenˇ, jak jsme si rˇekli, zˇe se budeme snazˇit o co nejveˇtsˇ´ı jednotnost a jednoduchost. Zatı´m neza´lezˇ´ı na dobeˇ trva´nı´ prˇ´ıkazu a tak na´m ten jeden KROK navı´c nevadı´. A taky nezapomenˇ, zˇe vzˇdy po postavenı´ panelu musı´sˇ prˇejı´t na mı´sto, odkud budesˇ staveˇt novy´ panel. Proto je pro na´s vy´hodne´, kdyzˇ bude co nejveˇtsˇ´ı jednotnost. Poslednı´m prvkem – panelem, ktery´ na´m scha´zı´, jsou dverˇe. Dverˇe jsou dveˇ pra´zdna´ polı´cˇka. My bychom je tedy mohli jednodusˇe vynechat. Ale protozˇe jsme si rˇekli o jednotnosti, tak je nadefinujeme jako DVOJ-KROK: DVERE DVOJ-KROK
DVERE ZNAMENA DVOJ-KROK KONEC
Je to vlastneˇ jeden a ten samy´ prˇ´ıkaz, ale ma´ jine´ jme´no.
6. Panela´rna
23
7. Stavı´me du˚m Ano a za chvı´li budeme slavnostneˇ vztycˇovat glajchu. Uzˇ ma´me spolu du˚m rozlozˇeny´ na jednotlive´ panely, dokonce jsme si je posledneˇ stacˇili i vyrobit. Tı´m jsme provedli dekompozici proble´mu. Ale jesˇteˇ na´m kus zby´va´. Vzˇdyt’ my ma´me zatı´m vyrobeny vlastneˇ jenom takove´ kostky ! A zkus da´t svojı´ dvoulete´ sestrˇicˇce kostky at’ z nich postavı´ du˚m ! Nepostavı´ ho. Nevı´ jak. Zrovna tak ani ja´ jesˇteˇ nevı´m, jak bych postavil du˚m. Vı´m jak du˚m vypada´. Umı´m si i vyrobit potrˇebne´ kostky – panely. Jenzˇe jak da´l ? Vzpomenˇ si na jerˇa´b. Tam jsme taky museli spolu cestovat na monta´zˇnı´ mı´sto. Proto si i ted’musı´me naprˇed nadefinovat prˇechod na nove´ mı´sto. Zu˚staneme zatı´m jesˇteˇ u prˇ´ızemı´. Kdyzˇ zacˇ´ına´me staveˇt, tak ja´ stojı´m v nove´m meˇsteˇ ve vy´chozı´ pozici. To znamena´, zˇe meˇsto je cˇiste´ a uklizene´ a ja´ jsem otocˇen podle spodnı´ zdi. Naprˇed se tedy musı´m otocˇit nahoru. To je snadne´ – to provedu jenom VLEVO-VBOK. Pak postavı´m PANEL. Ale my chceme postavit prˇ´ızemı´. Proto musı´m sejı´t dolu˚, udeˇlat krok stranou a opeˇt se otocˇit nahoru. Kdyzˇ skoncˇ´ım PANEL, provedu CELEM-VZAD a pak meˇ musı´sˇ nechat udeˇlat DVOJ-KROK. Tı´m se dostanu na mı´sto, odkud jsem zacˇal. Ale ty potrˇebujesˇ, abych se dostal do nove´ vy´chozı´ pozice ! To znamena´, zˇe musı´m sta´t na vedlejsˇ´ım polı´cˇku otocˇeny´ opeˇt nahoru ! To tedy udeˇla´m VLEVO-VBOK, KROK, VLEVO-VBOK – a je to. NA-NOVY-PANEL CELEM-VZAD DVOJ-KROK VLEVO-VBOK KROK VLEVO-VBOK
NA-NOVY-PANEL ZNAMENA CELEM-VZAD DVOJ-KROK VLEVO-VBOK KROK VLEVO-VBOK KONEC
Ted’ mu˚zˇeme uzˇ spolu postavit prˇ´ızemı´. Takhle bys to jisteˇ svedl i bez na´poveˇdy:
24
Programovacı´ jazyk KAREL
PRIZEMI1 VLEVO-VBOK PANEL NA-NOVY-PANEL OKNO NA-NOVY-PANEL PANEL NA-NOVY-PANEL DVERE NA-NOVY-PANEL PANEL NA-NOVY-PANEL OKNO NA-NOVY-PANEL PANEL NA-NOVY-PANEL OKNO NA-NOVY-PANEL PANEL NA-NOVY-PANEL PANEL
PRIZEMI1 ZNAMENA VLEVO-VBOK PANEL NA-NOVY-PANEL OKNO NA-NOVY-PANEL PANEL NA-NOVY-PANEL DVERE NA-NOVY-PANEL PANEL NA-NOVY-PANEL OKNO NA-NOVY-PANEL PANEL NA-NOVY-PANEL OKNO NA-NOVY-PANEL PANEL KONEC
No ale takovy´ prˇ´ıkaz ? Vzˇdyt’ma´ 19 rˇa´dku˚ ! To se pomalu ani nevejde na obrazovku ! Kdyzˇ se na prˇ´ıkaz podı´va´sˇ, tak vidı´sˇ, zˇe nejvı´ce se tam vyskytuje prˇ´ıkaz NA-NOVY-PANEL. Nejjednodusˇeji se ho zbavı´me, kdyzˇ si znovu nadefinujeme prˇ´ıkazy pro jednotlive´ panely a zabudujeme do nich i prˇ´ıkaz pro prˇechod na nove´ pracovisˇteˇ. Proto pomocı´ prˇ´ıkazu CHYBA vymazˇ NA-NOVY-PANEL, DVERE, OKNO a PANEL a znovu si je nadefinuj. Ale pozor na porˇadı´: protozˇe v jednotlivy´ch panelech chceme pouzˇ´ıt i NA-NOVYPANEL, musı´me jej nadefinovat nejdrˇ´ıve. PANEL
OKNO
DVERE
2 KRAT VYPLN KROK
VYPLN DVOJ-KROK NA-NOVY-PANEL
DVOJ-KROK NA-NOVY-PANEL
↑
NA-NOVY-PANEL Dalsˇ´ı mozˇne´ zjednodusˇenı´ je, zˇe se za dverˇmi dvakra´t za sebou vyskytuje PANEL a OKNO. proto mu˚zˇeme tyto dva prˇ´ıkazy nechat opakovat. Prˇ´ızemı´ pak vypada´ takto:
7. Stavı´me du˚m
25
PRIZEMI VLEVO-VBOK PANEL OKNO PANEL DVERE 2 KRAT PANEL OKNO ↑
PANEL
PRIZEMI ZNAMENA VLEVO-VBOK PANEL OKNO PANEL DVERE OPAKUJ 2 KRAT PANEL OKNO KONEC PANEL KONEC
No, sice ani toto nenı´ moc hezky napsany´ prˇ´ıkaz, ale my jej zatı´m lı´p neumı´me. Ostatnı´ prˇ´ıkazy na´m uzˇ pu˚jdou lı´p. Nad prˇ´ızemı´m je prˇeklad. To je cela´ rˇada znacˇkami vyplneˇny´ch polı´cˇek. Vidı´sˇ, zˇe jich je celkem deveˇt vedle sebe. My uzˇ vlastneˇ takovy´ prˇ´ıkaz ma´me a dokonce i s prˇechodem na nove´ pracovisˇteˇ ! Je to OKNO ! Tı´m, zˇe udeˇla´me krok, nakreslı´m sice pra´zdne´ polı´cˇko, ale to nevadı´. Vzˇdyt’ i do takove´ho polı´cˇka ja´ mohu znacˇky pokla´dat. A protozˇe ted’ ze zacˇa´tku na´m neza´lezˇ´ı na rychlosti, tak pouzˇijeme OKNO na sestrojenı´ prˇekladu. Nevadı´, zˇe je to jiny´ prˇ´ıkaz. Na´m vyhovuje. Je spra´vny´, protozˇe s nı´m nakreslı´me prˇeklad. A to tak, zˇe meˇ necha´sˇ postavit deveˇt oken vedle sebe. To je prˇece kra´sny´ prˇ´ıklad pro OPAKUJ: PREKLAD 9 KRAT OKNO ↑
PREKLAD ZNAMENA OPAKUJ 9 KRAT OKNO KONEC KONEC
Ale tı´mto jednı´m prˇ´ıkazem ma´me za´rovenˇ nadefinovanou i strˇechu ! Vzˇdyt’ strˇecha nenı´ nic jine´ho nezˇ prˇeklad nad patrem. Proto na´m zby´va´ uzˇ jenom vytvorˇit definici pro PATRO. Na patrˇe, tam ma´m cˇtyrˇi okna, ktera´ sousedı´ s panely. Proto pouzˇijeme na´m jizˇ dobrˇe zna´me´ OPAKUJ. Ale ten jeden panel pak jesˇteˇ musı´me prˇidat ! Na to nezapomenˇ ! PATRO 4 KRAT PANEL OKNO ↑
PANEL
26
PATRO ZNAMENA OPAKUJ 4 KRAT PANEL OKNO KONEC PANEL KONEC
Programovacı´ jazyk KAREL
A jednotlive´ dı´ly domu jsou hotovy. Ted’ uzˇ je zby´va´ jenom pospojovat. Nezapomenˇ, zˇe ja´ skoncˇ´ım vzˇdy na konci a ted’ se potrˇebuju dostat na dalsˇ´ı pozici. My si pro jednoduchost nadefinujeme dva prˇ´ıkazy: NA-PREKLAD a NA-PATRO. Jejich konstrukce uzˇ ti je jisteˇ tak jasna´, zˇe je nemusı´m ani komentovat. NA-PREKLAD VLEVO-VBOK 9 KRAT KROK ↑
VPRAVO-VBOK DVOJ-KROK
NA-PREKLAD ZNAMENA VLEVO-VBOK OPAKUJ 9 KRAT KROK KONEC VPRAVO-VBOK DVOJ-KROK KONEC
A NA-PATRO je prˇ´ıkaz obdobny´: NA-PATRO VLEVO-VBOK 9 KRAT KROK ↑
VPRAVO-VBOK KROK
NA-PATRO ZNAMENA VLEVO-VBOK OPAKUJ 9 KRAT KROK KONEC VPRAVO-VBOK KROK KONEC
Takzˇe ted’ uzˇ zna´sˇ vsˇechno potrˇebne´ pro stavbu domu. Na´sˇ prvnı´ du˚m vypada´ takto: DUM PRIZEMI NA-PREKLAD PREKLAD NA-PATRO PATRO NA-PREKLAD PREKLAD
DUM ZNAMENA PRIZEMI NA-PREKLAD PREKLAD NA-PATRO PATRO NA-PREKLAD PREKLAD KONEC
To byla ale drˇina ! To proto, zˇe jesˇteˇ neˇktere´ veˇci nezna´me. Ty se spolu naucˇ´ıme v na´sledujı´cı´ch kapitola´ch. Azˇ dojdeme na konec knı´zˇky, tak si zkus du˚m postavit znovu. Uvidı´sˇ, zˇe to bude snadneˇjsˇ´ı. Ale i takto jsme zvla´dli kus pra´ce a za´klady programova´nı´.
7. Stavı´me du˚m
27
8. Karlova prˇ´ıtelkyneˇ Nepochybuji, zˇe uzˇ sis meˇ nahra´l do pocˇ´ıtacˇe, a tak dovol, abych ti dnes prˇedstavil svoji nejmilejsˇ´ı prˇ´ıtelkyni. Je to slecˇna rekurze. Na nose ti vidı´m i z obrazovky, zˇe jsi na ni zveˇdavy´. Ma´sˇ by´t na co. Rekurze je jednı´m z nejzajı´maveˇjsˇ´ıch jevu˚ ve vy´pocˇetnı´ technice. Co to vlastneˇ rekurze je ? Kdyzˇ ti to prozradı´m ucˇeneˇ, tak je to definova´nı´ prˇ´ıkazu pomocı´ sebe samotne´ho. Ted’ si to vysveˇtlı´me jednodusˇeji. Dosud jsme spolu definovali nove´ prˇ´ıkazy pomocı´ zna´my´ch prˇ´ıkazu˚. Naprˇ´ıklad VPRAVOVBOK jsme si nadefinovali pomocı´ VLEVO-VBOK. U rekurze pouzˇijeme ale nove´, nezna´me´ slovo hned v jeho definici. Je to asi tak, jako kdyzˇ rˇeknesˇ, zˇe sˇkolnı´ rok je obdobı´ mezi zacˇa´tkem a koncem sˇkolnı´ho roku. Kdyzˇ teˇ uslysˇ´ı neˇjaky´ logik, tak se hrozneˇ vydeˇsı´ a do zˇa´kovske´ knı´zˇky ti napı´sˇe velikou peˇtku neˇkolikra´t podtrzˇenou. Poucˇ´ı teˇ, zˇe ses dopustil chyby definice v kruhu. Na´m ale o to jde ! Potrˇebujeme neˇco, co by meˇ dostalo do neˇjake´ho zacˇarovane´ho kruhu, kde bych se tocˇil porˇa´d dokola jako na kolotocˇi. Uka´zˇeme si ale radeˇji prˇ´ıklad. Prˇedstav si, zˇe meˇ chcesˇ roztocˇit jako krasobruslarˇe prˇi pirueteˇ. Budu se tedy ota´cˇet porˇa´d doleva. Zatı´m bys to umeˇl zapsat trˇeba pomocı´ prˇ´ıkazu OPAKUJ takto: PIRUETA 255 KRAT VLEVO-VBOK ↑
PIRUETA ZNAMENA OPAKUJ 255 KRAT VLEVO-VBOK KONEC KONEC
Tady bych ale vykona´va´nı´ prˇ´ıkazu po chvı´li prˇerusˇil. Kdyzˇ chcesˇ, abych se tocˇil de´le, tak musı´sˇ pouzˇ´ıt mı´sto VLEVO-VBOK prˇ´ıkaz VPRAVO-VBOK. To znı´ divneˇ, vid’, ale jen si vzpomenˇ, zˇe VPRAVO-VBOK ma´me definova´n pomocı´ trˇ´ı VLEVO-VBOKu˚. Ale zase se za chvı´li zastavı´m. Jak meˇ roztocˇit trvale ? Nejle´pe to jde pomocı´ rekurze. Za´pis pomocı´ rekurze by vypadal takto: PIRUETA VLEVO-VBOK PIRUETA
PIRUETA ZNAMENA VLEVO-VBOK PIRUETA KONEC
Vypada´ to divneˇ, co ? Ale vzpomenˇ si na cyklus se zna´my´m pocˇtem opakova´nı´. Nebo se podı´vej, jak jsme si rozepsali moji cˇinnost prˇi OPAKUJ. A tady to je neˇco podobne´ho. Jesˇteˇ le´pe to pochopı´sˇ, kdyzˇ ti kopenogram rozepı´sˇi.
28
Programovacı´ jazyk KAREL
PIRUETA VLEVO-VBOK PIRUETA PIRUETA VLEVO-VBOK PIRUETA PIRUETA VLEVO-VBOK PIRUETA PIRUETA VLEVO-VBOK PIRUETA PIRUETA VLEVO-VBOK PIRUETA PIRUETA VLEVO-VBOK PIRUETA ... Vsˇimni si jedne´ veˇci. V kopenogramu vybarvujeme rekurzi jako hlavu. To znamena´ zˇlutou barvou. Procˇ ? No prˇeci proto, zˇe rekurze je vlastneˇ hlava nove´ho podprogramu. Tady je spra´vneˇ analogie s OPAKUJ. Jak tedy vlastneˇ prˇi rekurzi pracuji ? To je jednoduche´. Zada´sˇ mi prˇ´ıkaz PIRUETA. Ja´ se prˇi kazˇde´m prˇ´ıkazu, ktery´ nenı´ primitivem, podı´va´m do slovnı´ku, co vlastneˇ znamena´, co ma´m prova´deˇt. Tam si prˇecˇtu, zˇe prˇi prˇ´ıkazu PIRUETA ma´m prove´st VLEVO-VBOK. Provedu VLEVO-VBOK. Jako dalsˇ´ı prˇ´ıkaz ma´m prove´st PIRUETA. Ale to nevı´m, co znamena´. Tak se musı´m znovu podı´vat do slovnı´ku. Pochopitelneˇ vı´sˇ, zˇe prˇed kazˇdy´m podı´va´nı´m – odskocˇenı´m, si musı´m udeˇlat cˇa´rku, poznamenat do sve´ho za´pisnı´ku adresu – abych veˇdeˇl, kam se ma´m vra´tit. A tak to probı´ha´ donekonecˇna, dokud se nevycˇerpa´m. ˇ ekli jsme si, zˇe je urcˇita´ podobnost mezi rekurzı´ a opakova´nı´m. Z nasˇeho vy´kladu je videˇt. Ale R ve skutecˇnosti se podstatneˇ od sebe lisˇ´ı ! Rekurzi mu˚zˇeme prˇirovnat k tve´mu obrazu jak se vidı´sˇ, kdyzˇ si stoupnesˇ mezi dveˇ zrcadla. A opakova´nı´, to je zkra´tka opakova´nı´. Panı´ ucˇitelka teˇ necha´ taky opakovat za doma´cı´ u´kol na´sobilku, kdyzˇ ji neumı´sˇ. Opakova´nı´ na´sobilky ale ukoncˇ´ısˇ v okamzˇiku, kdyzˇ ji umı´sˇ. Nebo jestli jsi meˇl opakovat pı´semneˇ, tak kdyzˇ ji napı´sˇesˇ trˇeba desetkra´t. Ale svoje obra´zky v zrcadlech vidı´sˇ sta´le. Ty nekoncˇ´ı. Je jich nekonecˇneˇ mnoho. Proto abys meˇ alesponˇ na obrazovce mohl zastavit, tak prˇi prova´deˇnı´ kazˇde´ho prˇ´ıkazu napı´sˇi na´pis Zastavı ´m se kdyz ˇ stisknes ˇ Esc. Pokud meˇ sa´m nezastavı´sˇ, tak jsou jenom dveˇ mozˇnosti. Bud’ se program zhroutı´, anebo budu prova´deˇt PIRUETu donekonecˇna. Jestli jsi da´val pozor, tak uzˇ to urcˇiteˇ vı´sˇ. Jestli ne a chcesˇ to vysveˇtlit, tak docˇti tuto kapitolu azˇ do konce. Pokud ne, zacˇni cˇ´ıst novou.
8. Karlova prˇ´ıtelkyneˇ
29
Procˇ bych se meˇl prˇi prova´deˇnı´ rekurze zastavit ? Prˇ´ıcˇina je jednoducha´: Zaplnı´m si pameˇt na´vratovy´mi adresami. Rekurze v nasˇem prˇ´ıpadeˇ totizˇ nenı´ nekonecˇna´, ale pouze jakoby nekonecˇna´ – cˇili odborneˇ kvazinekonecˇna´. Na zacˇa´tku jsme si rˇekli, zˇe soucˇa´stı´ pocˇ´ıtacˇe jsou obvody, ktere´ si pamatujı´ tvoje prˇ´ıkazy. To znamena´, zˇe je to neˇco jako sesˇit. Prˇi zapnutı´ je cˇisty´, bı´ly´. Pak si ale do tohoto sesˇitu namalujesˇ meˇ – Karla. Tı´m uzˇ ten sesˇit tak cˇisty´ nenı´, neˇco jsi popsal. Ale jesˇteˇ ma´sˇ neˇjake´ cˇiste´ stra´nky – volnou pameˇt’. Ja´ ted’ dostanu prˇ´ıkaz, abych prova´deˇl rekurzi. Naprˇ´ıklad PIRUETA. To slovo ja´ ale nezna´m. Proto si musı´m nalistovat ve sve´m programu, co ma´m prova´deˇt prˇi nezna´me´m prˇ´ıkazu. Ale abych veˇdeˇl, kam se ma´m vra´tit, tak si musı´m poznamenat stra´nku a rˇa´dek, kde jsem pra´veˇ byl. Je to stejne´, jako kdyzˇ si cˇtesˇ knı´zˇku ty a maminka ti rˇekne umyj na´dobı´. Vezmesˇ si papı´rek a poznamena´sˇ, kam jsi knı´zˇku docˇetl. Ja´ tedy ve slovnı´ku najdu prˇ´ıkaz PIRUETA. Prˇecˇtu si, zˇe ma´m vykonat VLEVO-VBOK. Kdyzˇ jej ale vykona´m, tak narazı´m opeˇt na PIRUETA. Co ted’? Opeˇt se musı´m podı´vat do slovnı´ku. Ja´ uzˇ to zapomneˇl. Proto si poznamena´m na volne´ mı´sto, kam jdu. A opeˇt se jdu podı´vat, co ma´m deˇlat. No a tebe kdyby maminka sta´le neˇkam posı´lala, tak si za chvı´li papı´rek popı´sˇesˇ a nebudesˇ veˇdeˇt, kde jsi prˇestal cˇ´ıst. Ja´ vı´m, zˇe ty si sice vezmesˇ novy´ papı´r. Ale ja´ nemohu. A vygumovat pozna´mky si take´ nemohu. Vzˇdyt’ to bych se pak nedostal zpa´tky. Neumeˇl bych se vra´tit. To je jako ty kdyby sis pozna´mky vygumoval, tak bys neveˇdeˇl, na ktere´ stra´nce teˇ maminka poprve´ neˇkam poslala. Ja´ proto prˇestanu pracovat. Na me´m programu za´lezˇ´ı, jestli je uzpu˚sobeny´ tak, zˇe teˇ na tuto okolnost upozornı´ tı´m, zˇe ozna´mı´ Uz ˇ me ˇ to nebavı ´, nebo jestli se zhroutı´ – prˇestane pracovat program. Neˇkdy jsem ale naprogramova´n tak, zˇe kdyzˇ zjistı´m rekurzi na konci prˇ´ıkazu, tak to znamena´, zˇe uzˇ se nemusı´m nikam vracet – zˇe si nemusı´m zapisovat, kam se ma´m vra´tit, protozˇe jsem uzˇ vsˇechnu pra´ci na dane´m prˇ´ıkazu vykonal – pak uzˇ je tam jenom KONEC. A tak se mohu tocˇit donekonecˇna. Tak, a to je ta cela´ veˇda. Podstatne´ prˇitom je, zˇe ja´ si dovedu podle svy´ch pozna´mek, ktere´ prˇitom sesbı´ra´m – vygumuju – najı´t mı´sto, odkud jsem vysˇel, vra´tit se. Proto se my´m pozna´mka´m taky rˇ´ıka´ na´vratove´ adresy.
30
Programovacı´ jazyk KAREL
9. Seskakujeme z kolotocˇe Tak co, nezatocˇila se ti hlava z toho veˇcˇne´ho ota´cˇenı´ prˇi prˇ´ıkazu PIRUETA ? Ja´ se svojı´ kamara´dkou doka´zˇi i jine´ veˇci. Nezˇ se naucˇ´ıme, jak se rekurzivnı´ kolotocˇ opousˇtı´, tak si jesˇteˇ uka´zˇeme neˇktere´ prˇ´ıkazy s rekurzı´. Da´sˇ mi za u´kol trˇeba hlı´dat neˇjaky´ prˇedmeˇt na pomyslne´m dvorku uvnitrˇ meˇsta. Abych jej uhlı´dal, musı´m obcha´zet kolem dokola. Procha´zet se i zahy´bat uzˇ umı´me. Ale ted’ ma´me i rekurzi, takzˇe mu˚zˇeme i hlı´dat. HLIDEJ ZNAMENA DVOJ-KROK VLEVO-VBOK HLIDEJ KONEC
HLIDEJ DVOJ-KROK VLEVO-VBOK HLIDEJ
Prˇi prova´deˇnı´ prˇ´ıkazu˚ musı´sˇ da´t pozor, abych nenarazil do zdi. To bych vykona´va´nı´ prˇ´ıkazu prˇerusˇil a ozna´mil ti – Narazil jsem ! Au ! – protozˇe meˇ to bolı´. Neveˇrˇ´ısˇ ? Tak si to zkus na prˇ´ıkladu, kdy dojdu azˇ ke zdi a zastavı´m se tı´m, zˇe do ni narazı´m. DO-ZDI ZNAMENA KROK DO-ZDI KONEC
DO-ZDI KROK DO-ZDI
K tomu, abych nenara´zˇel, slouzˇ´ı jine´ prˇ´ıkazy. Prˇi nich se uzˇ musı´m rozhodovat. Pokusme se spolu takovy´ prˇ´ıkaz vytvorˇit. Vytvorˇ´ıme prˇ´ıkaz, kdy dojdu azˇ ke zdi a prˇed nı´ se zastavı´m. Nazveme jej KE-ZDI. Vzˇdy prˇed kazˇdy´m krokem zepta´m, jestli je prˇede mnou na dalsˇ´ım polı´cˇku zed’. To mi moje robotı´ cˇidla umozˇnı´. ˇ ´ıka´me jim podmiTak a ted’ se musı´m jen rozhodnout. K tomu slouzˇ´ı trˇetı´ skupina primitiv. R nˇujı´cı´. Jedno z nich – OPAKUJ – uzˇ zna´sˇ. Jak tedy nadefinovat KE-ZDI ? Trˇeba takto: KE-ZDI ZED
↓
KROK KE-ZDI
KE-ZDI ZNAMENA KDYZ JE ZED KONEC JINAK KROK KE-ZDI KONEC KONEC
Vidı´sˇ, jak je za´pis v kopenogramu prˇehledneˇjsˇ´ı ? Ale naprˇed si jej jesˇteˇ vysveˇtlı´me. Kdyzˇ odesˇlesˇ do pocˇ´ıtacˇe (pomocı´ kla´vesy Enter ↵) prˇ´ıkaz KDYZ, tak se teˇ zepta´m, zda KDYZ JE nebo KDYZ NENI. Po tve´ odpoveˇdi JE (nebo NENI, ale v nasˇem prˇ´ıpadeˇ JE) se teˇ zepta´m na podmı´nku, kterou ma´m testovat. Mu˚zˇesˇ napsat ZED nebo jenom ZE.
9. Seskakujeme z kolotocˇe
31
Ja´ pak prˇi prova´deˇnı´ prˇ´ıkazu narazı´m na prˇ´ıkaz KDYZ. Zastavı´m se a zkouma´m, jestli je na´sledujı´cı´ podmı´nka – v nasˇem prˇ´ıkladeˇ JE ZED – splneˇna. Na za´kladeˇ tohoto zjisˇteˇnı´ se rozhodnu. Pokud je splneˇna, vykona´m levou cˇa´st kopenogramu – v tomto prˇ´ıpadeˇ neudeˇla´m nic. Pokud ale podmı´nka splneˇna nenı´, vyberu si mozˇnost JINAK (v kopenogramu je vyznacˇena sˇipkou dolu˚). Du˚lezˇite´ je, zˇe at’ se rozhodnu jakkoliv, obeˇ cesty se vzˇdy nakonec spojı´. Ale podle toho, kterou cestou si podle pravdivosti nebo nepravdivosti podmı´nky vyberu, se lisˇ´ı cˇinnost, kterou budu vykona´vat. Protozˇe rozhodova´nı´ je cˇinnost velmi du˚lezˇita´, vyznacˇ´ıme ji vy´razneˇ i v kopenogramu. Rozhodovacı´ za´hlavı´ vybarvujeme vy´razneˇ – zvolı´me si proto modrou barvu. Ta na´m vynika´. Do za´hlavı´ vzˇdy vypı´sˇeme testovanou podmı´nku. V nasˇem prˇ´ıpadeˇ ZED. Je-li tato podmı´nka splneˇna, pokracˇujeme tou cˇa´stı´ programu, ktera´ je umı´steˇna v kopenogramu pod podmı´nkou. V nasˇem prˇ´ıpadeˇ tam nenı´ nic. Jdeme tedy na konec cˇinnosti. Kdyzˇ podmı´nka splneˇna nenı´, prˇesuneme se vpravo, kde sˇipka ukazuje, kudy ma´me pokracˇovat. Konec bloku odpovı´da´ mı´stu, kde se obeˇ cesty sbı´hajı´. Podı´vej se ale, co vsˇechno se da´ s KDYZ doka´zat. Zkusı´me prˇ´ıkaz NA-DALSI-ZNACKU. Ma´sˇ za u´kol nadefinovat mi prˇ´ıkaz, kdyzˇ stojı´m na znacˇce, abych sˇel smeˇrem, kam jsem natocˇen. A to do doby, nezˇ dojdu na dalsˇ´ı znacˇku. Tam se ma´m zastavit. V prˇ´ıpadeˇ, zˇe dojdu drˇ´ıv ke zdi, udeˇla´m cˇelem vzad a zastavı´m se taky. Brrrr. To uzˇ je peˇkneˇ slozˇite´. Tady budu muset vykona´vat neˇjakou cˇinnost, at’ pu˚jdu kteroukoliv cestou. A prˇitom testovat dveˇ podmı´nky. Za prve´, je-li prˇede mnou zed’, to uzˇ zna´m. Ale za druhe´, je-li pode mnou znacˇka. Ale tuto podmı´nku mohu testovat, azˇ udeˇla´m prvnı´ krok ! Vzˇdyt’ na znacˇce stojı´m. Podı´vej se, jak tedy takovy´ prˇ´ıkaz vypada´. NA-DALSI-ZNACKU ZED CELEM-VZAD
↓
KROK ZNACKA
↓
NA-DALSI -ZNACKU
NA-DALSI-ZNACKU ZNAMENA KDYZ JE ZED CELEM-VZAD KONEC JINAK KROK KDYZ JE ZNACKA KONEC JINAK NA-DALSI-ZNACKU KONEC KONEC KONEC
Jak prˇ´ıkazem – a tady uzˇ skutecˇny´m programem – procha´zı´m, je ti ted’ podle kopenogramu jasne´. Dalsˇ´ı podmı´nky, ktere´ umı´m testovat, jsou sveˇtove´ strany. Na obrazovce, stejneˇ jako na mapeˇ, je SEVER nahorˇe, ZAPAD vlevo, JIH je dole a VYCHOD vpravo. NA-SEVER meˇ pak mu˚zˇesˇ otocˇit tak, zˇe meˇ necha´sˇ prova´deˇt VLEVO-VBOK pomocı´ rekurze a zastavı´sˇ meˇ, kdyzˇ bude SEVER:
32
Programovacı´ jazyk KAREL
NA-SEVER ↓
SEVER
VLEVO-VBOK NA-SEVER
NA-SEVER ZNAMENA KDYZ JE SEVER KONEC JINAK VLEVO-VBOK NA-SEVER KONEC KONEC
A natocˇit meˇ na jakoukoliv jinou sveˇtovou stranu je pro tebe uzˇ hracˇka. Kdybys to na´hodou neveˇdeˇl, tak prˇ´ıkazy jsou ve slovnı´ku. K-JIZNI-ZDI NA-JIH KE-ZDI
K-JIZNI-ZDI ZNAMENA NA-JIH KE-ZDI KONEC
Kdybys chteˇl takovy´ prˇ´ıkaz nadefinovat rovnou, jo´ pane, to by byl proble´m. Zrovna tak je lehke´ si vytvorˇit prˇ´ıkazy ktery´mi bych dosˇel k ostatnı´m zdem. A ted’uzˇ nemu˚zˇeme zabloudit ! Jak to ? No prˇece uzˇ spolu vzˇdy trefı´me domu˚. Protozˇe kdyzˇ pu˚jdeme trˇeba k jizˇnı´ zdi a azˇ k nı´ dojdeme, da´me se k za´padnı´ zdi, tak jsme doma. A tento prˇ´ıkaz musı´ fungovat, at’budeme kdekoliv ve meˇsteˇ. Ovsˇem pokud mi nepostavı´sˇ schva´lneˇ neˇjakou zed’do cesty. Vzpomı´na´sˇ, jak jsme spolu staveˇli du˚m ? Tam jsme to potrˇebovali. A slı´bili jsme si pozdeˇji lepsˇ´ı rˇesˇenı´. Tak tady je. DOMU K-JIZNI-ZDI K-ZAPADNI-ZDI CELEM-VZAD
DOMU ZNAMENA K-JIZNI-ZDI K-ZAPADNI-ZDI CELEM-VZAD KONEC
A jsem doma. Ale jak se dı´va´m, ty jesˇteˇ ne. Ted’ ti zrovna vrta´ hlavou, jaky´ je rozdı´l mezi rekurzı´ a KDYZ. Co to vlastneˇ to nasˇe seskocˇenı´ z kolotocˇe je ? To si uka´zˇeme na na´sledujı´cı´m kopenogramu. Nadefinujeme si neˇco, co nebudu nikdy prova´deˇt. Nadefinujeme si jakoukoliv cˇinnost. Kdyzˇ ji budeme prova´deˇt jen pomocı´ rekurze, tak na´m cˇinnost skoncˇ´ı bud’ v kvazinekonecˇnu, nebo na chybeˇ. Vzpomenˇ si na prˇ´ıkaz DO-ZDI. Tam jsi nejpozdeˇji v desa´tem (nebo patna´cte´m – podle rozmeˇru meˇsta) se mnou trˇ´ıskl do zdi, azˇ se mi v nosnı´ elektronce zajiskrˇilo. Oproti tomu kdyzˇ testuji vstupnı´ podmı´nku, tak nevı´m, jak dlouho budu cˇinnost prova´deˇt. To je rozdı´l proti cyklu se zna´my´m pocˇtem opakova´nı´ (OPAKUJ). Testuji podmı´nku do te´ doby, nezˇ zjistı´m, zˇe je splneˇna. Pak musı´m jı´t nazpeˇt. A hele, jak se mi ted’ hodı´, zˇe jsem si do noty´sku psal na´vratove´ adresy. Ted’ si je tedy hezky posbı´ra´m, prˇitom si noty´sek vygumuju a mu˚zˇu pokracˇovat dalsˇ´ım prˇ´ıkazem. V kopenogramu je to hezky zna´zorneˇne´.
9. Seskakujeme z kolotocˇe
33
ˇINNOST C Uzˇ jsi hotov?
↓
Udeˇlej kousek Poveˇrˇ se dokoncˇenı´m cˇinnosti Tento kopenogram si mu˚zˇesˇ vedle rozkreslit podobneˇ, jako jsme si spolu rozkreslili rekurzi. Jesˇteˇ le´pe tak pochopı´sˇ, jak vlastneˇ pracuji.
34
Programovacı´ jazyk KAREL
10. Sta´va´me se sbeˇrateli Tak uzˇ jsme se spolu prosˇli i po sveˇteˇ, respektive po meˇsteˇ. Ale sa´m vı´sˇ ze svy´ch vy´letu˚, zˇe jenom koukat se na´m moc nechce. Ra´d si vzˇdycky neˇco dovezesˇ na pama´tku z vy´letu. Neˇkdo vozı´ pohledy, jiny´ fotografie a neˇkdo ra´d zase neˇco jine´ho. Se mnou je to trochu slozˇiteˇjsˇ´ı. A nebo vlastneˇ jednodusˇsˇ´ı. Ja´ mohu sbı´rat do sve´ho kouzelne´ho bat’u˚zˇku jenom znacˇky. Dnes se spolu naucˇ´ıme posbı´rat znacˇky, at’ jsou kdekoliv. Jedna´ se o u´kol na prvnı´ pohled mozˇna´ jednoduchy´, ale uvidı´sˇ, zˇe prˇina´sˇ´ı ru˚zne´ proble´my. Nejsem prˇeci tak dokonaly´ jako ty. Kdyzˇ tobeˇ maminka rˇekne, abys uklidil, tak se kolem sebe jenom rozhle´dnesˇ a uzˇ vidı´sˇ, kde je neporˇa´dek. Ja´ to ma´m ale trochu slozˇiteˇjsˇ´ı. Znacˇku vidı´m jen kdyzˇ na nı´ stojı´m. Proto musı´m u´sek, ktery´ ma´m uklidit, projı´t vzˇdy cely´. A prˇitom si pochopitelneˇ da´vat pozor, abych nenarazil do zdi. Proto mu˚j prˇikaz obsahuje i povel abych – kdyzˇ dojdu ke zdi – provedl bud’ VLEVO-VBOK, nebo abych prova´deˇnı´ ukoncˇil. Takovy´ prˇ´ıkaz je uzˇ prˇece jenom delsˇ´ı. Musı´me si porˇa´d pamatovat neˇkolik veˇcı´: 1. Kdyzˇ prˇijdu na znacˇku → zvednu ji a uklidı´m do bat’u˚zˇku. POZOR – znacˇka nemusı´ by´t jen jedna ! 2. Kdyzˇ prˇijdu ke zdi → uhnu → dokoncˇ´ım cˇinnost. 3. Kdyzˇ si pod sebou uklidı´m → pokracˇuji v pohybu. Vidı´sˇ sa´m, zˇe to tak moc jednoduche´ nenı´. Ale my to spolu zvla´dneme. Ke zdi uzˇ spolu dojı´t umı´me. Sebrat vsˇechny znacˇky pod sebou – to take´ nenı´ takova´ pra´ce. Nadefinujeme si pro to prˇ´ıkaz VYBER. VYBER ZNACKA ZVEDNI VYBER
↓
VYBER ZNAMENA KDYZ JE ZNACKA ZVEDNI VYBER KONEC JINAK KONEC KONEC
Za pomoci VYBER uzˇ to zˇa´dny´ proble´m nebude. Pro nasˇi definici bychom sice novy´ prˇ´ıkaz VYBER mohli pouzˇ´ıt, ale vytvorˇ´ıme si prˇ´ıkazy jine´. Trˇeba SEBER-NEKDE-ZNACKU.
10. Sta´va´me se sbeˇrateli
35
SEBER-NEKDE-ZNACKU ZNACKA ZVEDNI
↓
ZED VLEVO-VBOK
↓
KROK
SEBER-NEKDE-ZNACKU
SEBER-NEKDE-ZNACKU ZNAMENA KDYZ JE ZNACKA ZVEDNI KONEC JINAK KDYZ JE ZED VLEVO-VBOK KONEC JINAK KROK KONEC SEBER-NEKDE-ZNACKU KONEC KONEC
Vidı´sˇ sa´m, zˇe vytvorˇeny´ prˇ´ıkaz je dlouhy´ jako had. A ted’ uzˇ na´m znovu vynika´ i jednoduchost a prˇehlednost kopenogramu proti karlovske´mu za´pisu. Jenzˇe kdyzˇ si prˇ´ıkaz spustı´sˇ, tak prˇijdesˇ i na malou vadu na kra´se. Zastavı´m se totizˇ na mı´steˇ, kde zvednu znacˇku. Schva´lneˇ si to zkus. Po nadefinova´nı´ prˇ´ıkazu zadej pocˇ´ıtacˇi prˇ´ıkaz MESTO. A do meˇsta naskla´dej na libovolna´ mı´sta ru˚zne´ pocˇty znacˇek. Asi teˇ nemusı´m upozornˇovat, zˇe tentokra´t budu chodit jenom pode´l zdı´. Pak teprve spust’ prˇ´ıkaz SEBER-NEKDE-ZNACKU. Vy´sledek bude ten, zˇe budu chodit okolo zdı´ tak dlouho, dokud nenarazı´m na znacˇku. Kdyzˇ narazı´m na znacˇku, tak ji seberu a skoncˇ´ım. To je zpu˚sobeno umı´steˇnı´m rekurze. Kdyzˇ totizˇ vykona´m prˇ´ıkaz ZVEDNI, pokracˇuji na´sledujı´cı´ u´rovnı´ vykona´va´nı´. No a tam uzˇ nic nenı´ – jenom prˇ´ıkazy KONEC. Takzˇe rekurzi minu a skoncˇ´ım. Proto si spolu sestrojı´me obdobny´ prˇ´ıkaz SEBER-NEKDE-ZNACKY. Ten na´s necha´ sesbı´rat vsˇechny znacˇky po obvodu meˇsta. SEBER-NEKDE-ZNACKY ZNACKA ZVEDNI
↓
ZED VLEVO-VBOK
SEBER-NEKDE-ZNACKY
↓
KROK
SEBER-NEKDE-ZNACKY ZNAMENA KDYZ JE ZNACKA ZVEDNI KONEC JINAK KDYZ JE ZED VLEVO-VBOK KONEC JINAK KROK KONEC KONEC SEBER-NEKDE-ZNACKY KONEC
Rozdı´l proti minule´mu prˇ´ıkazu SEBER-NEKDE-ZNACKU nenı´ skoro zˇa´dny´, a prˇece se chova´m zcela jinak. Je to zpu˚sobeno jiny´m umı´steˇnı´m rekurze – je azˇ na konci prˇ´ıkazu a budu tedy pracovat porˇa´d – at’ seberu znacˇku nebo ne. Protozˇe je druha´ podmı´nka KDYZ JE ZED v jedne´ veˇtvi podmı´nky KDYZ JE ZNACKA, rˇ´ıka´me taky, zˇe jde o podmı´nky vnorˇene´. 36
Programovacı´ jazyk KAREL
A ted’ ti uka´zˇu jak lze takovy´ prˇ´ıkaz zjednodusˇit. Naprˇed pouzˇijeme jizˇ vytvorˇeny´ prˇ´ıkaz VYBER: SEBER-NEKDE-ZNACKY2 VYBER ZED VLEVO-VBOK
↓
KROK
SEBER-NEKDE-ZNACKY2
SEBER-NEKDE-ZNACKY2 ZNAMENA VYBER KDYZ JE ZED VLEVO-VBOK KONEC JINAK KROK KONEC SEBER-NEKDE-ZNACKY2 KONEC
Ale i tento prˇ´ıkaz je jesˇteˇ prˇ´ılisˇ dlouhy´. Dalsˇ´ı zjednodusˇenı´ si mu˚zˇesˇ prove´st sa´m. Podı´vej se pozorneˇ na prˇ´ıkaz SEBER-NEKDE-ZNACKY2. Vidı´sˇ, zˇe nejvı´ce mı´sta zabı´ra´ prˇ´ıkaz otocˇenı´ u zdi. Tak si to mu˚zˇeme zjednodusˇit tı´m, zˇe mi nadefinujesˇ pomocny´ prˇ´ıkaz OTOC-U-ZDI. To uzˇ jisteˇ svedesˇ sa´m. Ale to sta´le sbı´ra´me znacˇky jen pode´l zdı´. A ty chcesˇ prˇece vysbı´rat znacˇky po cele´m meˇsteˇ ! Ale o tom azˇ prˇ´ısˇteˇ.
10. Sta´va´me se sbeˇrateli
37
11. Kolo kolo mly´nske´ Posledneˇ jsme se ucˇili uklı´zet. A prˇitom jsme pouzˇ´ıvali i prˇ´ıkaz, abych chodil okolo zdı´. Kdyzˇ ted’ budesˇ chtı´t, abych chodil kolem zdı´, bude nejjednodusˇsˇ´ı, kdyzˇ mi da´sˇ v cˇiste´m meˇsteˇ prˇ´ıkaz SEBER-NEKDE-ZNACKU. Ale to prˇeci nenı´ programa´torske´ ! Za prve´ by tam neˇjaka´ znacˇka mohla by´t a ja´ bych se zastavil, takzˇe bys musel pouzˇ´ıt SEBER-NEKDE-ZNACKY. Ale co kdyzˇ ty znacˇky nebudeme chtı´t sbı´rat ? Proto si spolu vytvorˇ´ıme prˇ´ıkaz OKOLO. Je to na´ramneˇ jednoduche´. OKOLO KE-ZDI VLEVO-VBOK OKOLO
OKOLO ZNAMENA KE-ZDI VLEVO-VBOK OKOLO KONEC
Ale my se prˇece chceme dostat i jinam ! Nebudeme se porˇa´d drzˇet zdi jako neˇjaka´ nemluvnˇata. Jednou jsme velcı´ a tak se odva´zˇneˇ pustı´me i do nezna´my´ch kraju˚. Jde na´m o to, jak projı´t cele´ meˇsto. Pro jednoduchost vzˇdy prˇedpokla´da´me, zˇe vycha´zı´me z domu. Tam uzˇ se umı´m dostat pomocı´ prˇ´ıkazu DOMU. Doka´zˇeme jı´t i ke zdi. Ted’ na´m uzˇ jenom zby´va´, abychom prosˇli vsˇechna polı´cˇka. Je trˇeba, abychom se dostali vzˇdy o jednu rˇadu polı´cˇek vy´sˇ, kdyzˇ se na´m podarˇ´ı dojı´t ke zdi. Proto si nadefinujeme jesˇteˇ dva pomocne´ prˇ´ıkazy: OTOC-VLEVO a OTOC-VPRAVO: OTOC-VLEVO VLEVO-VBOK KROK VLEVO-VBOK
OTOC-VLEVO ZNAMENA VLEVO-VBOK KROK VLEVO-VBOK KONEC
Prˇ´ıkaz pro ota´cˇku vpravo ti uzˇ tady psa´t nebudu. To by byla ostuda ! Jestli prˇesto nevı´sˇ, jak na to, tak ti pomu˚zˇe slovnı´k na konci. Du˚lezˇite´ je osˇetrˇit prˇ´ıkaz proti nara´zˇenı´ do zdi. Kdyzˇ bych totizˇ sta´l jizˇ na poslednı´ rˇadeˇ a otocˇil se, udeˇla´m krok rovnou do zdi. Proto si prˇ´ıkaz OTOC-VLEVO (a ty sa´m i OTOC-VPRAVO) nadefinujeme jinak – s podmı´nku. ?OTOC-VLEVO VLEVO-VBOK ZED ↓ DOMU KROK VLEVO-VBOK
38
?OTOC-VLEVO ZNAMENA VLEVO-VBOK KDYZ JE ZED DOMU KONEC JINAK KROK VLEVO-VBOK KONEC KONEC Programovacı´ jazyk KAREL
A ted’ uzˇ pro na´s nenı´ zˇa´dny´ proble´m projı´t cele´ meˇsto. A po procha´zce se vzˇdy vra´tı´me hezky domu˚. PROJDI KE-ZDI ?OTOC-VLEVO KE-ZDI ?OTOC-VPRAVO PROJDI
PROJDI ZNAMENA KE-ZDI ?OTOC-VLEVO KE-ZDI ?OTOC-VPRAVO PROJDI KONEC
Tak, ted’ uzˇ umı´me projı´t cele´ meˇsto – pochopitelneˇ za prˇedpokladu, zˇe vycha´zı´me z domu. Nadefinovat prˇ´ıkaz pomocı´ vstupnı´ podmı´nky a cyklu uzˇ umı´sˇ. Ja´ ale rozumı´m i dalsˇ´ım prˇ´ıkazu˚m, ktere´ jsme si uzˇ drˇ´ıve slı´bili vysveˇtlit. Prˇi tve´ definici mu˚zˇesˇ pouzˇ´ıt trˇeba i primitivum DOKUD. Cˇ´ım se lisˇ´ı od KDYZ ? Nezˇ si to uka´zˇeme na prˇ´ıkladu, zopakujeme si pravidla pro pouzˇ´ıva´nı´ KDYZ. Pokud pouzˇijeme KDYZ, pak vzˇdy na´sledujı´ dveˇ cesty, z nichzˇ se provede pouze jedna: bud’ ta pro splneˇnou podmı´nku, nebo ta pro nesplneˇnou podmı´nku. Na konci se obeˇ cesty spojı´ a pokracˇuje se dalsˇ´ım prˇ´ıkazem. Pokud ale pouzˇijesˇ DOKUD, pak je-li podmı´nka splneˇna, vykonajı´ se prˇ´ıkazy na´sledujı´cı´ za prˇ´ıkazem DOKUD azˇ po prˇ´ıslusˇny´ KONEC. Ten ale vra´tı´ vykona´va´nı´ zpeˇt na u´vodnı´ podmı´nku DOKUD. A to seprova´dı´ azˇ do te´ doby, dokud je podmı´nka splneˇna. V prˇ´ıkazu KDYZ musı´me projı´t jednou z jeho veˇtvı´. U DOKUD prˇi nesplneˇnı´ podmı´nky vnitrˇkem cyklu neprojdeme vu˚bec a budeme pokracˇovat za prˇ´ıslusˇny´m prˇ´ıkazem KONEC. Vstupnı´ podmı´nka mu˚zˇe by´t i typu NENI podmı ´nka. Teˇlo cyklu se pak prova´dı´ tehdy, pokud NENI podmı ´nka. Cyklus se prˇeskakuje, pokud NENI NENI podmı ´nka, takzˇe vlastneˇ pokud JE podmı ´nka. Protozˇe to vypada´ slozˇiteˇ, uka´zˇeme si to na na´sledujı´cı´m prˇ´ıkladu. Pu˚jdeme zde opeˇt ke zdi. To uzˇ umı´me s pomocı´ KDYZ a rekurze. Nynı´ si to uka´zˇeme s pomocı´ DOKUD. Schva´lneˇ, co bude lepsˇ´ı ? KE-ZDI2 - ZED KROK ↑
KE-ZDI2 ZNAMENA DOKUD NENI ZED KROK KONEC KONEC
Ja´ prˇi vykona´va´nı´ tohoto prˇ´ıkazu postupuji na´sledovneˇ: Testuji je-li splneˇno, zˇe prˇede mnou NENI ZED (v kopenogramu se zapisuje symbolicky „- ZED“). Pokud je to pravda (takzˇe prˇede mnou nenı´ zed’), vykona´m vnitrˇek cyklu (KROK) a vra´tı´m se opeˇt na test vstupnı´ podmı´nky. Pokud prˇede mnou zed’ je (a podmı´nka „NENI ZED“ nenı´ splneˇna), teˇlo cyklu nevykona´va´m 11. Kolo kolo mly´nske´
39
a v tomto prˇ´ıpadeˇ skoncˇ´ım. Sˇipka v kopenogramu naznacˇuje, zˇe se ma´ skocˇit nahoru prˇed zacˇa´tek vstupnı´ podmı´nky (stejneˇ jako u OPAKUJ). A jesˇteˇ jedna informace pro tebe: Tento cyklus, ktere´mu programa´torˇi odborneˇ rˇ´ıkajı´ cyklus se vstupnı´ podmı´nkou a s degenerovanou vy´stupnı´ podmı´nkou, si vybarvuj zeleneˇ – tedy pouze jeho rˇ´ıdı´cı´ cˇa´st: rˇa´dek „- ZED“ a rˇa´dek „ ↑ “. A aby sis tento cyklus procvicˇil, nadefinujeme si prˇ´ıkaz, ktery´ zabezpecˇ´ı, zˇe se budu vzˇdy nata´cˇet do toho smeˇru, kde prˇede mnou nenı´ zed’. To znamena´, zˇe po provedenı´ tohoto prˇ´ıkazu budu schopny´ udeˇlat KROK anizˇ bych prˇi neˇm narazil. Pokud meˇ ovsˇem schva´lneˇ nezavrˇesˇ do dvorku o jednom polı´cˇku ! To potom takovy´ vy´chod nenajdu a budu se tocˇit donekonecˇna. To ale nenı´ dvorek, to je veˇzenı´ ! Prˇ´ıkaz si nazveme trˇeba NENI-ZED: NENI-ZED ZED VLEVO-VBOK ↑
NENI-ZED ZNAMENA DOKUD JE ZED VLEVO-VBOK KONEC KONEC
Tady vidı´sˇ, zˇe prˇi prˇ´ıkazu DOKUD mu˚zˇesˇ vyzˇadovat jak splneˇnı´ podmı´nky (JE ZED), tak jejı´ nesplneˇnı´ (NENI ZED). Sa´m si ted’ zkus vsˇechny prˇ´ıkazy, kde jsme pouzˇili KDYZ a rekurzi, napsat pomocı´ DOKUD.
40
Programovacı´ jazyk KAREL
12. Opeˇt na cesta´ch Tak to vidı´sˇ ! Ve meˇsteˇ uzˇ jsme jako doma. Doposud jsme se ale pohybovali tak, zˇe jsme vzˇdy vybı´ral vsˇechny mozˇnosti, ktere´ mohli nastat. To je sice jedna z mozˇnostı´ rˇesˇenı´, tady na´m spolu funguje, ale dobre´ to nenı´. My jsme zatı´m znacˇky vyhleda´vali tak, zˇe jsme procha´zeli meˇsto polı´cˇko za polı´cˇkem. Sa´m vidı´sˇ, jak to dlouho trva´. Je to vı´ce me´neˇ jen takove´ chaoticke´ chozenı´ sem a tam. Tak se prˇece neda´ pracovat. Nasˇe programy doposud pracujı´ jen za prˇedpokladu, zˇe ve meˇsteˇ nic nenı´. Ale sa´m vı´sˇ, zˇe ve meˇsteˇ jsou domy a spousta jiny´ch prˇeka´zˇek. Tam bychom tak chodit nemohli ! Ale ja´ ti prozradı´m, jak vyzrajeme na vsˇechny prˇ´ıpadne´ prˇeka´zˇky. Zkusı´me vyjı´t z bludisˇteˇ. To si nakresli na obrazovku pomocı´ prˇ´ıkazu MESTO. A ted’ beˇzˇ ! Zkus to naprˇed podle uvedene´ho vzoru.
Jak vidı´sˇ, bludisˇteˇ ma´ jenom jeden vy´chod. A kdyzˇ si vezmesˇ tuzˇku a pu˚jdesˇ podle libovolne´ zdi, tak zjistı´sˇ, zˇe vzˇdy dojdesˇ k vy´chodu. Na tomhle principu je zalozˇen i na´sledujı´cı´ prˇ´ıkaz, ktery´ na´s z bludisˇteˇ vyvede.
12. Opeˇt na cesta´ch
41
PRYC ZED VLEVO-VBOK PRYC
↓
KROK VPRAVO-VBOK
PRYC ZNAMENA KDYZ JE ZED VLEVO-VBOK KONEC JINAK KROK VPRAVO-VBOK KONEC PRYC KONEC
Schva´lneˇ si jeho pravdivost oveˇrˇ na jine´m bludisˇti. Co vlastneˇ deˇla´me celou cestu ? Jdeme pode´l prave´ zdi. Prˇed kazˇdy´m krokem se zepta´me, je-li prˇed na´mi zed’. Pokud ano, tak se pouze otocˇ´ıme. Pokud tam zed’ nenı´, udeˇla´me KROK a VPRAVO-VBOK, abychom se drzˇeli zdi. Prˇed tı´mto prˇ´ıkazem musı´m by´t pravy´m bokem u zdi. A nebo udeˇlat prˇ´ıkaz dvouu´rovnˇovy´ – nejprve udeˇlat KE-ZDI a VLEVO-VBOK, cˇ´ımzˇ se dostanu pravy´m bokem ke zdi, a pak vlastnı´ PRYC. Po spusˇteˇnı´ ti doka´zˇi, zˇe sice najdu vy´chod z bludisˇteˇ, ale nezastavı´m se ani venku. Chodı´m porˇa´d dokola. Je to tı´m, zˇe v prˇ´ıkazu je pouzˇita rekurze. A zdi, ktere´ ohranicˇujı´ meˇsto, jsou pro meˇ jen pokracˇova´nı´m bludisˇteˇ. Kdyby zdi bludisˇteˇ sahaly azˇ ke zdi meˇsta, tak by se mi podarˇilo do bludisˇteˇ opeˇt vejı´t. Vyjdu sice ven, ale sta´le budu chodit sem a tam. Nejjednodusˇsˇ´ı ukoncˇenı´ prˇ´ıkazu bude, kdyzˇ mi u vy´chodu prˇipravı´sˇ znacˇku a prˇ´ıkaz nadefinujesˇ tak, zˇe se na znacˇce zastavı´m. Urcˇiteˇ jsi taky zpozoroval, zˇe chodı´m sem a tam. Jak taky ne, kdyzˇ si nepamatuji, kde uzˇ jsem vsˇude byl ! Abych si to doka´zal zapamatovat, k tomu mi opeˇt slouzˇ´ı znacˇky. Ja´ si je budu na cestu pokla´dat a pak vı´m, kudy jsem uzˇ prosˇel. Tento zpu˚sob ma´ ale jeden ha´cˇek. Prˇedstav si, zˇe se dostanu na dvorek, ktery´ ma´ vchod sˇiroky´ jenom jedno polı´cˇko. To znamena´, zˇe budeme muset znacˇky pocˇ´ıtat, protozˇe jinak bych se nemusel dostat ven. Ale jesˇteˇ nezˇ si to spolu zkusı´me, podı´vej se, jak se chova´m v jine´m bludisˇti. Jeho obra´zek jsem ti nakreslil na dalsˇ´ı stra´nce. Bludisˇteˇ je tady spojeno s venkovnı´ zdı´. Kdyzˇ se na obra´zek pozorneˇ podı´va´sˇ, tak je to vlastneˇ jedno bludisˇteˇ, ktere´ nema´ zˇa´dny´ vy´chod. Je tedy logicke´, zˇe v takove´m bludisˇti budu porˇa´d chodit a za´rovenˇ hledat vy´chod. Kdyzˇ neuspeˇji ani u venkovnı´ zdi, pustı´m se zpa´tky dovnitrˇ bludisˇteˇ a budu hledat i tam. Co kdyzˇ jsem poprve´ v bludisˇti ten spra´vny´ vy´chod prˇehle´dl ! A tak bych tady mohl chodit donekonecˇna. Sa´m uvidı´sˇ, zˇe po cˇase zacˇnu vykona´vat sta´le stejny´ cyklus. Mu˚zˇe by´t peˇkneˇ douhy´. Schva´lneˇ meˇ nech beˇhat se stisknuty´m tlacˇ´ıtkem Shift. Jak tomu bloudeˇnı´ zabra´nit ? Neˇco jsme si uzˇ naznacˇili. Polozˇ mi neˇkam znacˇku a dej mi prˇ´ıkaz, abych se na znacˇce zastavil. Prˇ´ıkaz si nazveme trˇeba Z-BLUDISTE.
42
Programovacı´ jazyk KAREL
Z-BLUDISTE VPRAVO-VBOK ZED VLEVO-VBOK ↑
KROK ZNACKA
↓
Z-BLUDISTE
Z-BLUDISTE ZNAMENA VPRAVO-VBOK DOKUD JE ZED VLEVO-VBOK KONEC KROK KDYZ JE ZNACKA KONEC JINAK Z-BLUDISTE KONEC KONEC
At’uzˇ mi nakreslı´sˇ sebeslozˇiteˇjsˇ´ı bludisˇteˇ, vy´chod v neˇm vzˇdy najdu. Nejdu sice nejkratsˇ´ı cestou, ale zato spolehliveˇ. Zrovna tak je jasne´, zˇe doka´zˇu najı´t znacˇku kdekoliv v bludisˇti. Ale ! To jen za podmı´nky, zˇe je znacˇka umı´steˇna u zdi. Vzˇdyt’vı´sˇ, zˇe jsem kra´tkozraky´. Proto chodı´m bludisˇteˇm jen podle zdı´. A protozˇe znacˇku vidı´m jen kdyzˇ si na ni stoupnu, tak nebude-li vedle zdi, neuvidı´m ji a budu chodit sta´le dokola.
12. Opeˇt na cesta´ch
43
13. A co takhle trochu matematiky? Nelekej se ! Nechci teˇ prˇipravit o hodiny matematiky, ktere´ patrˇ´ı mezi tvoje nejoblı´beneˇjsˇ´ı ve sˇkole. To nenı´ my´m cı´lem. Naucˇ´ıme se jen o neˇco vı´c, abychom mohli pozdeˇji pocˇ´ıtacˇ vyuzˇ´ıvat naplno. I kdyzˇ ty uzˇ vlastneˇ trochu pocˇ´ıtat umı´sˇ. Dovedesˇ polozˇit stanoveny´ pocˇet znacˇek, udeˇlat prˇ´ıslusˇny´ pocˇet kroku˚. To vsˇe pomocı´ OPAKUJ. Ale co kdyzˇ nema´sˇ nic prˇesneˇ urcˇeno ? I v takove´hle situaci si uzˇ umı´sˇ poradit. Vzˇdyt’doka´zˇesˇ jı´t trˇeba ke zdi a prˇitom nevı´sˇ, jak je zed’ daleko. Ale co takhle dojı´t trˇeba jenom na polovinu vzda´lenosti ke zdi ? Jestli budesˇ veˇdeˇt, zˇe je zed’ vzda´lena cˇtyrˇi kroky, tak to umı´sˇ. Udeˇla´sˇ jenom dva. Ale to jsi spocˇ´ıtal za meˇ ty a jen pro tento jeden vy´jimecˇny´ prˇ´ıpad ! Ja´ to chci umeˇt sa´m a vzˇdy. Tedy i tehdy, kdyzˇ nevı´m, jak jsem daleko od zdi. To je orˇ´ısˇek, co ? Jak je ta zed’ daleko ? Vı´me, zˇe je od na´s vzda´lena dveˇ poloviny vzda´lenosti. Prˇipada´ ti tahle jednoduchost jako nesmysl ? Zˇe na´m to nic nepomu˚zˇe ? Ale naopak. Trochu odskocˇ´ıme. Zalistuj si ted’ zpa´tky a podı´vej se, jak jsme definovali prˇ´ıkaz CTYR-KROK3 na stra´nce 12. Tehdy jsme si rˇekli, zˇe takova´hle definice je z programa´torske´ho hlediska nespra´vna´. Ano, ale jenom proto, zˇe jsem meˇl udeˇlat cˇtyrˇi kroky doprˇedu . . . a tady chodı´m zbytecˇneˇ sem tam. Jsou vsˇak prˇ´ıpady, kdy se na´m i zda´nliva´ zbytecˇnost mu˚zˇe hodit. Jak vypada´ trˇeba krok z tohoto pohledu ? Mu˚zˇesˇ jej nadefinovat jako dva kroky doprˇedu a jeden zpa´tky. Zajı´mave´, vid’? Ale tı´mto krokem ujdu polovinu vzda´lenosti, jako dveˇma kroky. Takzˇe do polovicˇky vzda´lenosti dojdu tehdy, kdyzˇ na kazˇde´ dva kroky doprˇedu udeˇla´m jeden krok zpa´tky. Pochopitelneˇ musı´m naprˇed deˇlat dvojkroky doprˇedu a pak tolik kroku˚ zpa´tky, jako jsem udeˇlal dvojkroku˚ doprˇedu. Ted’ uzˇ na´m zby´va´ jenom urcˇit pocˇet dvojkroku˚ doprˇedu, abych mohl udeˇlat stejny´ pocˇet kroku˚ vzad. To je kazˇde´mu pochopitelne´. Ale sta´le jesˇteˇ nevı´sˇ, jaky´m zpu˚sobem spocˇ´ıta´me dvojkroky. Prˇemy´sˇlı´sˇ, hlavu nama´ha´sˇ a stejneˇ nakonec nic zjistı´sˇ, zˇe zˇa´dna´ z prˇ´ımy´ch cest, ani s pouzˇitı´m podmı´nky nebo cyklu, k cı´li nevede. Ale to nic. Vzpomenˇ si na moji prˇ´ıtelkyni rekurzi. Ta na´m pomu˚zˇe. A ani nepotrˇebujesˇ zna´t ´ plneˇ stacˇ´ı, kdyzˇ vı´m, zˇe udeˇla´m tolik kroku˚ jako dvojkroku˚. A jestli to jsou pocˇet dvojkroku˚. U trˇi nebo sedm, to meˇ vu˚bec nemusı´ zajı´mat. Jesˇteˇ ti to nenı´ u´plneˇ jasne´ ? Tak si to spolu zopakujeme podrobneˇji. Ted’ totizˇ zacˇ´ına´m prˇ´ımo napı´navou kapitolu a tak napni svoji pozornost, aby ti nic, ale vu˚bec nic neuniklo ! Na zacˇa´tku kapitoly jsi mi prˇiky´vnul, zˇe se mnou umı´sˇ dojı´t opatrneˇ KE-ZDI, anizˇ bych naboural. Ale co kdyzˇ ma´m za u´kol dojı´t ke zdi a polozˇit u nı´ znacˇku ? Zahrajeme si tedy na voja´ky. Ja´ – KAREL – ma´m za u´kol polozˇit u zdi neprˇ´ıtelova opevneˇnı´ minu – znacˇku. Jak se s tı´m vyporˇa´da´m ? No to je prˇece jednoduche´. Dojdu ke zdi a polozˇ´ım znacˇku. POLOZ-MINU-U-ZDI KE-ZDI POLOZ
POLOZ-MINU-U-ZDI ZNAMENA KE-ZDI POLOZ KONEC
„Poslusˇneˇ hla´sı´m, zˇe zadany´ u´kol jsem podle rozkazu splnil !“ Ale co ted’ se mnou ? Vzˇdyt’ zˇa´dna´ arma´da si nemu˚zˇe dovolit ztra´cet tak dobre´ voja´ky, jako jsem ja´. Dej mi rychle prˇ´ıkaz, 44
Programovacı´ jazyk KAREL
abych se vra´til zpeˇt. Jak ? Mozˇnostı´ je neˇkolik. Jako dobry´ voja´k ma´m veˇdeˇt, zˇe se budu muset vra´tit zpa´tky. Proto, abych nezabloudil, si mohu cestu znacˇkovat. A po svy´ch znacˇka´ch se mohu vra´tit zpeˇt. Prˇi zpa´tecˇnı´ cesteˇ je pochopitelneˇ posbı´ra´m, aby neprˇ´ıtel neobjevil, zˇe jsem k neˇmu pronikl. A jak jsem to udeˇlal ? To uzˇ urcˇiteˇ vı´sˇ sa´m. Vsˇimnul sis, zˇe jsme tu zrovna nakousli dekompozici ? Trochu z jine´ho konce, ale zase jsme museli rozebrat celek – v tom jsem ti trochu pomohl – a opeˇt jej slozˇit dohromady. Ale abych porˇa´d neodbı´hal. Tady je prˇ´ıkaz, abych polozˇil minu a opeˇt se vra´til na sve´ pu˚vodnı´ stanovisˇteˇ. Naprˇed si nadefinuji prˇ´ıkaz ZNACKUJ-CESTU-KE-ZDI: ZNACKUJ-CESTU-KE-ZDI ↓
ZED
KROK POLOZ ZNACKUJ-CESTU -KE-ZDI
ZNACKUJ-CESTU-KE-ZDI ZNAMENA KDYZ JE ZED KONEC JINAK KROK POLOZ ZNACKUJ-CESTU-KE-ZDI KONEC KONEC
No a u zdi pak jenom polozˇ´ım znacˇku, udeˇla´m cˇelem vzad a pu˚jdu po znacˇka´ch zpa´tky. Prˇi zpa´tecˇnı´ cesteˇ si znacˇky sesbı´ra´m. Ale pozor ! Minu sebrat nesmı´m ! Proto jesˇteˇ jeden prˇ´ıkaz – PO-ZNACKACH-ZPET: PO-ZNACKACH-ZPET ZNACKA ZVEDNI KROK ↑
PO-ZNACKACH-ZPET ZNAMENA DOKUD JE ZNACKA ZVEDNI KROK KONEC KONEC
A ted’ je prˇ´ıkaz POLOZ-MINU-KE-ZDI-2 u´plneˇ jasny´. POLOZ-MINU-KE-ZDI-2 ZNACKUJ-CESTU-KE-ZDI POLOZ CELEM-VZAD PO-ZNACKACH-ZPET
POLOZ-MINU-KE-ZDI-2 ZNAMENA ZNACKUJ-CESTU-KE-ZDI POLOZ CELEM-VZAD PO-ZNACKACH-ZPET KONEC
Mozˇna´ teˇ napadlo, procˇ je rˇesˇenı´ tak slozˇite´ ? Ty uzˇ prˇece doka´zˇesˇ takto zadany´ prˇ´ıkaz zjednodusˇit. Stacˇ´ı pouze zadat, abych na mı´steˇ, kde stojı´m, polozˇil znacˇku, dosˇel ke zdi polozˇit minu, otocˇil se a sˇel zpeˇt, dokud nedojdu na znacˇku. To je pravda, nasˇemu zada´nı´ by i takove´ jednodusˇsˇ´ı rˇesˇenı´ plneˇ vyhoveˇlo. Ale co kdybych se musel po cesteˇ vyhy´bat prˇeka´zˇka´m ? Pak takovy´ prˇ´ıkaz stacˇ´ı jenom trochu doplnit a ma´me hned
13. A co takhle trochu matematiky?
45
obecneˇjsˇ´ı rˇesˇenı´. A tı´m i lepsˇ´ı. Takto jsme to spolu ale schva´lneˇ rozebrali, aby dalsˇ´ı vy´klad byl srozumitelneˇjsˇ´ı. Ale jesˇteˇ nezˇ zacˇneme doopravdy pocˇ´ıtat, rozkreslı´me si do kopenogramu prˇedcha´zejı´cı´ rˇesˇenı´. Jak bys napsal prˇ´ıkaz s pouzˇitı´m jednodusˇsˇ´ıch prˇ´ıkazu˚ ? Asi takto: POLOZ-MINU-KE-ZDI-3 ZED POLOZ CELEM-VZAD
↓
KROK POLOZ-MINU -KE-ZDI-3 KROK
POLOZ-MINU-KE-ZDI-3 ZNAMENA KDYZ JE ZED POLOZ CELEM-VZAD KONEC JINAK KROK POLOZ-MINU-KE-ZDI-3 KROK KONEC KONEC
To jsou zajı´mave´ veˇci,co ? Neboj ! Prˇ´ısˇteˇ na´s cˇekajı´ jesˇteˇ zajı´maveˇjsˇ´ı. Vyda´me se spolu do da´vny´ch veˇku˚ pyramid.
46
Programovacı´ jazyk KAREL
14. Stavı´me pyramidu Ale neboj se. Nepostavı´me ji z kamenny´ch kva´dru˚, ale jenom tak na papı´ru. Ty nevı´sˇ, co to je pyramida ? Jak vypada´ ? Ja´ ted’ tady nemyslı´m ty honosne´ hrobky staroegyptsky´ch farao´nu˚, ale takovou docela malinkatou pyramidu. A aby se na´m sem vesˇla, tak si ji namalujeme jako troju´helnı´k. Vypada´ trˇeba takto: 1 / \ 1 1 / \ / \ 1 2 1 / \ / \ / \ 1 3 3 1 / \ / \ / \ / \ 1 4 6 4 1 V tomto troju´helnı´ku – pyramideˇ – je hodnota kazˇde´ho cˇ´ısla da´na soucˇtem jeho prave´ho a leve´ho hornı´ho souseda. Neˇkdy se mu take´ rˇ´ıka´ Pascalu˚v troju´helnı´k – podle francouzske´ho matematika Blaise Pascala. Ja´ zacˇ´ına´m staveˇt na vrsˇku smeˇrem k dolnı´ zdi. Na mı´steˇ jednotlivy´ch cˇ´ısel si prˇedstav moje bratrˇ´ıcˇky. Ja´ jim rozda´m znacˇky, ale jenom svy´m dveˇma spodnı´m bratru˚m. A ted’ kazˇdy´ z nich da´ tolik znacˇek, kolik dostal, svy´m dveˇma spodnı´m bratru˚m. Ti ale dostanou kazˇdy´ jesˇteˇ dalsˇ´ı znacˇky od sve´ho dalsˇ´ıho hornı´ho bratra z druhe´ strany. A co s tı´m ma´ spolecˇne´ho nasˇe kamara´dka rekurze ? Moji bratrˇ´ıcˇci – to budu vlastneˇ ja´ – poveˇrˇ´ım sa´m sebe neˇjakou pracı´ a azˇ ji dokoncˇ´ım, budu pracovat znovu. A ted’ trochu pocˇ´ıtacˇoveˇ: Ja´ na kazˇde´m polı´cˇku – uzlu – pyramidy polozˇ´ım znacˇku. Pak pokud nejsem u zdi (cozˇ znamena´ konec pyramidy), rozbeˇhnu se vlevo dolu˚ (z me´ho pohledu, protozˇe stojı´m otocˇen smeˇrem dolu˚; z tve´ho pohledu je to vpravo). Tam postavı´m pyramidu (prvnı´ bratrˇ´ıcˇek – rekurze). Pak se posunu o dva kroky na za´pad a tam postavı´m dalsˇ´ı pyramidu (druhy´ bratrˇ´ıcˇek – rekurze). Nakonec se vra´tı´m zpeˇt na mı´sto, odkud jsem vysˇel. Kazˇdou pyramidu – tedy i ty v nizˇsˇ´ı u´rovni – stavı´m ze severu na jih. Prˇechod na NA-LEVOUPYRAMIDU je tedy pomeˇrneˇ jednoduchy´: NA-LEVOU-PYRAMIDU KROK VLEVO-VBOK KROK
NA-LEVOU-PYRAMIDU ZNAMENA KROK VLEVO-VBOK KROK KONEC
Prˇechod NA-PRAVOU-PYRAMIDU je jesˇteˇ jednodusˇsˇ´ı: stacˇ´ı udeˇlat dva kroky smeˇrem na za´pad:
14. Stavı´me pyramidu
47
NA-PRAVOU-PYRAMIDU NA-ZAPAD DVOJ-KROK
NA-PRAVOU-PYRAMIDU ZNAMENA NA-ZAPAD DVOJ-KROK KONEC
Na´vrat o u´rovenˇ vy´sˇ na´m taky neda´ zˇa´dnou pra´ci: ZPATKY NA-VYCHOD KROK VLEVO-VBOK KROK
ZPATKY ZNAMENA NA-VYCHOD KROK VLEVO-VBOK KROK KONEC
No a vlastnı´ pyramida je jednoducha´: Otocˇ´ım se NA-JIH – tı´m smeˇrem prˇece budu staveˇt pyramidu. Pak polozˇ´ım znacˇku. Nynı´ ma´m dveˇ mozˇnosti: 1. Jsem-li u zdi, uzˇ nenı´ co staveˇt, protozˇe nenı´ kam. Nebudu tedy deˇlat nic. 2. Nejsem-li u zdi, pak se prˇesunu NA-LEVOU-PYRAMIDU, postavı´m PYRAMIDU, prˇesunu se NA-PRAVOU-PYRAMIDU, postavı´m PYRAMIDU a vra´tı´m se ZPATKY. „Elementary, my dear Watson“ jak rˇ´ıka´ slavny´ anglicky´ detektiv Sherlock Holmes. Cely´ prˇ´ıkaz PYRAMIDA jsme si popsali v minule´m odstavci: PYRAMIDA NA-JIH POLOZ ZED ↓ NA-LEVOU-PYRAMIDU PYRAMIDA NA-PRAVOU-PYRAMIDU PYRAMIDA ZPATKY
PYRAMIDA ZNAMENA NA-JIH POLOZ KDYZ JE ZED KONEC JINAK NA-LEVOU-PYRAMIDU PYRAMIDA NA-PRAVOU-PYRAMIDU PYRAMIDA ZPATKY KONEC KONEC
A stejneˇ funguje rekurze prˇi zjisˇt’ova´nı´ pocˇtu dvojkroku˚, kdyzˇ jdeme ke zdi. Jak to tedy vypada´ tam ? Zacˇnu od same´ho zacˇa´tku, od zdi. Kolik mohu udeˇlat udeˇlat dvojkroku˚ ? No prˇece zˇa´dny´. Ale ted’ nestojı´m prˇed zdı´. Vı´m, zˇe mohu udeˇlat ke zdi alesponˇ krok. Ale taky vı´m, zˇe o dveˇ polı´cˇka da´l je bra´cha. A ja´ pomocı´ rekurze prˇeda´m rˇ´ızenı´ jemu. Ale o je naprosto stejny´ jako ja´. Podı´va´ se, je-li prˇed nı´m zed’. To by umeˇl splnit – neudeˇlal by nic, jen mi vra´tı´ rˇ´ızenı´. Ale kdyzˇ tam zed’ nenı´, tak to prˇihraje dalsˇ´ımu bratrovi . . . ja´ na bra´chu, bra´cha na meˇ . . . a tak si prˇehazujeme u´kol do te´ doby, nezˇ jsme schopni jej splnit. Ale tı´m jsme teprve u zdi. My jesˇteˇ musı´me kazˇde´mu bra´chovi, ktery´ na´m poma´hal, rˇ´ıci, aby meˇ poslal o jeden krok zpeˇt. Vzˇdyt’chceme dojı´t do poloviny vzda´lenosti. A kdyzˇ to udeˇlajı´, je u´kol splneˇn. 48
Programovacı´ jazyk KAREL
Nejprve neˇkolik pomocny´ch prˇ´ıkazu˚: VZAD – to je vracenı´ se o krok zpa´tky. A ?KROK je opatrny´ krok – protozˇe testujeme pocˇet dvojkroku˚, ktere´ mu˚zˇeme udeˇlat, tak se mu˚zˇe sta´t, zˇe bych sta´l lichy´ pocˇet kroku˚ od zdi. No a protozˇe jdu vzˇdy po dvou krocı´ch, tak bych mohl narazit. VZAD CELEM-VZAD KROK CELEM-VZAD
VZAD ZNAMENA CELEM-VZAD KROK CELEM-VZAD KONEC
?KROK ZED
↓
KROK
?KROK ZNAMENA KDYZ JE ZED KONEC JINAK KROK KONEC KONEC
No a samotny´ prˇ´ıkaz PUL uzˇ je jednoduchy´: nenı´-li prˇede mnou zded’, udeˇla´m KROK a ?KROK (opatrny´ krok, abych ani zde nenarazil do zdi), zavola´m sve´ho bra´chu (PUL) a na dva kroky, ktere´ jsem udeˇlal (KROK a ?KROK) udeˇla´m jeden VZAD. PUL ZED
↓
KROK ?KROK PUL VZAD
PUL ZNAMENA KDYZ JE ZED KONEC JINAK KROK ?KROK PUL VZAD KONEC KONEC
Tı´mto zpu˚sobem mu˚zˇesˇ definovat pak jizˇ cokoliv. To je sˇikovna´ kamara´dka rekurze, co ? Bez nı´ bychom si neporadili. Musı´me jen zachova´vat neˇkolik za´sad. At’na´m da´ neˇkdo hlavolam jaky´ chce, musı´me najı´t takove´ podmı´nky, za ktery´ch jej doka´zˇeme vyrˇesˇit. V nasˇich prˇ´ıpadech to jsou situace, kdy stojı´me u zdi. Pak teprve zacˇneme hledat ja´dro u´lohy, ktere´ bude mı´t cˇtyrˇi vlastnosti: 1. Umı´me v neˇm prˇejı´t od slozˇiteˇjsˇ´ıho k jednodusˇsˇ´ımu – zjednodusˇit u´lohu. U na´s jsou to trˇeba pocˇa´tecˇnı´ dva kroky. 2. Umı´me rˇesˇenı´ jednodusˇsˇ´ı u´lohy upravit na rˇesˇenı´ slozˇiteˇjsˇ´ı – trˇeba tı´m, zˇe udeˇla´me krok zpeˇt. 3. Musı´me mı´t jistotu, zˇe toto postupne´ zjednodusˇova´nı´ jednou skoncˇ´ı. To znamena´, zˇe naprˇ. dojdeme ke zdi. 4. Musı´me mı´t jistotu, zˇe drˇ´ıv, nezˇ dospeˇjeme ke krachu, najdeme situaci, kterou umı´me vyrˇesˇit bez dalsˇ´ıho zjednodusˇova´nı´. Ale to, co jsme si ted’ poveˇdeˇli, jde vyja´drˇit i obra´zkem. Neveˇrˇ´ısˇ ? No prˇece kopenogramem. Bude to kopenogram obecne´ho algoritmu rˇesˇenı´ jednoho typu u´loh rekurzı´. Brrrr, to je veˇda.
14. Stavı´me pyramidu
49
ˇ ˇES VYR Nejjednodusˇsˇ´ı prˇ´ıpad ↓ Vyrˇesˇ jej. Zjednodusˇ u´lohu. ˇ ˇES VYR Uprav rˇesˇenı´ zjednodusˇene´ u´lohy na rˇesˇenı´ slozˇiteˇjsˇ´ı. A ted’ – ale uzˇ jenom rekreacˇneˇ – spolu dojdeme do strˇedu dvorku: DO-STREDU PUL VLEVO-VBOK PUL
DO-STREDU ZNAMENA PUL VLEVO-VBOK PUL KONEC
A stejneˇ jako PUL mu˚zˇesˇ definovat prˇ´ıkaz TRETINA. Kdybys na´hodou neveˇdeˇl jak, je vy´sledek uveden ve slovnı´cˇku v prˇ´ıloze 2. Tak, a to je poslednı´ prˇ´ıkaz, ktery´m jsme se tady spolu zaby´vali. Ja´ ale veˇrˇ´ım, zˇe mi zu˚stanesˇ veˇrny´ a zˇe se spolu jesˇteˇ mnohokra´t setka´me. V kazˇde´m prˇ´ıpadeˇ, kdyzˇ jsi vydrzˇel azˇ sem, je z tebe programa´tor a vsˇe, co jsme se spolu naucˇili, ty uplatnı´sˇ.
Hodneˇ zdaru, kra´sny´ch programu˚ a hodneˇ bitu˚ pameˇti prˇeje na rozloucˇenou Tvu˚j KAREL.
50
Programovacı´ jazyk KAREL
Prˇ´ıloha 1: Jak deˇlat kopenogramy Na stra´nce 8 jsme se poprve´ sezna´mili s kopenogramy. Abychom s nimi mohli u´speˇsˇneˇ pracovat, je nejlepsˇ´ı, kdyzˇ jsou barevne´. Ne vzˇdy ma´sˇ k dispozici barevnou knı´zˇku. Taky jako programa´tor potrˇebujesˇ deˇlat kopenogramy svoje. Proto si tady strucˇneˇ shrneme neˇkolik hlavnı´ch za´sad, jak kopenogramy deˇlat. VPRAVO-VBOK
– Hlava kopenogramu na zˇlute´m pozadı´. Hlavu oddeˇlujeme dvojitou cˇa´rou. Neˇkdy se mu˚zˇesˇ setkat taky s tı´m, zˇe hlava je na bı´le´m pozadı´. Ale zu˚stanˇme spolu u zˇlute´. Je to vy´razneˇjsˇ´ı, kdyzˇ si sa´m malujesˇ do sesˇitu.
VPRAVO-VBOK
– Hlava kopenogramu – Teˇlo kopenogramu necha´me bı´le´. Je to vzˇdy cˇtverec, nebo obde´lnı´k.
VPRAVO-VBOK
– Hlava kopenogramu – Blok prˇ´ıkazu˚ uda´va´, ktere´ prˇ´ıkazy a v jake´m porˇadı´ se budou prova´deˇt. Primitiva jsou vybarvena cˇerveneˇ, slozˇene´ prˇ´ıkazy ru˚zˇoveˇ.
VLEVO-VBOK CELEM-VZAD PIRUETA VLEVO-VBOK PIRUETA
NA-JIH ↓
JIH
VLEVO-VBOK NA-JIH KE-ZDI
VYPLN
- ZED KROK
9 KRAT POLOZ
↑
↑
– Hlava kopenogramu – Blok prˇ´ıkazu˚ (cˇerveneˇ primitiva, ru˚zˇoveˇ slozˇene´ prˇ´ıkazy) – Zˇlute´ pole rekurzivnı´ho vola´nı´ – je to vlastneˇ hlava programu, proto je zˇluta´. – Hlava kopenogramu – Podmı´neˇny´ blok – modrˇe. Sˇipka na´m naznacˇuje, kam se vyda´me prˇi nesplneˇnı´ podmı´nky.
– Hlava kopenogramu – Cyklus se vstupnı´ podmı´nkou – zeleneˇ. Znak „ - “ = „NENI“. – Blok opakovany´ch prˇ´ıkazu˚ – Degenerovana´ vy´stupnı´ podmı´nka – zeleneˇ.
To jsou jen strucˇna´ pravidla. Kdyzˇ si budesˇ malovat kopenogramy do sesˇitu, mu˚zˇesˇ pouzˇ´ıt sice ru˚zna´ zjednodusˇenı´, ale vzˇdy zachova´vej barevne´ oznacˇenı´. Aby meˇly kopenogramy vy´znam, dodrzˇuj stanovene´ barvy ! Vy´razne´ barvy prˇeje KAREL.
Prˇ´ıloha 1: Jak deˇlat kopenogramy
51
Prˇ´ıloha 2: Karlu˚v slovnı´k Ve slovnı´ku jsou prˇ´ıkazy serˇazeny podle abecedy. Najdesˇ tu vsˇechny kromeˇ duplicitnı´ch. Jsou zde uvedeny i prˇ´ıkazy, na ktere´ je v textu pouze odkaz. Vpravo je uvedeno cˇ´ıslo stra´nky, kde najdesˇ, jak jsme prˇ´ıkaz vytvorˇili.
?KROK ↓
ZED
KROK
4-KROK 4 KRAT KROK ↑
5-KROK 5 KRAT KROK ↑
CELEM-VZAD VLEVO-VBOK VLEVO-VBOK
CTYR-KROK DVOJ-KROK DVOJ-KROK
52
?KROK ZNAMENA KDYZ JE ZED KONEC JINAK KROK KONEC KONEC
[49]
4-KROK ZNAMENA OPAKUJ 4 KRAT KROK KONEC KONEC
[16]
5-KROK ZNAMENA OPAKUJ 5 KRAT KROK KONEC KONEC
[16]
CELEM-VZAD ZNAMENA VLEVO-VBOK VLEVO-VBOK KONEC
[9]
CTYR-KROK ZNAMENA DVOJ-KROK DVOJ-KROK KONEC
[12]
Programovacı´ jazyk KAREL
DO-STREDU PUL VLEVO-VBOK PUL
DO-ZDI KROK DO-ZDI
DOMU K-JIZNI-ZDI K-ZAPADNI-ZDI CELEM-VZAD
DUM PRIZEMI NA-PREKLAD PREKLAD NA-PATRO PATRO NA-PREKLAD PREKLAD
DVERE DVOJ-KROK NA-NOVY-PANEL
DVOJ-KROK KROK KROK
Prˇ´ıloha 2: Karlu˚v slovnı´k
DO-STREDU ZNAMENA PUL VLEVO-VBOK PUL KONEC
[50]
DO-ZDI ZNAMENA KROK DO-ZDI KONEC
[31]
DOMU ZNAMENA K-JIZNI-ZDI K-ZAPADNI-ZDI CELEM-VZAD KONEC
[33]
DUM ZNAMENA PRIZEMI NA-PREKLAD PREKLAD NA-PATRO PATRO NA-PREKLAD PREKLAD KONEC
[27]
DVERE ZNAMENA DVOJ-KROK NA-NOVY-PANEL KONEC
[25]
DVOJ-KROK ZNAMENA KROK KROK KONEC
[9]
53
HLIDEJ DVOJ-KROK VLEVO-VBOK HLIDEJ
JAKO-KUN DVOJ-KROK VLEVO-VBOK KROK
JERAB NA-VEZ VEZ NA-RAMENO RAMENO
K-JIZNI-ZDI NA-JIH KE-ZDI
K-SEVERNI-ZDI NA-SEVER KE-ZDI
K-VYCHODNI-ZDI NA-VYCHOD KE-ZDI
K-ZAPADNI-ZDI NA-ZAPAD KE-ZDI
54
HLIDEJ ZNAMENA DVOJ-KROK VLEVO-VBOK HLIDEJ KONEC
[31]
JAKO-KUN ZNAMENA DVOJ-KROK VLEVO-VBOK KROK KONEC
[13]
JERAB ZNAMENA NA-VEZ VEZ NA-RAMENO RAMENO KONEC
[20]
K-JIZNI-ZDI ZNAMENA NA-JIH KE-ZDI KONEC
[33]
K-SEVERNI-ZDI ZNAMENA NA-SEVER KE-ZDI KONEC
[33]
K-VYCHODNI-ZDI ZNAMENA NA-VYCHOD KE-ZDI KONEC
[33]
K-ZAPADNI-ZDI ZNAMENA NA-ZAPAD KE-ZDI KONEC
[33]
Programovacı´ jazyk KAREL
KE-ZDI ↓
ZED
KROK KE-ZDI
KE-ZDI2 - ZED KROK ↑
NA-DALSI-ZNACKU ZED CELEM -VZAD
↓
KROK ZNACKA
↓
NA-DALSI -ZNACKU
NA-JIH JIH
↓
VLEVO-VBOK NA-JIH
NA-LEVOU-PYRAMIDU KROK VLEVO-VBOK KROK
Prˇ´ıloha 2: Karlu˚v slovnı´k
KE-ZDI ZNAMENA KDYZ JE ZED KONEC JINAK KROK KE-ZDI KONEC KONEC
[31]
KE-ZDI2 ZNAMENA DOKUD NENI ZED KROK KONEC KONEC
[39]
NA-DALSI-ZNACKU ZNAMENA KDYZ JE ZED CELEM-VZAD KONEC JINAK KROK KDYZ JE ZNACKA KONEC JINAK NA-DALSI-ZNACKU KONEC KONEC KONEC
[32]
NA-JIH ZNAMENA KDYZ JE JIH KONEC JINAK VLEVO-VBOK NA-JIH KONEC KONEC
[33]
NA-LEVOU-PYRAMIDU ZNAMENA KROK VLEVO-VBOK KROK KONEC
[47]
55
NA-NOVY-PANEL CELEM-VZAD DVOJ-KROK VLEVO-VBOK KROK VLEVO-VBOK
NA-PATRO VLEVO-VBOK 9 KRAT KROK ↑
VPRAVO-VBOK KROK
NA-PRAVOU-PYRAMIDU NA-ZAPAD DVOJ-KROK
NA-PREKLAD VLEVO-VBOK 9 KRAT KROK ↑
VPRAVO-VBOK DVOJ-KROK
NA-RAMENO 2 KRAT VLEVO-VBOK DVOJ-KROK ↑
VLEVO-VBOK
56
NA-NOVY-PANEL ZNAMENA CELEM-VZAD DVOJ-KROK VLEVO-VBOK KROK VLEVO-VBOK KONEC
[24]
NA-PATRO ZNAMENA VLEVO-VBOK OPAKUJ 9 KRAT KROK KONEC VPRAVO-VBOK KROK KONEC
[27]
NA-PRAVOU-PYRAMIDU ZNAMENA NA-ZAPAD DVOJ-KROK KONEC
[48]
NA-PREKLAD ZNAMENA VLEVO-VBOK OPAKUJ 9 KRAT KROK KONEC VPRAVO-VBOK DVOJ-KROK KONEC
[27]
NA-RAMENO ZNAMENA OPAKUJ 2 KRAT VLEVO-VBOK DVOJ-KROK KONEC VLEVO-VBOK KONEC
[17]
Programovacı´ jazyk KAREL
NA-SEVER ↓
SEVER
VLEVO-VBOK NA-SEVER
NA-VEZ TROJ-KROK VLEVO-VBOK
NA-VYCHOD ↓
VYCHOD
VLEVO-VBOK NA-VYCHOD
NA-ZAPAD ↓
ZAPAD
VLEVO-VBOK NA-ZAPAD
NENI-ZED ZED VLEVO-VBOK ↑
OKNO VYPLN DVOJ-KROK NA-NOVY-PANEL
Prˇ´ıloha 2: Karlu˚v slovnı´k
NA-SEVER ZNAMENA KDYZ JE SEVER KONEC JINAK VLEVO-VBOK NA-SEVER KONEC KONEC
[33]
NA-VEZ ZNAMENA TROJ-KROK VLEVO-VBOK KONEC
[20]
NA-VYCHOD ZNAMENA KDYZ JE VYCHOD KONEC JINAK VLEVO-VBOK NA-VYCHOD KONEC KONEC
[33]
NA-ZAPAD ZNAMENA KDYZ JE ZAPAD KONEC JINAK VLEVO-VBOK NA-ZAPAD KONEC KONEC
[33]
NENI-ZED ZNAMENA DOKUD JE ZED VLEVO-VBOK KONEC KONEC
[40]
OKNO ZNAMENA VYPLN DVOJ-KROK NA-NOVY-PANEL KONEC
[25]
57
OKOLO KE-ZDI VLEVO-VBOK OKOLO
OTOC-VLEVO VLEVO-VBOK KROK VLEVO-VBOK
?OTOC-VLEVO VLEVO-VBOK ↓ ZED DOMU KROK VLEVO-VBOK
OTOC-VPRAVO VPRAVO-VBOK KROK VPRAVO-VBOK
?OTOC-VPRAVO VPRAVO-VBOK ZED ↓ DOMU KROK VPRAVO-VBOK
58
OKOLO ZNAMENA KE-ZDI VLEVO-VBOK OKOLO KONEC
[38]
OTOC-VLEVO ZNAMENA VLEVO-VBOK KROK VLEVO-VBOK KONEC
[38]
?OTOC-VLEVO ZNAMENA VLEVO-VBOK KDYZ JE ZED DOMU KONEC JINAK KROK VLEVO-VBOK KONEC KONEC
[38]
OTOC-VPRAVO ZNAMENA VPRAVO-VBOK KROK VPRAVO-VBOK KONEC
[38]
?OTOC-VPRAVO ZNAMENA VPRAVO-VBOK KDYZ JE ZED DOMU KONEC JINAK KROK VPRAVO-VBOK KONEC KONEC
[38]
Programovacı´ jazyk KAREL
PANEL 2 KRAT VYPLN KROK ↑
NA-NOVY-PANEL
PATRO 4 KRAT PANEL OKNO ↑
PANEL
PIRUETA VLEVO-VBOK PIRUETA
PO-ZNACKACH-ZPET ZNACKA ZVEDNI KROK ↑
POLOZ-MINU-U-ZDI KE-ZDI POLOZ
POLOZ-MINU-KE-ZDI-2 ZNACKUJ-CESTU-KE-ZDI POLOZ CELEM-VZAD PO-ZNACKACH-ZPET
Prˇ´ıloha 2: Karlu˚v slovnı´k
PANEL ZNAMENA OPAKUJ 2 KRAT VYPLN KROK KONEC NA-NOVY-PANEL KONEC
[25]
PATRO ZNAMENA OPAKUJ 4 KRAT PANEL OKNO KONEC PANEL KONEC
[26]
PIRUETA ZNAMENA VLEVO-VBOK PIRUETA KONEC
[28]
PO-ZNACKACH-ZPET ZNAMENA DOKUD JE ZNACKA ZVEDNI KROK KONEC KONEC
[45]
POLOZ-MINU-U-ZDI ZNAMENA KE-ZDI POLOZ KONEC
[44]
POLOZ-MINU-KE-ZDI-2 ZNAMENA ZNACKUJ-CESTU-KE-ZDI POLOZ CELEM-VZAD PO-ZNACKACH-ZPET KONEC
[45]
59
POLOZ-MINU-KE-ZDI-3 ↓
ZED POLOZ CELEM-VZAD
KROK POLOZ-MINU -KE-ZDI-3 KROK
PREKLAD 9 KRAT OKNO ↑
PRIZEMI VLEVO-VBOK PANEL OKNO PANEL DVERE 2 KRAT PANEL OKNO ↑
PANEL
PROJDI KE-ZDI ?OTOC-VLEVO KE-ZDI ?OTOC-VPRAVO PROJDI
60
POLOZ-MINU-KE-ZDI-3 ZNAMENA KDYZ JE ZED POLOZ CELEM-VZAD KONEC JINAK KROK POLOZ-MINU-KE-ZDI-3 KROK KONEC KONEC
[46]
PREKLAD ZNAMENA OPAKUJ 9 KRAT OKNO KONEC KONEC
[26]
PRIZEMI ZNAMENA VLEVO-VBOK PANEL OKNO PANEL DVERE OPAKUJ 2 KRAT PANEL OKNO KONEC PANEL KONEC
[26]
PROJDI ZNAMENA KE-ZDI ?OTOC-VLEVO KE-ZDI ?OTOC-VPRAVO PROJDI KONEC
[39]
Programovacı´ jazyk KAREL
PRYC ZED VLEVO-VBOK
↓
KROK VPRAVO-VBOK
PRYC
PUL ZED
↓
KROK ?KROK PUL VZAD
PYRAMIDA NA-JIH POLOZ ZED ↓ NA-LEVOU-PYRAMIDU PYRAMIDA NA-PRAVOU-PYRAMIDU PYRAMIDA ZPATKY
Prˇ´ıloha 2: Karlu˚v slovnı´k
PRYC ZNAMENA KDYZ JE ZED VLEVO-VBOK KONEC JINAK KROK VPRAVO-VBOK KONEC PRYC KONEC
[42]
PUL ZNAMENA KDYZ JE ZED KONEC JINAK KROK ?KROK PUL VZAD KONEC KONEC
[49]
PYRAMIDA ZNAMENA NA-JIH POLOZ KDYZ JE ZED KONEC JINAK NA-LEVOU-PYRAMIDU PYRAMIDA NA-PRAVOU-PYRAMIDU PYRAMIDA ZPATKY KONEC KONEC
[48]
61
RAMENO 2 KRAT VYPLN KROK ↑
KROK 5 KRAT VYPLN5 KROK ↑
SEBER-NEKDE-ZNACKU ZNACKA ZVEDNI
↓
ZED VLEVO-VBOK
↓
KROK
SEBER-NEKDE -ZNACKU
SEBER-NEKDE-ZNACKY ZNACKA ZVEDNI
↓
ZED VLEVO-VBOK
SEBER-NEKDE-ZNACKY
62
↓
KROK
RAMENO ZNAMENA OPAKUJ 2 KRAT VYPLN KROK KONEC KROK OPAKUJ 5 KRAT VYPLN5 KROK KONEC KONEC
[18]
SEBER-NEKDE-ZNACKU ZNAMENA KDYZ JE ZNACKA ZVEDNI KONEC JINAK KDYZ JE ZED VLEVO-VBOK KONEC JINAK KROK KONEC SEBER-NEKDE-ZNACKU KONEC KONEC
[36]
SEBER-NEKDE-ZNACKY ZNAMENA KDYZ JE ZNACKA ZVEDNI KONEC JINAK KDYZ JE ZED VLEVO-VBOK KONEC JINAK KROK KONEC KONEC SEBER-NEKDE-ZNACKY KONEC
[36]
Programovacı´ jazyk KAREL
SEBER-NEKDE-ZNACKY2 VYBER ZED VLEVO-VBOK
↓
KROK
SEBER-NEKDE-ZNACKY2
TRETINA ↓
ZED
KROK ?KROK ?KROK TRETINA VZAD
TROJ-KROK KROK KROK KROK
VEZ 9 KRAT VYPLN KROK ↑
VPRAVO-VBOK VLEVO-VBOK VLEVO-VBOK VLEVO-VBOK
Prˇ´ıloha 2: Karlu˚v slovnı´k
SEBER-NEKDE-ZNACKY2 ZNAMENA VYBER KDYZ JE ZED VLEVO-VBOK KONEC JINAK KROK KONEC SEBER-NEKDE-ZNACKY2 KONEC
[37]
TRETINA ZNAMENA KDYZ JE ZED KONEC JINAK KROK ?KROK ?KROK TRETINA VZAD KONEC KONEC
[50]
TROJ-KROK ZNAMENA KROK KROK KROK KONEC
[11]
VEZ ZNAMENA OPAKUJ 9 KRAT VYPLN KROK KONEC KONEC
[17]
VPRAVO-VBOK ZNAMENA VLEVO-VBOK VLEVO-VBOK VLEVO-VBOK KONEC
[9]
63
VYBER ZNACKA ZVEDNI VYBER
↓
VYPLN 9 KRAT POLOZ ↑
VYPLN5 5 KRAT POLOZ ↑
VZAD CELEM-VZAD KROK CELEM-VZAD
Z-BLUDISTE VPRAVO-VBOK ZED VLEVO-VBOK ↑
KROK ZNACKA
↓
Z-BLUDISTE
64
VYBER ZNAMENA KDYZ JE ZNACKA ZVEDNI VYBER KONEC JINAK KONEC KONEC
[35]
VYPLN ZNAMENA OPAKUJ 9 KRAT POLOZ KONEC KONEC
[17]
VYPLN5 ZNAMENA OPAKUJ 5 KRAT POLOZ KONEC KONEC
[18]
VZAD ZNAMENA CELEM-VZAD KROK CELEM-VZAD KONEC
[49]
Z-BLUDISTE ZNAMENA VPRAVO-VBOK DOKUD JE ZED VLEVO-VBOK KONEC KROK KDYZ JE ZNACKA KONEC JINAK Z-BLUDISTE KONEC KONEC
[43]
Programovacı´ jazyk KAREL
ZNACKUJ-CESTU-KE-ZDI ↓
ZED
KROK POLOZ ZNACKUJ-CESTU-KE-ZDI
ZPATKY NA-VYCHOD KROK VLEVO-VBOK KROK
ZNACKUJ-CESTU-KE-ZDI ZNAMENA [45] KDYZ JE ZED KONEC JINAK KROK POLOZ ZNACKUJ-CESTU-KE-ZDI KONEC KONEC ZPATKY ZNAMENA NA-VYCHOD KROK VLEVO-VBOK KROK KONEC
[48]
Pokud pouzˇ´ıva´te PDF variantu tohoto textu, pak dvojklikem na na´sledujı´cı´ ikonu, vybra´nı´m cele´ho textu a pouzˇitı´m prˇ´ıkazu OPRAV mu˚zˇete cely´ slovnı´k prˇene´st do programu PC-Karel.
Prˇ´ıloha 2: Karlu˚v slovnı´k
65
Prˇ´ıloha 3: Seznam Karlovy´ch prˇ´ıkazu˚ V seznamu jsou rˇazeny prˇ´ıkazy tak, jak po sobeˇ v knı´zˇce na´sledujı´. U kazˇde´ho prˇ´ıkazu je strucˇneˇ vysveˇtlena jeho funkce. Za´rovenˇ je uvedeno, na ktere´ stra´nce knı´zˇky jej najdesˇ. Nejsou zde vysveˇtlena primitiva – to by prˇece bylo primitivnı´. Nenajdesˇ zde taky prˇ´ıkazy obdobne´ – jako jsou prˇ´ıkazy NA-JIH a NA-SEVER. DVOJ-KROK
Karel udeˇla´ dva kroky ve smeˇru, do ktere´ho je natocˇen.
[9]
CELEM-VZAD
Karel provede cˇelem vzad.
[9]
VPRAVO-VBOK1
Karel provede vpravo vbok pomocı´ trˇ´ı vlevo vboku˚.
[9]
VPRAVO-VBOK2
Karel provede vpravo vbok pomocı´ cˇelem vzad a vlevo [10] vbok.
TROJ-KROK1
Karel provede trˇi kroky ve smeˇru, do ktere´ho je natocˇen, [11] pomocı´ trˇ´ı prˇ´ıkazu˚ KROK.
TROJ-KROK2
Karel provede trˇi kroky ve smeˇru, do ktere´ho je natocˇen, [12] pomocı´ prˇ´ıkazu˚ DVOJ-KROK a KROK.
CTYR-KROK1
Karel udeˇla´ cˇtyrˇi kroky ve smeˇru, do ktere´ho je natocˇen, [12] pomocı´ dvou prˇ´ıkazu˚ DVOJ-KROK.
CTYR-KROK2
Karel udeˇla´ cˇtyrˇi kroky ve smeˇru, do ktere´ho je natocˇen, [12] pomocı´ prˇ´ıkazu˚ TROJ-KROK a KROK.
JAKO-KUN
Karel jde po meˇsteˇ jako sˇachovy´ ku˚nˇ po sˇachovnici.
4-KROK
Karel udeˇla´ cˇtyrˇi kroky ve smeˇru, do ktere´ho je natocˇen, [16] pomocı´ prˇ´ıkazu OPAKUJ.
5-KROK
Karel udeˇla´ peˇt kroku˚ ve smeˇru, do ktere´ho je natocˇen, [16] pomocı´ prˇ´ıkazu OPAKUJ.
VYPLN
Karel vyplnı´ pra´zdne´ polı´cˇko, kde stojı´, devı´ti znacˇ- [17] kami.
VEZ
Karel postavı´ ve smeˇru, do ktere´ho je natocˇen, veˇzˇ [17] vysokou 9 polı´cˇek.
NA-RAMENO
Karel prˇejde na mı´sto, odkud zacˇne staveˇt rameno je- [17] rˇa´bu.
66
[13]
Programovacı´ jazyk KAREL
VYPLN5
Karel polozˇ´ı do pra´zdne´ho polı´cˇka, na ktere´m stojı´, peˇt [18] znacˇek.
RAMENO
Karel postavı´ rameno jerˇa´bu.
[18]
NA-VEZ
Karel prˇejde z domu na mı´sto, kde bude staveˇt jerˇa´b.
[20]
JERAB
Karel sestrojı´ na obrazovce jerˇa´b z prˇedem nadefinova- [20] ny´ch prˇ´ıkazu˚.
NA-NOVY-PANEL
Karel prˇejde prˇi stavbeˇ domu na mı´sto, odkud bude [24] staveˇt novy´ panel.
PANEL
Karel sestrojı´ panel pro stavbu domu a prˇejde na mı´sto [25] pro stavbu nove´ho panelu (NA-NOVY-PANEL).
OKNO
Karel sestrojı´ okno pro stavbu domu a prˇejde na mı´sto [25] pro stavbu nove´ho panelu (NA-NOVY-PANEL).
DVERE
Karel sestrojı´ dverˇe pro stavbu domu a prˇejde na mı´sto [25] pro stavbu nove´ho panelu (NA-NOVY-PANEL).
PRIZEMI
Karel z jednotlivy´ch prvku˚ smontuje prˇ´ızemı´ domu.
PREKLAD
Karel sestavı´ prˇeklad nad prˇ´ızemı´m domu. Tento prˇ´ıkaz [26] je za´rovenˇ prˇ´ıkazem pro sestrojenı´ strˇechy.
NA-PREKLAD
Karel prˇejde prˇi stavbeˇ domu na mı´sto, odkud zacˇne [27] montovat prˇeklad.
NA-PATRO
Karel prˇejde prˇi stavbeˇ domu na mı´sto, odkud zacˇne [27] montovat patro.
DUM
Karel postavı´ du˚m.
[27]
PIRUETA
Karel deˇla´ piruetu pomocı´ rekurze.
[28]
HLIDEJ
Karel hlı´da´ pmocı´ rekurze pomyslny´ dvorek.
[31]
DO-ZDI
Karel dojde pomocı´ rekurze k libovolneˇ vzda´lene´ zdi [31] a narazı´ do nı´.
KE-ZDI
Karel dojde pomocı´ KDYZ a rekurze ke zdi, k nı´zˇ je [31] natocˇen, a zu˚stane prˇed nı´ sta´t anizˇ by do ni narazil.
Prˇ´ıloha 3: Seznam Karlovy´ch prˇ´ıkazu˚
[26]
67
NA-DALSI-ZNACKU
Karel dojde na znacˇku, ktera´ je polozˇena ve smeˇru, do [32] ktere´ho je natocˇen. Na znacˇce se zastavı´.
NA-SEVER
Karel se natocˇ´ı ve smeˇru zˇa´dane´ sveˇtove´ strany (SE- [33] VER, JIH, VYCHOD, ZAPAD).
K-JIZNI-ZDI
Karel dojde k zvolene´ (JIZNI, SEVERNI, ZAPADNI, [33] VYCHODNI) zdi.
DOMU
Karel se vra´tı´ z libovolne´ho mı´sta v pra´zdne´m meˇsteˇ [33] domu˚.
VYBER
Karel u´plneˇ vysbı´ra´ libovolny´ pocˇet znacˇek na mı´steˇ, [35] kde stojı´.
SEBER-NEKDE-ZNACKU
Karel dojde na znacˇku polozˇenou u zdi, zvedne ji a zu˚- [36] stane sta´t.
SEBER-NEKDE-ZNACKY
Karel vysbı´ra´ vsˇechny znacˇky polozˇene´ u zdı´.
[36]
SEBER-NEKDE-ZNACKY2
Zjednodusˇeny´ za´pis SEBER-NEKDE-ZNACKY.
[37]
OKOLO
Karel obcha´zı´ okolo cele´ho meˇsta bez zdı´.
[38]
OTOC-VLEVO
Karel se po prˇ´ıchodu ke zdi otocˇ´ı a prˇejde na sousednı´ [38] rˇadu polı´cˇek vlevo.
?OTOC-VLEVO
Karel po prˇ´ıchodu ke zdi prˇejde na sousednı´ rˇadu vlevo [38] jen pokud nenarazı´ do zdi.
PROJDI
Karel procha´zı´ vsˇemi polı´cˇky meˇsta beze zdı´.
[39]
KE-ZDI2
Karel dojde opatrneˇ azˇ ke zdi pomocı´ DOKUD.
[39]
NENI-ZED
Karel se ota´cˇ´ı tak dlouho, dokud je prˇed nı´m zed’.
[40]
PRYC
Karel vyjde z jednoduche´ho bludisˇteˇ.
[42]
Z-BLUDISTE
Karel vyjde z jednoduche´ho bludisˇteˇ a zastavı´ se na [43] znacˇce.
POLOZ-MINU-U-ZDI
Karel dojde ke zdi, polozˇ´ı tam minu – znacˇku – a zu˚- [44] stane na nı´ sta´t.
68
Programovacı´ jazyk KAREL
ZNACKUJ-CESTU-KE-ZDI
Karel jde ke zdi a cestou pokla´da´ znacˇky.
PO-ZNACKACH-ZPET
Karel jde po znacˇka´ch zpeˇt na vy´chozı´ mı´sto a sbı´ra´ je [45] po sobeˇ.
POLOZ-MINU-KE-ZDI-2
Karel dojde ke zdi znacˇkuje si cestu, polozˇ´ı tam minu [45] – znacˇku – a po znacˇka´ch se vra´tı´ zpeˇt na vy´chozı´ mı´sto.
POLOZ-MINU-KE-ZDI-3
Karel dojde ke zdi, polozˇ´ı tam minu – znacˇku – a vra´tı´ [46] se zpeˇt.
NA-LEVOU-PYRAMIDU
Karel se prˇi stavbeˇ pyramidy posune na mı´sto stavby [47] leve´ podpyramidy.
NA-PRAVOU-PYRAMIDU
Karel se prˇi stavbeˇ pyramidy posune na mı´sto stavby [48] prave´ podpyramidy.
ZPATKY
Karel se prˇi stavbeˇ pyramidy posune zpeˇt na vy´chozı´ [48] mı´sto.
PYRAMIDA
Karel postavı´ pyramidu – Pascalu˚v troju´helnı´k – ze [48] znacˇek.
VZAD
Karel udeˇla´ jeden krok vzad.
?KROK
Karel udeˇla´ opatrny´ krok – krok jen pokud prˇed nı´m [49] nenı´ zed’.
PUL
Karel dojde do poloviny vzda´lenosti mezi nı´m a zdı´.
[49]
DO-STREDU
Karel dojde z domecˇku do strˇedu meˇsta.
[50]
TRETINA
Karel dojde do trˇediny vzda´lenosti mezi nı´m a zdı´.
[50]
Prˇ´ıloha 3: Seznam Karlovy´ch prˇ´ıkazu˚
[45]
[49]
69
Obsah ´ vodem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . U 1. KAREL se prˇedstavuje
3
. . . . . . . . . . . . . . . . . . . . . . . . . 4
1.1. Primitiva . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2. kapitola, ale 1. programa´torska´
5
. . . . . . . . . . . . . . . . . . . . . . 7
3. Jesˇteˇ trochu turistiky . . . . . . . . . . . . . . . . . . . . . . . . . . 11 4. Ucˇ´ıme se pracovat: KAREL monte´rem 5. OPAKUJ – budesˇ chytrˇejsˇ´ı 6. Panela´rna
. . . . . . . . . . . . . . . . . . . 15
. . . . . . . . . . . . . . . . . . . . . . . 19
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
7. Stavı´me du˚m . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 8. Karlova prˇ´ıtelkyneˇ
. . . . . . . . . . . . . . . . . . . . . . . . . . . 28
9. Seskakujeme z kolotocˇe . . . . . . . . . . . . . . . . . . . . . . . . . 31 10. Sta´va´me se sbeˇrateli
. . . . . . . . . . . . . . . . . . . . . . . . . . 35
11. Kolo kolo mly´nske´
. . . . . . . . . . . . . . . . . . . . . . . . . . 38
12. Opeˇt na cesta´ch
. . . . . . . . . . . . . . . . . . . . . . . . . . . 41
13. A co takhle trochu matematiky ? . . . . . . . . . . . . . . . . . . . . . 44 14. Stavı´me pyramidu
. . . . . . . . . . . . . . . . . . . . . . . . . . 47
Prˇ´ıloha 1: Jak deˇlat kopenogramy . . . . . . . . . . . . . . . . . . . . . . 51 Prˇ´ıloha 2: Karlu˚v slovnı´k
. . . . . . . . . . . . . . . . . . . . . . . . . 52
Prˇ´ıloha 3: Seznam Karlovy´ch prˇ´ıkazu˚
. . . . . . . . . . . . . . . . . . . . 66
ISBN 99972-03-09-7
9 789997 203090