$$ \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}}} $$
Priručnik za početnike (C++) / Uslovno izvršavanje

Uslovno izvršavanje

  • Dozvoljeno polaganje
  • Lekcije
  • Nema
  • Filip Zivkovic
  • 7/26/2015

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, Pera a koliko Joca.

Rešenje:

Imaćemo četiri promenljive - po jednu za zadatke koji je uradio svaki od drugara i još jednu koja broji koliko ih je došlo na igralište - zovimo 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.

 

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 C-u zapisali isto to koristimo strukturu if:


#include <iostream>

int main()

{

int mika, pera, joca;

int brojNaIgralistu;

std::cout << "Unesi koliko zadataka je uradio Mika, koliko Joca a koliko Pera:" << std::endl;

std::cin >> mika >> joca >> pera;

brojNaIgralistu = 0;

if (mika >= 3)

{

brojNaIgralistu += 1;

}

if (pera >= 3)

{

brojNaIgralistu += 1;

}

if (joca >= 3)

{

brojNaIgralistu += 1;

}

std::cout << brojNaIgralistu << std::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 viticastu zagradu. Ovo je osnovni oblik if naredbe. Uslov je ono što proveravamo - da li je a veće od nula, 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 logičkim operatorima da bi dobili složene uslove.

Kada ima grananja u programima ponekad je tesko 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 moguce, ponekad, naći grešku gledanjem promene vrednosti promenljive - kao što smo radili u lekciji "Postepeno izvršavanje programa".


Uslov moze biti i samo logička promenljiva pa se prethodni kod može napisati kao:
 

#include <iostream>

int main()

{

int mika, pera, joca;

bool mika_na_igralistu, pera_na_igralistu, joca_na_igralistu;

int brojNaIgralistu;

std::cout << "Unesi koliko zadataka je uradio Mika, koliko Joca a koliko Pera:" << std::endl;

std::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;

}

std::cout << brojNaIgralistu << std::endl;

}

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.

Rešenje:

Na prvi pogled ovaj zadatak nigde ne sadrži uslovno izvršavanje - u pitanju je 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.

#include <iostream>

int main()

{

int J, P;

std::cout << "Unesite dva broja - koliko Miki treba do Jocine i koliko Miki treba do Perine kuce:" << std::endl;

std::cin >> J >> P;

int koraka;

if ( J > P )

{

koraka = J - P;

}

if ( !(J > P) )

{

koraka = P - J;

}

std::cout << koraka << std::endl;

}

Probajte da izvršite poslednja dva programa postupno, kao sto smo do sada radili, da vidite koje se linije
 izvršavaju.