h1. for-toistorakenne
_For_\-rakennetta kannattaa käyttää, jos *toistojen määrä tiedetään* ohjelmassa, ennen kuin toistot aloitetaan.
* _For_\-lauseessa toistojen lukumäärää hallitaan _yleensä_ ohjelmassa olevan toistolaskurin avulla.
\-> Se määritellään yleensä kokonaislukumuuttujana, jolle annetaan nimi {{i}}.
* Toistot päätetään, kun laskuri on saavuttanut sovitun loppuarvon (loppuarvo voi olla vakio tai muuttuja).
h2. Syntaksi
_For_\-rakenteen kieliopillisesta muodosta on oleellista huomata, että kaikki kolme toistoa ohjaavaa operaatiota kirjoitetaan _for_\-riville sulkujen sisään:
{code}
for (alkutoimet; toistoehto; lopputoimet)
{
lauseita;
}
{code}
h2. Toistolaskurin käsittely
Laskuriin kohdistuu kolme oleellista operaatiota. Nämä ovat:
|| || Toimet || Merkitys ||
| 1. | alkutoimet | Laskurin alkuarvon asettaminen |
| 2. | toistoehto | Laskurin arvon vertaaminen loppuarvoon |
| 3. | lopputoimet | Laskurin arvon kasvattaminen |
Nämä kaikki asiat tehdään for-lauseen alussa sulkujen sisällä:
{code}
int i;
for (i=1; i<=N; i++)
{code}
* alkuarvon asettaminen tehdään *kerran* (ennen 1. toistoa)
* toistoehto tutkitaan *ennen* kunkin toistokerran alkua
* laskurin arvoa kasvatetaan kunkin toistokerran *päätteeksi*
--
* Jos for-silmukoita on sisäkkäin, tarvitaan useita laskureita. Kts [#Esimerkki 2].
* Sisempien silmukoiden laskureille voidaan käyttää nimiä {{j}} ja {{k}}, jne.
h2. Esimerkki 1
Ohjelman pätkä, joka tulostaa arvot 0...9 allekain ruudulle käyttäen _for_\-toistorakennetta:
{code}
int i;
for (i=0; i<10; i++)
{
printf("\n i = %d", i);
}
{code}
{anchor:Esimerkki 2}
h2. Esimerkki 2
Ohjelma, jossa tulostetaan kymmenen kertotaulu käyttäen sisäkkäisiä for-rakenteita:
{note}Ohjelmassa käytetään samaa laskuria {{i}} kahteen kertaan. Tämä on ok, kunhan silmukat eivät ole sisäkkäisiä.
{note}
{code}
int i, j; // for-rakenteiden laskurit
printf(" |"); // alkumuotoilut
for (i=1; i<=10; i++) printf("%3d ", i); // tulostetaan ylärivin luvu 1...10
printf("\n--------------------------------------------"); // tulostetaan rivinvaihto ja 40 '-' -merkkiä
for (i=1; i<=10; i++) // ulompi silmukka, käydään arvot 1...10 läpi
{
printf("\n%3d|", i); // tulostetaan vasempaan laitaan luku, millä kerrotaan ylärivin luvut
for (j=1; j<=10; j++) // sisempi silmukka, jossa kerrotaan luvuilla 1...10 ulomman silmukan laskuri
{
printf("%3d ", i*j); // tulostetaan laskenta i*j ruudulle
}
}
printf("\n"); // loppuun rivinvaihto
{code}
Ohjelma tulostaa seuraavan taulukon:
{noformat}
| 1 2 3 4 5 6 7 8 9 10
--------------------------------------------
1| 1 2 3 4 5 6 7 8 9 10
2| 2 4 6 8 10 12 14 16 18 20
3| 3 6 9 12 15 18 21 24 27 30
4| 4 8 12 16 20 24 28 32 36 40
5| 5 10 15 20 25 30 35 40 45 50
6| 6 12 18 24 30 36 42 48 54 60
7| 7 14 21 28 35 42 49 56 63 70
8| 8 16 24 32 40 48 56 64 72 80
9| 9 18 27 36 45 54 63 72 81 90
10| 10 20 30 40 50 60 70 80 90 100
{noformat} |