Tie koodariksi

C++-ohjelmointi

Luku 5: Silmukat

For-silmukka

For-silmukan rakenne on seuraavanlainen:
for (alku; ehto; muutos) {
    koodi
}
Silmukan alussa suoritetaan komento alku, minkä jälkeen suoritetaan jokin määrä kierroksia. Jokaisen kierroksen alussa tarkastetaan, päteekö ehto. Jos ehto pätee, suoritetaan ensin koodi ja sitten komento muutos, minkä jälkeen alkaa seuraava kierros. Jos taas ehto ei päde, silmukka päättyy.

For-silmukan tavallinen käyttökohde on lukuvälin läpikäynti:

for (int i = 1; i <= 10; i++) {
    cout << i << " ";
}
Koodin tulostus on seuraava:
1 2 3 4 5 6 7 8 9 10

While-silmukka

While-silmukan rakenne on seuraava:
while (ehto) {
    koodi
}
Silmukan jokaisen kierroksen alussa tarkastetaan, päteekö ehto, ja jos pätee, suoritetaan silmukan sisällä oleva koodi. Silmukka päättyy, kun ehto ei enää päde.

While-silmukkaa voi käyttää vaikkapa näin:

int a = 1, b = 10;
while (a < b) {
    cout << a << " " << b << " ";
    a++; b--;
}
Koodin tulostus on seuraava:
1 10 2 9 3 8 4 7 5 6

Do-silmukka

Harvinaisempi silmukka on do-silmukka, jonka rakenne on seuraava:
do {
    koodi
} while (ehto);
Tämä toimii muuten samalla tavalla kuin while-silmukka, mutta ehto tarkastetaan vasta silmukan kierroksen jälkeen. Tämän vuoksi koodi suoritetaan aina vähintään kerran.

Seuraava koodi esittelee do-silmukan toimintaa:

int x = 100;
do {
    cout << x << " ";
    x /= 2;
} while (x != 0);
Koodin tulostus on seuraava:
100 50 25 12 6 3 1

Break-komento

Komento break keskeyttää silmukan ja siirtyy sen jälkeiselle riville.

Esimerkiksi seuraavan silmukan ehtona on true, minkä vuoksi se periaatteessa jatkuu ikuisesti. Komento break kuitenkin keskeyttää silmukan.

int x = 1;
while (true) {
    cout << x << " ";
    if (x == 10) break;
    x++;
}
Koodi tuottaa seuraavan tuloksen:
1 2 3 4 5 6 7 8 9 10

Continue-komento

Komento continue siirtyy suoraan silmukan seuraavalle kierrokselle eikä suorita jäljellä olevaa koodia.

Esimerkiksi seuraava silmukka käy läpi luvut 1...10, mutta komento continue siirtyy seuraavalle kierrokselle, jos luku on parillinen, joten silmukka tulostaa vain parittomia lukuja.

for (int i = 1; i <= 10; i++) {
    if (i%2 == 0) continue;
    cout << i << " ";
}
Koodi tuottaa seuraavan tuloksen:
1 3 5 7 9

Goto-komento

Vielä yksi tapa vaikuttaa ohjelman suoritukseen on komento goto, joka hyppää toisaalla koodissa olevaan nimiöön (label). Esimerkiksi seuraavassa koodissa komento goto hyppää nimiöön loppu.
goto loppu;
cout << "apina\n";
cout << "banaani\n";
loppu:
cout << "cembalo\n";
Tässä tapauksessa komennon goto vuoksi vain viimeinen rivi tulostetaan:
cembalo
Yleensä kuitenkin komennon goto sijasta kannattaa käyttää muita rakenteita, koska sen käyttäminen tekee koodista sekavaa.