Tähän mennessä kirjoittamamme ohjelmat ovat olleet toiminnaltaan lineaarisia. Jotta ohjelmamme pystyy reagoimaan muutoksiin ympäristössään, tarvitaan ehtolauseita. Ehtolauseet asettavat nimensä mukaisesti ehdon, jonka perusteella ohjelman suoritus haarautuu kahdeksi tai useammaksi poluksi.
yksinkertaisin ehtolause on if
rakenne.
if (ehto) {
// jos ehto pitää paikkansa, suoritetaan koodi hakasulkujen välissä
}
If-rakenne alkaa ohjelmointikielen varatulla termillä if
. Tämän jälkeen asetetaan tarkasteltava ehto sulkujen väliin. Lopuksi ehdon täyttyessä suoritettava koodi asetetaan hakasulkujen sisään.
If-rakenteessa käytettävä ehto arvioidaan totuusarvona, eli bool
tyyppinä. Mikäli ehto saa arvon true
, hakasulkujen välissä oleva koodi suoritetaan. Mikäli taas false
, hypätään hakasulkujen ohi. If-rakenteen ehto voi olla myös numeerinen arvo. Tällöin nolla luetaan samaksi kuin false
ja mikä tahansa nollasta poikkeava luku (myös negatiiviset luvut) luetaan samaksi kuin true
.
Yleensä if-rakenteeseen ei suoraan aseteta arvoa true tai false, vaan sitä käytetään tarkkailemaan jonkin muuttujan tilaa.
bool muuttuja = true;
if (muuttuja) {
// Suoritetaan jos muuttuja on true
}
Tässä koodissa vain vihreä valo palaa, mutta punainen ei. Muuta koodia siten, että punainen valo palaa myös. Entä miten saat vihreän valon sammumaan?
https://wokwi.com/projects/401650299392099329
Yleinen if-rakenteen käyttökohde on numeeristen arvojen tarkastelu ja vertailu. Näin voidaan numeerisista arvoista tuottaa totuusarvoja.
int muuttuja = 100;
if (muuttuja == 90) {
// Tätä ei suoriteta, koska if-lauseen ehto on false
}
Arduino-ohjelmoinnissa (ja muissakin ohjelmointikielissä) numeeristen arvojen vertailu onnistuu seuraavanlaisilla merkinnöillä.
== | Yhtäsuuruus. Tulos on true , jos luvut ovat yhtäsuuret, muuten false . Huomaa kaksi == merkkiä peräkkäin! |
---|---|
> | Suurempi kuin. Tulos on true , jes merkin vasemmalla puolella oleva arvo on suurempi kuin oikealla puolella oleva. |
< | Pienempi kuin. Tulos on true jos merkin vasemmalla puolella oleva arvo on pienempi kuin oikealla puolella oleva. |
>= | Suurempi tai yhtäsuuri kuin. Tulos on true , jos vasemmalla puolella oleva arvo on suurempi kuin oikealla puolella oleva, tai arvot ovat yhtäsuuret. |
<= | Pienempi tai yhtäsuuri kuin. Tulos on true , jos vasemmalla puolella oleva arvo on pienempi kuin oikealla puolella oleva, tai arvot ovat yhtäsuuret. |
!= | Erisuuruus. Tulos on true , jos arvot ovat erisuuret. |
Jos halutaan ottaa totuusarvoisen muuttujan käänteisarvo arvo, voidaan käyttää !
merkintää.
int totuus = false;
if (!totuus) {
// Täällä oleva koodi suoritetaan, koska false:n käänteisarvo on true
}
Tämä koodi ei toimi, mikään valo ei syty. Muuta vertailuja niin, että saat kaikki LED valot syttymään.
https://wokwi.com/projects/401651191367555073
Joskus ehtolauseessa halutaan suorittaa koodia myös silloin, kun ehto ei toteudu. Tällöin voidaan käyttää else
rakennetta if
rakenteen lisäksi.
if (ehto) {
// Jos ehto pitää paikkansa, suoritetaan koodi hakasulkujen välissä
} else {
// Jos ehto ei pitänyt paikkaansa, suoritetaan tämä koodi
}
Jos ehto pitää paikkansa, suoritetaan ensimmäisten hakasulkujen välissä oleva koodi. Jos taas ehto ei pidä paikkaansa, suoritetaan else
:n jälkeen hakasuluissa oleva koodi.
Muuta seuraavaa koodia niin, että punainen valo syttyy vihreän valon sijaan
https://wokwi.com/projects/401653711677907969
Tämä koodi laittaa vain vihreän valon päälle. Miten saisit vihreän ja punaisen valon vilkkumaan vuorotellen muttamalla ok
muuttujan arvoa loop-funkiton sisällä?
https://wokwi.com/projects/401653822317366273
Joko-tai vertailun lisäksi joskus voi olla tarpeen reagoida useampaan eri tilanteeseen. Tällöin voidaan if
ja else
osioiden lisäksi käyttää else if
osiota
if (ehto) {
// Suoritetaan jos ehto pitää paikkansa
} else if (toinenEhto) {
// Suoritetaan jos toinenEhto pitää paikkansa
}
Näitä else if osioita voidaan lisätä peräkkäin tarvittava määrä ilman rajoituksia. else if
osioiden jälkeen voidaan myös tarvittaessa lisätä else
osio, joka suoritetaan, jos mikään ehdoista ei täyty.
if (ehto) {
// Suoritetaan jos ehto pitää paikkansa
} else if (toinenEhto) {
// Suoritetaan jos toinenEhto pitää paikkansa
} else if (kolmasEhto) {
// Suoritetaan jos kolmasEhto pitää paikkansa
} else {
// Suoritetaan jos mikään ehdoista ei täyty
}
Tässä esimerkissä liikennevaloista toimivat vain vihreä ja punainen valo. Muuta koodia siten, että liikennevalot toimivat oikein myös keltaisen valon osalta. Vinkki: Kokeile luoda lisää arvoja muuttujalle tila, ja sytyttää LED valoja sen perusteella.
https://wokwi.com/projects/401659312000234497
© 2024 Eero Prittinen
Seuraavaksi tutustutaan Arduinon input ominaisuuksiin