Siirry sisältöön

C++/Ohjausrakenteet

Wikikirjastosta
< C++

Tämä luku kertoo ohjausrakenteista. Ohjausrakenteet ovat lauseita, jotka vertailevat kahta tai useampaa arvoa toisiinsa. Ohjausrakenteiden avulla voidaan tehdä monimutkaisia ohjelmia, jonka suoritusjärjestys muuttuu ehtojen tulosten perusteella. Ilman ohjausrakenteita ei pystyisi ratkaisemaan kuin ongelmia, joilla on vain yksi ratkaisutapa. C++:ssa ohjausrakenteita on monenlaisia, ja niitä yhdistelemällä on mahdollista hallita ohjelman kulkua tehokkaasti.

Ehtolause eli if-lause on ohjausrakenteista yksinkertaisin. Ehtolauseen muoto C++-kielessä on:

if (ehto)
    lause;

Ehto voi olla mikä tahansa vertailu, joka palauttaa totuusarvon, true tai false. C++-kielessä ohjelmalauseen voi korvata koodilohkolla joka kirjoitetaan aaltosulkujen väliin. Alla esimerkkejä erilaisista ehtolauseista.

int luku = 3; 
if (luku < 5)
    std::cout << "Tulostetaan tekstiä.";

Jos ohjelmalauseita on enemmän kuin yksi, ne täytyy kirjoittaa aaltosulkujen sisään.

if (luku > 2)
{
    luku = 1;
    std::cout << "Tulostetaan lisää.";
}

Ehtolauseita voidaan laajentaa käyttämällä else-lohkoa. Tässä lohkossa olevat lauseet suoritetaan, jos ehto on epätosi.

if (luku > 2)
{
    // Suoritetaan jos ehto on tosi
}
else
{
    // Suoritetaan jos ehto on epätosi
}

While-silmukka

[muokkaa | muokkaa wikitekstiä]

While-silmukka on yksinkertainen toistorakenne. Siinä määritellään vain ehto, jonka ollessa tosi, toistetaan tietyt koodilauseet. Silmukan rakenne on:

while (ehto)
{
    // tee jotakin
}

Tämä ohjelma tulostaa samalle riville 10 kertaa tekstin "Hello World!".

// Tarvittava muuttuja toistorakennetta varten
int x = 0;

// Toista niin kauan kunnes x ei ole pienempi kuin 10
while(x < 10)
{
    std::cout << "Hello World!" << std::endl;
    // Lisää yhdellä muuttujaa x
    ++x;
}

Do-while-silmukka

[muokkaa | muokkaa wikitekstiä]

Do-while-silmukka on toisenlainen versio while-silmukasta. Sen ainoa ero tavalliseen while-rakenteeseen on, että silmukka toistuu vähintään kerran. Do...while-rakennetta käytetään usein syötöntarkistuksessa, koska sen avulla voidaan helposti varmistaa että käyttäjä syöttää esimerkiksi jonkin tietyn arvon. Silmukan rakenne on:

do {
    // tee jotakin
} while (ehto);

Alla olevan esimerkin silmukka toistuu kerran. Vastaavassa tilanteessa while-silmukka ei toistuisi kertaakaan.

int x = 1;
do {
    std::cout << "Teksti tulostuu kerran." << std::endl;
} while (x == 0);

For-silmukka on toistorakenne, joka toistaa silmukan määrätyn monta kertaa. Se vastaa toiminnaltaan while-silmukkaa, mutta sitä käytetään yleensä jos toistojen määrä tiedetään etukäteen. Silmukan rakenne on seuraavanlainen:

for (alustus; ehto; päivitys)
{
    // tee jotakin
}

Silmukka koostuu kolmesta lausekkeesta. Ensimmäinen on alustuslauseke, jossa yleensä alustetaan silmukassa käytettävä laskuri. Toinen lauseke on ehtolauseke, jonka perusteella silmukkaa joko jatketaan tai se pysäytetään. Kolmas lauseke on ns. päivityslauseke, joka suoritetaan aina silmukan jälkeen. Sitä käytetään yleensä laskurin arvon nostamiseen tai laskemiseen. Seuraava esimerkki tulostaa kaikki luvut nollan ja kymmenen välillä.

for (int i = 0; i <= 10; ++i)
{
    std::cout << i << std::endl;
}

Break ja continue

[muokkaa | muokkaa wikitekstiä]

Break on kätevä, koska sillä voi poistua silmukan sisältä välittömästi, ilman että silmukan ehtoa tarkastellaan uudelleen. Continuella taas voi jatkaa ohjelman suoritusta seuraavaan silmukan iteraatioon. Seuraavat esimerkit näyttävät, kuinka niitä käytetään.

  // Tämä esimerkki tulostaa '42' (eikä esimerkiksi '100')
  int i = 0;
  while (i < 100) {
     if (i == 42) 
        break; // silmukka keskeytyy, kun i = 42
     i++;
  }
  std::cout << i << std::endl;
  // Tämä esimerkki laskee 100:aa pienempien parittomien lukujen summan (eli tulostaa '2500')
  int sum = 0;
  for (int i = 0; i < 100; i++) {
     if (i % 2 == 0)  // % on jakojäännösoperaattori
        continue;     // Luku on parillinen, jatka silmukan suoritusta sen lopusta (ensin 'i++', sitten ehto 'i < 100' )
     sum += i;
  }
  std::cout << sum << std::endl;

Switch-rakenne

[muokkaa | muokkaa wikitekstiä]

If-rakenteen sijasta voi käyttää switch-rakennetta. Default-kohtaa käytetään kun muuttujaa vastaavaa arvoa ei löydy. Sopivan vaihtoehdon löytyessä switch-rakenne voidaan katkaistaan break-käskyllä, koska ilman sitä kaikki loputkin käydään läpi.

switch (muuttuja) // kokonaisluku tai char
{
  case 0:
    // Arvo on nolla, älä tee mitään ja mene seuraavaan
  case 1: case 2:
    // Arvo on nolla (edellisestä "tippumalla") tai yksi tai kaksi, mene switch-rakenteen loppuun
    break;
  case 3:
  {
    // Arvo on kolme, kutsutaan funktiota silloin
    tee_jotain_arvolla_kolme();
    // Tässä voi olla useampia lauseita, mene switch-rakenteen loppuun 'break' lauseella lopuksi.
    break;
  }
  default:
    // Arvo on joku muu
    break;
}
// switch-lauseen loppu on tässä

Rakenteiden yhdisteleminen

[muokkaa | muokkaa wikitekstiä]