Programmeerimiskeel C/Keelestruktuurid

Allikas: Vikiõpikud

Korduvad tegevused (tsükkel, silmus)[muuda]

Korduseid täidetakse, kuni kordustingimus on tõene. Kordusest saab väljuda segmendiga break;. Programmeerimiskeeles C on 3 tsükli laadi. Sümboolselt i on iteratsiooni märk ja kasutatakse korduses tavaliselt muutujana. Tavaline väljumistingimus on i<mitu.

for tsükkel[muuda]

Üldkuju:

for(i_alg; tingimus; i_muutus_igal_läbikäikul){sisu;}

Korduste arv on eelnevalt teada. Kasutusele on võetud tsüklimuutujaga kordus.

  1. Täidetakse iteratsioonimuutuja(te) algväärtustamisavaldis(ed), mis tavaliselt on i=0; ;
  2. Kuni tingimus on tõene (mitte arv 0), täidetakse segmenti sisu;, mis tavaliselt on i<mitu;.
  3. Pärast iga tsükli läbikäimist täidetakse avaldis(ed) i_muutus_igal_läbikäikul, mis tavaliselt on i++;.


while tsükkel[muuda]

Üldkuju:

while(tingimus){sisu;}

Korduste arv selgub programmi töö käigus. Eelkontrolliga kordus.

Segmenti sisu; täidetakse kuni tingimus on tõene, kui üldse.

do while tsükkel[muuda]

Üldkuju:

do{sisu;}while(tingimus);

Korduste arv selgub programmi töö käigus. Järelkontrolliga kordus. Segmenti sisu; täidetakse vähemalt üks kord.

Segmenti sisu; täidetakse kuni tingimus on tõene

Lisaks[muuda]

break;[muuda]

Koodisegment break; võimaldab kordusest väljuda olles tsükli sees.

continue;[muuda]

Koodisegment continue; võimaldab vool jätkata koheselt tsükli algusest.

Erand pre - suurendamisel/vähendamisel[muuda]

Pre - suurendamisel/vähendamisel täidetakse avaldis(ed) i_muutus_igal_läbikäikul enne tsükli algust, mis näeks tavaliselt välja ++i.

Tühi operaator[muuda]

Tühi operaator tähendab, et sisu osa puudub, ning tegevus toimub tingimuses. Seda saab rakendada mõne triviaalse juhtumi lahendamisel, nt: sõne/stringi pikkuse leidmisel.

DO-LOOP analoogia[muuda]

While kordust kasutatakse ka, kui BASIC'ust tuntud DO-LOOP'ina, selle normaalkuju näeks välja:

while(1){sisu_mis_sisaldab_väljumist;}

Väljumiseks kasutatakse koodisegmenti break;

Valikud[muuda]

Ühene ja kahene valik[muuda]

Kui tingimus on tõene (pole arv 0), täidetakse tegevus1, kui mitte täidetakse tegevus2. Pöördtingimuse tühjaks jätmine on sama, mis selle ära jätmine.

if(tingimus){tegevus1;}
if(tingimus){tegevus1;}else{tegevus2;}

Väärtustav kahene valiktingimus a la (iif)[muuda]

Tegemist on valikuga, mis väärtustab tingimuse alusel. Normaalkuju oleks

muutuja=(tingimus)?(kui_tõene):(kui_väär);

Lisaks: Seda kasutatakse mõne triviaalse juhu lahendamisel, näiteks maksimumi ja miinimumi leidmisel:

MAX = (a > b) ? a : b;
MIN = (a < b) ? a : b;


Mitmikvalik[muuda]

Switch[muuda]

Valikuid käiakse läbi kuni sobivas valikus jõutakse käsuni break;, kui ükski valik ei sobinud, täidetakse valik default.

Näiteks tavaliselt näeb mitmik tingimus välja:

switch(tingimus){
  case valik_1: tegevus1; break;
  case valik_2: tegevus2; break;
  case valik_3: tegevus3; break;
  default: tegevus4 break;
}

Meelespea:

  • Kui sobivas valikus täidetakse tegevus(ed), ning puudub segment break; jätkatakse sobivate valikute läbikäimist.
  • Default valik pole kohustuslik
  • Tingimused ja valikud peaksid olema täisarvu tüüpi
    • Tähemärgid on ka täisarvutüüpi! Neid tuleks korduses märkida nt: case('M'):, meeles tuleb pidada, et apostroof(') ei ole jutumärk(") ja suurtel ja väikestel tähtedel tehakse vahet.

Mitmik if[muuda]

Kuigi parema loetavuse annab arvatavasti switch, on ka if'lausetega võimaliks simureeri switchi. Nüüd ei pea me break'i kasutama, ning see võimalab näiteks breaki kasutada kordusest väljumisel.

 
if(k==0){
    }else if(k==1){
        //sisu
    }else if(k==2){
        //sisu
    }else if((k<6 && k>3)|| k==666 || k--==34){
        //sisu
    }else if(k==2){      
        //sisu
    }else{
        //sisu
}

Selle võimaluse suurimad plussid muutuvad irooniliselt tema miinusteks, kuid leidub olukordi kus tõepoolest ehk oleks ratsionaalne seda varianti kasutada.

Meelespea:

  • koodisegmendiga break; saab kasutada, näiteks väljumiseks tsüklist
  • iga else if võib sisaldada täiesti uut tingimust
  • tingimused võivad olla ka keerulised algoritmid
  • tingimused ei pea olema sama muutujaga
  • tingimused võivad muuta läbikäimisel väärtusi
    • NT: näites tähendakse see, kui k=3, siis esimese tingimusel k==2 olek vastus väär, kuid k--=34 vähendab k väärtust ja teisel tingimusel k==2 olek vastus tõene! (See teeb koodi raskest loetavaks)
  • Viimane }else{ tingimus täidetakse, kui eelnevalt olid kõik võimalused väärad, põhimõtteliselt on sama mis default swich'i puhul

Voo järje oma suva järgi muutmine kasutades goto koodisegmenti[muuda]

Tegemist on väga lihtsa ja traditsioonilise voo jaotus mehhanismiga, mida välditakse, kuna ta võib muuta koodi lugemise ülikeeruliseks. Goto ütleb millise goto lipiku juurest jätkata.

Üldkuju:

goto lipik_1;
   //sisu; 
lipik_1:
   //sisu;

Kui seda ülde reaalselt kasutatakse, siis olles tingimuses, mis märgib viga ja juhendab voo vigade tingimusplokki.

Lisaks[muuda]

  • Kui korduse või tingimuse sisu on 1 koodisegmendine, pole vaja teda ümbritseda "{" ja "}" märkidega.
  • C++'is on võimalik deklareerida muutuja skoop ka korduse siseselt! See aga tähendab, et korduse standardmuutuja i deklareerimine ülefunktsioonilise skoopiga on halb komme.