GRANANJE U PROGRAMU U C JEZIKU
U jednostavnim primerima u programskom jeziku C, naredbe su se izvršavale u jednom toku, tj. jedna za drugom, do samog kraja programa kao na slici 1 - levo. Grananje u programu znači da se u nekom trenutku tok izvršavanja programa deli u dve ili više grana, odnosno postoji 2 ili više varijanti izvršenja programa. Na slici 1 - desno je prikazano grananje na 2 grane. Program prvo započinje u 1 toku, tako što se izvrši naredba 1(vidi sliku desno), a zatim se na osnovu vrednosti "uslova" program izvršava naredbu 2 ili naredbu 3, dakle ima dva moguća toka za nastavak.
Uslov je zapravo, logička promenljiva ili izraz koja može imati dve vrednosti:
Uslov je zapravo, logička promenljiva ili izraz koja može imati dve vrednosti:
- Vrednost 1, što predstavlja logičku istinu(TRUE)
- Vrednost 0, što predstavlja logičku neistinu(FALSE)
U jeziku C, ne postoji poseban tip promenljive za logičke podatke, već se za to koristi tip podatka int, ali se pozitivne vrednosti, najčešće 1 koristi kao interpretacija logičke istine, a vrednost 0 za interpretacije logičke neistine. U drugim programskim jezicima postoje posebni tipovi podataka npr. u c++ je to bool tip, a u JAVA programskom jeziku je to boolean.
Na prethodnoj slici dato grananje podrazumeva da postoji bar po jedna naredba za svaki tok(naredba 2 u levom, a naredba 3 u desnom). Međutim postoje slučajevi kada u jednoj od grana nemamo nijednu naredbu. U tom slučaju govorimo o uslovnom izvršavanju neke naredbe. Naredna slika(slika 2) to pokazuje. Na dijagramu levo može se videti da nema naredbi, već ako uslov bude imao vrednost 0(FALSE), naredba 2 se neće izvršiti, nego zaobići.
Naredba koju predstavljaju prethodni dijagrami su if naredba i if naredba u kombinaciji sa else. Na slici 3 je prikazana sintaksa ovih varijanti sa naredbom if:
Pogledajmo sada kako se prethodno pomenuta komanda primenjuje na primeru "Provera ispravnosti dužine".
Primer 1: Provera ispravnosti dužine
Zadatak: Uneti vrednost stranice kvadrata a i proveriti da li je podatak ispravan, tj. da li je pozitivan broj.
Objašnjenje:
Da bi vrednost stranice bila ispravan broj znači da treba da bude pozitivan jer dužina stranic ne može biti negativn broj, a i vrednost nula takođe nema smisla jer bi onda kvadrat bio jedna tačka.
Pogledajmo sada algoritam i primenu naredbe if za ovaj zadatak, na sledećoj slici(slika 4)
Objašnjenje:
Da bi vrednost stranice bila ispravan broj znači da treba da bude pozitivan jer dužina stranic ne može biti negativn broj, a i vrednost nula takođe nema smisla jer bi onda kvadrat bio jedna tačka.
Pogledajmo sada algoritam i primenu naredbe if za ovaj zadatak, na sledećoj slici(slika 4)
Logiku izvršavanja možemo videti na slici levo. Naredba za učitavanje kao i prethodno definisanje podatka a s eprvo izvršavaju u jednom toku:
int a;
scanf("%d",&a);
scanf("%d",&a);
Zatim se proverava ispravnost podatka pomoću if naredbe:
if(a>0){
printf("a=%d\n",a);
}
Dakle kompletan kod:
// Deklaracija promenljive a
int a;
// Unos vrednosti promenljive a od strane korisnika
scanf("%d", &a);
// Provera da li je a veće od 0
if(a > 0) {
int a;
// Unos vrednosti promenljive a od strane korisnika
scanf("%d", &a);
// Provera da li je a veće od 0
if(a > 0) {
// Ispis vrednosti promenljive a ako je uslov ispunjen
printf("a=%d\n", a);
}printf("a=%d\n", a);
Primer 1b: Provera ispravnosti dužine sa alternativnim ispisom poruke o grešci
Zadatak: Uneti vrednost stranice kvadrata a i proveriti da li je podatak ispravan, tj. da li je pozitivan broj. Ako nije ispisati poruku: "Neispravan podatak".
Objašnjenje:
Objašnjenje:
Da bi dobili alternativno izvršavanje druge naredbe u slučaju da uslov nije ispunjen, onda se if naredba mora proširiti klauzulom else, kao što prikazuje dijagram na slici 5.
Klauzula else je dodata posle prvog bloka naredbi posle napisane if naredbe i uslova.
int a; /* Deklaracija promenljive a */
scanf("%d", &a); /* Unos vrednosti za promenljivu a */
if(a > 0) { /* Provera da li je a pozitivno */
scanf("%d", &a); /* Unos vrednosti za promenljivu a */
if(a > 0) { /* Provera da li je a pozitivno */
printf("a=%d\n", a); /* Ispis vrednosti a ako je uslov ispunjen */
}
else { /* Alternativna grana - uslov nije ispunjen */
printf("Neispravan podatak\n"); /* Ispis vrednosti a u slučaju da nije pozitivno */
}
U slučaju da u nekoj od grana moraju da se izvrše više od jedne naredbe vitičaste zagrade su obavezne, a ako je samo 1, kao što je slučaj u ovom primeru, onda one mogu biti izostavljene
if(a > 0) /* Provera da li je a pozitivno */
printf("a=%d\n", a); /* Ispis vrednosti a ako je uslov ispunjen */
else /* Alternativna grana - uslov nije ispunjen */
printf("a=%d\n", a); /* Ispis vrednosti a u slučaju da nije pozitivno */
Primer 2: Izračunavanje vrednosti razlomka
Zadatak: Za učitane brojeve a i b, potrebno je izračunati vrednost razlomka a/b. Međutim, treba proveriti da li je b različito od nule, jer je deljenje sa nulom nedozvoljeno.
Objašnjenje:
Objašnjenje:
Posle deklaracije promenljivih i unosa a i b od strane korisnika dolazimo do dela gde je potrebno izračunati razlomak. Da li se može jednostavno uvesti promenljiva c i izračunati c=a/b ?
Poznato je da nije dozvoljeno deljenje sa nulom. To znači, da pre nego što se napiše gore napisana formula, mora prethodno proveriti da li je ispunjen uslov da je b različito od nule.
ko jeste, onda se može napisati formula i ispisati rezultat. U suprotnom, može da se, ili nešto alternativno uradi, npr. da se napiše poruka da nije dozvoljeno deljenje sa nulom, ili da se ne uradi ništa.
Zaključujemo da postoje dve varijante izvršenja programa, ili samo jedna, koje zavise od uslova da li je b različito od nule ili ne. To znači da dolazi do grananja u programu i da se grananje vrši na osnovu logičkog podatka ili izraza.
Poznato je da nije dozvoljeno deljenje sa nulom. To znači, da pre nego što se napiše gore napisana formula, mora prethodno proveriti da li je ispunjen uslov da je b različito od nule.
ko jeste, onda se može napisati formula i ispisati rezultat. U suprotnom, može da se, ili nešto alternativno uradi, npr. da se napiše poruka da nije dozvoljeno deljenje sa nulom, ili da se ne uradi ništa.
Zaključujemo da postoje dve varijante izvršenja programa, ili samo jedna, koje zavise od uslova da li je b različito od nule ili ne. To znači da dolazi do grananja u programu i da se grananje vrši na osnovu logičkog podatka ili izraza.
Rešenje
- Deklarisane su tri promenljive:
- a i b (celobrojne) za unos od korisnika.
- c (tipa float) za rezultat razlomka.
- Nakon unosa vrednosti a i b, proverava se uslov:
- Ako je b različito od nule, izračunava se razlomak a/b, a rezultat se ispisuje.
- Ako je b jednako nuli, program ispisuje odgovarajuću poruku o grešci.
- Na ovaj način grananje zavisi od vrednosti promenljive b.
Napomena:
- Za izračunavanje razlomka koristi se float tip kako bi rezultat imao decimalne vrednosti. U suprotnom, deljenje dva cela broja vraća zaokružen rezultat bez ostatka.
#include <stdio.h> /* Uključivanje standardne biblioteke */
int main() {
int main() {
int a, b; /* Deklaracija promenljivih a i b */
float c; /* Deklaracija promenljive c za rezultat razlomka */
printf("Unesite broj a: "); /* Unos broja a */
scanf("%d", &a);
printf("Unesite broj b: "); /* Unos broja b */
scanf("%d", &b);
if(b != 0) { /* Provera da li je b različito od nule */
return 0; /* Završetak programa */
}
float c; /* Deklaracija promenljive c za rezultat razlomka */
printf("Unesite broj a: "); /* Unos broja a */
scanf("%d", &a);
printf("Unesite broj b: "); /* Unos broja b */
scanf("%d", &b);
if(b != 0) { /* Provera da li je b različito od nule */
c = (float)a / b; /* Izračunavanje vrednosti razlomka */
printf("Vrednost razlomka je: %.2f\n", c); /* Ispis rezultata */
} else { /* Alternativna grana za slučaj kada je b jednako nuli */printf("Vrednost razlomka je: %.2f\n", c); /* Ispis rezultata */
printf("Deljenje sa nulom nije dozvoljeno.\n"); /* Poruka korisniku o grešci */
}return 0; /* Završetak programa */
Logički podaci
To su podaci čija vrednost je rezultat nekog logičkog izraza i može imati dva stanja:
true-tačno
false-netačno
Za tip ovih podatka se koristi int tip podatka, gde se pozitivna vrednost(1) tumači kao logička istina , a nula kao logička neistina.
true-tačno
false-netačno
Za tip ovih podatka se koristi int tip podatka, gde se pozitivna vrednost(1) tumači kao logička istina , a nula kao logička neistina.
Logički podaci i izrazi.
Logičke relacije tj. izrazi su izrazi koji su zapravo rezultati nekih poređenja, i koriste sledeće operatore:
<, >, <=, >=, !, !=, ==
“manje od”, “veće od”, “manje ili jednako”, “veće ili jednako”, “negacija”, “nije jednako”, “jednako”
<, >, <=, >=, !, !=, ==
“manje od”, “veće od”, “manje ili jednako”, “veće ili jednako”, “negacija”, “nije jednako”, “jednako”
Primer logičkih izraza u programskom jeziku C
Za logički tip u C jeziku se koristi int tip podatka, kao da je ceo broj u pitanju s tim što se za vrednosti koriste dve stvari:
- pozitivni brojevi prestani logičku istinu ili tačno (Obično se koristi vrednost 1)
- negativni brojevi i nula za logičku neistinu
int a=10, b=8,c;
int d;//logički podatak
c=a+b; //celobrojni izraz
c=a>b; //c=1
d=a>b; //ispravno i iznosi d=1
d=!(a>b); //d=!(1), d=0
int d;//logički podatak
c=a+b; //celobrojni izraz
c=a>b; //c=1
d=a>b; //ispravno i iznosi d=1
d=!(a>b); //d=!(1), d=0
Logički podaci i složeniji izrazi
Da bi povezali više manjih logičkih izraza koristimo operatore:
“&&” – Logičko “i”
“||” – Logičko “ili”
Pretpostavimo da imamo sledeći kod:
int a,b,c;
a=10,b=4;c=2;
int d,e;//Koristimo da smestimo rezultate logičičkih izraza
Tada je:
d = (a==0) && (b>c) /* d=0 && 1; 1-logička istina, 0-logička neistina d=0; */
e=(a==0) || (b>c) /* e=0 || 1; e=1; */
Složeniji logički izraz koji je dobijen povezivanjem dva prosta logička izraza sa “&&” će biti tačan samo ako su oba prosta izraza tačna tj:
true && true = true
true && false = false
false && true = false
false && false = false
Složeniji logički izraz koji je dobijen povezivanjem dva prosta logička izraza sa “||” će biti tačan ako je bar jedan od prostih izraza tačan tj:
true || true = true
true || false = true
false || true = true
false || false = false
“&&” – Logičko “i”
“||” – Logičko “ili”
Pretpostavimo da imamo sledeći kod:
int a,b,c;
a=10,b=4;c=2;
int d,e;//Koristimo da smestimo rezultate logičičkih izraza
Tada je:
d = (a==0) && (b>c) /* d=0 && 1; 1-logička istina, 0-logička neistina d=0; */
e=(a==0) || (b>c) /* e=0 || 1; e=1; */
Složeniji logički izraz koji je dobijen povezivanjem dva prosta logička izraza sa “&&” će biti tačan samo ako su oba prosta izraza tačna tj:
true && true = true
true && false = false
false && true = false
false && false = false
Složeniji logički izraz koji je dobijen povezivanjem dva prosta logička izraza sa “||” će biti tačan ako je bar jedan od prostih izraza tačan tj:
true || true = true
true || false = true
false || true = true
false || false = false
Grananje u programu i logički podaci.
Logički podaci se koriste kao skretnica kod grananja u programu. Ako imamo logičku promenljivu uslov:
Pretpostavimo da ispitujemo uslov "Da li je unet podatak a veći od 5". Možemo uvesti celobrojnu promenljivu i kreirati izraz a>5 :
// Deklaracija promenljivih
int a, x, uslov;
// Učitavanje vrednosti promenljive x sa standardnog ulaza
scanf("%d", &x);
// Učitavanje vrednosti promenljive a sa standardnog ulaza
scanf("%d", &a);
// Provera uslova: da li je vrednost promenljive a veća od x
uslov = a > x;
int a, x, uslov;
// Učitavanje vrednosti promenljive x sa standardnog ulaza
scanf("%d", &x);
// Učitavanje vrednosti promenljive a sa standardnog ulaza
scanf("%d", &a);
// Provera uslova: da li je vrednost promenljive a veća od x
uslov = a > x;
Ovu promenljivu uslov možemo dalje umetnuti u male zagrade if -else naredbe:
int a, x, uslov;
// Učitavanje vrednosti promenljive x i a sa standardnog ulaza
scanf("%d", &x);
scanf("%d", &a);
uslov = a > x;
if(uslov)
{
else
{
// Učitavanje vrednosti promenljive x i a sa standardnog ulaza
scanf("%d", &x);
scanf("%d", &a);
uslov = a > x;
if(uslov)
{
printf("Broj %d je veći od 5\n", a);
}else
{
printf("Broj %d nije veći od 5\n", a);
}Grananje u programu i uslov
a>x je logički izraz i u ovom primeru daje false, tako da se naredba 1 neće izvršiti
Logički izraz može biti napisan direktno u maloj zagradi bez uvođenja promenljive koja čuva vrednost koja se koristi kao uslov.
Pretpostavimo da imamo:
int a=3, x=5;
if(a>x)
{
naredba1;
}
.
.
.
a>x je logički izraz i u ovom primeru daje false, tako da se naredba 1 neće izvršiti
Logički izraz može biti napisan direktno u maloj zagradi bez uvođenja promenljive koja čuva vrednost koja se koristi kao uslov.
Pretpostavimo da imamo:
int a=3, x=5;
if(a>x)
{
naredba1;
}
.
.
.
a>x je logički izraz i u ovom primeru daje false, tako da se naredba 1 neće izvršiti
Primer: Uneti ceo broj i odrediti da li je deljiv sa 3
Rešenje:
Broj je deljiv sa 3 ako je ostatak deljenja broja koji se unese i broja 3 jednak nuli. Naredbu if-else ćemo koristiti da bi napravili grananje u programu, tako da se u jednoj grani ispiše poruka(printf) "Broj je deljiv sa 3", dok će se u drugoj grani ispisati druga poruka: "Broj nije deljiv sa 3".
Da bi smo napisali uslov za grananje potrebno je odrediti ostatak deljenja. Za to se upotrebljava operator "%".
Dakle ostatak deljenja broja a i broja 3 je: a%3.
Zatim se proverava da li je jednak nuli. Dakle,
a%3 == 0
Broj je deljiv sa 3 ako je ostatak deljenja broja koji se unese i broja 3 jednak nuli. Naredbu if-else ćemo koristiti da bi napravili grananje u programu, tako da se u jednoj grani ispiše poruka(printf) "Broj je deljiv sa 3", dok će se u drugoj grani ispisati druga poruka: "Broj nije deljiv sa 3".
Da bi smo napisali uslov za grananje potrebno je odrediti ostatak deljenja. Za to se upotrebljava operator "%".
Dakle ostatak deljenja broja a i broja 3 je: a%3.
Zatim se proverava da li je jednak nuli. Dakle,
a%3 == 0
#include <stdio.h>
/* Uneti ceo broj i odrediti da li je deljiv sa 3 */
int main()
{
/* Uneti ceo broj i odrediti da li je deljiv sa 3 */
int main()
{
int a;
printf("Unesi ceo broj\n");
scanf("%d", &a);
if((a % 3) == 0)
}printf("Unesi ceo broj\n");
scanf("%d", &a);
if((a % 3) == 0)
printf("Broj %d je deljiv sa 3\n", a);
else
printf("Broj %d nije deljiv sa 3\n", a);
return 0;Posle pokretanja programa:
Video rešenje
Grananje u programu sa 3 grane
Grananje u programu kada imamo 3 grane ili više, ostvaruje se pomoću if-else if-else ili if-else if-else if naredbe. U prvom slučaju su potrebna 2, a u drugom slučaju 3 uslova.
Na slici 8 je prikazan prvi slučaj kada grananje ostvarujemo sa 2 uslova:
Kod koji je kreiran po ovom algoritmu:
// Naredbe 0
if(uslov1)
{
else if(uslov2)
{
else
{
if(uslov1)
{
// Naredbe 1
}else if(uslov2)
{
// Naredbe 2
}else
{
// Naredbe 3
}Ovaj kod predstavlja strukturu grananja sa tri grane koristeći if, else if, i else klauzule:
- Prva grana (if): Kada je uslov uslov1 tačan, izvršava se naredbe 1 (označene zelenom bojom).
- Druga grana (else if): Ako je prvi uslov netačan, ali je uslov uslov2 tačan, izvršava se naredbe 2 (označene crvenom bojom).
- Treća grana (else): Ako su oba prethodna uslova netačna, izvršava se naredbe 3 (označene plavom bojom).
- Naredbe pre grananja (Naredbe 0): Ove naredbe su nezavisne od grananja i izvršavaju se pre nego što se proveri bilo koji uslov.
Ako pravimo 3 grane sa 3 uslova
U nekim primerima je korisno eksplicitno definisati uslov za 3 granu, što znači da umesto poslednje grane sa else klauzulom upotrebimo else if, nakon čega treba eksplicitno postaviti uslov. Ovo je pokazano na sledećoj slici:
Na slici 9 je prikazan tok programa, kada se iz 1 toka grana u 3 grane. Da bi se program granao na 3 ili više grana potrebno je imati više od 1 uslova, jer se sa jednim uslovom program može podeliti samo u 2 grane u zavisnosti od toga da li je vrednost uslova 1(true) ili 0(false).
Dakle, da bi se program delio na 3 grane potrebna su najmanje 2, a može i 3 grane. Na dijagramu se program zapravo deli na 4 grane, s tim što u 4 grani nema naredbi.
Opis dijagrama:
Prvo se naredbe izvršavaju u 1 toku(naredbe 0), a zatim se postavi uslov 1 i ako je on tačan izvršiće se naredbe 1, tj. 1. grana. Ako je uslov 1 netačan, onda se postavlja uslov 2. Ako je on tačan izvršiće se naredbe 2, tj. druga grana. Ako ni on nije tačan postavlja se 3. uslov, tj. uslov 3. Ako je on tačan izvršiće se naredbe 3, a ako nije, sve naredbe se preskaču. Kružić na dijagramu predstavlja tačku gde se svi tokovi ponovo vraćaju u 1 tok.
Dakle, da bi se program delio na 3 grane potrebna su najmanje 2, a može i 3 grane. Na dijagramu se program zapravo deli na 4 grane, s tim što u 4 grani nema naredbi.
Opis dijagrama:
Prvo se naredbe izvršavaju u 1 toku(naredbe 0), a zatim se postavi uslov 1 i ako je on tačan izvršiće se naredbe 1, tj. 1. grana. Ako je uslov 1 netačan, onda se postavlja uslov 2. Ako je on tačan izvršiće se naredbe 2, tj. druga grana. Ako ni on nije tačan postavlja se 3. uslov, tj. uslov 3. Ako je on tačan izvršiće se naredbe 3, a ako nije, sve naredbe se preskaču. Kružić na dijagramu predstavlja tačku gde se svi tokovi ponovo vraćaju u 1 tok.
U ovom videu je opisano grananje u programu sa 3 i više grana. Naredbe: if-else if-else, if-else if - else if. U nastavku videa je opisana switch naredba, Takođe su pokazana i 2 primera rešena pomoću CodeBlock-a.
Primer 2: Uneti dva realna broja preko standardnog ulaza i uporediti njihove vrednosti
Rešenje:
Posle unosa broja a i b sa tastature, program se grana na 3 grane, jer postoje 3 varijante da se program izvrši. Varijante su u stvari poruke koje će biti ispisane pomoću printf naredbe:
Posle unosa broja a i b sa tastature, program se grana na 3 grane, jer postoje 3 varijante da se program izvrši. Varijante su u stvari poruke koje će biti ispisane pomoću printf naredbe:
- " a je veće od b"
- " a je jednako b"
- " a je manje od b"
Od ponuđene 3 varijante, tj. tri moguće poruke samo jedna će se izvršiti:
Za prvi uslov tačan izvršava se prva varijanta
Za prvi uslov netačan, a drugi uslov tačan, druga varijanta i
Za prvi i drugi uslov netačan, treća varijanta
Takođe treba uočiti da else klausula, koja može biti samo poslednja, ne zahteva eksplicitno pisanje uslova, nego se on podrazumeva: Ako nije a > b i ako nije tačno da je a == b, onda zakljucujemo da je a < b.
Ovo se može rešiti i sa else if naredbom na poslednjem mestu, ali ona zahteva uslov eksplicitno(zaokruženo crvenim- vidi sliku ispod).
Za prvi uslov tačan izvršava se prva varijanta
Za prvi uslov netačan, a drugi uslov tačan, druga varijanta i
Za prvi i drugi uslov netačan, treća varijanta
Takođe treba uočiti da else klausula, koja može biti samo poslednja, ne zahteva eksplicitno pisanje uslova, nego se on podrazumeva: Ako nije a > b i ako nije tačno da je a == b, onda zakljucujemo da je a < b.
Ovo se može rešiti i sa else if naredbom na poslednjem mestu, ali ona zahteva uslov eksplicitno(zaokruženo crvenim- vidi sliku ispod).
Za pisanje naredbi kao varijante programa u grananju nisu korišćene zagrade, jer u svakoj grani postoji samo po jedna naredba. U slučaju da ima više naredbi unutar neke od grane, stavljanje tih naredbi unutar bloka sa vitičastim zagradama bi bilo obavezno.
Primer 3: Odabir Figura
Tekst:
Omogućiti prvo korisniku, da odabere jednu od tri geometrijske figure:
1-Kvadrat, 2-Krug, 3-Paralelogram,
a zatim da unese potrebne ulazne podatke za odabranu figuru i izračuna njenu površinu
Omogućiti prvo korisniku, da odabere jednu od tri geometrijske figure:
1-Kvadrat, 2-Krug, 3-Paralelogram,
a zatim da unese potrebne ulazne podatke za odabranu figuru i izračuna njenu površinu
Rešenje
Primer iz oblasti "Grananje u programu" u programskom jeziku C. Kroz zadatak je pokazana upotreba algoritma, naredba switch i kakva je razlika u odnosu na rešavanje istog zadatka pomoću if-else if-else naredbe

grananjeuprogramu.pdf |
Sledeće
Petlje u programskom jeziku C >| |