TOISTOLAUSEET (silmukat)

C-ohjelmissa ohjelmalauseet suoritetaan siinä järjestyksessä, jossa ne avat kirjoitettu. Ohjelmassa oleva lause suoritetaan vain kerran. Tämä ei ole kovin joustava eikä käytännöllinen ratkaisu. Ohjelmalauseita joudutaan suorittamaan toistuvasti. Tällaisia tapauksia varten kieleen on rakennettu toistolauseet, joiden avulla lauseryhmää toistetaan niin kauan kunnes tietty looginen ehto on täytetty.

Toistorakenteita kielessä on kolme: for, while ja do...while.


for - KOMENTO

for-komentoa käytetään tilanteissa, joissa halutaan suorittaa jotakin tehtävää tietty kertamäärä.

for-komennon yleinen muoto:

for (alustus; ehto; päivitys) lause;

Avainsanan for jälkeen tulevissa suluissa on kolme osaa:
Alustus on toiminto jolla silmukkaa ohjaava muuttuja alustetaan, eli alustetaan laskuri jonka avulla toistojen määrää kontroloidaan.( alla, alustus on x = 0; )
Ehto-osan ollessa tosi voidaan silmukan suoritusta jatkaa, ehto-osaa voidaan pitää myös lopetusehtona. ( alla, ehto on x < 10; )
Päivitys-osassa suoritetaan uudet arvottamiset esim. lisätään silmukan laskuria. ( alla, päivitys on x ++ )

Osista jokin tai kaikki voivat puuttua mutta puolipisteet on laitettava sulkujen sisälle.

for on aloitusehtoinen komento, joka tarkoittaa, että ehto testataan ennen silmukkaan menoa.

int x; for (x=0; x < 10; x++) printf(”Kymmenen tulostusta\n”);

Huom ! Silmukkailmaisun jälkeen eli for-lauseen loppuun ei tule puolipistettä.

/* for-esimerkki */ #include <stdio.h> int main() { int x; for (x = 1; x <= 10; x++) printf(”Iterointi: %d\n”, x); getch(); return 0; }




/* lasketaan sataan kymmenen välein */ #include <stdio.h> int main() { int x; for (x=0; x<=100; x = x + 10) printf(”Arvo on: %d\n”, x); getch(); return 0; }




Alla, ohjelma joka kysyy yksiuloitteiseen taulukkoon 10 desimaalilukua ja tulostaa annetut luvut taulukosta näytölle.

/* for-esimerkki, kymmenen lukua taulukkoon ja niiden tulostus */ #include <stdio.h> int main() { int x=1, rivi; float lukuja[10]; for (rivi = 0; rivi <= 9; rivi++) { printf("Anna %d. luku: \n", x); x++; scanf("%f",&lukuja[rivi]); } for (rivi = 0; rivi <= 9; rivi++) { printf("%f \n", lukuja[rivi]); } getch(); return 0; }




Alla, sisäkkäisistä for-lauseista esimerkki. Sisäkkäisellä for-lauseella voi käsitellä esim. kaksi-uloitteista taulukkoa.

/* sisäkkäiset for-lauseet */ #include <stdio.h> int main() { int x, y; for (y=0; y<=10; y++) { for (x=0; x<=10; x++) printf("_ ", x); printf("\n"); } getch(); return 0; }




Alla pseudo-kielinen versio kaksiuloitteisen taulukon käsittelystä. Pseudo-kielellä ratkaistaan ohjelman rakenteita kirjoittamatta ohjelmointikieltä.

/* Pseudo-kielinen malli kaksiuloitteisen taulukon käsittelystä */ rivi, sarake, taulukko 5*4 toista ( viidelle riville ) toista ( neljään sarakkeeseen ) pyydä luku lue luku sarakkeeseen sarake




while - KOMENTO

C-kielen toinen silmukkarakenne on while-rakenne. while -silmukassa silmukan runko suoritetaan niin kauan kuin ehto on tosi. Kun ehto tulee epätodeksi, ohjelman suoritus siirtyy silmukkaa seuraavaan lauseeseen. while on alku-ehtoinen toistolause, eli ensin tutkitaan toteutuuko ehto ennenkuin rakenteen sisään mennään.

