2.7.2 Toistolause do..while

Silmukan do..while yleinen muoto on

do lause while (ehto);

tai, jos lause korvataan lohkolla:

do {
  lause1;
  lause2;
  ...
} while (ehto);

Tämä silmukka aloitetaan suorittamalla ensin lause (lohko). Sitten lasketaan ehto-lausekkeen arvo; jos tulos on tosi (nollasta poikkeava), suoritetaan lause (lohko) uudelleen ja lasketaan jälleen ehto, jne. Sitten kun ehdon tulos on epätosi (nolla), silmukan suoritus päättyy.

Lause do..while eroaa while-lauseesta vain sikäli, että nyt lause (tai lohko) suoritetaan aina vähintään kerran, kun taas while:a käytettäessä on mahdollista, että toistettavaa toimenpidettä ei tehdä kertaakaan. Se, kumpaa silmukkaa kannattaa käyttää, täytyy päättää tapauskohtaisesti.

Edellinen esimerkki do..while-silmukan avulla tehtynä näyttää seuraavalta:

/* *********************************************************
COOPER3.CPP
  Kuten COOPER2.CPP, mutta käytetään do..while -silmukkaa
  syöttötietojen tarkistamisessa.
********************************************************* */

#include <iostream.h>

#define RADAN_PITUUS 400
#define MAKSIMI 6000
#define MINIMI 100

void tulosta_esittely(void)
{
  cout << "\n\n";
  cout << "Cooperin testi\n" << endl;
}

void kysy_matka(int &matka)
{
  /* toistetaan kunnes annettu matka on järkevä */
  do {
    cout << "Anna juoksemasi matka metreinä (";
    cout << MINIMI << "-" << MAKSIMI << ") > ";
    cin >> matka;
  } while (matka < MINIMI || matka > MAKSIMI);
}

int laske_kierrokset(int &matka)
{
  int kierrokset = 0;

  while (matka >= RADAN_PITUUS) {
    matka = matka - RADAN_PITUUS;
    kierrokset++;
  }

  return kierrokset;
}

void tulosta_kierrokset(int kierrokset, int loppumatka)
{
  cout << "\n";
  cout << "Juoksit " << kierrokset << " kierrosta ";
  cout << "ja lisäksi " << loppumatka << " metriä." << endl;
}

int main(void)
{
  int matka;
  int kierros_lkm;

  tulosta_esittely();
  kysy_matka(matka);
  kierros_lkm = laske_kierrokset(matka);
  tulosta_kierrokset(kierros_lkm, matka);

  return 0;
}

Esimerkkiajo:

Cooperin testi

Anna juoksemasi matka metreinä (100-6000) > 25
Anna juoksemasi matka metreinä (100-6000) > 7500
Anna juoksemasi matka metreinä (100-6000) > 3800

Juoksit 9 kierrosta ja lisäksi 200 metriä.

Cooper-ohjelmassa radan pituus on vakiona. Muuta se muuttujaksi, jonka arvon käyttäjä antaa.