7. Silmukkarakenne do-while

Alunperin julkaistu: 11.2.2017

Viimeksi muokattu: torstai 11.6.2020

Edellisellä sivulla käytiin läpi while ja for silmukkarakenteet. Seuraavaksi on vuorossa do-while. Do-while eroaa while ja for silmukoista mm. suoritusehtojen tarkistuksen osalta. Do-while silmukassa silmukan suorittamista varten olemassa oleva ehto tarkistetaan aina vähintään yhden kerran. Do-while toistaa itseään silloin, kun tarkistettava ehto täyttyy eli on tosi.

Do-while silmukka silmukassa do-lohko suoritetaan ensin yhdesti, jonka jälkeen suoritetaan ehdon tarkistus while -sulkujen sisällä. Mikäli ehto on tosi, suoritetaan do-lohko uudestaan. Monesti do-while lohkon voi kirjoittaa muullakin silmukalla, mikäli kyseinen rakenne tuntuu hankalalta tai se ei sovi tarpeeseen. Toisaalta do-while lohko soveltuu hyvin esimerkiksi erilaisten tarkistusten tekoon.

Esimerkki 1: Do-while silmukkarakenne

Tämän ohjelman kirjoittamiseksi on helpoin muokata osan 5 esimerkkikoodia. Ohjelmasta tehdään jälleen uusi ledin vilkutus ja tällä kertaa käytetään do-while rakennetta. Ohjelman koodi on alla.

#include <msp430g2231.h> 
// aliohjelman esittely 
void Viive(unsigned int aika);

void main(void)
{
     unsigned int viiveenpituus = 20000;
     WDTCTL = WDTPW + WDTHOLD;
     // vahtikoiran pysäytys 
     P1DIR |= BIT0 + BIT6;
     // asetetaan ledipinnit outputiksi
     P1OUT &= ~(BIT6 + BIT0);
     // asetetaan ledipinnit nollaan ettei ledit pala
     while(1) // pääohjelman pääsilmukka          
     {
          do 
          {
               P1OUT ^= BIT6;
               // ledin tilan vaihto
               // kutsutaan viivettä, parametrinä muuttuja viiveenpituus
               Viive(viiveenpituus);
          }
          while( P1IN & BIT3 ); // toisto jos nappia ei ole painettu
          // kasvatetaan viiveen pituutta, jotta led välkkyy hitaammin 
          viiveenpituus += 10000;
     }
}
void Viive(unsigned int aika)
{
     unsigned int x=0;
     for(x=0;x<aika;x++);
}

Ohjelman kulku

Ohjelma toimii siten, että vihreä led vilkkuu aluksi nopeahkoon tahtiin. Kun nappia painetaan, vilkutustahti muuttuu hieman nopeammaksi. "Vauhtia" kasvatetaan aina lisää niin kauan, kunnes viiveenpituus muuttujan arvo menee yli 16 bitin rajan (eli ylittää arvon 65535).

Ohjelma alkaa jo totuttuun tapaan: muuttujien alustus, vahtikoiran pysäytys ja ledien sammutus. Ohjelman pääsilmukassa siirrytään suoraan do-whilelausekkeeseen, missä itse toimintoa suoritetaan. Ohjelma suorittaa do lohkoa niin kauan, kunnes nappia painetaan. Napin painalluksen jälkeen ohjelman suoritus hyppää ulos do-while silmukasta ja kasvattaa muuttujan arvoa 10000:lla. Tämän jälkeen do lohkon suoritus alkaa uudestaan kunnes nappia painetaan jne.

Do-while silmukka kirjoitetaan aina kuten yllä olevassa esimerkissä. Ensin do ja sitten while. Huomaa myös while -sulkujen lopussa oleva puolipiste, joka tarkoittaa sitä että ohjelma suorittaa silmukkaa mikäli ehto täyttyy eli on tosi. Vaikka while -silmukka voidaan luoda lohkoksi, ei sitä tässä tapauksessa voida tehdä. Et siis voi kirjoittaa kuten alla:

do { // koodia }
 while( P1IN & BIT3 ) // ei puolipistettä
 { // lisää koodia } // tästä seuraa käännösvirhe

Seuraavassa osassa käydään läpi switch-case rakenne ja vilkutellaan lediä jälleen eri tahdissa.