TOISTOLAUSEET (silmukat)
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:
Avainsanan for jälkeen tulevissa suluissa on kolme osaa:for (alustus; ehto; päivitys) lause;
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.
Huom ! Silmukkailmaisun jälkeen eli for-lauseen loppuun ei tule puolipistettä.int x; for (x=0; x < 10; x++) printf(”Kymmenen tulostusta\n”);
/* 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:
Varattua sanaa while seuraa ehto suluissa ja suoritettava lause.while (ehto) 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:
HUOM! Avainsanan while jälkeen tulee ehto sulkuihin ja sulkujen jälkeen puolipiste ; .do { lause_1; lause_2; ....... } while(ehto);
/* 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.