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:
  • 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.
intuslov = 1;
if (uslov) {
// izvršava se naredba 2
} else {
// izvršava se naredba 3
}
Dijagrami toka izvršavanja programa: Bez grananja - levo i sa grananjem - desno
Slika 1: Dijagrami toka izvršavanja programa: Bez grananja - levo i sa grananjem - desno
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. Dijagrami toka izvršavanja programa: if naredba - levo i if-else naredba - desno
Slika 2: Dijagrami toka izvršavanja programa: if naredba - levo i if-else naredba - desno
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:Slika 3: Uslovno izvršavanje komande-if naredba
Slika 3: Uslovno izvršavanje komande-if naredba. Algoritam-levo i naredba if-desno
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 stranice ne može biti negativan broj, a i vrednost nula takođe nema smisla jer bi onda kvadrat bio samo jedna tačka.

Pogledajmo sada algoritam i primenu naredbe if za ovaj zadatak, na sledećoj slici (slika 4).
inta;
scanf("%d", &a);
if (a > 0) {
printf("Ispravna duzina stranice.");
} else {
printf("Neispravan podatak!");
}
 Primena if naredbe u primeru
Slika 4: Primena if naredbe u primeru "Provera ispravnosti podatka". Algoritam je prikazan na slici levo, a kod na slici desno
Logiku izvršavanja možemo videti na slici levo. Naredba za učitavanje kao i prethodno definisanje podatka a se prvo izvršavaju u jednom toku:
inta;
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
inta;

// 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);
}
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:
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.
Primena if naredbe u primeru
Slika 5: Primena if naredbe u primeru "Provera ispravnosti podatka sa alternativnim tekstom". Algoritam je prikazan na slici levo, a kod na slici desno
Klauzula else se dodaje nakon prvog bloka naredbi koji sledi posle if naredbe i njenog uslova. Ova klauzula definiše alternativnu granu koja se izvršava kada uslov if nije zadovoljen.
inta; /* Deklaracija promenljive a */
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("Uslov nije zadovoljen\n"); /* Ispis poruke kada uslov nije ispunjen */
}
Ako u nekoj od grana treba da se izvrši više naredbi, vitičaste zagrade su obavezne. Ako je prisutna samo jedna naredba (kao u prethodnom primeru), zagrade mogu biti izostavljene:
if(a > 0) /* Provera da li je a pozitivno */
printf("a=%d\n", a); /* Ispis vrednosti a */
else/* Alternativna grana */
printf("a=%d\n", a); /* Ispis kada uslov nije zadovoljen */
Primer 2: Izračunavanje vrednosti razlomka

Zadatak: Za unete brojeve a i b, izračunati vrednost razlomka a/b. Pre izračunavanja potrebno je proveriti da li je b različito od nule, jer deljenje sa nulom nije dozvoljeno.

Objašnjenje:
Nakon deklaracije promenljivih i unosa a i b, računa se razlomak. Pre nego što se napiše formula c = a / b, proverava se da li je b različito od nule. Ako jeste, rezultat se računa i ispisuje. U suprotnom, ispisuje se poruka o grešci.

Grananje u ovom primeru zavisi od vrednosti promenljive b.

Napomena: Za rezultat razlomka koristi se tip float kako bi rezultat imao decimalne vrednosti. Ako se koriste samo celobrojni tipovi, rezultat bi bio zaokružen i bez ostatka.
#include <stdio.h> /* Uključivanje standardne biblioteke */

intmain() {
inta, b; /* Deklaracija promenljivih a i b */
floatc; /* Rezultat razlomka */

printf("Unesite broj a: ");
scanf("%d", &a);

printf("Unesite broj b: ");
scanf("%d", &b);

if(b != 0) {
c = (float)a / b;
printf("Vrednost razlomka je: %.2f\n", c);
    } else {
printf("Deljenje sa nulom nije dozvoljeno.\n");
    }

return0;
}

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

U C jeziku logičke vrednosti se obično predstavljaju korišćenjem int tipa, gde nula znači false (logička neistina), a bilo koja nenulta vrednost znači true (logička istina). U modernom C-u (C99 i kasnije) možete koristiti _Bool tip ili uključiti <stdbool.h> da biste koristili bool, true i false.

Logički podaci i izrazi

Logičke relacije tj. izrazi su rezultati nekih poređenja i koriste sledeće operatore: <, >, <=, >=, !, !=, ==

Značenja: “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čke vrednosti u C jeziku koristi se int tip podatka, s tim što važe pravila:

  • nula predstavlja logičku neistinu (false),
  • bilo koja nenulta vrednost predstavlja logičku istinu (true, obično 1 za preglednost).
int a=10, b=8, c;
int d; // logička promenljiva

