12 - Premenné v podprogramoch

Zatiaľ sme premenné využívali hlavne v jednoduchých programoch bez podprogramov. V podprogramoch fungujú premenné trošku inak a pozrieme sa teraz na to ako.

Začneme ale rozcvičkou.

Úloha 1

Vytvorte jednoduchý skeč, ešte bez setup a draw, ktorý na náhodné miesto na čiernej obrazovke vykreslí žltú tvár:

Úloha 2

Rozdeľte kód svojho programu do podprogramov setup a draw, aby skeč kreslil tvár na náhodné miesto neustále:

Možno vám to nepôjde hneď. Prídte na to, čo patrí do jedného podprogramu a čo do druhého.

Úloha 3

Vytvorte nový skeč, ktorý bude mať podprogramy setup aj draw aj mouseClicked. Hneď v prvom riadku programu zadefinujte premennú x a priraďte jej hodnotu 100. Takto:

int x = 100;

void setup()
{  
}

void mouseClicked()
{ 
}

void draw()
{
}

Doplňte program tak, aby pri kliknutí do okna vypísal program hodnotu premennej x takto:

Podla mysi je x = 100

Úloha 2

Presuňte vytvorenie premennej x z prvého riadku programu dovnútra podprogramu setup:



void setup()
{  
    int x = 100;
}

Processing nám hneď podčiarkne jedno aj druhé x a niečo sa mu nepáči. Prejdite myšou na prvé x a pozrite si chybovú hlášku:

V podprograme setup nám počítač hlási, že premenná x nie je nikde použitá. Ale ako to, veď ju používame v mouseClicked?

Pozrime sa na chybovú hlášku v mouseClicked:

V podprograme mouseClicked zase počítač hlási, že premenná x neexistuje. Ale ako to, veď ju definujeme v podprograme setup?

Premenná zadefinovaná v jednom podprograme neexistuje v druhom podprograme. Podprogram je uzavretý svet a čo sa vytvorí v ňom, to neprekračuje jeho hranice. Premenné, ktoré vytvoríme v podprograme, patria iba jemu.

Lokálna a globálna premenná

Premenné, ktoré sú zadefinované v podprograme voláme lokálne. Existujú len v tom podprograme, v ktorom boli zadefinované.

Toto je lokálna premenná x:

void setup()
{  
    int x = 100;
}

Je lokálna pre podprogram setup, existuje len v ňom a iné podprogramy ju nemôžu používať. Preto nám podprogram mouseClicked hlásil chybu, že premenná x neexistuje.

A toto je globálna premenná x:

int x = 100;

void setup()
{  
}

Je globálna v celom programe, vrátane podrogramov. Vie ju používať každý podprogram.

Úloha 4

Vyrobíme si počítadlo kliknutí. Vytvorte nový skeč s globálnou premennou kliky, ktorá má hodnotu 0. V podprograme mouseClicked ju dajte vypísať v takejto podobe:

Klikli ste 0 krat

Toto je samozrejme nezmysel, pretože aby počítadlo fungovalo, musíme ho pri každom kliknutí zvýšiť o 1. To sme ešte nerobili a robí sa to takto. Pozrite si prvý riadok v podprograme:

void mouseClicked()
{ 
  kliky = kliky + 1;
  println("Klikli ste", kliky, "krat");
}

Zvyšovanie premennej o 1 je veľmi častá vec. Zápis v tvare premenna=premenna+1 ešte uvidíte veľa krát.

Čo by sa stalo, keby bolo poradie príkazov v podprograme mouseClicked opačné? Najprv by bol println a potom by bolo zvýšenie počítadla o 1. Bude výstup iný? A prečo? Vyskúšajte.

Úloha 5

Doplňte program o novú globálnu premennú tuky. Napíšte podprogram keyPressed tak, aby sa okrem hlásenia o klikoch vypisovala pri každom stlačení klávesy aj koľkokrát už bola stlačená nejaká klávesa:

Klikli ste 1 krat
Klikli ste 2 krat
Tukli ste 1 krat
Tukli ste 2 krat
Klikli ste 3 krat
Tukli ste 3 krat

Úloha 6

Spustite tento nový program:

int x = 100;

void setup()
{  
}

void mouseClicked()
{
  println("Podla mysi je x =", x);
}

void keyPressed()
{
  int x = 33;
  println("Podla klavesnice je x =", x);
}

void draw()
{
}

Vyskúšajte, čo takto doplnený program píše, keď stlačíme myš a čo napíše, keď stlačíme klávesnicu.

Podla mysi je x = 100
Podla klavesnice je x = 33

Čo sa to deje? Prečo má raz premenná x hodnotu 33 a inokedy hodnotu 100?

Je to preto, že to nie je tá istá premenná.

Podprogram mouseClicked používa globálnu premennú x, na obrázku podčiarknuté fialovou.

Podprogram keyPressed si zadefinuje svoju vlastnú lokálnu premennú x, na obrázku zelenou.

Sú to v pamäti počítača dve rôzne krabice. Na každej je nálepka s menom x, ale sú to dve rôzne krabice. Tá fialová je na polici v spoločnom globálnom sklade, tá zelená je na polici v lokálnom sklade keyPressed.

Čo by sme urobili, keby sme v podprograme keyPressed chceli použiť aj lokálne x aj globálne x? V skratke: nerobte to.

Processing vám to síce dovoľuje, ale načo si komplikovať život?

Pomenujte si lokálne premenné inak ako globálne a nemusíte rozmýšľať ktorá je ktorá.

Globálne premenné si pamätajú

Úloha 7

Vytvorte program s počítadlom interakcií, teda ťuknutí a kliknutí dohromady. Pri každom stlačení klávesy vypíše "Tuk" a aktuálny stav, pri stlačení myši vypíše "Klik" a aktuálny stav:

Klik! Pocet interakcii je 1
Klik! Pocet interakcii je 2
Tuk! Pocet interakcii je 3
Tuk! Pocet interakcii je 4
Klik! Pocet interakcii je 5
Tuk! Pocet interakcii je 6
Klik! Pocet interakcii je 7
Tuk! Pocet interakcii je 8
Tuk! Pocet interakcii je 9

Úloha 8

Vytvorte nový skeč, ktorý má globálne premenné x a y s hodnotami 50 a 100. Pri kliknutí myšou sa nakreslí čiara z x,y do pozície myši:

Úloha 9

Upravte program tak, aby sa pri stlačení klávesy nastavila hodnota premenných x,y na novú náhodnú pozíciu a farba čiar tiež náhodne:

Úloha 10

Vytvorte nový skeč, ktorý na začiatku programu vygeneruje náhodnú pozíciu x,y a potom v podprograme draw na túto pozíciu kreslí kružnice náhodnej veľkosti z rozsahu 100,200:

Úloha 11

Doplňte program tak, aby sa pri kliknutí myšou nastavila hodnota premenných x,y na aktuálnu pozíciu myši:

Úloha 12

Vytvorte nový skeč, ktorý na klik myši kreslí nakreslí krúžok s veľkosťou d. Po každom nakreslení sa d zväčší o 1:

Úloha 13

Vytvorte nový skeč, ktorý vykreslí horizontálnu hranicu v náhodnej výške. Potom vykresľuje na náhodné miesta bodky a ofarbuje ich podľa toho, kde sa nachádzajú. Ak ich stred je nad hranicou, tak sú červené, inak sú žlté.

Úloha 14

Doplňte program aby som mohol kliknúť myšou, aby sa hranica nastavila na pozíciu myši. Tiež sa pri kliknutí premaže aj obrazovka:

Last updated