e-gradiva     HTML CSS JavaScript Načrtovanje    
  logotip  
SERŠ Maribor Iskanje Primeri

Zanke

O zankah

Ponavljalni stavki v resničnem življenju pomenijo ponavljanje sklopa korakov, dokler se ne izpolnijo določeni pogoji, hkrati pa omogočajo, da določene korake preskočimo.

Primer zanke v našem vsakdanjem življenju je vožnja okoli bloka v zelo naseljeni soseski, vse dokler ne najdemo prostega parkirnega mesta.

Zanka torej lahko ponavlja sklop stavkov, dokler ni izpolnjen nek določen pogoj. Ti pogoje vključujejo logični vrednosti true ali false. Potrebno je imeti podatek ali zbirko podatkov, ki jih zančni stavek preverja. Med izvajanjem stavkov se določene spremenljivke inkrementirajo, dekrementirajo, faktorizirajo, lahko pa tudi izvedejo kompleksnejše operacije.

Ko se pogoj enkrat izpolni, lahko skript nadaljuje z izvajanjem ukazov, ki se nahajajo v nadaljevanju za repeat stavkom. Na primer, JavaScript preverjevalnik vnešenih podatkov lahko pregleda vsak znak za vsakim v vnosnem polju za besedilo in preverja, če je vnesena vrednost število.

Zanka while

Zanka while je najpreprostejša oblike zanke. Zapišemo jo takole:

while (pogoj)
{
stavek/stavki
}

JavaScript najprej preveri pogoj, ki mora biti zapisan v oklepajih. Če je pogoj izpolnjen, izvrši stavek, ki sledi. Nato spet preveri pogoj, in če je ta še vedno izpolnjen, izvrši stavek še enkrat in ponovno preveri pogoj. Ko pogoj ni več izpolnjen, nadaljuje s stavkom, ki sledi zanki. Če pogoj že pri prvem preverjanju ni izpolnjen, se stavek v zanki sploh ne izvrši. Na primeru si poglejmo, kako bi lahko s pomočjo zanke while izračunali fakulteto števila 10.

var fakulteta = 1, i = 1
while (i <= 10) fakulteta *= i++

Kadar želimo v zanki izvršiti več stavkov, jih zapišemo v obliki sestavljenega stavka, tako da jih zapišemo v zavitih oklepajih. Ker je v prejšnjem primeru marsikomu stavek, ki ga ponavljamo v zanki, težko razumljiv, zapišimo rešitev iste naloge še enkrat, tokrat v preprostejši obliki.

var fakulteta = 1
var i = 1
while (i <= 10)
{
   fakulteta *= i
   ++i
}

Zanko while pogosto uporabljamo tako, da uvedemo pomožno spremenljivko, s katero štejemo, kolikokrat se zanka izvrši. V prejšnjem primeru je to vlogo igrala spremenljivka i, ki smo ji pred zanko nastavili začetno vrednost 1, pred naslednjo ponovitvijo zanke smo ji vrednost povečali za 1, zanko pa smo ponavljali, dokler je bila njena vrednost manjša ali enaka 10 (torej smo zanko izvršili desetkrat). V takih primerih je preprosteje uporabiti zanko for.

Zanka for

Najpogosteje uporabljana oblika zank v JavaScript je stavek for. Svoje ime dobi po ukazu, ki začne njegovo konstrukcijo. For stavek je zelo uporabna struktura, saj lahko sproti vodi število ponovitev stavka znotraj sebe.

Formalna sintaksa je sledeča:

for ([začetni izraz]; [pogoj]; [spreminjanje spremenljivke])
{
stavek/stavki
}

Oglati oklepaji pomenijo, da je element lahko prisoten, ni pa nujno. Prvi del običajno določa začetno vrednost spremenljivke. Pogoj - enake vrste pogoj kot smo ga videli pri stavkih if...then - definira pogoj, ki poskrbi za izvajanje ali prekinitev pogoja in tako preprečuje brezkončno ponavljanje stavkov zanke.

Na zadnjem mestu je stavek, ki se izvede vedno, ko je pogoj še izpolnjen. ObiČajna zanka for tako na tem mestu vsebuje števec i, ki ga povečuje za 1 vedno znova, ko se izvedejo notranji stavki in to ponavlja, dokler vrednost spremenljivke ne ustreza nekemu pogoju, v tem primeru, dokler i ni manjši ali enak najVrednost:

