Algoritam sa uslovnim izvršavanjem
Do sada smo videli programe koji izvršavaju svaku naredbu, redom. Problemi u realnom svetu često zahtevaju više mogućnosti od ovoga. Ponekad nam je potrebno da preskočimo deo programa prilikom izvršavanja.
Pogledajmo sledeći problem. Mika, Pera i Joca su tri drugara koji se često igraju zajedno. Međutim, pre nego što izađu da se igraju, moraju da urade najmanje 3 zadatka iz programiranja. Ukoliko neko ne uradi 3 zadatka, on tog dana ne dođe da se igra sa ostalima. Koliko drugara će se pojaviti na igralištu ukoliko znamo koliko zadataka je uradio Mika, koliko Pera, a koliko Joca?
Analizirajmo kako ćemo da rešimo ovaj problem. Imaćemo četiri promenljive, i to po jednu za zadatke koji je uradio svaki od drugara i još jednu koja broji koliko ih je došlo na igralište. Nazovimo tu promenljivu brojNaIgralistu.
Treba nam program koji, posle unosa podataka:
-
postavi brojNaIgralistu na nulu
-
ako je Mika uradio preko 3 zadatka uveća brojNaIgralistu za 1
-
ako je Pera uradio preko 3 zadatka uveća brojNaIgralistu za 1
-
ako je Joca uradio preko 3 zadatka uveća brojNaIgralistu za 1
Tako obezbeđujemo da ako je samo jedan drugar završio sa zadacima, brojNaIgralistu će se samo jednom uvećati pa će imati vrednost 1. Da bi brojNaIgralistu imao vrednost 2 mora da se uveća dva puta pa moraju tačno dva drugara da završe 3 zadatka. Jedini slučaj kada je brojNaIgralistu jednak 3 je kada su svi uradili po barem 3 zadatka. Ako ni jedan broj nije pozitivan brojNaIgralistu se neće menjati pa će ostati 0 do kraja.
Naredba if
Primetimo da se naredba uvećavanja za jedan ne izvršava ukoliko je vrednost promenljive negativna ili nula - izvršava se uslovno. Da bismo u programkog kodu to zapisali, koristimo naredbu if.
using namespace std; #include <iostream> int main() { int mika, pera, joca; int brojNaIgralistu; cout << "Unesi koliko zadataka je uradio Mika, koliko Joca a koliko Pera:" << endl; cin >> mika >> joca >> pera; brojNaIgralistu = 0; if (mika >= 3) { brojNaIgralistu += 1; } if (pera >= 3) { brojNaIgralistu += 1; } if (joca >= 3) { brojNaIgralistu += 1; } cout << brojNaIgralistu << endl; }
Odmah posle ključne reči if pišemo uslov u zagradama, potom otvorenu vitičastu zagradu, posle toga naredbe koje se izvršavaju samo ukoliko je uslov tačan i na kraju zatvorenu vitičastu zagradu. Ovo je osnovni oblik if naredbe. Uslov je ono što proveravamo - da li je a veće od nule, da li je c jednako b itd... Ukoliko koristimo logičke promenljive, onda svaka promenljiva predstavlja uslov za sebe. Uslovni deo se izvršava ako je vrednost promenljive "tačno" (true), a preskače se ukoliko je vrednost "netačno" (false). Naravno, u uslovu možemo kombinovati logičke promenljive sa logičkim operatorima da bi dobili složene uslove. Kada ima grananja u programima, ponekad je teško pronaći grešku pukim gledanjem koda. Zato postoji mehanizam kojim je moguće da se program izvršava postepeno, naredbu po naredbu. Tako je moguće, ponekad, naći grešku gledanjem promene vrednosti promenljive - kao što smo radili u lekciji Postepeno izvršavanje programa.
Uslov može biti i samo logička promenljiva pa se prethodni kod može napisati kao:
using namespace std; #include <iostream> int main() { int mika, pera, joca; bool mika_na_igralistu, pera_na_igralistu, joca_na_igralistu; int brojNaIgralistu; cout << "Unesi koliko zadataka je uradio Mika, koliko Joca a koliko Pera:" << endl; cin >> mika >> joca >> pera; mika_na_igralistu = mika >= 3; pera_na_igralistu = pera >= 3; joca_na_igralistu = joca >= 3; brojNaIgralistu = 0; if (mika_na_igralistu) { brojNaIgralistu += 1; } if (pera_na_igralistu) { brojNaIgralistu += 1; } if (joca_na_igralistu) { brojNaIgralistu += 1; } cout << brojNaIgralistu << endl; }
Primer 2
Pogledajmo još jedan zadatak. Mika, Pera i Joca žive u istoj ulici. Mika živi na početku ulice i zna da mu je do Joce potrebno J a do Pere P koraka. Svi žive na istoj strani ulice. Mika želi da izračuna koliko koraka Pera napravi kada ide u posetu Joci. Unose se J i P.
Na prvi pogled ovaj zadatak nigde ne sadrži uslovno izvršavanje zato što je u pitanju jednostavno oduzimanje. Međutim, ako pažljivo pogledamo vidimo da ne znamo da li treba da oduzmemo J-P ili P-J. Ovo treba da odlučimo na osnovu toga koji od ova dva broja je veći (broj koraka nikada ne može da bude negativan). Zato imamo dva uslovna izvršavanja, jedno iza drugog. Prvo se izvršava ako je J veće, a drugo ako nije.
using namespace std; #include <iostream> int main() { int J, P; cout << "Unesi dva broja - koliko Miki treba do Jocine " << "i koliko Miki treba do Perine kuce:" << endl; cin >> J >> P; int koraka; if (J > P) { koraka = J - P; } if (!(J > P)) { koraka = P - J; } cout << koraka << endl; }
Probaj da izvršiš poslednja dva programa postupno, kao što smo do sada radili, pa vidi koje se linije izvršavaju.