while -komennon yleinen muoto:

while (ehto) lause;

Varattua sanaa while seuraa ehto suluissa ja suoritettava lause.

while (x == TRUE) printf(”Muuttuja x on tosi\n”);


Alla, while-komentoa käytetään toistolauseena.

/* while-silmukan käyttö */ #include <stdio.h> int main() { int counter = 1; while (counter <= 20) { printf(”Iterointi: %d\n", counter); counter ++; } getch(); return 0; }




do ... while - KOMENTO

do..while-silmukan rakenne on samantyyppinen kuin while-silmukan. do..while-rakenteen ero while ja for rakenteeseen on, että se on lopetusehtoinen. do..while-silmukka suoritetaan aina vähintään yhden kerran, koska ehto testataan silmukan lopussa eikä sen alussa.

do..while-silmukan yleinen muoto:

do { lause_1; lause_2; ....... } while(ehto);

HUOM! Avainsanan while jälkeen tulee ehto sulkuihin ja sulkujen jälkeen puolipiste ; .

/* do_while käyttö */ #include <stdio.h> int main() { int x = 1; do { printf(”%d\n”, x++); } while(x <= 10); getch(); return 0; }




do..while-silmukka on yleisin rakenne toteutettaessa ohjelmien tai ohjelmistojen lopetus-ehto.

#include <stdio.h> int main(void) { int luku1, luku2; char vastaus; do { printf ("\nYhteenlaskukone"); printf ("\nAnna kaksi kokonaislukua: "); scanf ("%d %d", &luku1, &luku2); printf ("Summa on: %d",luku1+luku2); printf ("\nJatketaanko (k/e): "); vastaus = getche(); }while (vastaus == 'k'); }




Edellinen esimerkki hiukan erilailla, tässä ohjelman lopetus tapahtuu ESC-painikkeella. Lopetus-ehto voi lukea seuraavasti:
toistetaan mikäli vastaus on eri suurikuin 27 eli Esc-painike.

#include <stdio.h> int main(void) { int luku1, luku2; char vastaus; do { printf ("\nYhteenlaskukone (Lopetus, ESC-painikkeella)"); printf ("\nAnna kokonaisluku: "); scanf ("%d", &luku1); printf ("Anna kokonaisluku: "); scanf ("%d", &luku2); printf ("Summa on: %d \n",luku1+luku2); vastaus = getche(); }while (vastaus != 27); }




goto - KOMENTO

C-kieli sisältää myös goto -komennon, tosin sen käyttöä ei suositella koska se johtaa usein sekaviin ohjelmatoteutuksiin. Esim.

int main() { otsikko: /* otsikko, johon goto viittaa */ printf(”*”); goto otsikko; return 0; }



break - KOMENTO

break-komennon ensisijainen käyttö on keskeyttää case-komento. Sillä voidaan myös pakottaa lopettamaan silmukan suoritus. Kun kääntäjä havaitsee break-komennon silmukan sisäpuolella, silmukan ajo keskeytetään ja kontrolli siirretään silmukkaa seuraavalle ohjelmariville.

/* break esimerkki */ #include <stdio.h> int main() { int x; for (x = 0; x < 100; x++) { printf(”Muuttujan arvo on %d\n”, x); if (x == 10) break; } getch(); return 0; }




continue - KOMENTO

continue -komentoa käytetää ohittamaan silmukan loppuosa. Komentoa käytetään kuten break komentoa mutta komennon käyttö ei johda silmukan keskeyttämiseen vaan silmukan suoritusta jatketaan silmukan alusta.

/* continuen käyttö */ #include <stdio.h> int main() { int x; for (x = 0; x < 50; x++) if ( x % 2) { continue; printf(”Muuttuja x on suuruudeltaan %d\n, x); } return 0; }




while ja while...do -silmukassa continue -komento siirtää ohjelman kontrollin suoraa ehto-osaan. Silmukkaprosessia jatketaan ehto-osan jälkeen. for -silmukan yhteydessä suoritetaan ensin alustusosa jonka jälkeen suoritetaan testi.