Komenskio Logo:
Programa Pamokos: Užsienio šalyse
 

Sąrašai. Vektoriai. Tekstas. Vėžliukų sąrašas. Jaunesni ir vyresni Vėžliukai.

Klasifikuojant tradiciškai Komenskio Logo kalba turi tris duomenų tipus: žodžiai, paveikslai, sąrašai. Pirmieji du gali būti laikomi elementariais vienetais, paskutinis – duomenų struktūrinimo mechanizmu.

Su žodžiais ir paveikslais (kaukėmis arba vaizdeliais) jau supažindinome pirmose pamokose, juos vartojome pateikiamuose projektuose. Atkreipiame dėmesį, kad skaičiai yra atskiras žodžių atvejis. Į žodžius ir paveikslus vėlgi galima žiūrėti kaip į struktūrinius vienetus: žodžius sudaro simboliai, paveikslus – kadrai, yra operacijų, leidžiančių išardyti ir vėl sujungti šiuos tipus. Iš žodžių bei paveikslų galima konstruoti sąrašus.

Sąrašai

Sąrašas Komenskio Logo kalboje – tai elementų (žodžių, paveikslų ar vėl sąrašų) seka, rašoma laužtiniuose skliaustuose. Sąrašo elementai vienas nuo kito skiriami tarpais. Sąraše žodžiai rašomi be kabučių. Pavyzdžiui:
[a b c]
[aš tu mes]
[Gyveno senis ir senutė]
[1999 2000 2001 2002]

Sąrašo elementams netaikomi jokie ribojimai. Taigi sąrašo elementai gali būti vėl sąrašai ir t.t. Pavyzdžiui: [tėvas motina [duktė sūnus]] yra trijų elementų sąrašas: pirmasis ir antrasis elementai – žodžiai tėvas, motina, o trečiasis elementas –sąrašas, turintis du elementus (duktė, sūnus). Tokia hierarchinė struktūra vertinga programuojant. Sąrašams apdoroti yra daug komandų, kurios visos labai reikalingos kuriant projektus. Dalį jų išvardysime. Santrumpa Rez. reiškia rezultatą.
 

Komanda

Paaiškinimas

Pavyzdys

be

grąžina argumentą be nurodytų elementų

parodyk be "A [L A B A S]
Rez.: [L B S]

be.pirmo

grąžina argumentą be pirmojo jo elemento

parodyk be.pirmo "SAULĖ
Rez.: AULĖ

be.paskutinio

grąžina argumentą be paskutiniojo elemento

parodyk be.paskutinio "SAULĖ
Rez.: SAUL

dalis

pateikia nurodytą argumento dalį

parodyk dalis [3 6] [N E J U O K A I]
Rez.: [J U O K A I]

nuo.nario

pateikia argumento dalį nuo nurodytos vietos

parodyk nuo.nario "V  [P O V A N D E N I N I S]
Rez.: [V A N D E N I N I S]

pirmas

pateikia pirmą nurodyto argumento elementą

parodyk pirmas [[1 7] [2 3] k]
Rez.: [1 7]

paskutinis

pateikia paskutinį nurodyto argumento elementą

parodyk paskutinis [[1 7] 3 k]
Rez.: k

pasirink

pateikia atsitiktinai pasirinktą argumento elementą

parodyk pasirink [[1 7] 3 k]
Rez.: k

dėk.pirmu

prie argumento pradžios prideda nurodytą elementą

parodyk dėk.pirmu "NE  "GALIMA
Rez.: NEGALIMA

dėk.paskutiniu

prie argumento pabaigos prideda nurodytą elementą

parodyk dėk.paskutiniu "m [1 k 5]
Rez.: [1 k 5 m]

keisk

argumento nurodyti nariai pakeičiami nurodytais elementais

parodyk keisk 3 "LAUMĖ  "KŠ
Rez.: LAKŠMĖ

kiek

pateikia argumente esančių elementų skaičių

parodyk kiek "JONAS
Rez.: 5

narys

pateikia nurodyto elemento eilės numerį argumente

parodyk narys "N "JONAS 
Rez.: 3

sumaišyk

grąžina argumentą, kurio nariai jau bus atsitiktinai sukeisti vietomis

parodyk sumaišyk "JONAS
Rez.: OAJNS

didesnis?

pateikia tiesa, jeigu pirmas argumentas yra didesnis už antrąjį, priešingu atveju pateikia melas. Lyginti galima skaičius, žodžius bei taškus (Rezultatas yra tiesa, jei, kai taškas1 = [a b], o 
taškas2 = [c d], funkcijų didesnis? a c ir didesnis? b d rezultatai yra tiesa. Priešingu atveju rezultatas yra melas.).

