While

From ICO wiki
Jump to navigationJump to search

Mõisted

TSÜKKEL on struktuur, mille abil saab mingi osa programmi või algoritmi lauseid korduma panna.[1] Sageli on vaja täita mingeid käske korduvalt: trükkida mitu korda sama sõna, teha sama tehet, joonistada ühesuguseid kujundeid jne. Ühest küljest oleks liiga töömahukas kopeerida sama koodi kümneid, tuhandeid või miljoneid kordi, teisest küljest ei pruugi me alati programmi kirjutades veel teadagi, mitu korda mingit operatsiooni on vaja teha. Kas programmi kasutaja soovib joonistada 10 või 1000 kolmnurka? [2]

Korduvate operatsioonide puhul kasutatakse programmeerimises tsükleid. Sõltuvalt programmeerimiskeelest antakse programmeerija käsutusse erinevat tüüpi tsükleid. Näiteks Pascalis on võimalik kasutada kolme erinevat tsüklit: [3]

  • WHILE-tsükkel e. tsükkel, mis kordab valitud käske seni, kuni määratud tingimus (tsüklitingimus) on tõene (ka eelkontrolliga tsükkel).
  • FOR-tsükkel e. tsükkel, mis kordab valitud käske kindel arv kordi (ka määratud tsükkel).
  • REPEAT-tsükkel e. tsükkel , mis täidab kõigepealt tsükli sisu ja seejärel kontrollb tingimuse täidetust (järelkontrolliga tsükkel).


WHILE TSÜKKEL on eelkontrolliga tsükkel, kus kontrollitakse enne käskude täitma asumist mingi tingimuse tõesust. Kuni tingimus on tõene (tsüklitingimuses kasutatav tsüklimuutuja vastab tingimusele), täidetakse tsüklis olevaid käske, kui aga mitte, väljutakse tsüklist e. minnakse järgmisele reale pärast tsüklit sisaldavat plokki. Loogikatingimus on tsükli alustamise tingimus. Kui see tingimus osutub tõeseks, siis täidetakse tegevused tsükli sees. Ehk teisisõnu tsüklit täidetakse siis, kui tingimus on tõene. Sellise tsükli olemasolu on igas programmeerimiskeeles hädavajalik. While tsükkel on olemas enamikes programmeerimiskeeltes [4]

While-tsükli üldine kuju: [5]

while <avaldis>:
   <käsk_1>
   <käsk_2>

Kasutamine

While-tsüklit on mõistlik kasutada siis, kui pole teada, palju kordi on vaja koodiridu korrata, kuni kasutaja sisestab nõuetele vastavad andmed (alles siis minnakse edasi ja töödeldakse neid) või kuni kasutaja soovib lõpetetada programmi töö. Tsükli täitmise igal sammul peaks tsüklimuutuja väärtust muutma, vastasel korral on tsükli tingimus pidevalt tõene ja tsükkel jääb lõpmatult tööle. [6]

Tsükli täitmine: [7]

  • Arvutatakse loogikatingimuse väärtus
  • Kui väärtus on ÕIGE, täidetakse tsükli sees olevad laused ja täitmine antakse tsükli algusesse uueks loogikatingimuse väärtuse leidmiseks.
  • Kui väärtus on VALE, lõppeb tsükli täitmine ja programmi jätkatakse käsuga peale tsüklit.

Lause keha täidetakse vaid siis kui päises antud tingimus kehtib. Kui kehas olevad laused on täidetud, siis minnakse uuesti päises näidatud tingimust kontrollima – kui tingimus kehtib ikka veel, siis täidetakse kehas olevad laused uuesti jne. [8] Selleks, et taoline tsükkel ei jääks lõputult tööle, peab tsükli kehas olema mingi lause, mis mõjutab tingimuse kehtivust – järgnevas näites on selleks lause, mis muudab muutuja i väärtust 1 võrra suuremaks. Muutujaid, mille väärtust suurendatakse igal tsükli sammul, nimetatakse loenduriteks ja nende nimeks pannakse tavaliselt i. Selliseid tsükleid, kus korduste arv on tsükli alustamise hetkel teada, nimetatakse määratud tsükliteks.[9]

  • Järgnevas näites võrdsustatakse muutuja i väärtus ühega ning väljastatakse i väärtusi ja suurendatakse i väärtust ühe võrra seni, kuni i väärtus pole enam väiksem kui 5. Seega muutub i väärtus ühest neljani ning ekraanile trükitakse neli rida. [10]
