3.1 Muuttujat ja tietotyypit

Yhteenveto

  • Muuttuja on muistipaikka, johon ohjelman suorituksen aikainen tieto tallennetaan.
  • Kaikki ohjelman käyttämät muuttujat ensin esiteltävä, ennen kuin niitä voi käyttää. Esittely tehdään vain kerran.
  • Esittelyn yhteydessä kerrotaan muuttujan tietotyppi, joka kertoo minkä tyyppistä tietoa ohjelman käyttämiin muuttujiin voidaan tallentaa.
  • Esittelyn yhteydessä muuttujalle annetaan ainutkertainen nimi. Huomio: Muuttujan nimissä ei voi käyttää merkkejä: å, ö, ä, välilyöntejä ja erikoismerkkejä.
  • Yhteen muuttujaan voidaan tallentaa vain yksi tieto kerrallaan. Muuttujan saama arvo tallennetaan muuttujaan yhtäsuuruusmerkin avulla.
  • Mikäli muuttujalle sijoitetaan uusi tieto, niin vanha tieto poistuu. Uuden tiedon sijoitus voidaan tehdä samalle muuttujalle useamman kerran samassa ohjelmassa, mutta esittely vain kerran.
  • Kun sijoitat muuttujille arvoja, niin kokonaisluvut kirjoitetaan sellaisenaan, desimaaliluvut kirjoitetaan pisteen avulla, merkkijono kirjoitetaan lainausmerkkien (" ") sisälle, merkit kirjoitetaan heittomerkkien (' ') sisälle ja totuusarvoissa käytetään sanoja true tai false.







Sanallinen algoritmi
  1. Määritellään kokonaislukumuuttuja x ja annetaan sille arvo 250.
  2. Määritellään kokonaislukumuuttuja y ja annetaan sille arvo 100.
  3. Aseta ikkunan kooksi 450 px vaakaan ja 450 px pystyyn.
  4. Aseta taustaväriksi valkoinen.
  5. Aseta tekstin kooksi 20.
  6. Aseta tekstin väriksi eli täyttöväriksi musta.
  7. Määritellään kokonaislukumuuttuja: Nimi1 ja annetaan sille arvo 100.
  8. Määritellään desimaalilukumuuttuja: Nimi2 ja annetaan sille arvo 4.65.
  9. Määritellään merkkijonomuuttuja: Nimi3 ja annetaan sille arvo "Siiri Silakka".
  10. Määritellään merkkimuuttuja: Nimi4 ja annetaan sille arvo '%'.
  11. Määritellään totuusarvomuuttuja: Nimi5 ja annetaan sille arvo false.
  12. Tulostetaan muuttujan: Nimi1 arvo paikkaan (50,50).
  13. Tulostetaan muuttujan: Nimi2 arvo paikkaan (50,100).
  14. Tulostetaan muuttujan: Nimi3 arvo paikkaan (50,150).
  15. Tulostetaan muuttujan: Nimi4 arvo paikkaan (50,200).
  16. Tulostetaan teksti: "Hei "+Nimi3+", mitä kuuluu?" paikkaan (50,250).
  17. Tulostetaan teksti: "Luvut ovat: "+Nimi1+" ja "+Nimi2 paikkaan (50,300).
  18. Piirretään ympyrä paikkaan (x,y), jonka halkaisija määräytyy muuttujan Nimi1 arvosta.

// Ohjelman tehnyt: e-Oppi Oy
// 29.1.2017
int x = 250;
int y = 100;
void setup () {
size(450,450); // Ikkunan koko
background(255); // Taustaväri valkoinen
textSize(20); // Tekstin koko 20
fill(0); // Tekstin väri musta
}
void draw () {
int Nimi1 = 100; // Kokonaisluku
float Nimi2 = 4.65; // Desimaaliluku
String Nimi3 = "Siiri Silakka"; // Merkkijono
char Nimi4 = '%'; // Merkki
boolean Nimi5 = false; // Totuusarvo
text(Nimi1,50,50); // Tulosta muuttujien arvot
text(Nimi2,50,100);
text(Nimi3,50,150);
text(Nimi4,50,200);
text("Hei "+Nimi3+", mitä kuuluu?",50,250);
text("Luvut ovat:"+Nimi1+" ja "+Nimi2,50,300);
ellipse(x,y,Nimi1,Nimi1);
}