parodyk didesnis? "ONA "JONAS
Rez.: tiesa
Pastaba: ONA didesnis žodis už JONAS, kadangi O didesnis už J.

mažesnis?

pateikia tiesa, jeigu pirmas argumentas yra mažesnis už antrąjį, priešingu atveju pateikia melas

parodyk mažesnis? "ONA "JONAS
Rez.: melas

lygūs?

pateikia tiesa, jeigu abu argumentai yra lygūs (identiški), priešingu atveju pateikia melas

parodyk lygūs? [A [B C] ] [ [B C] A]
Rez.: melas

sąrašas?

pateikia tiesa, jeigu argumentas yra sąrašinė struktūra, priešingu atveju pateikia melas

parodyk sąrašas? [A B C]
Rez.: tiesa
parodyk sąrašas?[ ]
Rez.: tiesa
parodyk sąrašas? PIRMAS [A B C]
Rez.: melas
parodyk sąrašas? "Oho
Rez.: melas

narys?

pateikia tiesa, jeigu nurodytas elementas yra argumento narys, priešingu atveju pateikia melas

parodyk narys? "ABC [A AB ABC ABCD]
Rez.: tiesa
parodyk narys? "ABC [ [A AB ABC ABCD] ]
Rez.: melas
Pastaba:  pateiktas sąrašas turi tik vieną narį, būtent, sąrašą [A AB ABC ABCD]

gauk.sakinį

iš nurodytų elementų padaro sąrašą

parodyk gauk.sakinį [A B C] "D
Rez.: [A B C D]

gauk.sąrašą

į sąrašą sudeda nurodytus elementus

parodyk gauk.sąrašą [A B C] "D
Rez.: [ [A B C] D]

Vektoriai

Vektorius yra svarbi matematikos (ir fizikos) koncepcija. Išsamiau čia jų nenagrinėsime, tik atkreipsime dėmesį, kad Komenskio Logo kalba suteikia puikias galimybes darbui su vektoriais.

Jeigu turime kintamąjį A, kurio koordinatės (sąrašas) [20 50], tai vektoriumi laikoma kryptinga atkarpa, einanti iš taško [0 0] į tašką A (pav. 1):
 

 1 pav. 

Atidžiai panagrinėkite pavyzdį ir supraskite pagrindinius darbo su vektoriais principus:

? tebus "A [20 50]
? parodyk -:A
[-20 -50]
? parodyk -[20 50]
[-20 -50]
? tebus "B [35 10]
? parodyk 2*:B
[70 20]
? parodyk :A+:B
[55 60]
? parodyk :B+:A
[55 60]
? parodyk -:A-:B
[-55 -60]
 

2 pav. 

Tekstas

Komenskio Logo kalba turi daug komandų darbui su tekstu. Tekstas Vėžliuko lauke yra piešiamas, o jo pateikimas konstruojamas panaudojant sąrašines struktūras. Tekstą Vėžliuko lauke galima išdėstyti įvairiai – parašyti tiesia linija, apskritimu, stulpeliu ir kt.

Procedūra Stulpelis nurodytą tekstą užrašys stulpeliu, kur tekstas lygiuos pagal kairįjį kraštą:

tai stulpelis :tekstas
   jeigu tuščias? :tekstas [baik]
   piešk.tekstą pirmas :tekstas  ;užrašo pirmąjį teksto žodį
   eisim priekin dalis 2 teksto.dydis :tekstas  ;palieka teksto dydžio tarpą tarp eilučių
   stulpelis be.pirmo :tekstas
taškas
 

3 pav. 

Tai rekursinė procedūra. Procedūra deš.stulpelis tekstą irgi išdėsto stulpeliu, tik jis lygiuoja pagal dešinį kraštą. Pirmoji procedūra pasiruošia teksto piešimui:

tai deš.stulpelis :tekstas
   eisim
   deš.stulpelis1 did.plotis :tekstas 0 ~
                dalis 2 teksto.dydis :tekstas ~
                :tekstas
taškas

Antroji procedūra piešia tekstą:

tai deš.stulpelis1 :did.plotis :aukštis :tekstas
   jeigu tuščias? :tekstas [baik]
   tebūnie "p pirmas teksto.dydis pirmas :tekstas
   dešinėn 90 priekin :did.plotis - :p kairėn 90
   piešk.tekstą pirmas :tekstas
   kairėn 90 priekin :did.plotis - :p dešinėn 90
   atgal :aukštis
   deš.stulpelis1 :did.plotis :aukštis be.pirmo :tekstas
