Kraps

Loendid mängivad väga olulist rolli kõikides programmeerimiskeeltes. Tegemist on lihtsamate andmekogumitega, mida paljudes programmeerimiskeeltes nimetakse ka ühemõõtmelisteks massiivideks. Võrreldes traditsiooniliste tekstipõhiste programmeerimiskeeltega on Scratchis loendite kasutamises teatud iseärasused, kuid loendite olemus ja kasutamise üldised põhimõtted on samad.

 

Loendite käsitlemine Scratchis

Loendi olemus ja selle loomine

Loend (List) on järjestatud mäluväljade (muutujate) kogum, mis tähistatakse ühe nimega. Loendi elementidele viidatakse nime ja indeksi (järjenumbri) abil. Loendi üheks analoogiks võiks olla näiteks tabeli tulp (veerg). Näiteks võib allpool toodud statistiliste andmete tabeli iga tulpa vaadelda loendina. Loendiks võiks olla tulp Pikkus, sellele võib Scratch viidata taoliselt add- loendile lisatakse muutuja L väärtus. Selle loendi elementidele saab viidata järgmiselt:
liikmed - elementide järjenumbrid (indeksid) on määratud konstantide abil, liige_i- indeks on esitatud muutuja i abil. Tekstipõhistes programmeerimiskeeltes ja algoritmides viited elementidele esitatakse sõltuvalt keelest kujul: Pikkus(3), Pikkus(i) või Pikkus[3], Pikkus[i].

Meeskond: Torm

Jrn  Eesnimi   Perenimi Sünniaasta Pikkus Kaal  …
1   Rein   Aavik 1990 192 76  
2   Andres   Heinsoo 1991 186 69  
3   Rasmus   Kasemets 1990 190 77  
4   Kristjan   Kuuspakk 1989 179 65  
5   Markus   Merisoo 1992 181 70  
6   Paul   Puusepp 1991 194 81  
 …  …  
Käsuga Loo loend luuakse Scratchis tühi loend. Kasutajalt küsitakse loendi nimi ja skoop. Loendi nime valimisel võib lähtuda samadest kriteeriumidest nagu muutujate puhul. Nii nagu muutujad, võivad ka loendid olla globaalsed või lokaalsed. Laval tekib loendi tühi monitor ning süsteemis fikseeritakse loendi nimi ja skoop. Koos esimese loendiga ilmuvad ka käsuplokid tegevuste täitmiseks loendite ja loendite elementidega: lisamine, eemaldamine, sisestamine ja asendamine.
Loendi_monitorid.bmploo  

Loendi elemente saab lisada, muuta ja eemalda ka nö „käsitsi“ ning sageli nii ka toimitakse. Alustades tühjast monitorist lisatakse järjest elemente, vajadusel ka parandades (muutes) ja eemaldades neid. Lisamiseks klõpsata „+“ monitori alumises servas. Ilmub tühi väli, kuhu saab sisestada väärtuse ning see salvestatakse automaatselt arvuti mälus antud loendile eraldatud piirkonnas. Elementide numeratsioon algab alati ühest ja suureneb sammuga üks. Olemasoleva elemendi muutmiseks aktiveeritakse see hiireklõpsuga ning muudetakse väärtust või sisestatakse uus. Kui klõpsata aktiivse elemendi väljas olevat ristikest, eemaldatakse element. Loendi elemendid saab importida tekstifailist ja eksportida tekstifaili. Vastavad käsud ilmuvad, kui teha paremklõps loendi monitoril.

Loendi ja selle elementide omadused ning meetodid

loe_klassinglskeelses variandis on plokk L_nr
Loendi nimest ja skoobist oli juttu eespool. Loendi pikkus on elementide arv loendis. Tegemist võib olla muutuva suurusega, sest elemente saab lisada ja eemaldada. Loend võib olla ka tühi, siis on pikkus 0.
Loendite loomine ja eemaldamine saab toimuda ainult projekti loomise faasis. Programmi täitmise ajal neid tegevusi täita ei saa.
 Programselt saab lisada elemente loendi lõppu, panna vahele ning eemaldada.   Vastavad käsuplo-kid on toodud allpool olevas tabelis

Loendi element vastab oma olemuselt muutujale – tegemist on mäluväljaga. Oluliseks erinevuseks on, et loendi elementidel ei ole nimesid, neile vastab järjenumber, mis määrab elemendi asukoha loendis. Elemendi väärtuseks võib olla arv, tekst, tõeväärtus või objekti (sprait, heliklipp, kostüüm) nimi, st loendite elemente saab (nagu muutujaidki) kasutada ka viitamiseks objektidele.  

Käsuplokid tegevuste määramiseks loendite elementidega ja loenditega

