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. |