...
Toistorakenteet
Kun jotain koodin osaa halutaan toistaa ennalta tiedetty määrä kertoja tai ennalta tuntematon määrä, niin voimme käyttää toistorakennetta.
C-kielessä on kolme toistorakennetta:
for-silmukka
For-rakennetta kannattaa käyttää, jos toistojen määrä tiedetään ohjelmassa, ennen kuin toistot aloitetaan.
- For-lauseessa toistojen lukumäärää hallitaan ohjelmassa olevan toistolaskurin avulla.
- Se määritellään yleensä kokonaislukumuuttujana, jolle annetaan nimi i:
Code Block |
---|
int i;
|
- Toistot päätetään, kun laskuri on ylittänyt sovitun loppuarvon.
- Jos for-silmukoita on sisäkkäin, tarvitaan useita laskureita.
- Sisempien silmukoiden laskureille voidaan käyttää nimiä j ja k.
Toistolaskurin käsittely
Laskuriin kohdistuu kolme oleellista operaatiota. Nämä ovat:
- laskurin alkuarvon asettaminen (alkutoimet)
- laskurin arvon vertaaminen loppuarvoon (toistoehto)
- laskurin arvon kasvattaminen yhdellä (lopputoimet)
Nämä kaikki asiat tehdään for-lauseen alussa sulkujen sisällä:
Code Block |
---|
for (i=1; i<=N; i++)
|
- alkuarvon asettaminen tehdään kerran (ennen 1. toistoa)
- toistoehto tutkitaan ennen kunkin toistokerran alkua
- laskurin arvoa kasvatetaan kunkin toistokerran päätteeksi
Syntaksi
For-rakenteen kieliopillisesta muodosta on oleellista huomata että kaikki kolme toistoa ohjaavaa operaatiota kirjoitetaan for-riville sulkujen sisään:
Code Block |
---|
for (alkutoimet; toistoehto; lopputoimet)
{
lauseita;
}
|
Esimerkki
Seuraavassa for-silmukassa tulostetaan i:n arvot (0...9) ruudulle:
Code Block |
---|
int i;
for (i=0; i<10; i++)
{
printf("\n i = %d",i);
}
|
do...while
do...while- toistorakennetta käytetään silloin, kun silmukkaan täytyy mennä kerran, vaikka silmukassa oloehto ei olisikaan tosi. do...while-rakennetta sanotaan loppuehtoiseksi toistorakenteeksi.
Code Block |
---|
do
{
toiminnot silmukan sisällä;
}
while (silmukassa olo ehto);
|
Esimerkki
Code Block |
---|
int i=0;
do
{
printf("\ni = %d",i);
}
while (i<10);
|
while
while-toistorakennetta käytetään silloin, kun silmukkaan ei mennä alkuehdon ollessa epätosi. while-rakennetta sanotaan alkuehtoiseksi while-silmukaksi.
Code Block |
---|
while (silmukassa olo ehto)
{
toiminnot silmukan sisällä;
}
|
Esimerkki
Code Block |
---|
int i=0;
while (i<10)
{
printf("\ni = %d",i);
i++;
}
|
"Ikuinen" silmukka
Näistä kaksi ensimmäistä ovat ns. alkuehtoisia ja viimeinen, do...while on loppuehtoinen toistorakenne.
...
"Ikuinen" silmukka
- Joskus on tarpeen rakenne, joka toistaa haluttua koodia "ikuisesti".
- Lainausmerkit siksi, että ei tietenkään mikään ohjelma pyöri ikuisesti, mutta merkintää käytetään ilmaisemaan että toistorakenne toistuu ennalta tuntemattoman määrän kertoja.
Esimerkki
Seuraavassa on esimerkki ikuisen silmukan sekä if ja else-lauseiden käytöstä.
Ikuista silmukkaa tarvitaan ohjelmissa, missä ei ennalta tiedetä milloin ohjelmasta tulisi poistua.
Ikuisesta Seuraavassa on esimerkki ikuisen silmukan ja if sekä else- lauseiden käytöstä. Ikuista silmukkaa tarvitaan hyvin usein ohjelmassa, kun ennalta ei tiedetä koska ohjelmasta tulisi poistua. Tyypillisesti ikuisesta silmukasta poistutaan break tai return käskyillä.
Code Block |
---|
/* Ohjelma, joka tulostaa millä välillä annettu luku on.
* Lukuvälit ovat <10, 10-100 ja >100.
* Käytetään ohjelmassa if, else if ja else -lauseita.
*/
#include <stdio.h>
#include <conio.h>
int main()
{
int Luku;
while (1) // "ikuinen" silmukka
{
printf("\nAnna jokin luku: ");
scanf("%d",&Luku);
if (Luku < 10) printf("Luku on < 10");
else if (Luku >= 10 && Luku <= 100) printf("Luku on 10...100");
else printf("Luku on > 100");
if (Luku == 500) break; // poistutaan silmukasta, kun käyttäjä antaa luvun 500
}
return 1;
}
|