Muuttujat ja näkyvyys

Muuttujat

Oppimateriaalissa on aiemmin puhuttu muuttujista. Materiaalissa on mainittu esimerkiksi sellaisia muutujia kuin width ja height. Mitä muuttujalla oikein tarkoitetaan, ja miten voit luoda omia muuttujia?

Muuttuja on muistipaikka, jonne on tallennettu jokin arvo. Arvoa voidaan muuttaa ja arvo voidaan hakea muuttujasta. Javaan pohjautuvassa Processing-kielessä muuttuja tarvitsee tyypin sekä nimen:

int luku = 100;

Yllä oleva koodinpätkä luo int-tyyppisen muuttujan nimeltä luku ja muuttujan arvoksi tallennetaan 100. Muuttujan tyyppi (int) tarkoittaa kokonaislukua, eli muuttujaan voi nyt tallentaa kokonaislukuja kuten 1, -2, 0, 99, 2147483647.

Muuttuja "luku" viittaa paikkaan, jonne tallennetaan arvo 100. "Luku" on ikään kuin lokero, jonka sisällä olevaa arvoa voi hakea ja muuttaa:

int luku = 100;  // luodaan uusi muuttuja ja asetetaan sen arvoksi 100
luku = 40;       // asetetaan muuttujan arvoksi 40
luku = 40/2;     // asetetaan muuttujan arvoksi 40/2 eli 20
luku = luku + 2; // asetetaan muuttujan arvoksi luku + 2 eli 20 + 2 eli 22
luku = luku * 2; // asetetaan muuttujan arvoksi luku * 2 eli 22 * 2 eli 44

Uusi muuttuja luodaan kirjoittamalla muuttujan tyyppi, nimi, yhtäsuuruusmerkki ja arvo.

tyyppi muuttujan_nimi = arvo;

Muuttuja muistaa vain uusimman asetetun arvon. Jos muuttujaan tallentaa uuden arvon, vanha ei siis ole enää muistissa.

Muuttujan tyyppi

Processing-kielessä jokaiselle muuttujalle täytyy määritellä tyyppi. Tiettyyn lokeroon voi tallentaa vain tietyn tyyppisiä asioita. Tyyppejä ovat esimerkiksi kokonaisluvut, desimaaliluvut, merkkijonot tai myöhemmin kurssilla esiteltävät luokat.

  • int: kokonaisluku, esimerkiksi 0, -10, 255 tai 2018584.
  • char : kirjain, esimerkiksi 'a', 'b' tai 't'.
  • float: desimaaliluku, esimerkiksi 23.1, 1.0 tai -4.2.
  • color : väriarvo, esimerkiksi color(0, 22, 250)
  • boolean: totuusarvo, true tai false. Voit käyttää boolean-muuttujaa ehtolauseesi ehtona!
  • String: merkkijono, esimerkiksi "Moikka!" tai "Peli ohi!".

Tyyppi liittyy tietokoneen tapaan tallentaa tietoa. Tietokone käsittelee kokonaislukua kuten 10 ja desimaalilukua kuten 3.14159 hieman eri tavalla ja tästä syystä muuttujan tyyppi täytyy erikseen määritellä.

Processing varoittaa tyyppivirheistä esimerkiksi ilmoituksilla "Type mismatch, 'float' does not match with 'int'" ja "Cannot convert from float to int". Kokeile seuraavaksi alla olevia monivalintatehtäviä ja koita määrittää muuttujalle oikea tyyppi.


Valitse oikea tyyppi tehtävän tyhjälle kohdalle
_____ halkaisija = 150;
_____ nopeus = 0.75;
_____ nimi = "mehackit";

Muuttujat ja näkyvyys

Kokeile seuraavaa ohjelmaa. Mitä ohjelma tulostaa?

void setup() {
  float a = 10;
}

void draw() {
  println(a);
}

Kääntäjä antaa tässä tapauksessa virheilmoituksen "a cannot be resolved to a variable". Muuttujaa a ei ole siis löydy, kun print-metodi yrittää käyttää sitä. Tämä johtuu muuttujien näkyvyydestä. Muuttuja a on määritelty setup-metodissa, jolloin se näkyy vain setup-metodille. Tilanteen voisi korjata määrittelemällä muuttuja draw-metodissa:

void setup() {
}

void draw() { 
  float a = 10;
  println(a);
}

Entä jos haluaisit kasvattaa muuttujaa a aina, kun draw-metodi ajetaan. Kokeile lisätä muuttujan a arvoon yksi draw-metodin lopussa:

void setup() {
}

void draw() {
  float a = 10;
  println(a);
  a = a + 1;
}

Nyt ohjelma tulostaa jatkuvasti arvoa 10. Muuttujan a arvoksi määritellään jokaisen metodikutsun alussa 10, arvo tulostetaan ja sen jälkeen muuttujan arvoa kasvatetaan yhdellä. Seuraavalla kerralla muuttujan arvoksi asetetaan jälleen 10 ja muuttujan arvo tulostetaan. Ratkaisu pulmaan on määritellä muuttuja heti ohjelman alussa, jolloin muuttuja näkyy kaikissa metodeissa:

float a = 10;

void setup() {
}

void draw() {
  println(a);
  a = a + 1;
}

Nyt ohjelma tulostaa numeroita kymmenestä ylöspäin. Samaa tekniikkaa voit käyttää liikkeen animointiin:

float x = 0;

void setup() {
  size(400,400);
}

void draw() {
  ellipse(x, height/2, 50, 50);
  x = x + 1;
}

Nyt x kasvaa loputtomasti. Jos haluat palauttaa muutujan x arvon nollaan sen jälkeen kun arvo on ylittänyt ruudin leveyden voit käyttää apuna ehtolauseita. Ehtolauseet esitellään vasta seuraavassa kappaleessa, joten tässä on pieni kurkistus tulevaan:

float x = 0;

void setup() {
  size(400,400);
}

void draw() {
  ellipse(x, height/2, 50, 50);
  x = x + 1;
  if ( x > width) {
   x = 0;
  }
}

Virheet muuttujien tyypeissä ja näkyvyydessä ovat tyypillisiä haasteita ohjelmoinnissa. Kääntäjän virheilmoitukset auttavat virheiden metsästyksessä ja edelliset esimerkit käsittelivät tyypillisiä virhetilanteita.


Ohjelmointiharjoitus

Harjoitus

Piirrä ympyrä jonka läpimitta vaihtelee satunnaisesti välillä 50-100.

  • Kirjoita seutup- ja draw-metodit.
  • Arvo draw-metodin alussa numero välillä 50-100 ja tallenna se muuttujaan
  • Piirrä draw-metodissa ympyrä ja käytä läpimittana äsken arpomaasi muuttujaa.