$$ \newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor} \newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil} \newcommand{\mod}{\,\mathrm{mod}\,} \renewcommand{\div}{\,\mathrm{div}\,} \newcommand{\metar}{\,\mathrm{m}} \newcommand{\cm}{\,\mathrm{cm}} \newcommand{\dm}{\,\mathrm{dm}} \newcommand{\litar}{\,\mathrm{l}} \newcommand{\km}{\,\mathrm{km}} \newcommand{\s}{\,\mathrm{s}} \newcommand{\h}{\,\mathrm{h}} \newcommand{\minut}{\,\mathrm{min}} \newcommand{\kmh}{\,\mathrm{\frac{km}{h}}} \newcommand{\ms}{\,\mathrm{\frac{m}{s}}} \newcommand{\mmin}{\,\mathrm{\frac{m}{min}}} \newcommand{\smin}{\,\mathrm{\frac{s}{min}}} $$
Uvod - Priručnik za JavaScript / Naredbe ponavljanja

Naredbe ponavljanja

  • Dozvoljeno polaganje
  • -
  • Nema
  • Jovan Popović
  • 2/10/2017

Naredbe ponavljanja su naredbe koje ponavljaju druge naredbe. Naredbe ponavljanja se nazivaju PETLjE. Naredba ponavljanja ima uslov koji joj govori da li treba još da ponavlja druge naredbe, a izgleda ovako:

Naredba ponavljanja

Sve dok je uslov petlje koji se nalazi u zagradama while naredbe tačan, naredbe u telu će se ponavljati. Novi pojmovi:

  • Logički izraz u zagradama iza while naredbe se naziva USLOV PETLjE.
  • Naredbe u vitičastim zagradama se nazivaju TELO PETLjE.
  • Svako ponavljanje naredbi u telu petlje se naziva ITERACIJA.

Kada nam trebaju naredbe ponavljanja?

Naredbe ponavljanja su odlične ako ne znamo koliko puta treba da se izvrši neka naredba. Na primer:

  • Koliko puta je potrebno udariti čekićem ekser da bismo ga zakucali u drvo? Dok se ne zakuca.
  • Koliko puta treba da ubacimo zemlju lopatom u rupu? Dok se rupa ne zatrpa.
  • Koliko koraka treba da trčimo na trci? Dok ne stignemo do cilja.

U ovim primerima imamo naredbe koje se ponavljaju, ali ne možemo da kažemo koliko puta treba da se izvrše. U ovim naredbama moramo da imamo neke odluke ili uslove. Ovo su nove vrste naredbi koje zovemo naredbe ponavljanja sa uslovima. To su kombinacije običnih naredbi za ponavljanje i naredbi sa odlukama.

Pogledajmo primer sa Redom koji hoće da dođe do praseta na slici. Ako bismo imali samo običnu naredbu "pomeri se napred" morali bismo da izbrojimo koliko je daleko od praseta da bismo onda 5 puta napisali tu naredbu. Međutim, ako imamo naredbu ponavljanja sa uslovom, možemo da mu kažemo: dok ne dođeš do praseta, ponavljaj naredbu „pomeri se napred“, kao na slici desno:

Ponavljaj "pomeri se napred" dok ne dođeš do praseta

Zamislite da Red razume sledeće naredbe:

  • nije_stigao_do_praseta() koja proverava da li je Red stigao do praseta i ako još uvek nije stigao vraća vrednost TAČNO
  • pomeri_se_napred() koja pomera Reda jedno polje napred

Program bi izgledao ovako:

while (nije_stigao_do_praseta()) {
  pomeri_se_napred()
}

Naredba while će svaki put pitati funkciju nije_stigao_do_praseta() da li je Red stigao do praseta. Sve dok nije stigao pozivaće pomeri_se_napred().

Zašto su korisne naredbe ponavljanja sa uslovima? Prvo, lakše nam je da programiramo sa njima, zato što ne moramo da brojimo koliko puta treba da se ponovi neka naredba. Da je Red bio 73 koraka od praseta, ovo bi bilo teško, a mogli bismo lako i da pogrešimo. Ako bismo pogrešili u brojanju samo za jedan, Red bi ili stao ispred praseta ili bi udario u zid iza praseta. Drugi razlog je da nekada stvarno ne možemo da znamo koliko puta treba da se nešto ponovi. Na primer, ako ne vidimo sva polja između Reda i praseta, ne možemo da znamo koliko puta Red treba da ide napred. Ali, ono što znamo je da Red treba da dođe do praseta. Zašto to ne bismo koristili da zadamo do kada treba da se ponavlja naredba umesto nekog broja koji smo ranije koristili?

Na slici je farmer sa lopaticom koji hoće da napuni rupu na putu zemljom. Možemo da mu kažemo „ispuni 1“ što znači da ubaci jednu lopatu zemlje u rupu. Međutim, pošto ne znamo koliko je rupa duboka, ne možemo da mu kažemo nešto kao pet puta ubaci zemlju. Ali ako imamo naredbu ponavljanja sa uslovom, možemo da mu kažemo nešto kao: „Dok je tu rupa: ispuni 1“. Tako će farmer sipati lopatu po lopatu zemlje u rupu dok je ne napuni.

Ponovi "ispuni 1" dok je tu još uvek rupa