taškas

Tačiau šitokiam teksto išdėstymui reikia sužinoti ilgiausio tekste esančio žodžio ilgį, t. y. stačiakampio, kurį užims šis žodis, plotį:

tai did.plotis :tekstas :dydis
   jeigu tuščias? :tekstas [grąžink :dydis]
   tebūnie "šis pirmas teksto.dydis pirmas :tekstas
   jeigu :šis > :dydis ~
         [grąžink did.plotis be.pirmo :tekstas :šis] ~
         [grąžink did.plotis be.pirmo :tekstas :dydis]
taškas

Kartu užrašius abiejų stulpelių procedūras, gausime dvigubą stulpelį:

tai kartu
    stulpelis :tekstas
    es kr 90
    pr ( did.plotis :tekstas 0 ) + 10
    dš 90
    at dalis 2 teksto.dydis :tekstas
    deš.stulpelis :tekstas
taškas
 

4 pav. 

O dabar pabandykime teksto žodžius išdėstyti saulute:

tai saulutė :tekstas
   eisim
   saulutė1 :tekstas 360 / kiek :tekstas
taškas

Procedūra saulutė tik pasiruošia teksto piešimui.

tai saulutė1 :tekstas :kampas
   jeigu tuščias? :tekstas [baik]
   piešk.tekstą pirmas :tekstas
   priekin 15 kairėn :kampas
   saulutė1 be.pirmo :tekstas :kampas
taškas
 

5 pav.

Pabandykite tekstą išdėstyti kitokiais stulpeliais, saulutėm, ratu ar stačiakampiu. Jums reikia tiks susikurti kintamąjį :tekstas.

Vėžliukų sąrašas

Dažnai kuriant projektą prireikia vienu metu sukurti keletą, keliolika ar net keliasdešimt vėžliukų. Parašykime procedūrą Vėžliukų sąrašui sukurti, tame sąraše nurodant Vėžliuko vardą ir pradines jų koordinates. Tuomet kiekvieną Vėžliuką aprašo trys skaičiai, taigi argumentu nurodomo sąrašo nariai bus triženkliai skaičiai. Šitokių procedūrų galima parašyti labai daug, priklausomai kokias komandas vartosite.

tai kurk1 :sąrašas
   išdėstyk [[jie][kurk.vėžliuką pirmas :jie gauk.sakinį dalis 2 :jie dalis 3 :jie]] :sąrašas
   tik visi [rodykis]
taškas

Šiuo atveju komanda išdėstyk kintamajam jie priskiria vieną sąrašo elementą, t. y. triženklį skaičių, o komanda kurk.vėžliuką sukuria Vėžliuką, kurio vardas yra pirmasis skaičiaus skaitmuo, o antrasis ir trečiasis – atitinkamai x ir y koordinatės. Paskutinė procedūros eilutė padaro Vėžliukus matomais. Sukurti Vėžliukai nėra aktyvūs.

Pabandykim parašyti rekursinę procedūrą. Čia reiks tikrinti ar sąrašas dar ne tuščias (jeigu jau tuščias – padarom visus sukurtus Vėžliukus matomais), Priskyrimo komanda priskiriame pirmą sąrašo narį kintamajam jis ir tuo pačiu būdu kaip ir pirmojoje procedūroje sukuriame Vėžliuką. Tuomet kartojame procedūrą su sąrašu be pirmojo nario:

tai kurk2 :sąrašas
   jeigu tuščias? :sąrašas [tik visi [rodykis] baik]
   tebūnie "jis pirmas :sąrašas
   kurk.vėžliuką pirmas :jis gauk.sakinį dalis 2 :jis dalis 3 :jis
   kurk2 be.pirmo :sąrašas
taškas

Paskutinėje procedūroje kintamasis jis  sukuriamas vidinis (jo nebus objektų sąraše), o šiam kintamajam reikšmę priskiria komanda kiekvienam – kiekvienas sąrašo narys priskiriamas kintamajam jis ir įvykdomas Vėžliuko kūrimas, analogiškas pirmoms dviems procedūroms.

tai kurk3 :sąrašas
   vidinis "jis
   kiekvienam "jis :sąrašas [kurk.vėžliuką pirmas :jis gauk.sakinį dalis 2 :jis dalis 3 :jis]
   tik visi [rodykis]
taškas

Sąrašinės struktūros rašomas procedūras sutrumpina – pabandykit įsivaizduoti procedūrą, kuri kuria 50 Vėžliukų, o kintamo Vėžliukų skaičiaus procedūros sukurti ir nepavyktų nevartojant sąrašinių struktūrų.