NB! Plokkide eestikeelne tekst on muutmisel!

Käsuplokk

Selgitus

Lisab elemendi (väärtuse) loendi lõppu. Loend esitatakse nime abil. Lisatav element võib olla esitatud avaldisena.

Eemaldab ühe või kõik väärtused loendist. Loend esitatakse nime abil. Elemendi määrab järjenumber; võib ka valida: 1, viimane, kõik.

Sisestab (paneb vahele) elemendi antud kohale loendis. Võib anda järjenumbri või valida menüüst: 1, viimane, mõni.

loend_asenda.gif

Asendab antud numbriga elemendi loendis avaldise väärtusega. Võib anda järjenumbri  või valida menüüst: 1, viimane, mõni.

Viitab antud numbriga elemendile loendis. Võib anda järjenumbri või valida menüüst: 1, viimane, mõni.

loendi_pikkus.gif

Elementide arv loendis.

loend_sisaldab.gif

Tagastab väärtuse tõene, kui loend sisaldab elementi, mis on võrdne avaldise väärtusega

loe_kuva Kuvab loendi näidiku
peida Peidab loendi näidiku

Väärtuse omistamine loendi olemasolevale elemendile (st. väärtuste muutmine programmi täitmisel) toimub plokiga [asenda ...], mis vastab omistamiskäsule [võta muutuja = avaldis]

Mõned näited

NB! Loendite plokkide eestikeelne tekst võib tulevikus muutuda

  Näide„Keele test“


Klipis on realiseeritud kaks ülesannet "Keele test" (käivitamise "Roheline Lipp") ja "Tõlkimine" (vt allpool, käivitamine "Tühik")
Programm "Keele test" kuvab järjest eestikeelseid sõnu. Kasutaja peab sisestama nende vasteid inglise keeles. Programm kontrollib vastuseid, teeb kindlaks õigete vastuste arvu ja protsendi.
Kahes loendis on sõnad eesti ja inglise keeles (sama tähendusega sõnad on sama järjenumbriga). Loendid on juba loodud näiteks „käsitsi“, nende nimedeks on eesti ja inglise. Elementide (sõnade) arv loendites võib muutuda; loendite pikkused on muidugi võrdsed.
loomad

Andmed
Loendid:
  eesti (sõnu), inglise (sõnu)
Muutujad:
  sõnu – sõnade arv
  õigeid – õigete vastuste arv
  vastus – kasutaja vastus
  nr – elemendi järjenumber
  protsent – õigete protsent

 

Keele test. Algoritm
sõnu = eesti.pikkus
õigeid = 0
nr = 1
kordus sõnu korda
    kuva eesti(nr)
    loe vastus
    kui vastus = inglise(nr)  siis
         õigeid = õigeid +1
    muidu
         kuva „Vale!"
    lõpp kui
    nr = nr + 1
lõpp kordus
protsent = õigeid  / sõnu * 100

keel1

Programm teeb kindlaks elementide (sõnade) arvu loendites, kasutades loendi eesti omadust pikkus, ning omistab selle muutujale sõnu. Seejärel omistatakse algväärtused muutujatele õigeid ja nr. Korduses kuvatakse järjest sõnu loendist eesti, kasutades viitamiseks elementidele indeksit (muutujat) nr. Kasutaja vastust võrreldakse sama numbriga sõnaga loendis inglise. Kui vastus on õige, suurendatakse muutuja õigeid väärtust, vastupidisel juhul kuvatakse teade „Vale!“. Korduse lõpus suurendatakse muutuja nr väärtust ühe võrra, et järgmisel kordamisel viidata järgmisele elemendile. Kui kõik sõnad on läbitud, leitakse õigete vastuste protsent.
NB! Algoritmides kasutatakse viitamiseks loendi elementidele konstruktsiooni nimi(indeks), kus nimi on loendi nimi ja indeks on elemendi järjenumber: eesti(nr), inglise(nr).
Analoogset lähenemisviisi võib kasutada suvaliste testide ja viktoriinide koostamiseks. Ühes loendis on küsimused, teises õiged vastused. Programm kuvab järjest küsimusi esimesest loendist, loeb kasutaja vastuseid ja võrdleb teises loendis olevate vastustega.

Näide „Tõlkimine“

Rakendus tõlgib sõnu inglise keelest eesti keelde. Programm loeb inglisekeelse sõna ja kuvab selle vaste eesti keeles, kui inglisekeelne sõna on sõnastikus olemas. Kasutatakse samu loendeid eesti ja inglise, mis eelmises näites.


Muutujad
n  – elementide arv loendites,
k  – elemendi järjenumber (indeks),
sõna  – sõna inglise keeles

