4.2 If-lause ja eri tietotyypit

Yhteenveto

  • Desimaalilukuja (float) vertaillaan aivan samalla tavalla kuin kokonaislukuja. Desimaaliluku kirjoitetaan pisteen avulla.
  • Merkkijonoja (String) vertaillessa merkkijono kirjoitetaan lainausmerkkien väliin(" "), niin kuin muuttujien sijoituslauseessa,
  • Merkkejä (char) vertaillessa merkki, kirjoitetaan heittomerkkien (' ') väliin, niin kuin muuttujien sijoituslauseessa.
  • Totuusarvoa (boolean) vertaillessa käytetään joko sanaa: true tai false.



Sanallinen algoritmi
  1. Aseta ikkunan kooksi 450 px vaakaan ja 450 px pystyyn.
  2. Aseta taustaväriksi valkoinen.
  3. Aseta tekstin väriksi musta.
  4. Aseta tekstin kooksi 25.
  5. Määrittele desimaalilukumuuttuja nimeltään: luku ja anna sille arvo: -5.0.
  6. Jos luku on suurempi kuin -5.1, niin silloin tulosta teksti: "Luku "+luku+" on suurempi kuin -5.1" paikkaan (10,100),
  7. muutoin tulosta teksti:"Luku "+luku+" on pienempi kuin -5.1" paikkaan (10,100).
  8. Määrittele merkkijonomuuttuja nimeltään: kaupunki ja anna sille arvo: "Joensuu".
  9. Jos kapunki on yhtä kuin "Joensuu", niin silloin tulosta teksti: kapunki+" on Suomen pääkaupunki" paikkaan (10,150),
  10. muutoin tulosta teksti: kapunki+" ei ole Suomen pääkaupunki" paikkaan (10,150).
  11. Määrittele merkkimuuttuja nimeltään: merkki ja anna sille arvo: char(64).
  12. Jos merkki on yhtä suuri kuin '@', niin silloin tulosta: merkki+" on ät-merkki" paikkaan (10,200),
  13. muutoin tulosta: merkki+"ei ole ät-merkki" paikkaan (10,200).

// Ohjelman tehnyt: e-Oppi Oy
// 29.1.2017
void setup () {
size(500,300); // Ikkunan koko
background(255); // Taustaväri valkoinen
fill(0); // Täyttöväri musta
textSize(25); // Tekstin koko 25
}
void draw () {
float luku = -5.0; // Desimaaliluku
if (luku > -5.1) {
text("Luku "+luku+" on suurempi kuin -5.1",10,100);
} else {
text("Luku "+luku+" on pienempi kuin -5.1",10,100);
}
String kaupunki = "Joensuu"; // Merkkijono
if (kaupunki=="Helsinki") {
text(kaupunki+" on Suomen pääkaupunki",10,150);
} else {
text(kaupunki+" ei ole Suomen pääkaupunki",10,150);
}
char merkki = char(64); // Merkki
if (merkki == '@') {
text(merkki+" on ät-merkki",10,200);
} else {
text(merkki+" ei ole ät-merkki",10,200);
}
}

Esimerkki: Desimaaliluvut

Tehdään ohjelma, joka vertaa kahta lukua desimaalilukua keskenään. Ohjelma selvittää kumpi näistä luvista on suurempi.

Sanallinen algoritmi
  1. Aseta ikkunan kooksi 600 px vaakaan ja 300 px pystyyn.
  2. Aseta ikkunan taustaväriksi valkoinen.
  3. Aseta tekstin väriksi musta.
  4. Aseta tekstin kooksi 32 px.
  5. Määrittele desimaalilukumuuttuja nimeltään: luku1 ja anna sille arvo: 12.2.
  6. Määrittele desimaalilukumuuttuja nimeltään: luku2 ja anna sille arvo: 12.1.
  7. Jos luku1-muuttuja on suurempi kuin luku2-muuttuja, niin
    tulosta kommentti: "luku1-muuttuja on suurempi kuin luku2-muuttuja" paikkaan (10,100).
  8. Jos luku1-muuttuja on pienempi kuin luku2-muuttuja, niin
    tulosta kommentti: "luku2-muuttuja on suurempi kuin luku1-muuttuja" paikkaan (10,100).
  9. Jos luku1-muuttuja on yhtäsuuri kuin luku2-muuttuja, niin
    tulosta kommentti: "Luvut ovat yhtäsuuria" paikkaan (10,100).