Jaunesnis ir vyresnis

Kurdami Vėžliukus tikriausiai pastebėjote, kad jaunesni (vėliau sukurti) Vėžliukai dengia vyresnius. Kuriant sudėtingesnį projektą dažnai būna svarbu Vėžliuko amžius, o kartais jį norisi ir pakeisti. Siūlome kartu sukurti projektą, kur Vėžliuko amžių galima bus keisti pelės rodyklės spragtelėjimu. Tegul amžių keis eglutės žmogučio su rogutėm atžvilgiu. Taigi eglutės bus vyresnės ir jaunesnės už žmogutį. Pradine procedūra Startas pirmiausia pašalinkim visus Vėžliukus. Įsikelkim norimą Vėžliuko lauką ir sukurkim 9 Vėžliukus-eglutes. Pradžioje visos eglutės bus vyresnės už žmogutį.

Taigi, pirmiausia reikia susikurti eglutės ir žmogučio kaukes, o kad žmogutis gražiai judėtų, tai jam sukurkim net keletą kadrų:
 

6 pav.

tai Startas
   šalink.vėžliuką visi įkelk.vėžliuko.lauką "fonas vėžliuko.laukas
   kartok 9 [kurk.vėžliuką gauk.žodį "eglutė kartojimai [-180 0] ~
        + kartojimai * [80 0] ~
        tik gauk.žodį "strom1 kartojimai [imk.kaukę "eglutė rodykis]]
   tebūnie "vyresni visi                                 ;sukuriamas kintamasis vyresni, jo reikšmė – visų sukurtų eglučių sąrašas
   tebūnie "jaunesni []                                 ;sukuriamas kintamasis jaunesni, kol kas tuščias sąrašas
   kurk.vėžliuką "žmogutis [-220 0 90]       ;sukuriamas žmogutis, jis važinės tarp eglučių
   tik 1 [imk.kaukę :žmogeliukas ~
       naudosim.kadrus "tiesa keisk.kadrą 1 ~
       eisim rodykis]
   judesys
taškas

Taigi, turim sukūrę eile sustatytas eglutes ir prieš jas esantį žmogutį. Procedūra judesys liepia Vėžliukui judėti išilgai eglučių ir tikrina ar nėra spragtelėta kuri nors eglutė. Tai bus rekursinė procedūra, kurią vykdydamas Vėžliukas-žmogutis paeis vieną žingsnį ir patikrins, ar buvo paspaustas koks nors klavišas.
 
tai judesys
   jeigu paspausta? ~ 
        [rinkis kai.paspausta ~ 
        [27 [baik] ~ 
        0 [jeigu narys? paliestas gauk.sakinį :vyresni ~
        :jaunesni ~ 
        [keisk.amžių paliestas]]]] 
   tik "žmogutis [keisk.kadrą kadras + 2 priekin 5]
   lauk 50
   judesys
taškas

; tikrina ar yra paspaustas koks nors klavišas
; tikrina koks klavišas yra paspaustas
; jeigu Esc projektas sustabdomas
; jeigu buvo spragtelėta pele –
; tikrina ar tai Vėžliukas-eglutė
; ir tuomet keičia jos amžių
; žmogutis juda toliau

Procedūra keisk.amžių pakeičia spragtelėtos eglutės amžių.
 
tai keisk.amžių :spragteltas
   jeigu narys? :spragteltas :vyresni ~ 
      [tebus "vyresni be :spragteltas :vyresni ~ 
      tebus "jaunesni dėk.pirmu :spragteltas :jaunesni] ~ 
      [tebus "vyresni dėk.pirmu :spragteltas :vyresni ~ 
       tebus "jaunesni be :spragteltas :jaunesni]
   rikiuok ( gauk.sakinį :vyresni "žmogutis :jaunesni )
taškas

; tikrina ar spragtelta eglutė yra vyresnė
; jeigu taip, tai iš vyresnių sąrašo pašalinama spragtelta eglutė
; ir ji patalpinama į kintamojo jaunesni sąrašą
; priešingu atveju tas pats atliekama su jaunesne eglute

Įvykdykite projektą ir paspragsėkite ties eglutėm.
 

pav. 7

Paruošta pagal J. Aušraitės ir V. Dagienės pamokų ciklą Mokomės dirbti su Komenskio Logo.

Logo – kas tai? LogoWriter programa Naudingos nuorodos Metodinė medžiaga Moksleivių darbai
į svetainės pradžią
Laiškus su klausimais ir komentarais siųskite adresu: juraa@delfi.lt
Atnaujinta 2000 m. spalio 20 d.