for (var i = zacetnaVrednost; i <= najVrednost; i++)
stavek/stavki
}

ZacetnaVrednost in najVrednost predstavljata numerični (številčni vrednosti) vrednosti. V zadnjem, tretjem delu izraza se nahaja operator ++, ki doda 1 k prejšnji vrednosti spremenljivke i vedno znova, ko se sklop stavkov v zanki ponovi. Po prvi ponovitvi ima i vrednost 2, za tem 3 in tako dalje. Tako je v primeru, da je najVrednost 10, število ponovitev zanke 10 (drugače povedano, dokler je i manjši ali enak 10). Drugače povedano, stavki znotraj zanke uporabljajo vrednost spremenljivke za štetje v njihovem izvajanju.

Zanka do

Bistvena razlika med zanko do in prej opisanima zankama while in for je v tem, da se pri zanki do pogoj preveri šele na koncu zanke. Telo zanke se zato izvrši vsaj enkrat. Zanko do zapišemo takole (zaviti oklepaji so obvezni tudi, če je v zanki en sam stavek):

do
{
   stavek/stavki
}
while (pogoj)

Poglejmo si primer, kako izračunamo, iz koliko števk je sestavljeno dano naravno število x.

var n = 0
do {
   ++n
   x = (x - x % 10) / 10
} while (x > 0)

label

V primeru mnogih gnezdenih zank, je včasih težko poiskati končni pogoj za izhod. Problem lahko rešita stavka break in continue, ki zaključita tekočo zanko. Izvajati pa se bo pričela zunanja zanka. Včasih se želi poiskati hiter izhod iz vseh zank. Vsak ukaz se lahko označi z labelo:

labela:
    stavek

Običajno se labela uporablja v povezavi stavki switch, if in z zankami. Pogosto se jo kliče preko stavkov break in continue.

break

Ukaz break se uporablja za nasilno prekinitev izvajanja stavkov for, while, do, if ali switch. Nadzor nad programom se na prvi stavek za zanko. Če se uporabi labelo, prekine izvajanje stavka, ki je označen z labelo:

labela:
if(pogoj)
{
	stavek1;
	if(pogoj)
		stavek2;
	else
	break labela;
	stavek3;
}

Če se stavek break/label izvrši, nadaljuje z izvajanjem prvega stavka za zunanjim stavkom if in se stavek stavek3 ne izvede. Če imamo zanko v zanki in stavek break v notranji zanki, bo ta prekinil zanko, v kateri se nahaja, torej notranjo zanko.

Primer:

Med vsemi celimi števili od a do b poiščimo najmanjše število, ki je deljivo s 17 ali 23.

var i
for (i = a; i <= b; ++i)
if (i % 17 == 0 || i % 23 == 0) break
if (i > b) document.writeln("Takega števila ni.")
else document.writeln("Iskano število je " + i)

continue

Ukaz continue je podoben prejšnjemu. Nasilno prekine izvajanje zanke for ali while. Pri zanki while preseli izvajanje programa nazaj k pogoju zanke, pri zanki for pa k izrazu, ki povečuje števec zanke. Če uporabimo samo labelo zunaj telesa zanke preseli tok programa nazaj na stavek, ki ga označuje labela. Če imamo zanko v zanki in stavek continue v notranji zanki, bo ta ponovil zanko, v kateri se nahaja, torej notranjo zanko.

Stavek continue v telesu zanke while povzroči skok na začetek zanke. To pomeni, da se na novo ovrednoti pogoj, zanka pa se ponovi, če je pogoj izpolnjen. V zanki for stavek continue sproži najprej izračun tretjega izraza (korak), šele nato pa preveri pogoj za ponovitev zanke. Če je pogoj izpolnjen, se zanka ponovi. Stavek continue v telesu zanke do pa povzroči skok na konec zanke. Tam se na novo ovrednoti pogoj, zanka pa se ponovi, če je pogoj izpolnjen.

Primer:

Program, ki prešteje, koliko praštevilskih deliteljev ima naravno število x, bi lahko torej napisali tudi takole:

var pd = 0
for (var i = 2; i <= x; ++i)
  {
  if (x % i != 0) continue
  while (x % i == 0) x /= i
  ++pd
  }

SERŠ Maribor : Strokovna gimnazija : 2003 : Aleš Brumec