Tõlkimine. Algoritm
n = inglise.pikkus
k = 1
loe sõna
kordus n korda
   kui sõna = inglise (ksiis
         kuva „See on ” & eesti (k)
         stopp
    lõpp kui
    k = k + 1
lõpp kordus
kuva „Sellist sõna ei ole!”

tolge1

Programm loeb inglisekeelse sõna ja omistab selle muutujale sona. Seda otsitakse loendist inglise, võrreldes elemente küsitud sõnaga alates esimesest ja võimalik, et lõpuni. Kui sõna leitakse, kuvatakse eestikeelne vaste ja skripti töö katkestatakse. Kui sõna ei leita, lõpeb kordus ja kuvatakse teade „Seda sõna sõnastikus ei ole!“
Näide demonstreerib loendi elementide järjestikust töötlemist võimaliku katkestusega. Tegemist on üsna levinud ülesandega: etteantud väärtuse otsimisega loendis (massiivis). Toodud lahendus ei ole eriti hea. Otsimiseks oleks parem kasutada eraldi skripti.

Dialoogid, vestlused ja koomiksid

Vestlus.bmp

Võrdlemisi sarnaselt eelmiste näidetega võib organiseerida mitmesuguseid dialooge, vestlusi jmt.
Ühes loendis on ühe tegelase jutt, teises partneri jutt. Vestluse sisu ja pikkus võib olla suvaline.
Toodud skeemi kohaselt mängib üks tegelastest siin nö juhtrolli, kes alustab vestlust ja kelle skriptis on kordus loenduri (järjenumbri) muut-miseks, mida kasutatakse lausete valimiseks loenditest. Pärast esimese tegelase iga lause kuvamist saadetakse teade teisele tegelasele, kelle skriptis lastakse kuvada sama numbriga tekst tema loendist.
Jutuga võib siduda ka mitmesuguseid tegevusi.  

Vestlus_skript.gif

Ülevaate saamiseks taolistest rakendustest võiks tutvuda projektidega Kraps_koolis ja Vestlus_tiigriga

Loendite elementide loomine programmiga

Enne kui skripti saab kasutada loendi elementide loomiseks, peab loend olema loodud käsuga Tee loend ning peab teada olema loendi nimi.

Loendi elementide sisestamine klaviatuurilt

loend_loo.gif

Varem loodud loendisse saab elemente (nii arve kui tekste) sisestada klaviatuurilt.
Kõrval on toodud üks võimalikest skeemidest. Seda saab kohandada vastavalt oma rakenduse vajadustele. Eeskätt puudutab see loendi nime, mille võib välja vahetada.
Skript küsib elementide arvu n. Eemaldatakse loendi V kõik elemendid. Edasi järjest küsitatakse ja loetakse elemente. Igal küsimisel väljastatakse teade „Element k“, kus k on elemendi järjenumber.

Loendi loomine juhuarvudest

loend_tee.gif

Algoritmide kontrollimiseks on sageli vaja teatud andmete kogumeid. Neid saab mugavalt luua juhuarvudest.
Kõigepealt küsitatakse elementide arvu loendis ja omis­tatakse see muutujale n.
Seejärel küsitakse arvude minimaalne ja maksimaalne suurus; kasutaja antud väärtused omistatakse vastavalt muutujatele min ja max.
Korduses genereeritakse järjest juhuslikke arve vahemi­kus min … max ning lisatakse need loendi lõppu.


Loendi positiivsete elementide summa ja keskmine

Rakendus demonstreerib programmi tööd loendi positiivsete elementide summa ja aritmeetilise keskmise leidmisel. Kasutaja saab valida liuguriga elementide arvu loendis (n) ja lasta luua selle elemendid juhuslikest arvudest, klõpsates nuppu Tee vektor. Enne täitmist saab loendi elemente muuta, lisada ja eemaldada. Kõpsates nuppu Arvuta, saab lasta arvutada summa ja keskmise ilma tegevuste visualiseerimiseta. Nupp Näita demontreerid sammhaaval täitmist. Muutuja paus väärtusega (0...5) saab reguleerida täitmise kiirust. Muutuja heli väärtus (1 või 0), määrab, kas korduses heli on või ei ole. See samuti mõjutab töö kiirust.

 

Skriptis kasutatavad andmed ja algoritm ning skripti pilt.


Andmed
  V – antud loend
   n – elementide arv loendis
   i  – elemendi järjenumber
   S – pos. elementide summa
   k - pos. elementide arv
   kesk – aritmeetiline keskmine
Muutuja S algväärtuseks võetakse 0, muutuja n väärtuseks elementide arv loendis. Indeksi i väärtust muudetakse järjest ühe võrra. Kui element numriga i on suurem nullist, liidetakse see S-le ja k väärtust suurendatakse ühe võrra.

skript  Pos_kesk
n = V.pikkus
S = 0
k = 0
i = 1
kordus n korda
   kui V(i) > 0 siis
     S = S + V(i)
     k = k + 1
   lõpp kui
   i = i + 1
lõpp kordus
kesk = S / n

pos_kes

Maksimaalne element loendis ja selle järjenumber

Rakendus demonstreerib programmi (nupp Scratch) või algoritmi (Algo) tööd loendi maksimaale elementide ja selle järjenumbri (indeksi) leidmisel. Kasutaja saab valida liuguriga elementide arvu loendis (n) ja lasta luua selle elemendid juhuslikest arvudest, klõpsates nuppu Tee loend. Enne täitmist saab loendi elemente muuta, lisada ja eemaldada. Muutuja paus väärtusega (0...5) saab reguleerida täitmise kiirust. Muutuja heli väärtus (1 või 0), määrab, kas heli on või ei ole. See samuti mõjutab töö kiirust.

 

Andmed
  V – antud loend
   n – elementide arv loendis
   k  – järjenumber
   max – maksimaalne element
   nr – maks. elemendi järjenumber
Muutuja max algväärtuseks võetakse loendi esimene element, nr algväärtuseks on 1. Loendi elemente võrreldakse järjest max jooksva väärtusega; kui mõni element osutub suuremaks, võetakse see uueks maks väärtuseks ja jäätakse meelde ka järjenumber.

protseduur  Max_nr
n = V.pikkus
max  = V(1)
nr = 1
k = 1
kordus n korda
    kui V(k) > max siis
        max =V(k)
        nr =
     lõpp kui
     k = k + 1  
lõpp kordus

max

Sorteerimine

Sorteerimine seisneb väärtuse järjestamises kasvavalt või kahanevalt. Enamasti sorteeritakse kasvavas järjestuses, kuid põhimõttelist vahet siin ei ole. Reeglina toimub sorteerimine samas loendis (massiivis). Sorteerimine leiab väga sageli kasutamist andmetöötluses. Selleks on loodud palju erinevaid meetodeid ja algoritme, mille täitmise ajas võivad olla väga suured erinevused.

Jadasortimine

Siin kasutatakse ühte kõige lihtsamat algoritmi nn jadasorteerimist, mis on suurte loendite (n>1000) korral väga aeglane. Praegu meetod illusrerib eeskätt sorteerimise põhimõttet.

Jadasortimine. Andmed

V – loend, mille elemente sorteeritakse (n väärtust).
n – elementide arv loendis
i, j – indeksid
abi – abimuutuja, kasutatakse vahetamisel
Iga elementi, alates esime­sest kuni eelviimaseni, võrrel­dakse kõikide järgneva­tega. Kui mõni neist on jooksvast elemendist väiksem, vahe­tatakse selle väärtus jooksva ele­mendiga.

Jadasortimine. Algoritm

i = 1
kordus n-1 korda
    j = i + 1
    kordus n - i korda
       kui V(j) < V(i) siis
          abi = V(i)
          V(i) = V(j)
          V(j) = abi
       lõpp kui
       j = j + 1
    lõpp kordus
    i = i + 1
lõpp kordus

jadasort

Algoritmi täitmisel toimub ca n2 võrdlust, vahetuste arv sõltub andmete sorteerituse astmest. Taoliste algoritmide kohta öeldakse, et nende keerukus on n2. Elementide arvu kasvamisel n korda, suureneb aeg n2 korda. Näiteks, kui elementide arv suureneb 10 korda, suureneb täitmise aeg 100 korda!

Vaadake täitmise demot

Valiksortimine minimaalse elemendi valimisega

Muudetakse indeksi i väärtust vahemikus 1 kuni n - 1, iga i korral leitakse minimaalne element vektori osas i kuni n ja vahetatakse see elemendiga i.
Keerukus n2, 2-3 korda kiirem kui mullsortimine.

valik

protseduur Sort_Min(V, n)
 kordus i = 1 kuni n - 1
    min = V(i)
    k = i
    kordus j = i + 1 kuni n
       kui V(j) < min siis
          min = V(j)
          k = j
       lõpp kui
    lõpp kordus
    V(k) = V(i)
    V(i) = min
 lõpp kordus

void sordi_min(int V[], int n) // C
{
 int min, k;
 for (int i = 1; i <= n-1; i++)
 {
 min = V[i]; k = i;
 for (int j = i+1; j <= n; j++)
 if (V[j] < min)
 {min = V[j]
 k = j; }
 V[k]= V[i];
 V[i] = min;
 }
}