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 aktuální čas - 4 prvky (h, min, s, ms) zobraz čas [14 28 32 564] seznam želv zobraz všechny [ž1 ž2 ž3 ž4 malá] seznam aktivních želv zobraz stránka1'aktivnínastránce [ž1] 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é: dosaď "a [2 3 6 8 11] Počet prvků seznamu piš počet :a 5 První prvek ze seznamu piš první :a 2 Poslední prvek ze seznamu piš poslední :a 11 Konkrétní prvek piš prvek 4 :a 8 Libovolný prvek ze seznamu pro libprvek [ž1 ž2 ž3][do 15] Výpis prvků seznamu opakuj počet :a [piš prvek poč :a] Přidávání prvků k seznamu Přidání prvku před seznam * zobraz vložprvní 7 :a [7 2 3 6 8 11] Přidání prvku za seznam ** 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 zobraz bezprvního :a [3 6 8 11 s] Odebrání dvou posledních prvků dosaď "a bezposledního bezposledního :a zobraz :a [2 3 6 8] Odebrání konkrétního prvku zobraz bezprvku 2 :a [2 6 8] Vytvoření seznamu dosaď "b [2 3] dosaď "c "kdo Seznam ze dvou prvků zobraz seznam "b "c zobraz seznam :b :c [b c] [[2 3] kdo] Věta seznam z prvků seznamů zobraz věta :b :c [2 3 kdo] Seznam více prvků zo (seznam 2 :b :c) [2 [2 3] kdo] Seznam z jednoho prvku zo (seznam 12) [12] 2 3 6 8 11 1
Další příkazy pro práci se seznamy nahraď zo nahraď 3 [a b c d] "w [a b w d] zamíchej zo zamíchej [1 2 3 4 5] [2 4 3 5 1] převrať zo převrať [Karel brečel] [brečel Karel] prvek? piš prvek? "bc [a bc] ano seznam? piš seznam? "koloběžka ne podrobnější popis syntaxe a použití najdete v nápovědě Imagine Počítání uvnitř seznamů místo jednoduchého zápisu pomocí znamének: zo 100*myš [-23200 34500] piš čas + [0 0 0 5] 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 [10000 20000 30000 40000 50000] piš součet čas bezposledního :a 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 ne piš první poslední :a s piš poslední bezposledního :a cibule zo vložposlední "ne bezposledního :a [česnek cibule ne] Vyčištění seznamu dosaď "a [] piš prázdný? :a ano piš počet :a 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 pro [ž1 ž2][piš poz] pro [ž1 ž2] [každá[piš poz]] 210-180 prokaždou [ž1 ž2][piš poz] 210-180 vypíše se pozice první aktivní želvy ž1 želvy jsou aktivní postupně, vypíše se pozice obou želv jiný zápis téhož příkazu 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 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]] 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 Čí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 prvek? neuznává [pole] jako svůj vstup Procedura prvek? očekává slovo jako svůj vstup 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č] 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 a1 a2 a3 a4 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] ] 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] 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