Imagine – práce se seznamy (stručný manuál) Jiří Vaníček, 2008 (V materiálu byly použity příklady z přednášek prof. Kalaše, UK Bratislava)
Seznam jakákoliv data uzavřená do hranatých závorek (seznam čísel, slov, želv, věta, seznam seznamů) [úterý středa čtvrtek pátek sobota] [1 -3 5 2.33333] [ž1 ž2 Karel] [Jak se máte?] [[2 5][3 4][7 1.2][0 0]]
Některé funkce v Imagine pracují se seznamy přímo: pozice želvy - dvě souřadnice zobraz ž1'poz [232 -153] (příkl.: pozice želvy mezi 2 želvami každých 10 [poz! (ž2'poz + ž3'poz)/2] ) pozice myši piš myš -134 312 zobraz čas [14 28 32 564] aktuální čas - 4 prvky (h, min, s, ms) seznam želv zobraz všechny [ž1 ž2 ž3 ž4 malá] zobraz stránka1'aktivnínastránce [ž1] seznam aktivních želv
Přístup k datům v seznamu
(následující příklady na sebe navazují, obsah :a se mění)
Seznam může být obsahem proměnné: Počet prvků seznamu První prvek ze seznamu Poslední prvek ze seznamu Konkrétní prvek Libovolný prvek ze seznamu Výpis prvků seznamu
dosaď "a [2 3 6 8 11] piš počet :a piš první :a piš poslední :a piš prvek 4 :a pro libprvek [ž1 ž2 ž3][do 15] opakuj počet :a [piš prvek poč :a]
Přidávání prvků k seznamu
5 2 11 8 2 3 6 8 11
Přidání prvku před seznam * Přidání prvku za seznam **
zobraz vložprvní 7 :a [7 2 3 6 8 11] dosaď "a vložposlední "s :a zobraz :a [2 3 6 8 11 s] (všimněte si, že v řádku * se obsah proměnné nezmění, zatímco v ** se změní).
Odebírání prvků seznamu Odebrání prvního prvku seznamu Odebrání dvou posledních prvků Odebrání konkrétního prvku
zobraz bezprvního :a [3 6 8 11 s] dosaď "a bezposledního bezposledního :a zobraz :a [2 3 6 8] zobraz bezprvku 2 :a [2 6 8]
Vytvoření seznamu Seznam ze dvou prvků Věta – seznam z prvků seznamů Seznam více prvků Seznam z jednoho prvku
dosaď "b [2 3] dosaď "c "kdo zobraz seznam "b "c [b c] zobraz seznam :b :c [[2 3] kdo] zobraz věta :b :c [2 3 kdo] zo (seznam 2 :b :c) [2 [2 3] kdo] zo (seznam 12) [12]
1
Další příkazy pro práci se seznamy nahraď zamíchej převrať prvek? seznam?
zo nahraď 3 [a b c d] "w zo zamíchej [1 2 3 4 5] zo převrať [Karel brečel] piš prvek? "bc [a bc] piš seznam? "koloběžka podrobnější popis syntaxe a použití najdete v nápovědě Imagine
[a b w d] [2 4 3 5 1] [brečel Karel] ano ne
Počítání uvnitř seznamů místo jednoduchého zápisu pomocí znamének: zo 100*myš piš čas + [0 0 0 5]
[-23200 34500] 16 13 09 981
uvnitř složitějších příkazů se používají příkazy součet, součin, rozdíl, podíl: dosaď "a [1 2 3 4 5] opakuj 4 [dosaď "a součin 10 :a] zo :a piš součet čas bezposledního :a
[10000 20000 30000 40000 50000] 10016 20013 30055 40657
Složitější příklady Hádanky (uhodněte, co Imagine vypíše na uvedené příkazy – nebo zkuste porozumět výpisům) piš prvek? "b [a bc] ne b není samostatným prvkem seznamu piš prvek? "b poslední [a bc] ano dotaz, zda b je prvkem posledního prvku seznamu dosaď "a [česnek cibule skořice] piš prvek? "česnek bezprvního :a piš první poslední :a piš poslední bezposledního :a zo vložposlední "ne bezposledního :a
ne s cibule [česnek cibule ne]
Vyčištění seznamu dosaď "a [] piš prázdný? :a piš počet :a
ano 0
Ovládání více želv Příkazy každá, proKaždou postupně procházejí seznamy aktivních želv. Viz příklady: odteď všechny nyní budou poslouchat příkazy všechny želvy směr! směremK myš natočí se všechny stejným směrem, podle nastavení první aktivní želvy (obr. 1) každá [směr! směremK myš] postupně je aktivní vždy jen jedna želva, všechny se natočí k myši (obr. 2)
obr. 1
obr. 2 vypíše se pozice první aktivní želvy ž1
pro [ž1 ž2][piš poz] -137 112
pro [ž1 ž2] [každá[piš poz]]
želvy jsou aktivní postupně, vypíše se pozice obou želv
-137 112 210 -180
proKaždou [ž1 ž2][piš poz]
jiný zápis téhož příkazu
-137 112 210 -180
2
Postupné vkládání souřadnice myši do seznamu každých 100 [dosaď "a vložposlední myš :a] zobraz :a [[20 47][-1 120][31 90][121 -65] ...] pd opakuj počet :a [poz! prvek poč :a] (želva obkreslí čáru ze souřadnic v seznamu) opakuj počet :a [poz! seznam první :a součin -1 poslední :a] (želva nakreslí čáru souměrnou s původní čarou podle osy x)
Seřazení želv do řady dosad "sez.želv stránka1'aktivníNaStránce zobraz :sez.želv [ž1 ž2 ž3 ž4 ž5 ž6 ž7] opakuj 7 [pro prvek poč :sez.želv [poz! seznam 35*poč 0]] (želvy se pravidelně rozmístí po ose x s rozestupem 35)
Stopky obsah proměnné, do které se dosazuje dosaď "startčas čas [15 32 52 765] dosaď "stopčas čas [15 33 06 954] dosad "x rozdíl :stopčas :startčas [0 1 -46 189] Oprava odečteného času: když prvek 3 :x < 0 [dosad "x nahrad 3 :x prvek 3 :x + 60 dosad "x nahrad 2 prvek 2 :x - 1] zobraz :x [0 0 14 189] piš (věta [Naměřil se čas] prvek 3 :x [sekund a ] prvek 4 :x [setin]) Naměřil se čas 9 sekund a 671 setin sekundy
Tvar želvy vytvořený jako seznam příkazů ke kreslení Příklad: tvar želvy jako obdélník od počátku ke kurzoru myši ž1'tvar! ![opakuj 2 [ do (poslední myš) vp 90 do (první myš) vp 90]]
Hromadná úprava prvků seznamu Definujeme operaci, jejímž vstupem je seznam čísel :sez. Výslednou hodnotou bude týž seznam, ale každé číslo bude zvětšené o 5. Pomocí opakování: opakuj počet :sez [dosaď "sez nahraď poč :sez součet prvek poč :sez 5] (každý prvek je postupně nahrazen součtem sebe sama a čísla 5) Pomocí rekurze: příkaz přidej5 :sez když prázdný? :sez [výsledek []] výsledek vložprvní 5 + první :sez přidej5 bezprvního :sez konec Definujeme proceduru, jejímž vstupem je seznam čísel :sez. Výslednou hodnotou bude seznam pouze těch z těchto čísel, která jsou menší než 20. příkaz menší.20 :sez dosaď "výsl [] opakuj počet :sez [když prvek poč :sez > 20 [dosaď "výsl vložposlední prvek poč :sez :výsl]] konec
Slova jsou seznamy písmen Základní práce se slovy je stejná jako se seznamy piš počet "norek 5 piš bezprvku 2 "Ostrava Otrava piš věta [Vojta ze mlýna][vedl krávu na trh.] Vojta ze mlýna vedl krávu na trh. Při použití více parametrů, než je předepsáno, se použijí kulaté závorky. dosaď "x [vedl krávu na trh] piš (věta [Vojta ze mlýna] :x [a chytil u splavu chrousta.]) Vojta ze mlýna vedl krávu na trh a chytil u splavu chrousta.
3
Práce s textovým polem Textové pole změní seznam v řetězec znaků, který jím zůstane, i když je z textového pole přemínśtěn do proměnné. dosad "verš [[pole][jsou už][dávno holá]] piš počet :verš 3 piš prvek 3 :verš dávno holá text1’hodnota! :verš piš počet text1 31 piš prvek 3 text1 p dosad "verš text1 piš počet :verš 31 piš prvek 3 :verš p piš prvek? "pole text1 ano piš prvek? [pole] text1 prvek? neuznává [pole] jako svůj vstup Procedura prvek? očekává slovo jako svůj vstup
Čísla v textovém poli Čísla jsou chápána jako řetězec znaků (při použití nástrojů pro práci se seznamy). dosaď "souř [100 16] piš 2*prvek 1 :souř 200 text1’hodnota! :souř piš počet text1 8 piš 2*prvek 2 text1 2 dosaď "souř text1 piš počet :souř 8 Zatímco před vložením do textového pole se obsah proměnné souř choval jako dvouprvkový, v textovém poli je prvkem každý jeho znak. text1’hodnota! bezprvního bezposledního text1
Sestavení názvu proměnné uvnitř cyklu – příkazy slovo a obsah Chceme vypsat obsah proměnných :a1, :a2, :a3, :a4 dosad "a1 "Svatý dosaď "a2 "Jan dosaď "a3 "nad dosaď "a4 "Malší opakuj 4 [piš slovo "a poč]
a1 a2 a3 a4
opakuj 4 [piš obsah slovo "a poč]
Svatý Jan nad Malší
Komentář k posledním dvěma řádkům příkazů: funkce slovo sestaví název proměnné podle aktuální hodnoty počítadla, tedy: "a1, "a2 …, funkce obsah vrátí obsah proměnné s příslušným názvem, tedy obsah proměnné :a1 ... obsah je ekvivalent : piš :a je totéž jako piš obsah
"a
Sestavení názvu želvy dosaď "a 3 pro slovo "ž :a [do 100]
leze pouze želva ž3
Oslovování více želv opakuj počet [ž1 ž2 ž3 ž4] [pro slovo "ž poč [tvar! "abeceda záběr! poč]] (každá želva převezme tvar písmena, jehož pořadí v abecedě odpovídá číslu v jejím jméně)
Záběry želv podle slova Definujeme proceduru, v níž želvy převezmou tvary písmen abecedy podle znaků slova – parametru :vstup (slovo je psáno velkými písmeny).
4
Předpokládáme, že máme vytvořen dostatek želv vhodně seřazených, všechny s načteným tvarem "abeceda se záběry od A do Z (bez znaků s diakritikou, bez ch). U všech želv je nastaveno určování záběrů (je vypnuto automatické nastavení záběru podle směru natočení želvy). příkaz oživlé.slovo :vstup opakuj počet :vstup [ pro slovo "ž poč [záběr! rozdíl kódznaku prvek poč :vstup 64] ] konec Na příkaz oživlé.slovo "CHLAP
se změní tvar želv:
Vysvětlivky: kódznaku zjistí ASCII kód znaku ze seznamu; od něho se odečte 64 (znak A má kód 65 a tomu odpovídá 1. záběr tvaru "abeceda).
Tatáž úloha pro celou větu Želvy se budou postupně měnit ve slova věty. příkaz oživlá.věta :vstupní.věta opakuj počet :vstupní.věta [oživlé.slovo prvek poč :vstupní.věta čekej 2000] konec Vstupním parametrem procedury oživlé.slovo jsou postupně jednotlivá slova vstupní věty. Příklad volání procedury z příkazového řádku: oživlá.věta [Měsíc v úplňku svítil přes záclony na tygra v knize.]
5