Poleg sekvence in vejitev, so ponavljanja (zanke) zadnji izmed pomembnejših osnovnih elementov programa. Ponavljanja običajno nastopajo v programih iz preprostega razloga : programiranje je v svojem bistvu modeliranje procesov, dogodkov realnega sveta. V realnem svetu so dogodki pogosto ali ponovljivi ali pa taki, da se s časom počasi spreminjajo. Pri opisovanju takih dogodkov v programih nujno nastopajo ponavljanja.
Primeri, kjer uporabljamo ponavljanja so npr. :
Pri računalniškem modeliranju so primeri še bolj izraziti tudi zaradi pomnenja podatkov, ki je ponavadi organizirano v strukture zaporedne narave. Obdelava tako organiziranih podatkov ponavadi temelji na ponavljajočih se postopkih (npr. isto operacijo izvedemo na večjem številu podatkov) .
Stavki ki jih javanski programski jezik namenja ponovitvam so:
Vse tri oblike zank (ponavlja) so zgrajene iz dveh blokov :
Telo zanke predstavljajo vsi programski stavki, ki jih želimo ponavljati. Telo zanke lahko vsebuje nič, enega ali več programskih stavkov. V primeru, da želimo ponavljati več kot en stavek, morajo biti vsi ti stavki ograjeni v programski blok stavkov (deločata ga { in } ).
Kontrolni blok zanke (včasih tudi glava zanke) zagotavlja pogoj za ponavljanje. Poenostavljeno rečeno določa, koliko časa oz. kolikokrat se bo telo zanke ponovilo (izvedlo).
Glede na to, kje stoji kontrolni blok zanke, pred telesom ali za njim, ločimo 2 obliki ponavljanj :
Oglejmo si posamezne primere.
je primer zanke s pogojem za ponavljam na začetku zanke. Zagotavlja ponavljanje telesa zanke, dokler je izpolnjen logični pogoj. V primeru, da pogoj za ponavljanje ni izpolnjen, se ne izvede noben izmed stavkov telesa zanke.
sintaksa : while (pogoj) ukaz; ali (desna slika) while ( pogoj) { ukaz_1; ukaz_2: ukaz_N; }Pogoj je pri tem vedno logičnega tipa. |
Značilnosti while zanke :
// izpis celih števil iz intervala [1,10] int x=1; while (x <=10) { System.out.println(x); x++; }
V zgonjem primer spremenljivka x določa, kolikokrat se bo izpis ponovil. Dejansko s tem kontrolira izvajanje zanke, zato o taki spremenljivki ponavadi govorimo kot o kontrolni spremenljivki zanke.
// izpis deliteljev števila n int n=99, x; x=1; while(x<=n){if (n % x == 0) System.out.println(x); x+=1; }
class Gcd { public static void main(String[] arg){ int x = Integer.valueOf(arg[0]); int y = Integer.valueOf(arg[1]); while (x != y){ if (x>y) x=x-y; else y=y-x; } System.out.println("Največji skupni delitelj je "+x); } }
Zgornji program naj bi določil največji skupni delitelj dveh števil. Ugotovite, ali to res počne in skušajte prepisati program tako, da bo namesto uporabljenega uporabil Euklidov algoritem z deljenjem!
je primer zanke s pogojem za ponavljam na koncu zanke. Zagotavlja ponavljanje telesa zanke, dokler je izpolnjen logični pogoj. V primeru, da pogoj za ponavljanje ni izpolnjen, se pred tem vsaj enkrat izvrši celotno telo zanke.
sintaksa : do { ukaz_1; ukaz_2: ukaz_N; } while(pogoj);Pogoj je pri tem vedno logičnega tipa. |
Značilnosti do-while zanke :
// izpis celih števil iz intervala [1,10] int x=1;
do { System.out.println(x); x++; } while(x<=10);
Primer je skoraj identičen primeru, kjer smo uporabili while obliko ponavljanja.
// izpis deliteljev števila n int n=99, x; x=1; do{ if (n % x == 0) System.out.println(x); x+=1; } while(x<=n);
class Gcd2 { public static void main(String[] arg){ int x = Integer.valueOf(arg[0]); int y = Integer.valueOf(arg[1]); if (x!=y) do { if (x>y) x=x-y; else y=y-x; } while (x != y); System.out.println("Največji skupni delitelj je "+x); } }
Včasih je potrebno določen postopek prepisati tako, da uporablja le eno izmed doslej omenjenih oblik ponavljanj. Pri pretvorbi si lahko pomagamo z naslednjima slikama :
Stavek for je tako kot stavek while oblika ponavljanja s pogojem ponavljanja na zečetku. Kot smo že opazili pri stavku while, se pri takih zankah telo zanke ne izvrši, če pogoj pre vstopom v zanko ni izpolnjen. Za osvežitev si še enkrat oglejmo diagramski prikaz zanke s pogojem na začetku :
Struktura stavka for je kompleksnejša od strukture stavka while. Glavo (kontrolni del zanke) sestavljajo trije bloki :
oz.for ( inicializacijski ; pogojni; izvrševanja) Stavek;
for ( inicializacijski ; pogojni; izvrševanja) BlokStavkov;
Primer izpisa prvih desetih naravnih števil :
for (int i=1; i<=10; i++) System.out.println(i);
Opazimo lahko, da je bila v tem primeru deklaracija in inicializacija kontrolen spremenljivke izvedena v inicializacijskem bloku, prav tako je spremeba vrednosti kontrolne spremenljivke določena v zadnjem bloku glave zanke.
Tipično bi lahko samo izvajanje pojasnili na primeru, izvedenem z while zanko :
a) deklaracija in inicializacija kontrolne spremenljivke se izvrši pred vstopom v zanko :
int i=1;
b) pred izvajanjem se preveri pogoj za vstop v telo zanke
while (i<=10)
c) izvedba telesa zanke (za vse i <= 10)
System.out.println(i);
d) za zadnjim stavkom telesa se izvede korekcija vrednosti kontrolen spremenljivke:
i++;
e) nadaljujemo izvajanje s kontrolo pogoja za ponavljanje v glave zanke
Še analogija celotnega programa z uporabo while stavka :
int i=1; while (i<=10) { System.out.println(i); i++; }
Iz danega primera je razvidno, da sta si obe omenjeni obliki ponavljanja popolnoma enakovredni. Obstaja pa malenkostna razlika: stavek while ne omejuje uporabljanega tipa kontrolne spremenljivke, dokler z njeno rabo lahko ustvari pogoj, ki je logičnega tipa. In tu imate domačo nalogo : skušajte ugotoviti, kateri izmed primitivnih javaskih tipov lahko nastopajo kot tip kontrolne spremenljivke pri zanki for !
Vsak izmed blokov glave zanke (razen pogoja za ponavljanje, ki mora biti logičnega tipa) je lahko sestavljen iz nič, enega ali večih stavkov. V primeru večih stavkov v posameznem bloku, so stavki (neobičajno) ločeni z vejico, kajti podpičja, ki po pravilu zaključujejo stavke v tem primeru ločujejo bloke kontrolnega dela zanke :
primer zanke s praznimi bloki (pazite, izvajanje take zanke lahko povzroči nemalo preglavic pri njeni zaustavitvi. Taka zanka izvaja nič stavkov v telesu in se izvaja v neskončnost. Ker je telo izredno kratko, jo boste težko nasilno prekinili s CTRL-C oz. BREAK oz. CTRL-Break):
for ( ; ; );
prazen pogoj pri taki zanki se smatra za izpolnjen pogoj ponavljanja.
Naslednji primer prikazuje uporabo večih stavkov znotraj blokov kontrolnega dela zanke. Postopek izračuna in izpiše vsoto števil od 1 do 33 :
int a,b; for (a=1, b=33, vsota=0; a < b; vsota+=a+b, a++, b--); System.out.println(vsota);
Prve štiri ( 4) naloge rešite izključno s stavkom while. |
Naloga 1
Napišite javanski program, ki vrednost N na zaslon izpiše N-krat. N naj bo pri tem vhodni parameter programa. Izvedba programa s parametrom 6:
>java V4n1 6
666666
Naloga 2
Napišite javanski program, ki na zaslon izriše kvadrat vrednosti N s stranico N. Npr.:
>java V4n2 5
55555 55555 55555 55555 55555
Naloga 3
Napišite javanski program ki na zaslon izriše podano obliko. Za boljšo ponazoritev sta podana dva izrisa:
>java V4n3 5
54321 4321 321 21 1>java V4n3 3
321 21 1
Program naj razstavi s parametrom vneseno število na posamezne števke. Vsako števko podanega števila naj izpiše v drugi vrstici. Npr.:
>java V4n4 2319
2
3
1
9
Naloga 5
Zgornje 4 primere rešite z uporabo stavka do-while.
Naloga 6
Naloge od 1 do 4 rešite z uporabo stavka for.