// Ohjelman tehnyt: e-Oppi Oy
// 30.1.2017
void setup() { 
     size(600,300); // Määritellään ikkunan koko
     background(255); // Asetetaan taustaväriksi valkoinen
     fill(0); // Asetetaan täyttöväriksi musta
     textSize(32); // Asetetaan tekstin kooksi 32
}
void draw() { float luku1 = 12.2; // Määrittele luku1 float luku2 = 12.1; // Määrittele luku2 if (luku1 > luku2) { // Jos luku1 on suurempi kuin luku2 text("Luku "+luku1+" on suurempi kuin "+luku2,10,100); } if (luku1 < luku2) { // Jos luku1 on pienempi kuin luku2 text("Luku "+luku2+" on suurempi kuin "+luku1,10,100); } if (luku1 == luku2) { // Jos luvut ovat yhtäsuuret text("Luvut ovat yhtä suuria",10,100); } }


Desimaalilukuja verrataan ehtolauseissa aivan samalla tavalla kuin kokonaislukujakin. Desimaaliluvut sijoitetaan ilman lainausmerkkiä. Desimaaliluvuissa käytetään pistettä. Ohjelman esimerkki tulostus eri muuttujien arvoilla on seuraava.

Esimerkki: Merkkijono

Tehdään ohjelma, joka tutkii mikä viikonpäivä. Tulostus tapahtuu seuraavasti:

VIIKONPÄIVÄTULOSTUS
maanantai Maanantaina makkaraa
tiistai Tiistaina tikkaria
keskiviikko Keskiviikkona keksejä
torstai Torstaina torttuja
perjantai Perjantaina pekonia
lauantai Lauantaina lakritsia
sunnuntai Sunnuntaina suklaata

Ohjelman koodi on seuraavanlainen.

Sanallinen algoritmi
  1. Aseta ikkunan kooksi 600 px vaakaan ja 300 px pystyyn.
  2. Aseta ikkunan taustaväriksi valkoinen.
  3. Aseta tekstin väriksi musta.
  4. Aseta tekstin kooksi 32 px.
  5. Määrittele merkkijonomuuttuja nimeltään: paiva ja anna sille arvo: "lauantai".
  6. Jos paiva-muuttuja on "maanantai", niin
    tulosta kommentti: "Maanantaina makkaraa" paikkaan (10,100),
  7. muutoin jos paiva-muuttuja on "tiistai", niin
    tulosta kommentti: "Tiistaina tikkaria" paikkaan (10,100),
  8. muutoin jos paiva-muuttuja on "keskiviikko", niin
    tulosta kommentti: "Keskiviikkona keksiä" paikkaan (10,100),
  9. muutoin jos paiva-muuttuja on "torstai", niin
    tulosta kommentti: "Torstaina torttuja" paikkaan (10,100),
  10. muutoin jos paiva-muuttuja on "perjantai", niin
    tulosta kommentti: "Perjantaina pekonia" paikkaan (10,100),
  11. muutoin jos paiva-muuttuja on "lauantai", niin
    tulosta kommentti: "Lauantaina lakritsia " paikkaan (10,100),
  12. muutoin jos paiva-muuttuja on "sunnuntai", niin
    tulosta kommentti: "Sunnuntaina suklaata" paikkaan (10,100),
  13. muutoin tulosta kommentti: " Ei ole viikonpäivä" paikkaan (10,100).

// Ohjelman tehnyt: e-Oppi Oy
// 30.1.2017
void setup() { 
     size(600,300); // Asetetaan ikkunan koko
     background(255); // Asetetaan valkea taustanväri
     fill(0); // Asetetaan musta tekstin väri
     textSize(32); // Asetetaan tekstin kooksi 32
}
void draw() { String paiva = "lauantai"; // Muuta tähän eri viikonpäivä if (paiva == "maanantai") { text("Maanantaina makkaraa",10,100); } else if (paiva == "tiistai") { text("Tiistaina tikkaria",10,100); } else if (paiva == "keskiviikko") { text("keskiviikkona keksejä",10,100); } else if (paiva == "torstai") { text("Torstaina torttuja",10,100); } else if (paiva == "perjantai") { text("Perjantaina pekonia",10,100); } else if (paiva == "lauantai") { text("Lauantaina lakritsia",10,100); } else if (paiva == "sunnuntai") { text("Sunnuntaina suklaata",10,100); } else { text("Ei ole viikonpäivä",10,100); } }


Kuten huomataan, vertailu tehdään samalla tavalla kuin merkkijonon sijoituslauseessa. Vertailtava sana on laitettava lainausmerkkien (" ") sisälle. Kun vertaat muuttujaa merkkijonoihin, nyt huomataan, miksi on erittäin hyödyllistä ketjuttaa if-lauseet. Viimeinen else-vaihtoehto kuittaa kaikki muut sanat kuin viikonpäivät. Hyvin suunniteltu ohjelma huomioi myös tyhmät syötteet.

Koska if-lauseessa on vain yksi merkkijono, johon verrataan, niin myös sillä on merkitystä, onko muuttujan arvo kirjoitettu isolla vai pienellä. Oheinen esimerkkiajo havainnollistaa asiaa. Isolla etukirjaimella kirjoittaminen johtaa viimeiseen vaihtoehtoon eli muut sanat kuin viikonpäivät. Ongelman voisi korjata TAI-lauseella. Palataan tähän myöhemmin.

Esimerkki: Merkki

Tehdään ohjelma, joka arpoo numeron väliltä 97..100 ja muuttaa numeron sitä vastaavaksi kirjaimeksi. Numeroa 97 vastaa kirjain a, numeroa 98 vastaa kirjain b, numeroa 99 vastaa kirjain c ja numeroa 100 vastaa kirjain d. Numeroiden ja kirjainten vastaavuus selviää ASCII-taulukosta.

Sanallinen algoritmi
  1. Määritellään kokonaislukumuuttuja nimeltään: numero, ja arvotaan sille kokonaisluku arvo väliltä 97...100.
  2. Aseta ikkunan kooksi 600 px vaakaan ja 300 px pystyyn.
  3. Aseta ikkunan taustaväriksi valkoinen.
  4. Aseta tekstin väriksi musta.
  5. Aseta tekstin kooksi 32 px.
  6. Määrittele merkkimuuttuja nimeltään: merkki ja sijoitetaan sille se merkki, jota arvottu numero-muuttujan luku vastaa ASCII-taulukossa.
  7. Jos merkki-muuttuja on 'a', niin
    tulosta kommentti: "Arvottu merkki on a" paikkaan (10,100).
  8. Jos merkki-muuttuja on 'b', niin
    tulosta kommentti: "Arvottu merkki on b" paikkaan (10,100).
  9. Jos merkki-muuttuja on 'c', niin
    tulosta kommentti: "Arvottu merkki on c" paikkaan (10,100).
  10. Jos merkki-muuttuja on 'd', niin
    tulosta kommentti: "Arvottu merkki on d" paikkaan (10,100).

// Ohjelman tehnyt: e-Oppi Oy
// 30.1.2017
int numero = 97+round(random(3)); // Arvotaan luku väliltä 97…100
void setup() { 
     size(600,300); // Asetetaan ikkunan koko
     background(255); // Asetetaan taustaväriksi valkoinen
     fill(0); // Asetetaan tekstin väriksi musta
     textSize(32); // Asetetaan teksin kooksi 32
}
void draw() { char merkki = char(numero); // Muutetaan arvottu numero merkiksi a,b,c tai d if (merkki == 'a') { // Jos merkki on a-kirjain text("Arvottu merkki on a",10,100); } if (merkki == 'b') { // Jos merkki on b-kirjain text("Arvottu merkki on b",10,100); } if (merkki == 'c') { // Jos merkki on c-kirjain text("Arvottu merkki on c",10,100); } if (merkki == 'd') { // Jos merkki on d-kirjain text("Arvottu merkki on d",10,100); } }


Kun teet vertailulauseita, niin vertailtavat merkit on laitettava heittomerkkien väliin (' '). Arpominen on suoritettava heti ohjelman alussa, koska haluamme arpoa luvun vain kerran. Jos arpominen suoritettaisiin void draw () -lohkossa, niin silloin arpominen tapahtuisi jatkuvasti. Tässä numero-muuttuja on ns. globaalimuuttuja eli on voimassa kaikissa lohkoissa. Komento random(3) arpoo luvun väliltä 0..3. Kun tähän arvottuun lukuun lisäämme luvun 97, niin saamme välin 97..100. Koska numero muuttuja on kokonaislukumuuttuja, niin arvontakomennossa on lisäksi käytettävä pyöristyskomentoa round( ).

Komennolla: char(kokonaisluku); voimme muuttaa kokonaisluvun sitä vastaavaksi merkiksi. Kokonaisluvun ja merkin vastaavuus selviää ASCII-taulukosta, joka on kuvattu alla.

ASCII-taulukko
33 ! 52 4 71 G 90 Z 109 m
34 " 53 5 72 H 91 [ 110 n
35 # 54 6 73 I 92 \ 111 o
36 $ 55 7 74 J 93 ] 112 p
37 % 56 8 75 K 94 ^ 113 q
38 & 57 9 76 L 95 _ 114 r
39 ' 58 : 77 M 96 ` 115 s
40 ( 59 ; 78 N 97 a 116 t
41 ) 60 < 79 O 98 b 117 u
42 * 61 = 80 P 99 c 118 v
43 + 62 > 81 Q 100 d 119 w
44 , 63 ? 82 R 101 e 120 x
45 - 64 @ 83 S 102 f 121 y
46 . 65 A 84 T 103 g 122 z
47 / 66 B 85 U 104 h 123 {
48 0 67 C 86 V 105 i 124 |
49 1 68 D 87 W 106 j 125 }
50 2 69 E 88 X 107 k 126 ~
51 3 70 F 89 Y 108 l 127  


Vastaavasti komennolla: int('merkki'); voidaan merkki muuttaa sitä vastaavaksi kokonaisluvuksi. Kun teet if-lauseen, niin merkkejä on vertailtava siten, että merkki kirjoitetaan heittomerkkien (' ') väliin.

Kokeile ajaa ohjelma useamman kertaa. Joka kerralla pitäisi tulostua satunnaisesti eri teksti. Alla on esitetty kaksi ohjelman esimerkkiajoa.


Esimerkki: Totuusarvo

Tehdään ohjelma, jossa meillä on boolean-tyyppinen muuttuja. Muuttuja voi saada vain kaksi eri arvoa: true tai false. Jos muuttujan arvo on true, niin ohjelma tulostaa: Tämä on totta. Jos muuttujan arvo on false, niin ohjelma tulostaa: Tämä ei ole totta.

Sanallinen algoritmi
  1. Aseta ikkunan kooksi 400 px vaakaan ja 200 px pystyyn.
  2. Aseta ikkunan taustaväriksi valkoinen.
  3. Aseta tekstin väriksi musta.
  4. Aseta tekstin kooksi 32 px.
  5. Määrittele totuusarvomuuttuja nimeltään: totuus ja anna sille arvo: true.
  6. Jos totuus-muuttuja on true, niin
    tulosta kommentti: "Tämä on totta" paikkaan (10,100),
  7. muutoin tulosta kommentti: "Tämä ei ole totta" paikkaan (10,100).

// Ohjelman tehnyt: e-Oppi Oy
// 30.1.2017
void setup() { 
     size(400,200); // Asetetaan ikkunan koko
     background(255); // Valkea taustan väri
     fill(0); // Musta tekstin väri
     textSize(32); // Tekstin koko on 32
}
void draw() { boolean totuus = true; // Mahdolliset arvot ovat true tai false if (totuus == true) { text("Tämä on totta",10,100); } else { text("Tämä ei ole totta",10,100); } }


Alla on kuvattu ohjelman esimerkkiajo eri muuttujan arvoilla.