Johdanto

Ohjelmassa käsitellään tietoa ja se voitava tallentaa ohjelman suorituksen aikana johonkin. Tallennettava tieto voi olla esimeriksi numerotietoa tai tekstitietoa. Tämä ohjelman suorituksen aikainen tallennettava tieto tallennetaan muuttujiin. Muuttuja on ohjelmassa määritelty sana tai merkkijono, johon tietoa tallennetaan sijoituslauseella. Tutkitaan aluksi kuinka erilaisia tietotyyppejä (numerotieto ja tekstitieto) käsitellään tekstin tulostuksen yhteydessä.

Lähdetään esimerkistä liikkeelle. Tulostetaan aluksi numeroita text-komennolla. Tehdään seuraava ohjelma.

// Ohjelman tehnyt: e-Oppi Oy
// 30.1.2017
void setup() { 
     size(300,300); // Määritellään ikkunan koko
     background(255); // Taustaväri valkoinen
     fill(0); // Tekstin väri musta
     textSize(30); // Tekstin koko 30 px
}
void draw() { text(" 1+2+3 ",100,60); text( 1+2+3,100,100); text(" 1+2+3 "+1+2+3,100,140); text(" 1+2+3 "+(1+2+3),100,180); text( 1+2+3+" 1+2+3 ",100,240); }


Kun ohjelma ajetaan, niin havaitaan jotain mielenkiintoista. Miksi ei joka rivillä tulostu 1 + 2 + 3?



Tuloste

Merkitys

1+2+3

Ensimmäinen rivi on normaali tulostuskomento eli teksti - tässä tapauksessa numerot – kirjoitetaan lainausmerkkien sisään ja lopputulos on niin kuin pitääkin.

6

Tässä kirjoitimme tekstiä ilman lainausmerkkiä ja ohjelma ei ilmoittanut virhettä, miksi? Syy on se, että on olemassa erilaisia tietotyyppejä: tekstitieto ja kokonaislukutieto. Tässä ”teksti” onkin kokonaisluku, ja lukujahan voi normaalisti laskea yhteen eli 1 + 2 + 3 = 6, ja siksi tulostui 6.

1+2+3 123

Nyt yhdistimme kaksi edellistä komentoa ja nyt ei tulostunut 6 loppuun, miksi? Syy on se, että plus-merkkiä käytetään myös tekstitiedon ja kokonaislukutiedon erottimena. Ensimmäinen plus-merkki tekstitiedon jälkeen tulkitaan erottimeksi. Tämä ensimmäinen erotinmerkki, muuttaa myös loput plusmerkit erotinmerkeiksi. Kun 1, 2 ja 3 tulostetaan peräkkäin ilman välilyöntiä (erotinmerkki ei tulostu), niin lopputuloksena on 123.

1+2+3 6

Tässä on tehty korjaus edelliseen komentoon eli lisäämällä sulut lukujen ympärille komentojen suoritusjärjestys muuttuu ja sulkujen sisällä olevat luvut summataankin nyt yhteen. Ainoastaan sulkujen edessä oleva plusmerkki on erotinmerkki.

6 1+2+3

Lainausmerkkien edessä olevat plusmerkit ovat viimeistä plusmerkkiä lukuun ottamatta yhteenlaskuja. Syy tähän on komentojen suoritusjärjestys. Koska ensimmäinen plus-merkki on yhteenlasku, niin muutkin plusmerkit ovat yhteenlaskuja, jos vain mahdollista.