U ovom programu će farmer prvo da se pomeri napred, onda okrene ulevo, pa onda pomeri napred da bi došao do rupe. Onda će da ponavlja naredbu „ispuni 1“ sve dok je tu rupa. Kada ispuni rupu do vrha, neće više da izvršava naredbu.  Farmer razume sledeće naredbe:

  • pomeri_se_napred() koja pomera Reda jedno polje napred
  • okreni_se(ulevo) ili okreni_se(udesno) koja mu govori da treba da se okrene ulevo ili udesno
  • je_tu_rupa() koja vraća vrednost TAČNO ako rupa još uvek postoji
  • ispuni(1) koja mu kaže da ispuni rupu jednom lopatom zemlje

Program koji objašnjava farmeru šta da uradi, prikazan je u sledećem primeru:

pomeri_se_napred()
okreni_se(ulevo)
pomeri_se_napred()
while (je_tu_rupa()) {
	ispuni(1)
} 

Hajde sad da objasnimo farmeru kako da ispuni rupu i pokupi zemlju sa gomile na slici dole. Možemo da mu kažemo ispuni 1 kao u prethodnom primeru, ali i ukloni 1 što znači da uzme jednu lopaticu zemlje sa gomile. Program koji bi mu objasnio ako da izravna ovaj teren je prikazan na slici desno.

Ponavljaj naredbe dok ne izravnaš njivu

Prvo ćemo da mu kažemo da se pomeri dva puta napred kako bi došao do rupe. Onda mu kažemo da ispuni rupu po jednom lopaticom zemlje sve dok je tu rupa. Potom mu govorimo kako da dođe do gomile zemlje. Onda mu drugom petljom govorimo da treba da ukloni po jednu lopaticu zemlje sa gomile sve dok ne nestane gomila. Farmer sada razume nove naredbe:

  • je_tu_gomila() koja vraća vrednost TAČNO ako je tu još uvek gomila zemlje
  • ukloni(1) koja mu kaže da ukloni jednu lopatu zemlje sa gomile

Program koji mu objašnjava šta da uradi je prikazan u sledećem primeru:

pomeri_se_napred()
pomeri_se_napred()
okreni_se(ulevo)
while (je_tu_rupa()) {
  ispuni(1)
}
pomeri_se_napred()
okreni_se(udesno)
pomeri_se_napred()
while (je_tu_gomila()) {}
  ukloni(1)
}

Naredba while je veoma slična if naredbi. Jedina razlika je u tome što u ovoj naredbi ponavljamo naredbe dok je uslov tačan, a u if naredbi jednom izvršimo te naredbe.

Primer - zbir svih neparnih dvocifrenih brojeva

Zamislite da treba da prođemo kroz sve neparne brojeve od 11 do 99 i da izračunamo njihov zbir. Uslov da je broj dvocifren je malo složeniji - on izgleda ovako 10 <= broj I broj <= 99. U sledećem primeru možete da vidite primer petlje koja koristi ovaj uslov da pronađe zbir svih neparnih dvocifrenih brojeva:

broj = 11
zbir = 0
while (broj <= 99) {
  zbir = zbir + broj
  broj = broj + 2
}

Prvo smo postavili početne vrednosti za prvi neparan dvocifreni broj (11) i zbir (na početku je nula). Dok je broj dvocifren, dodajemo ga u zbir i postavljamo mu vrednost sledećeg dvocifrenog broja. Uslov u while petlji stalno proverava da li je vrednost u promenljivoj broj i dalje dvocifren broj. Ako jeste, nastavljamo da izvršavamo naredbe između vitičastih zagrada i dodajemo vrednost koja je u promenljivoj broj na zbir.

Primer - prosti brojevi

Broj je prost ako nije deljiv ni jedim brojem osim samim sobom i brojem 1. Pomoću while petlje i aritmetičkog operatora % možemo lako da proverimo da li je broj prost ili ne. Dovoljno je da za sve brojeve manje od unetog broja proverimo da li je uneti broj deljiv nekim od njih. Program koji proverava da li je uneti broj deljiv brojevima između 2 i njega samog, izgleda ovako:

a = prompt("Unesite broj:")
broj_je_prost = true
delilac = 2;
while ( delilac < a ) {
  if ( a % delilac == 0 )  {
    broj_je_prost = false
  }
  delilac = delilac + 1
}

Prvo ćemo zatražiti da se unese vrednost broja za koji proveravamo da li je prost. Pretpostavićemo da je broj prost i u promenljivu broj_je_prost ćemo upisati vrednost TAČNO. Potom ćemo proveriti da li je uneta vrednost deljiva deliocima koji će imati vrednosti 2, 3, 4, 5, pa sve do broja koji je za jedan manji od unetog (tj. delilac < a). Kada primenimo operator % koji računa ostatak pri deljenju unetog broja deliocem, proveravamo da li je ostatak pri deljenju 0. Ako jeste, onda uneti broj nije prost i u promenljivu broj_je_prost upisujemo vrednost NETAČNO. Ovu proveru ponavljamo za svaku vrednost od 2 do unetog broja.

PAZITE DA NE UKLjUČITE I VREDNOST BROJA a U PETLjU! AKO STAVITE USLOV delilac <= a UMESTO delilac < a, U POSLEDNjOJ ITERACIJI ĆETE PROVERITI DA LI JE BROJ DELjIV SAMIM SOBOM I DOBIĆETE UVEK REZULTAT DA BROJ NIJE PROST.