i = 1
while i < 5:
    print("i väärtus on " + str(i))
    i = i + 1
  • Järgnevas näites kontrollib kood muutuja väärtust ja kui see on väiksem-võrdne kui 10, siis väljastatakse muutuja väärtus ja suurendatakse seda ühe võrra. Tehakse uus kontroll ja seda tsüklit korratakse kuni muutuja väärtus on suurem kui 10 ja tsükkel lõpetatakse. [11]
class while_tsykkel{
 public static void main(String args[]){
   int nr = 1;
   while(nr <= 10){
     System.out.println(nr);
     nr++;
    }
  }
}

Ekraanile trükitakse kümme rida.

1
2
3
4
5
6
7
8
9
10

Millele pöörata tähelepanu tsükli loomisel

  • Millist tsüklit kolmest võimalikust on otstarbekas kasutada? Kui korduste arv on enne tsükli algust teada ja mitte miski tsükli sees toimuv seda segada ei saa, tasub kasutada FOR-tsüklit. Lihtsam on kirja panna kordamise tingimusi. Lisaväärtust omab tsüklimuutuja massiivide töötlemisel indeksi(te) genereerimiseks. WHILE- ja REPEAT-tsüklite vahel on keerulisem valida. Tavaliselt on nad samaväärsed. Kui on teada, et tsükkel võib ka toimumata jääda, on õige valik WHILE. Ülejäänud juhtudel tasub lähtuda sellest, et loogikaavaldis kergemini ja arusaadavamalt üleskirjutatav oleks. Ei juhtu ka midagi halba, kui ainult WHILE-i kasutamisega piirdudagi. [12]
  • Leia üles laused, mis peavad tsükli sisse kuuluma. Ehkki see tundub triviaalsena, on õige lausetekomplekti tuvastamine sageli (eriti alguses) probleeme tekitav. [13]
  • Koosta sobiv loogikatingimus. Tihti ei aita ühest võrdlustehtest, vaid on vaja kontrollida erinevate muutujate väärtusi korraga. Sel juhul võib vigu tekitada loogikatehete AND ja OR kasutamine. Samal ajal tuleks ka jälgida, et loogikatingimuse väärtus tsükli sees üldse muutuda saab. Kui kasutada kontrollimisel muutujat, millega tsükli sees midagi ei tehta, on ilmselt kusagil viga. Vigane ei pruugi kindlasti olla tingimus, vaid tsükli kehas võivad sel juhul puududa mõned olulised laused. [14]
  • Õigete võrdlustehete kasutamine loogikatingimuses võib olla määrava tähtsusega tsükli korrektsuse tagamisel, õige korduste arvu saavutamisel, aga ka lõputu tsükli vältimisel. [15]
  • Enne tsükli alustamist (eriti WHILE-tsükli puhul) tuleb jälgida ka loogikatingimuses osalevate muutujate algväärtustamist, sest nende muutujate väärtusi asutakse kohe kontrollima. Kui õiged väärtused on jäänud kogemata omistamata, võib tsükkel mitte toimuda. [16]

Kokkuvõte

Kui tsüklit alustatakse, peab see ka lõppema, st. muutuja väärtus, mille abil tsükli alustamise või lõpetamise tingimust kontrollitakse, peab tsükli sees muutuma. Oskamatu disaini tulemuseks võib olla lõputu tsükkel. [17]

Sellise tsükli olemasolu on igas programmeerimiskeeles hädavajalik. Ülejäänud tsükliliigid on lisamugavus. [18]

Tavalised vead tsüklite puhul: [19]

  • Vigased loogikatingimused
  • Mittetäielikud loogikatingimused
  • Vale tsükli keha.
  • Lõputu tsükkel
  • Vale korduste arv
    • unustatakse algväärtustada muutujad, mis on seotud tsükli lõpu määramisega.
    • võrdlustehe on ebakorrektne (< või <=, > või >=).

Kasutatud kirjandus

Koostas

Heiko Niidas AK-31, 2014