Kun kirjoitamme tekstiä lainausmerkkien sisälle, niin se on tekstitietoa. Mutta jos kirjoitamme numeroita ilman lainausmerkkejä, niin se on numerotietoa. Jos esimerkiksi haluamme kirjoittaa lauseen: Lukujen 5 ja 7 summa on 12, siten että luvut ovat numerotietoa ja teksti on tekstitietoa, niin tulostuskomento on tällöin muotoa.

text("Lukujen "+5+" ja "+7+" summa on "+(5+7),100,100);

Teksti kirjoitetaan lainausmerkkien sisälle, mutta numerotietoa ei tarvitse kirjoittaa lainausmerkkien sisälle. Numerotieto ja tekstitieto erotetaan toisistaan plus-merkin avulla. Tosin plus-merkin avulla suoritetaan myös lukujen väliset laskutoimitukset. Eli tällä tulostuslauseella tulostetaan luvut 5 ja 7, sekä kirjoitettu teksti ja lisäksi ohjelma vielä laskee lukujen summan. Eli tulostus näyttää tältä.




Tulostuslauseen merkitys on seuraava.




Muuttujat käyttäytyvät ohjelmassa samalla tavalla. Kun seuraavaksi määrittelemme muuttujat, myös ne on tulostettava ilman lainausmerkkejä.

Muuttujat

Määritellään aluksi Processing-ohjelmoinnin yleisimmät tietotyypit. Edellisessä esimerkissä puhuttiin vain kokonaisluku- ja tekstitietotyypeistä, mutta Processing-ohjelmoinnissa on määritelty enemmänkin tietotyyppejä, ne ovat seuraavat:

Tietotyyppi

Määrittely

Muuttujan arvo

Kokonaisluku

int

15

Desimaaliluku

float

3.14

Merkkijono

String

"Matti Meikäläinen"

Merkki

char

'Ä'

Totuusarvo (true tai false)

boolean

true

 

Olisiko mahdollista määritellä ohjelmaan jokin muistipaikka, johon ohjelman käyttämä tieto voitaisiin tallentaa? Kyllä voidaan, mutta siinä on rajoite. Kokonaisluvut voidaan tallentaa vain kokonaisluku muistipaikkaan, desimaaliluvut voidaan tallentaa vain desimaaliluku muistipaikkaan, merkkijonot voidaan tallentaa vain merkkijonomuistipaikkaan ja niin edelleen. Voit ajatella esimerkiksi, että kokonaisluku laitetaan siniseen laatikkoon, desimaaliluku laitetaan keltaiseen laatikkoon, merkkijono laitetaan vihreään laatikkoon ja niin edelleen. Oheinen kuva havainnollistaa asiaa.



Sitten on vielä toinenkin rajoite: Yhteen laatikkoon eli muistipaikkaan mahtuu vain yksi tieto kerrallaan. Jos muistipaikkaan laitetaan uusi tieto, niin vanha tieto häviää. Tälle muistipaikalle on annettu ohjelmoinnissa nimi ja se on nimeltään muuttuja.

Ohjelmoinnissa kaikki ohjelman käyttämät muuttujat pitää ensin esitellä, ennen kuin niitä voidaan käyttää. Se tapahtuu esimerkiksi seuraavasti:

int Muuttuja1;

Aluksi siis kerrotaan minkälaista tietoa muuttujaan voi tallentaa (int, float, String, char tai boolean) ja sitten vasta annetaan muuttujalle nimi. Muuttujan nimessä käy kirjaimet a,b,c,…,z, ja A,B,C,…Z sekä numerot 0,1,2,…,9. Mutta et voi käyttää esimerkiksi skandimerkkejä: ä, ö ja å, etkä välilyöntejä, et voi myöskään käyttää useimpia erikoismerkkejä, poikkeuksena alaviiva ja dollarimerkki. Kun muuttuja on esitelty, niin siihen voidaan sijoittaa oikeantyyppinen tieto sijoituslauseella, esimerkiksi:

