$$ \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}}} $$

Uslovne naredbe

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

Zamislite da se vozite automobilom i nailazite na raskrsnicu na kojoj put desno vodi u Suboticu. Ako treba da razmislimo da li da skrenemo desno, morali bismo da donesemo ovakvu odluku:

Skreni udesno ako ideš u Suboticu

Ova naredba je naredba odluke. Naredba odluke u sebi ima neki uslov ili pitanje, na primer "Ako ideš u Suboticu uradi…" ili "Da li ideš u Suboticu?" ako je odgovor na ovo pitanje DA, onda će se izvršiti naredba „skreni desno“ i nastavićemo putem za Suboticu. Ako je odgovor NE neće se izvršiti ova naredba i nastavićemo pravo.

Naredba if može da proveri neki uslov i izvrši neke naredbe samo ako je ispunjen uslov. if naredba izgleda ovako:

Struktura uslovne naredbe

U zagradama if ( ) naredbe se nalazi neki uslov. Ako je taj uslov tačan, biće izvršena jedna ili više naredbi iza nje. Neki uslov može da bude funkcija koja vraća TAČNO/NETAČNO neki izraz koji poredi vrednost (na primer broj je veći od drugog broja) ili neki izraz sa logičkim operatorima. Naredbe u telu funkcije mogu da budu obične naredbe, pozivi funkcija, druge if naredbe, itd.

Hajde da se vratimo na problem u kome treba da odlučimo da li da skrenemo za Suboticu. Pretpostavimo da imamo dve funkcije:

  • ideš_u_Suboticu() koja će proveriti da li treba da idemo u Suboticu. Ova funkcija će vratiti vrednost TAČNO ili NETAČNO.
  • skreni_udesno() kojom ćemo skrenuti udesno.

Program bi izgledao ovako:

if( ideš_u_Suboticu() ) {
  skreni_udesno()
}

Naredbe odluke koristimo kada ne znamo unapred koje naredbe će u datom trenutku biti potrebno da se izvrše i ne možemo da sastavimo jednostavan linijski program. Tada onome ko izvršava naredbe ostavljamo da sam vidi šta se dešava, odgovori na neko pitanje i na osnovu odgovora sam donese odluku koja naredba treba da se izvrši.

Svakodnevni primer uslovnog izvršavanja je semafor - ako je svetlo na semaforu zeleno prelazimo ulicu.

Semafor - pređi ulicu ako je zeleno

Kada bismo vrednost semafora mogli da stavimo u neku promenljivu i kada bismo mogli da napišemo naredbu kojom bi se prelazila ulica, ovakav program bi bio:

if ( svetlo_na_semaforu() == "zeleno" ) {
  pređi_ulicu()
}

Funkcijom svetlo_na_semaforu() ćemo pogledati na semafor i videti koje je trenutno svetlo. Ako je vrednost koju vrati ova funkcija "zeleno", onda ćemo izvršiti naredbu pređi_ulicu().

Na primer, pogledajmo pčelu na slici koja sakuplja nektar iz cvetova. Na žalost neki oblak je prekrio poslednje polje tako da ne vidimo da li je tu cvet ili košnica. Međutim, kada pčela ode tri koraka napred, ona će videti šta je na tom polju. Ako kao četvrtu naredbu stavimo naredbu odluke kojom ćemo reći pčeli da ako je na cvetu treba da pokupi nektar, naš program bi izgledao ovako:

Pčela treba da uzme nektar AKO je ispod oblaka cvet

U ovom primeru smo rekli pčeli šta da uradi ako je odgovor DA (tj. da uzme nektar), a ako je odgovor NE onda da ne radi ništa. Pretpostavimo da imamo sledeće funkcije:

  • moveForward() koja pomera pčelu jedno polje napred.
  • atFlower() koja proverava da li se pčela nalazi na cvetu
  • getNectar() koja govori pčeli da uzme nektar.

Ako bismo napisali program koji je prikazan na prethodnoj slici, on bi izgledao ovako:

moveForward()
moveForward()
moveForward()
if (atFlower()) {
  getNectar()
}

Zamislite da na polju koje je prekriveno oblakom može da bude ili cvet ili saće. Ako se pčela nađe na cvetu, onda treba da sakupi nektar sa njega, ali ako nije na cvetu onda treba da napravi med. Pretpostavimo da imamo dve nove funkcije:

  • atHoneycomb() proverava da li je pčela na saću
  • makeHoney() govori pčeli da napravi med

Da bismo napisali naredbe za ovaj problem možemo da stavimo dve naredbe odluke jednu iza druge u primeru:

moveForward()
moveForward()
moveForward()
if (atFlower()) {
  getNectar()
}
if (atHoneycomb()) {
  makeHoney()
}

Možemo da koristimo i posebnu naredbu odluke kojoj možemo da kažemo šta treba da se uradi ako je odgovor DA, a šta da se uradi ako je odgovor NE. Ovakva naredba izgleda ovako:

if( neki uslov ) {
  naredba
} else {
  naredba
}

Kao i u običnoj if naredbi imamo uslov koji se proverava i naredbe u vitičastoj zagradi koje će se izvršiti ako je uslov tačan. Međutim, ovde imamo i else deo gde se u vitičastim zaradama nalaze naredbe koje će biti izvršene ako uslov nije tačan.

Program sa pčelom možemo da prepravimo tako da koristimo if/else naredbu:

moveForward()
moveForward()
moveForward()

if (atFlower()) {
  getNectar()
} else {
  makeHoney()
}

U ovom primeru, prvo proveravamo uslov da li je pčela na cvetu. Ako jeste uzeće nektar sa cveta. Ako nije na cvetu (to znači da je na saću), onda će napraviti med.

Primer - minimum brojeva

Sada ćemo videti primer u kome ćemo uporediti dve promenljive i naći koja je manja vrednost od njih dve. Program izgleda ovako:

a = prompt("Unesite prvi broj:")
b = prompt("Unesite drugi broj:")
minimum = a // Pretpostavimo da je prvi broj manji
if (b < a)     // proverimo da li je drugi broj manji od njega
{
    minimum = b // ako jeste, u minimum upišemo vrednost iz drugog broja
}

Prvo smo pretpostavili da je vrednost promenljive a manja od promenljive b i nju smo upisali u promenljivu minimum. Onda smo proverili da li je b manje od a, i ako jeste, u promenljivu minimum smo upisali vrednost promenljive b. Kao rezultat, kada izađemo iz if naredbe, u promenljivoj minimum će biti manja vrednost.

Primer - deljivost brojeva

Aritmetički operator % može da se koristi da bi se proverilo da li je broj paran ili deljiv nekim brojem. Ako izračunamo ostatak pri deljenju nekog broja drugim brojem i ako je taj ostatak nula, onda je broj deljiv drugim brojem. Program koji proverava da li je uneti broj deljiv sa 2, 5 ili 17, izgleda ovako:

a = prompt("Unesite broj:")
if ( a % 2 == 0 )
{
  alert( "Broj je paran" )
}
if ( a % 5 == 0 )
{
  alert( "Broj je deljiv sa 5" )
}
if ( a % 17 == 0 )
{
  alert( "Broj je deljiv sa 17" )
}

Kada se unese vrednost broja, primenjujemo operator % koji računa ostatak pri deljenju unetog broja sa 2, 5 i 17. Ako je ostatak pri deljenju broja sa 2 jednak nuli onda je broj paran. Ako su ostaci pri deljenju broja sa 5 i 17 isto nule, onda je uneti broj deljiv sa 5 odnosno 17.