c = a+b; // aritmetički izraz
c = a>b; // c=1 (true)
d = a>b; // ispravno, d=1 (true)
d = !(a>b); // d=!(1), d=0 (false)

Logički podaci i složeniji izrazi

Da bismo 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; // za rezultate logičkih izraza

d = (a==0) && (b>c); /* d=0 && 1 → d=0 (false) */
e = (a==0) || (b>c); /* e=0 || 1 → e=1 (true) */

Tabela istinitosti za operator &&

true && true = true
true && false = false
false && true = false
false && false = false

Tabela istinitosti za operator ||

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 uslovi kod grananja u programu. Ako imamo logičku promenljivu uslov, njena vrednost se koristi za odlučivanje da li će određeni blok koda biti izvršen.

Grananje u programu, algoritam za if-else naredbu
Slika 6: Grananje u programu, algoritam za if-else naredbu
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
inta, 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:
inta, x, uslov;
// 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

Logički izraz a > x u sledećem primeru daje false, tako da se naredba1 neće izvršiti. Logički izraz se može napisati direktno u zagradi bez uvodjenja promenljive koja čuva vrednost uslova.

int a = 3, x = 5;
if (a > x) {
    naredba1;
}

Ovde je a > x netačno, pa se naredba1 neće izvršiti.

Primer: Uneti ceo broj i odrediti da li je deljiv sa 3

Broj je deljiv sa 3 ako je ostatak deljenja tog broja i broja 3 jednak nuli. Za izračunavanje ostatka koristi se operator %. Dakle uslov za grananje biće: a % 3 == 0.

Ako je uslov ispunjen, ispisuje se poruka „Broj je deljiv sa 3“, u suprotnom poruka „Broj nije deljiv sa 3“.

#include <stdio.h>

/* Uneti ceo broj i odrediti da li je deljiv sa 3 */
intmain() {
inta;
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);

return0;
}

Primer izlaza (unos: 9)

Unesi ceo broj
9
Broj 9 je deljiv sa 3
  

Napomena

Uslov u if naredbi može biti bilo koji logički izraz (npr. kombinacija poređenja i logičkih operatora). Ako je izraz tačan (nenula), izvršiće se prvi blok; ako nije tačan (nula), izvršiće se else grana (ako postoji).

Grananje u programu, primer
Slika 7: Grananje u programu, primer "Deljivost sa 3"-izvršenje

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:Grananje u programu sa 3 grane u jeziku C, ostvareno sa dva uslova(logička izraza)
Slika 8: Grananje u programu sa 3 grane u jeziku C, ostvareno sa dva uslova(logička izraza)
Kod koji je kreiran po ovom algoritmu:
// Naredbe 0
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:
  1. Prva grana (if): Kada je uslov uslov1 tačan, izvršava se naredbe 1 (označene zelenom bojom).
  2. 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).
  3. Treća grana (else): Ako su oba prethodna uslova netačna, izvršava se naredbe 3 (označene plavom bojom).
  4. Naredbe pre grananja (Naredbe 0): Ove naredbe su nezavisne od grananja i izvršavaju se pre nego što se proveri bilo koji uslov.
Ovakva struktura grananja je korisna kada postoji precizna logika koja zavisi od više međusobno isključivih uslova. Else klauzula se koristi za slučaj kada nijedan prethodni uslov nije zadovoljen, što je korisno za hvatanje "preostalih" scenarija.

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:Grananje u programu sa 3 grane u jeziku C, ostvareno sa 3 uslova - algoritam
Slika 9: Grananje u programu sa 3 grane u jeziku C, ostvareno sa 3 uslova - algoritam
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.​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:​Prvo treba postaviti prvi uslov pomoću if naredbe, npr. da li je a veće od b(a>b). Sa ovim uslovom dobijamo dve te sledeći grane jedna za tačan uslov i tada se ispisuje prva poruka. Druga za netačan uslov, ali s obzirom da imamo jos dve mogućnosti, potreban nam je još bar jedan uslov. Npr. "da li je a jednako nuli"(a==0). Ovo ide uz else ifklauzula odmah ispod prve varijante. Drugu varijantu dobijamo za ovaj uslov tačan. Treću varijantu dobijamo za ovaj uslov netačan i to se piše uz klauzulu else. Sledeći kod ovo pokazuje:Grananje u programu, primer
Slika 9: Grananje u programu, primer "Poredjenje brojeva"-kompletno
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).Grananje u programu, primer
Slika 5: Grananje u programu, primer "Poredjenje brojeva"-varijanta sa 3 uslova
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šinuReš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

pdf
grananjeuprogramu.pdf
File Size: 351 kb
File Type: pdf
Download File


Srodni članci

Grananje u programu-primeri
Podaci
Grananje u programu - JAVA
Nizovi-primeri
Algoritmi