Muuttuja1 = 15;

On myös mahdollista yhdistää esittely ja sijoitus samaan lauseeseen, jolloin lause näyttää tältä:

int Muuttuja1 = 15;

Vastaavalla tavalla kaikki taulukon esimerkin mukaiset muuttujat voidaan esitellä ja sijoittaa siihen arvot seuraavasti.

int Muuttuja1 = 15;
float Muuttuja2 = 3.14;
String Muuttuja3 = "Matti Meikäläinen";
char Muuttuja4 = 'Ä';
boolean Muuttuja5 = true;


Esittely tehdään ohjelmassa vain kerran. Sijoitus voidaan kuitenkin tehdä useamman kerran. Tällöin vain viimeisin tieto säilyy muuttujassa. Processing ohjelmoinnissa on seuraavia sääntöjä, jotka koskevat muuttujien nimeämistä:

  • Nimi alkaa kirjaimella, alaviivalla tai dollarimerkillä
  • Seuraava merkki saa edellisten lisäksi olla myös numero
  • Kirjainten koolla on merkitystä (esimerkiksi: Piiri ja piiri on eri asia).
  • Nimi ei saa olla ohjelmointikielen varattu sana eli komento
  • Nimellä ei ole pituusrajoitusta
  • Nimen on oltava ainutkertainen

Yhteenvetona muuttuja esittelystä ja arvon sijoittamisesta:



Jokainen lause loppuu aina puolipisteeseen. Jos määrittelet muuttujan void draw ( ) -lohkossa, niin muuttuja on voimassa vain tässä lohkossa. Sanotaan, että muuttuja on paikallinen muuttuja.

Jos määrittelet muuttujan ohjelman alussa, ennen void setup ( ) -lohkoa, niin muuttujan on voimassa koko ohjelman ajan. Sanotaan, että muuttuja on globaalimuuttuja.

Huomaa, että sijoittaessa arvoja muuttujiin desimaaliluvussa (float) käytetään pistettä, merkkijonossa (String) lainausmerkkejä ja merkissä (char) heittomerkkiä.

Kokonainen ohjelma, jossa edellä mainitut muuttujat ovat käytössä, on seuraava:

Sanallinen algoritmi
  1. Aseta ikkunan kooksi 450 px vaakaan ja 250 px pystyyn.
  2. Aseta ikkunan taustaväriksi valkoinen.
  3. Aseta tekstin kooksi 30 px.
  4. Aseta tekstin väriksi musta.
  5. Määrittele kokonaislukumuuttuja nimeltään: Muuttuja1, ja anna sille arvo: 15.
  6. Määrittele desimaalilukumuuttuja nimeltään: Muuttuja2 ja anna sille arvo: 3.14.
  7. Määrittele merkkijonomuuttuja nimeltään: Muuttuja3 ja anna sille arvo: "Matti Meikäläinen".
  8. Määrittele merkkimuuttuja nimeltään: Muuttuja4 ja anna sille arvo: 'Ä'.
  9. Määrittele totuusarvo-muuttuja nimeltään: Muuttuja5 ja anna sille arvo: true.
  10. Tulosta muuttujan: Muuttuja1 arvo paikkaan (10,50).
  11. Tulosta muuttujan: Muuttuja2 arvo paikkaan (10,100).
  12. Tulosta muuttujan: Muuttuja3 arvo paikkaan (10,150).
  13. Tulosta muuttujan: Muuttuja4 arvo paikkaan (10,200).
  14. Tulosta muuttujan: Muuttuja5 arvo paikkaan (10,250).

