|
KAREL 32
Programovací mini-jazyk Robot Karel 3.2 je freeware. K
programu je podrobná dokumentácia a zdrojové texty.
Prečo Karel 3.2
Prostredie, postavička (šípka) a vzhľad miestnosti sú síce menej
atraktívne, ale o to bližšie prostrediu turbo pascalu od spoločnosti
Borland. V ľavej polovici obrazovky je okno na písanie a editáciu
zdrojového textu programu. Pri písaní programu možno používať klávesové
skratky, napr. pre kopírovanie, vkladanie, zmazanie slova, riadku,
nastavenie záložky a pod.
Príkazy Karla sú rozšírené o príkazy maluj "znak", návrat, stop, čekej,
o funkcie klávesa, náhoda, znak, o podmienky miesto, pravda, nepravda, o
premenné, o polia a i.
Žiak môže používať české alebo anglické užívateľské rozhranie, české
alebo anglické kľúčové slová, príkazy, samozrejme môže Karla naučiť po
slovensky. Doporučujem užívateľské rozhranie, kľúčové slová, príkazy a
pomoc (help) používať v anglickom jazyku.
V prostredí je kvalitne spracované ladenie programu (debugger), ktoré
umožňuje ladiť program krokovaním cez jeden riadok, jednu procedúru,
jednu inštrukciu, umožňuje zastaviť program na vopred vloženom bode
zastavenia (breakpoint).
Štruktúra
programu
PROCEDURE meno
blok prikazov
END
Program sa skladá z procedúr. Každá procedúra obsahuje
postupnosť príkazov a má svoje meno, ktoré nesmie začínať číslom. Každá
procedúra začína vyhradeným slovom PRÍKAZ (PROCEDURE), za ktorým je jej
meno, a končí slovom KONEC (END). Príkazy v tele procedúry sa pre
prehľadnosť zvyknú písať každý na jeden riadok, ale je možno písať na
jeden riadok aj viac príkazov oddelených bodkočiarkou. Do programu je
tiež možno písať komentár medzi reťazce /* a */ (aj viacriadkový) alebo
za reťazec // (do konca riadku). V programe nezáleží na poradí procedúr.
Žiadna procedúra nie je hlavným programom. Ďalej uvádzam štruktúry
jednotlivých prvkov Karla 3.2, kde blok príkazov môže byť jeden príkaz,
postupnosť viacerých príkazov, alebo iný štruktúrovaný prvok jazyka
(napr. vnorená podmienka).
Podmienený príkaz
IF podmienka
blok prikazov 1
ELSE
blok prikazov 2
END
V Karlovi 3.2 existuje aj konštrukcia viacnásobného
vetvenia programu. Číselný výraz je porovnávaný s viacerými výrazmi a
podľa pravdivosti zhody sa vykonávajú ďalšie bloky príkazov.
SWITCH vyraz
CASE vyraz 1
blok prikazov 1
CASE vyraz 2
blok prikazov 2
CASE vyraz 3
blok prikazov 3
...
ELSE
blok prikazov X
END
Cyklus
Cyklus s podmienkou na začiatku, ak podmienka prestane byť splnená,
cyklus skončí, nemusí prebehnúť ani raz.
WHILE podmienka
blok prikazov
END
Cyklus s podmienkou na konci, ak je podmienka splnená, cyklus skončí,
musí prebehnúť aspoň raz.
REPEAT
blok prikazov
UNTIL podmienka
Cyklus s podmienkou na začiatku aj na konci. Cyklus skončí ak prestane
byť splnená podmienka na začiatku alebo ak je splnená podmienka na konci
cyklu. Nemusí prebehnúť ani raz.
WHILE podmienka
blok prikazov
UNTIL podmienka
Cyklus s presným počtom opakovaní.
REPEAT pocet_krat
blok prikazov
END
Cyklus s presným počtom opakovaní a ešte podmienkou na konci. Cyklus
skončí ak je podmienka splnená alebo ak prebehne počet opakovaní.
REPEAT pocet_krat
blok prikazov
UNTIL podmienka
Nekonečný cyklus.
REPEAT
blok prikazov
END
Príkazy
Okrem základných (STEP, LEFT, RIGHT, PICK, PUT):
RETURN ukončí vykonávanú procedúru
STOP zastaví program
DELAY cislo čaká daný počet milisekúnd (ak číslo je -1, čaká na
stlačenie klávesy
PAINT vypíše (zobrazí, namaluje) znak (viď. ASCII)
Funkcie
CHAR vracia znak, ktorý sa nachádza pod Karlom
RANDOM (n) vracia náhodné číslo z intervalu (0 až n-1)
KEY prečíta znak z klávesnice, vracia jej ASCII hodnotu
LENGHT vracia počet prvkov poľa (viď. Pole)
Žiak si môže naprogramovať svoje vlastné funkcie, úvodné kľúčové slovo
má tvar FUNCTION.
Podmienky
Okrem základných (WALL, MARK, NORTH, WEST, SOUTH, EAST):
SPACE podmienka je splnená, ak sa dá položiť značka
TRUE podmienka je vždy splnená
FALSE podmienka nie je nikdy splnená
Podmienky možno spájať logickými operátormi (NOT, AND, OR). Podmienky
nevracajú číselný, ale logický (boolean) výraz. Žiak si môže
naprogramovať svoje vlastné podmienky, úvodné kľúčové slovo má tvar
CONDITION.
Premenné
Počas behu programu je často potrebné zapamätať si nejaké číslo a
neskôr ho použiť. Na to slúžia premenné. Premenné sa vytvárajú
(deklarujú) príkazom INTEGER, za ktorým nasledujú názvy premenných
(identifikátory) oddelené čiarkami. Tým sa v pamäti počítača vyhradí
pamäťové miesto na zapamätanie údajov. Keď žiak chce uložiť číslo do
premennej (priradiť identifikátoru premennej hodnotu), napíše názov
premennej rovná sa číselný výraz. Keď chce hodnotu z premennej prečítať,
napíše názov premennej kdekoľvek v číselnom výraze. Nie je možné
vytvárať globálne premenné pre celý program, každá procedúra musí mať
definované svoje lokálne premenné, ktoré po skončení procedúry zanikajú.
Procedúry s parametrami
Procedúry, funkcie alebo podmienky môžu mať parametre. Keď je taká
procedúra volaná, musia byť zadané hodnoty, ktoré sa predajú procedúre.
V definícii procedúry sú názvy parametrov uvedené v zátvorkách za
názvom procedúry. Tieto názvy potom nesmú byť použité v deklarácii
premenných (v príkaze INTEGER). Vnútri procedúry sa s parametrami
pracuje rovnako ako s premennými.
Pole
Keď je potrebné uložiť do pamäte väčšie množstvo čísel, použije sa
pole. Pole sa vytvára (deklaruje) podobne ako obyčajná premenná, ale za
názov poľa sa do hranatých zátvoriek napíše počet prvkov poľa. Tento
počet nemusí byť konštanta, napríklad je možné, aby veľkosť poľa
závisela od parametra procedúry. K jednotlivým prvkom poľa sa pristupuje
napísaním názvu poľa a za ním v hranatých zátvorkách poradie prvku v
poli. Prvý prvok poľa je na nultom mieste! Počet prvkov v poli sa dá
zistiť funkciou LENGHT.
Je možné vytvárať viacrozmerné polia. Napríklad pole A[5][6] bude
obsahovať 30 prvkov usporiadaných do 5 riadkov a 6 stĺpcov. Funkcia
LENGHT(A) vráti hodnotu 5 a funkcia LENGHT(A[0]) vráti hodnotu 6. Príkaz
A[0][1]=8 priradí hodnotu 8 do prvku v prvom riadku a v druhom stĺpci v
poli A.
ASCII
Každý znak na klávesnici (ale nielen ten) je pre počítač reprezentovaný
istou konkrétnou číselnou hodnotou, kódom. Väčšinou sa používa ASCII
(American Standard Code for Information Interchange) kód, kde 8 bitov
vytvára 256 rôznych znakov (v binárnej sústave 28 = 256 v desiatkovej).
Prvých 32 znakov je obsadené špeciálnymi riadiacimi znakmi a horná
oblasť, nad 127, sa používa pre definovanie národných symbolov
(diakritika). Tak napríklad znak A má ASCII hodnotu 65, ale znak a má
ASCII hodnotu 97 (viď. program Ritkej.exe na CD-ROM prílohe v adresári
Pascal). Karel 3.2 využíva ASCII hodnoty v príkaze PAINT a vo funkcii
KEY.
PAINT 'a' vypíše znak a (zápis znaku medzi apostrofmi)
PAINT 97 tiež vypíše znak a (zápis ASCII hodnotou znaku)
INTEGER z deklarácia premennej z
DELAY -1 čakanie na stlačenie klávesy
z=KEY premennej z sa priradí ASCII hodnota stlačenej klávesy
Napr. ak sa stlačila šípka pre posun kurzora hore, premenná z bude mať
hodnotu 72 (viď. riešená úloha pisaci_stroj).
Riešené úlohy Karel 3.2
příkaz obrad opakuj 4 dokud není zeď dokud je místo polož čekej 20 konec krok konec vlevo konec konec
procedure e_obrad repeat 4 while not wall while is space put delay 20 end step end left end end
příkaz pyramida číslo i i=28; krok opakuj opakuj i maluj i čekej 20 krok konec když je západ id_sever_vych jinak id_sever_zap konec i=i-2 až i=0 domov konec
procedure e_pyramida integer i i=28; step repeat repeat i paint i delay 20 step end if is west e_id_sever_vych else e_id_sever_zap end i=i-2 until i=0 e_domov end příkaz id_sever_vych smer_sever krok vpravo krok; krok konec
procedure e_id_sever_vych e_smer_sever step right step; step end příkaz id_sever_zap smer_sever krok vlevo krok; krok konec
procedure e_id_sever_zap e_smer_sever step left step; step end příkaz smer_sever dokud není sever vlevo konec konec procedure e_smer_sever while not north left end end příkaz domov smer_sever opakuj 2 vlevo dokud není zeď krok čekej 20 konec konec vlevo konec
příkaz e_domov e_smer_sever repeat 2 left while not wall step delay 20 end end left end
příkaz opilec_1 číslo n_max, n n_max=3 opakuj n=náhoda(n_max) zvolit n případ 0 vlevo; test případ 1 vlevo; vlevo; test případ 2 vpravo; test konec konec konec
příkaz test číslo t_max, t t_max=3 t=náhoda(t_max)+1 opakuj t dokud je místo polož konec když není zeď krok jinak návrat konec konec konec
příkaz opilec_2 číslo n_max, n n_max=3 opakuj n=náhoda(n_max) zvolit n případ 0 vlevo; test případ 1 vlevo; vlevo; test případ 2 vpravo; test konec konec konec
příkaz test číslo t_max, t t_max=20 t=náhoda(t_max)+1 když t=1 když je místo polož konec konec když není zeď krok konec konec
příkaz cistic_1 číslo n_max, n n_max=3 opakuj n=náhoda(n_max) zvolit n případ 0 vlevo; test případ 1 vlevo; vlevo; test případ 2 vpravo; test konec konec konec
příkaz test dokud je značka zvedni konec když není zeď krok konec konec
příkaz cistic_2 číslo n_max, n n_max=3 opakuj n=náhoda(n_max) zvolit n případ 0 vlevo; test případ 1 vlevo; vlevo; test případ 2 vpravo; test konec konec konec
příkaz test číslo t_max, t t_max=4 t=náhoda(t_max)+1 opakuj t dokud je značka zvedni konec když není zeď krok jinak návrat konec konec když není zeď krok konec konec
příkaz pisaci_stroj // STABY HLAVNY PROGRAM /* END Koniec programu SIPKY Pohyb kurzora DELETE Vymazanie znaku ENTER Novy riadok TAB Zmazanie plochy */ číslo z // deklaracia premennej z=32 // ASCII kod medzery (vymaz) cls opakuj čekej -1 // Funkcia stlacenia klavesy z=klávesa zvolit z // Podmienka vetvenia (<case z of>) případ -75 // sipka vlavo id_vlevo případ -77 // sipka vpravo id_vpravo případ -72 // sipka hore id_hore případ -80 // sipka dole id_dole případ 13 // enter riadok případ -83 // delete del případ -79 // end návrat případ 9 // tab cls jinak // ina klavesa(else) pis(z) konec konec konec
příkaz id_vlevo // POSUN KARLA VLAVO vlevo; vlevo když je zeď // Test steny vlevo; vlevo; návrat // Vystup z podprogramu jinak krok; vlevo; vlevo konec konec
příkaz id_vpravo // POSUN KARLA VPRAVO když je zeď // Test steny návrat // Vystup z podprogramu (return) jinak krok konec konec příkaz id_hore // POSUN KARLA HORE vlevo když je zeď // Test steny vpravo; návrat // Vystup z podprogramu jinak krok; vpravo konec konec
příkaz id_dole // POSUN KARLA DOLE vpravo když je zeď // Test steny vlevo; návrat // Vystup z podprogramu jinak krok; vlevo konec konec
příkaz riadok // POSUN KARLA NA ZAC. NOVEHO RIADKU vpravo; když není zeď // Test na posledny riadok krok; vpravo jinak zacni; návrat // Vykona sa podprogram "zacni" a vystup konec dokud není zeď krok konec vpravo; vpravo konec
příkaz del // KAREL VYMAZE ZNAK maluj ' ' konec
příkaz zacni // KAREL IDE VLAVO HORE dokud není východ vlevo konec opakuj 2 vlevo dokud není zeď krok konec konec vlevo vlevo konec
příkaz cls // KAREL ZMAZE PLOCHU zacni opakuj 20 // 20 riadkov (<for i:=1 to 20 do>) dokud není zeď pis(32) // Medzera konec maluj ' ' // Znak v stlpci vpravo riadok konec konec
funkce pis(z) // KAREL PISE STLACENY ZNAK maluj (z) když není zeď // Testuje posun vpravo krok jinak riadok konec konec
Tradičný dowňák
|