Joskus koodissa on tarpeen odottaa jonkin ehdon täyttymistä. Tällöin voidaan käyttää while
toistorakennetta.
while (ehto) {
// tehdään asioita niin kauan kuin ehto on voimassa
}
While
muistuttaa siis toiminnaltaan if
-rakennetta, sillä erotuksella, että while
rakenteen ehto tarkistetaan uudestaan ja uudestaan, kunnes se ei enää pidä paikkaansa.
Yhdistämällä while
rakenteen ja muuttujan, voidaan saada aikaan rajoitettu määrä toistoja
int toistoja = 0; // Alustetaan muuttuja 'toistoja' arvolla 0
while (toistoja < 3) { // jatketaan kunnes on suoritettu kolme toistoa
toistoja = toistoja + 1; // Lisätään toistojen määrää yhdellä
// Tänne voidaan laittaa koodia, joka halutaan suorittaa kolme kertaa
}
// Täältä jatketaan kun halutut toistot on suoritettu
Tässä koodissa käytetään while
rakennetta toistojen laskemiseen. Kun toistot ylittävät halutun rajan, while
rakenteen ehto ei enää täyty, ja koodia jatketaan aaltosulkujen jälkeen.
Tässä koodissa vilkutetaan lediä kolme kertaa. Kuinka muuttaisit koodia, jotta ledi vilkkuisi viisi kertaa?
https://wokwi.com/projects/405449905658573825
Toinen while
rakenteen käyttötarkoitus on odottaa kunnes jotain tapahtuu. Tämä voidaan yhdistää esimerkiksi digitalRerad()
funktion paluuarvoon.
while (digitalRead(3) == HIGH) {
digitalWrite(0, HIGH);
}
digitalWrite(0, LOW);
Tässä koodissa pidetään lediä päällä niin kauan kuin pinni kolme on kytketty jännitteeseen. Huomattavaa on myös, että digitalRead()
funktion paluuarvoa ei ole erikseen tallennettu muuttujaan, vaan sitä vertaillaan suoraan HIGH
-arvoon.
Tässä koodissa pidetään lediä päällä niin kauan kuin painike on painettuna. Kuinka koodin saisi vilkuttamaan lediä silloin kun painike on painettuna?
https://wokwi.com/projects/405450663678670849
Aiemmin if-lauseen kanssa käytetty tapa tallentaa digitalRead()
funktion paluuarvo muuttujaan ei toimikkaan while
-rakenteen kanssa. Osaatko selittää, miksi?
int painike = digitalRead(3);
while (painike == HIGH) {
digitalWrite(0, HIGH);
}
digitalWrite(0, LOW);
Ongelmana on, että muuttujan painike
arvoa ei päivitetä kutsumalla digitalRead()
funktiota uudelleen, joten sen arvo pysyy muuttumattomana toistosta toiseen.
Vaihtoehtoinen tapa tehdä while
-rakenne muuttujalla olisi siis:
int painike = digitalRead(3);
while (painike == HIGH) {
digitalWrite(0, HIGH);
painike = digitalRead(3); // Päivitetään muuttujan 'painike' arvo
}
digitalWrite(0, LOW);
Tässä painikkeen arvo päivitetään joka toiston lopussa ennen seuraavaa while
-rakenteen ehdon tarkistusta.
© 2024 Eero Prittinen
Olet nyt saavuttanut tämän kurssin lopun. olisi mahtavaa jos voisit vielä kertoa kokemuksistasi palautelomakkeessa