// Ohjelman tehnyt: e-Oppi Oy
// 30.1.2017
void setup() {
     size(450,300); // Ikkunan koko
     background(255); // Taustaväri valkoinen
     textSize(30); // Tekstin koko 30
     fill(0); // Aseta tekstin väriksi musta
}
void draw() { int Muuttuja1 = 15; // Kokonaisluku float Muuttuja2 = 3.14; // Desimaaliluku String Muuttuja3 = "Matti Meikäläinen"; // Merkkijono char Muuttuja4 = 'Ä'; // Merkki boolean Muuttuja5 = true; // Totuusarvo text(Muuttuja1,10,50); // Tulostetaan muuttujat text(Muuttuja2,10,100); text(Muuttuja3,10,150); text(Muuttuja4,10,200);
text(""+Muuttuja5,10,250);
// Huomio: Totuusarvo-muuttujalla erilainen tulostus }

Ohjelman suoritus näyttää tältä.



Palataan aikaisempaan yhteenlaskuesimerkkiin. Se voidaan muuttujien avulla kirjoittaa seuraavasti.

Sanallinen algoritmi
  1. Aseta ikkunan kooksi 600 px vaakaan ja 200 px pystyyn.
  2. Aseta ikkunan taustaväriksi valkoinen.
  3. Aseta tekstin väriksi musta.
  4. Aseta tekstin kooksi 30 px.
  5. Määrittele kokonaislukumuuttuja nimeltään: luku1, ja anna sille arvo: 5.
  6. Määrittele kokonaislukumuuttuja nimeltään: luku2, ja anna sille arvo: 7.
  7. Tulosta muuttujan luku1 ja luku2 arvot, sekä tulosta muuttujien luku1 ja luku2 summan arvo paikkaan (100,100).

// Ohjelman tehnyt: e-Oppi Oy
// 30.1.2017
void setup() { 
     size(600,200); // Määritellään ikkunan koko
     background(255); // Taustaväri valkoinen
     fill(0); // Tekstin väri musta
     textSize(30); // Tekstin koko 30 px
}

void draw() { int luku1 = 5; int luku2 = 7; text("Lukujen "+luku1+" ja "+luku2+" summa on "+(luku1+luku2), 100, 100); }


Kun ohjelma ajetaan, niin ohjelman tulostus näyttää samanlaiselta.


Ohjelma toimii samalla tavalla kuin äskenkin, mutta nyt emme tarvitse enää lukuja sijoittaa tulostuslauseeseen vaan lukujen sijoitus on tehty ennen tulostusta muuttujiin. Voit kokeilla muuttaa lukuarvoja ja ohjelma toimii halutunlaisesti millä tahansa muuttujan arvolla.

Esimerkki: Muuttujat piirtokomennossa

Voimme käyttää muuttujia piirtokomennoissa seuraavasti.

Sanallinen algoritmi
  1. Aseta ikkunan kooksi 250 px vaakaan ja 250 px pystyyn.
  2. Aseta ikkunan taustaväriksi valkoinen.
  3. Aseta täyttöväriksi punainen.
  4. Määrittele kokonaislukumuuttuja: x, ja anna sille arvo 150.
  5. Määrittele kokonaislukumuuttuja: y ja anna sille arvo 50.
  6. Määrittele kokonaislukumuuttuja: halkaisija, ja anna sille arvo: 100.
  7. Piirrä ympyrä muuttujien x,y ja halkasija avulla. Ympyrän keskipiste on kohdassa (x,y) ja ympyrän halkaisija sama kuin muuttujan halkaisija arvo.

// Ohjelman tehnyt: e-Oppi Oy
// 30.1.2017
void setup() { 
     size(250,250); // Määritellään ikkunan koko
     background(255); // Taustaväri valkoinen
     fill(255,0,0); // Täyttöväri punainen
}
void draw() {
     int x = 150;
     int y = 50;
     int halkaisija = 100;
     ellipse(x,y,halkaisija,halkaisija);
}


Ohjelman suoritus näyttää tältä.



Ohjelma siis piirtää punaisen ympyrän paikkaan (150,50), jossa ympyrän koko eli ympyrän halkaisija on 100 pikseliä. Piirtokomennossa voimme käyttää nyt kuvaavia sanoja eli muuttujia. Piirtokomennoissa on käytettävä vain kokonaislukumuuttujia. Kun muutat muuttujien arvoja, niin ympyrän paikka ja koko myös muuttuvat.

Esimerkki: Erotinmerkki muuttujien välillä

Tehdään kolme merkkijonomuuttujaa: a, b ja c ja sijoitetaan niihin eri tekstit. Tässä esimerkissä eri muuttujien tulostus tapahtuu yhdessä tulostuslauseessa. Tällöin käytämme muuttujien välillä + merkkiä erotinmerkkinä.

Sanallinen algoritmi
  1. Aseta ikkunan kooksi 300 px vaakaan ja 200 px pystyyn.
  2. Aseta ikkunan taustaväriksi valkoinen.
  3. Aseta tekstin väriksi musta.
  4. Aseta tekstin kooksi 24 px.
  5. Määrittele merkkijonomuuttuja nimeltään: a, ja anna sille arvo: "Hei, ".
  6. Määrittele merkkijonomuuttuja nimeltään: b, ja anna sille arvo: "Mitä ".
  7. Määrittele merkkijonomuuttuja nimeltään: c, ja anna sille arvo: "kuuluu?".
  8. Tulosta muuttujien a, b ja c arvot samassa tulostuslauseessa paikkaan (10,100).

// Ohjelman tehnyt: e-Oppi Oy
// 30.1.2017
void setup() {
     size(300,200); // Määritellään ikkunan koko
     background(255); // Taustaväri valkoinen
     fill(0); // Täyttöväri musta
     textSize(24); //Fontin koko
}
void draw() { String a = "Hei, "; String b = "Mitä "; String c = "kuuluu?"; text(a+b+c,10,100); }

Kun ajat ohjelman, niin se näyttää tältä.



Eli voit yhdistää erilaisia String - tyyppisiä muuttujia samaan tulostuslauseeseen lisäämällä muuttujien väliin plusmerkin. Tässä plus-merkki toimii erottimena.

TextWidth

Komennolla textWidth(); voidaan selvittää tekstin pituus. Tämä on erittäin kätevää, jos tulostuslauseet ovat erilliset ja haluamme tulostaa samalle riville. Tehdään edellinen harjoitus kolmella eri muuttujalla ja kolmella eri tulostuskomennolla, niin että tekstit tulostuvat peräkkäin. Ohjelman koodi on seuraava.

Sanallinen algoritmi
  1. Aseta ikkunan kooksi 300 px vaakaan ja 200 px pystyyn.
  2. Aseta ikkunan taustaväriksi valkoinen.
  3. Aseta tekstin väriksi musta.
  4. Aseta fontin kooksi 24 px.
  5. Aseta merkkijonomuuttuja nimeltään: a, ja anna sille arvo: "Hei ".
  6. Aseta merkkijonomuuttuja nimeltään: b, ja anna sille arvo: "Mitä ".
  7. Aseta merkkijonomuuttuja nimeltään: c ja anna sille arvo: "kuuluu?".
  8. Tulosta muuttujan a arvo paikkaan (10,100).
  9. Tulosta muuttujan b arvo edellisen tekstin perään eli paikkaan (10+muuttujan a pituus,100).
  10. Tulosta muuttujan c arvo kahden edellisen tekstin perään eli paikkaan (10+muuttujan a ja b pituus,100).

// Ohjelman tehnyt: e-Oppi Oy
// 30.1.2017
void setup() { 
     size(300,200); // Määritellään ikkunan koko
     background(255); // Taustaväri valkoinen
     fill(0); // Täyttöväri musta
     textSize(24); //Fontin koko
}
void draw() { String a = "Hei, "; String b = "Mitä "; String c = "kuuluu?"; text(a,10,100); text(b,10+textWidth(a),100); text(c,10+textWidth(a+b),100); }

Ohjelma tulostaa seuraavaa.