Grananje - naredba if i if..else

Sjedište: CARNET - Arhiva 2021 Loomen
E-kolegij: III. Gimnazija Osijek - Informatika 2
Knjiga: Grananje - naredba if i if..else
Otisnuo/la: Gost (anonimni korisnik)
Datum: ponedjeljak, 28. listopada 2024., 07:29

1. Grananje

Za rješavanje zadataka iz prethodne cjeline bile su dovoljne naredbe za učitavanje i ispis u kombinaciji s aritmetičkim izrazima. Nažalost, to nije dovoljno za rješavanje većine programskih problema. Često se pojedini blokovi naredbi moraju izvršiti samo ako su zadovoljeni određeni uvjeti (u jednom slučaju izvršava se jedan dio programa, a u drugom slučaju drugi dio programa). To znači da se program mora granati. Za rješavanje tih problema koriste se naredbe grananja.

Naredbe grananja omogućuju grananje programa u dva ili više smjerova, ovisno o istinitosti uvjeta koji je postavljen.

Pogledajte video na poveznci


U videu  je prikazan ovaj dijagram tijeka:

U njemu možete vidjeti kako se izvršava naredba grananja.

2. Operatori

Prije nego što počnemo upotrebljavati naredbe grananja, moramo naučiti kako postaviti uvjete o kojima grananje ovisi. Dosad smo se koristili samo aritmetičkim izrazima i aritmetičkim operatorima. No, osim njih postoje i logički izrazi te logički i relacijski operatori.

Pogledajte ovaj primjer:

Nama je svima jasno da je mama mislila da treba kupiti 6 jaja no to nije rekla. Naredba KUPI osnosila se samo na mlijeko. Ova šala je zapravo jako zgodan primjer u kojem možete vidjeti nužnost dobrog definiranja uvjeta i samog grananja u programu.

Dakle da bismo dobro postavili uvjete u našim programima moramo naučiti ispravno napisati relacijske i logičke operatore.

2.1. Relacijski operatori

Relacijski operatori upotrebljavaju se kada je potrebno utvrditi u kakvom su odnosu dvije vrijednosti (jesu li jednake, je li jedna veća ili manja od druge i sl.).

Rezultati relacijskih izraza mogu biti samo cjelobrojne vrijednosti 0 (laž) ili 1 (istina). Obzirom da programski jezik C nema ugrađen logički tip podataka i iako je uobičajeno da se istina označuje s 1, a laž s 0, u C-u se istinom smatra sve što je različito od 0.

U mješovitim izrazima prvo će se izvršiti aritmetičke operacije, a nakon toga će se dobivene vrijednosti usporediti jer relacijski operatori imaju niži prioritet od aritmetičkih.

Primjer

Izračunajte vrijednosti relacijskih izraza.

a) 1 < 2
b) 5 != 5
c) 5 != 3 + 4
d) (12 > 5) + 3


Rješenje

a)       1
b)       0
c)       1, jer se prvo izračuna vrijednost aritmetičkog izraza 3 + 4, pa se tek onda uspoređuje
d)       4, jer zagrade mijenjaju prioritet operatora


2.2. Logički operatori

Tri osnovne logičke operacije (logička negacija, logički I i logički ILI ) definirane su u programskom jeziku C. Operatori kojima ih definiramo su ovi:

Najveći prioritet ima operator !, a ako se u izrazu nađu aritmetički, logički i relacijski operatori, prioritet je sljedeći:

Kao i rezultati relacijskih, tako i rezultati logičkih izraza mogu biti samo 0 ili 1 (true ili false). Uporaba zagrada u izrazu promijenit će prioritet operatora.

U C-u postoje još bitovni operatori. To su operatori kojima se izvode izravne operacije na pojedinim bitovima podataka (komplement, binarni i, binarni ili, isključivi ili, pomak ulijevo i pomak udesno).

Primjer

Napisati u programskom jeziku C.

a)       a ≠ b
b)      (x OR y) = z
c)       (a AND b) < (c OR d)


Rješenje

              a) a != b
              b) ( x || y) == z
              c) (a && b) < (c || d)

 




2.3. Zadaci za vježbu

Pimjer 1.

Odredi vrijednost postavljenog uvjeta:

int a = 1, b = 2, c = 3, d = 4;
x = (a*b >= c-d) && (a-c <= b+d);


Rješenje:

Uvrstimo vrijednosti:

x = (1*2 >= 3-4) && (1-3 <= 2+4);
x = (2 >= -1) && (-2 <= 6);
x = 1 && 1;
x = 1;



Vratimo se naredbama grananja. Već smo rekli da služe za grananje u programu, a podijeljene su u dvije skupine: 

  • naredbe za jednostruko grananje
  • naredbe za višestruko grananje.

3. Jednostruko uvjetno grananje

Jednostruko uvjetno grananje upotrebljava se kada se naredba (ili blok naredbi) treba izvršiti samo ako je dani uvjet istinit. Ako uvjet nije istinit, program se nastavlja prvom naredbom nakon naredbe grananja.

U pseudojeziku takvu smo naredbu pisali na ovaj način:

ako je uvjet onda
    naredba

U programskom jeziku C za jednostruko uvjetno grananje koristi se naredba if oblika:

if (uvjet)
   naredba;


Ako je uvjet istinit ili različit od 0, izvršava se naredba koja slijedi. Ako uvjet nije istinit ili je jednak 0, naredba unutar if će se preskočiti.

Uvjet u naredbi if može biti logički, relacijski ili aritmetički izraz.

Naredbi iza if može biti više, ali ih tada treba grupirati u blok s pomoću vitičastih zagrada. U tom je slučaju opći oblik naredbe if sljedeći:

if (uvjet)
{
     blok naredbi;
}

Dijagramom tijeka jednostruko uvjetno grananje prikazuje se ovako:



3.1. Primjeri

Primjer 1.

Program od korisnika traži učitavanje jednoga cijelog broja. Nakon upisivanja, na zaslonu se ispisuje je li učitani broj pozitivan, negativan ili je nula.

Rješenje:

#include<stdio.h>
int main()
{
     int a;
     printf("Upisite jedan broj: ");
     scanf("%d",&a);
     if (a>0) printf("Ucitani broj je veci od nule.\n");
     if (a<0) printf("Ucitani broj je manji od nule.\n");
     if (a==0) printf("Ucitani broj je nula.\n");
     return 0;
}

 

Primjer 2.

Koje će vrijednosti imati varijable x = 5 i y = 0 nakon izvršavanja naredbi?             

      if (x == x + y)
           x += 7;
   y = 2 * x;


Rješenje

x = 12
y = 24

/* Dani je uvjet zadovoljen (5==5+0), pa se izvršavaju obje naredbe. Zamijetite da je druga naredba (y = 2 * x;) neovisna o naredbi grananja */


Što ako nam je uvjet u naredbi if napisan ovako?

if (x += y)
     x += 7;
y = 2 * x;

U tako napisanom zadatku uvjet je naredba pridruživanja s aritmetičkim operatorom i znači x = x + y, dakle varijabla x trebala bi promijeniti vrijednost (x = 5 + 0 = 5). S obzirom na to da je nova vrijednost varijable x različita od 0, smatra se istinom i naredbe unutar if će se izvršiti (x = 12, y = 24). Dakle, uvjet ne mora nužno biti relacijski ili logički izraz!


Primjer 3.

Što će se ispisati na zaslonu nakon izvođenja sljedećeg programa ako je vrijednost varijable a:

a)       a = 15
b)      a = ‒32?

 

#include<stdio.h>
int main()
{
     int a;
     printf("Upisite jedan broj: ");
     scanf("%d",&a);
     if (a%2!=0) printf("Broj %d nije djeljiv s 2",a);
     if (a%2==0) printf("Broj %d je djeljiv s 2",a);
    return 0;
}

Kako biste definirali tekst zadatka za ovaj program?

Rješenje

a)       Za a = 15 ispis na zaslon bio bi „Broj 15 nije djeljiv s 2“.

b)      Za a = -32 ispis na zaslon bio bi „Broj -32 je djeljiv s 2“.

Ovaj program ispisuje na zaslonu je li broj djeljiv s 2 ili nije.

Uočite da se ovaj zadataka samo promjenom ispisanog tekst može primjeniti tako da provjerava je li broj paran ili ne!

 

Primjer 4.

Napišite program koji će tražiti upisivanje tri broja. Program treba pronaći i ispisati na zaslonu najveći od njih.

Uputa: Sličan zadatak ovome (tražio se najmanji element) imali ste u video lekciji u kojoj je dan jedan od načina rješavanja određivanja najmanjeg / najvećeg od tri učitana broja. No način opisan u video lekciji prilično je kompliciran ako trebamo odrediti najmanji (ili najveći) između više od tri broja. Upravo zato se češće upotrebljava algoritam opisan malo niže. Ovo je jedan od najbitnih algoritama koji svakako treba upamtiti!

Najjednostavniji način pronalaska najvećeg (ili najmanjeg) elementa u nizu svodi se na to da jedan element (bilo koji, ali uobičajeno je da to bude prvi element) proglasimo najvećim (ili najmanjim) i dalje redom usporedimo sve elemente s tim pretpostavljenim. Ako pronađemo element veći (ili manji) od pretpostavljenog, on postaje pretpostavljeni, a postupak nastavljamo dok ne dođemo do kraja niza. Pseudokodom bi to izgledalo ovako:

Algoritam koji ispisuje najmanji od tri unesena broja

Objašnjenje
Na početku jednostavno pretpostavimo da je jedan od tri broja (npr. a) najmanji. Njegovu vrijednost pridružimo novoj varijabli (najmanji). Sad provjerimo je li možda vrijednost varijable b manja od vrijednosti varijable najmanji. Ako jest, vrijednost varijable b pridružimo varijabli najmanji i prijeđemo na sljedeću naredbu (provjera varijable c). Ako vrijednost varijable b nije manja od vrijednosti varijable najmanji, samo prijeđemo na sljedeću naredbu. Sad to isto napravimo s varijablom c. Na kraju algoritma zasigurno će najmanja vrijednost biti pridružena varijabli najmanji!
Provjerimo na konkretnom primjeru:


Rješenje

#include<stdio.h>
int main()
{
     int a,b,c,max;
     printf("Upisite tri broja: ");
     scanf("%d %d %d",&a,&b,&c);
     max=a;
     if (b>max) max=b;
     if (c>max) max=c;

     printf("Najveci je %d\n",max);
     return 0;
}

 

Testni primjeri

Ulaz:      5  1  2  
Izlaz:     Najveci je 5

Ulaz:      12  21  8  
Izlaz:     Najveci je 21

Ulaz:      15  8  15  
Izlaz:     Najveci je 15

 

U trećem testnom primjeru upisana su dva broja iste vrijednosti. Izvršavanjem programa u varijabli max bit će pohranjena najveća vrijednost  koja je zadnja upisana.

Isto tako, uočite da izvršavanjem ovog programa ne znamo koji učitani broj a, b ili c je najveći. Znamo samo koja je vrijednost najvećeg upisanog broja, jer je ona pohranjena u varijablu max.


3.2. Zadaci za vježbu

1. Koju će vrijednost poprimiti varijable a = 2 i b = 1 nakon ovih naredbi?

    if (a == b) a++;
   b++;

A koju nakon sljedećih naredbi?

      if (a != b) a++;
      b++;

 

2. Ako je a = 0,  b = 1,  c = 0, koju će vrijednost imati varijabla c nakon danog izraza?

               if (a || b) c = ++b;
         c++;

A koju nakon sljedećeg izraza?

         if (a && b) c = ++b;
         c++;

 

3. Napišite program koji traži učitavanje cijelih brojeva a i b. Program treba izračunati i ispisati na zaslon vrijednost funkcije x zadane formulom: 


Testni primjeri

Ulaz:      2  3  
Izlaz:     x = 8

Ulaz:      5  5       
Izlaz:     x =  -5

 

4. Napišite program koji će tražiti upisivanje tri cijela broja i nakon toga ih poredati po veličini, od najmanjega do najvećega, te tako poredane ispisati na zaslonu.

Uputa: Najprije treba pronaći najveći i najmanji element na prije opisan način. Srednji element dobije se tako da se zbroje sve tri ulazne vrijednosti i od zbroja oduzmu najveći i najmanji element.

 

5. Napišite program koji će od korisnika tražiti upisivanje tri cijela broja. Program treba izračunati i ispisati na zaslonu drugi korijen apsolutne vrijednosti srednjeg po veličini učitanog broja.


4. Višestruko uvjetno grananje

Ako program zahtijeva da se, ovisno o uvjetu, izvode dva neovisna bloka naredbi, pseudojezikom bismo to napisali ovako:

ako je uvjet onda
     naredba_1
inače
     naredba_2

Dakle, ako je uvjet istinit, izvršila bi se naredba_1, a ako uvjet nije istinit, izvršila bi se naredba_2.

U programskom jeziku C grananje u više smjerova izvršava se naredbom if else. Opći je oblik te naredbe ovaj:

if (uvjet)
{
     blok naredbi_1;
}
else
{
     blok naredbi_2;
}

 

Pri izvršavanju prethodne naredbe, ako je uvjet istinit (ili različit od 0), izvršava se blok naredbi_1 i program se nastavlja prvom naredbom iza naredbe if (prva programska linija nakon bloka naredbi_2). Ako je uvjet neistinit (jednak 0), preskače se blok naredbi_1 i izvodi se samo blok naredbi_2. Nakon toga se nastavlja izvođenje naredbi koje slijede.

Dijagram tijeka

Pogledajmo u nastavku kako bismo zadatak iz prošle cjeline napisali s pomoću naredbe if..else.



4.1. Primjeri

Primjer 1.

Program za učitani cijeli broj ispisuje je li djeljiv s 2 ili ne koristeći se samo naredbom if..else.

Rješenje

#include<stdio.h>
int main()
{
     int a;
     printf("Upisite jedan broj: ");
     scanf("%d",&a);
     if (a%2!=0)                // ili samo (a%2)
           printf("Ucitani broj nije djeljiv s 2.\n");
     else
          printf("Ucitani broj je djeljiv s 2.\n");
return 0;
}

Napomena: Promjenom broja s kojim dijelimo možemo provjeriti djeljivost sa bilo kojim brojem! U video lekciji je provjerena djeljivost učitanog broja sa 7. Promotrite male razlike u kodovima! Dakle ne postoji jedno jedinstveno rješenje, zadatak se može riješiti na više načina, a koji će te odabrati ovisi o vama.

Primjer 2.

1. Koje će vrijednosti imati varijable x = 5 i y = 2 nakon izvršavanja sljedećih naredbi?

a)           if (x>y) x=y;
              else y=x;

b)           if (x=y)
       {
          x++;
          y+=x;
       }
       else
       {
          y--;
          x+=y;
       }

c)           if (x<y)
        {
           x=y;
           y=x;
        }
        else
        {
           y++;
           x=y;
        }

d)           if (x>y)
          y++;
        else
          x++;
        x=2*y;
 

Rješenje
a) x = 2, y = 2     //uvjet je istinit pa se izvršava naredba unutar if.
b) x = 3, y = 5     /*uvjet je zapravo naredba pridruživanja pa x postaje jednak 2. Time je uvjet različit od 0 i izvršava se blok naredbi unutar if  */.
c) x = 3, y = 3     //uvjet nije istinit pa se izvršava naredba unutar else.
d) x = 6 y = 3      /*uvjet je istinit pa se izvršava naredba unutar if, ali izvršava se i posljednja naredba jer nije vezana uz naredbu if.*/

 

4.2. Zadaci za vježbu

1. Koja je vrijednost varijable x nakon izvršavanja niza naredbi?

int main()
{
     int a=-5,b=13,x=0;
     if (a>b)
          x=a;
     else
          x=b;
     return 0;
}

 

2. Kada se pokrene ovaj program i korisnik upiše broj 3, što će se ispisati na zaslonu monitora?

#include <stdio.h>
int main()
{
     int a;
     printf("\nUpisite jedan broj: ");
     scanf("%d",&a);
     if (a<0)
           a++;
     else
           a--;
     printf ("%d",a);
     return 0;
}

Kako glasi tekst zadatka koji opisuje dani program?

3. Napišite program koji će omogućiti upisivanje dvaju cijelih brojeva. Program treba od većega učitanog broja oduzeti manji i dobiveni rezultat ispisati na zaslonu.

Testni primjeri

Ulaz:      3  4  
Izlaz:     1

Ulaz:      5  5       
Izlaz:    0

 

4. Napišite program koji će za zadane duljine stranica trokuta izračunati njegovu površinu i opseg.

Uputa: Pri rješavanju zadatka treba imati na umu  da zbroj bilo kojih dviju duljina stranica u trokutu mora biti veći od duljine treće stranice. Isto tako duljine stranica moraju biti veće od nule. Formule za opseg i površinu trokuta su:

Testni primjeri

Ulaz:      3  4  5
Izlaz:     o=12.00
             P=6.00

Ulaz:      1  4  7   
Izlaz:      Ucitane stranice ne cine trokut   

 

5. Napišite program koji će omogućiti učitavanje koeficijenata linearne jednadžbe, izračunati njezino rješenje i ispisati ga na zaslonu.

Uputa: Opći oblik linearne jednadžbe je

  

6. Napiši program koji će tražiti unos dvaju brojeva i ispisati je li prvi upisani broj djeljiv s onim drugim (na primjer, ako korisnik unese brojeve 45 i 5, algoritam treba ispisati „djeljiv je”, a ako unese 45 i 7, treba ispisati „nije djeljiv”).


5. Ugnježđivanje if funkcija

Blokovi naredbi if mogu se nastavljati i pisati jednu if funkciju unutar druge , ovisno o potrebi zadatka.

Takav oblik naredbe if..else omogućuje ispitivanje niza uvjeta. Najprije se provjerava istinitost prvog uvjeta (uvjet_1). Ako je uvjet istinit, izvršava se prvi blok naredbi (blok naredbi_1) i program se nastavlja s prvom naredbom nakon posljednjeg else bloka u nizu. Ako prvi uvjet nije zadovoljen, provjerava se istinitost sljedećeg (uvjet_2) i, ovisno o njegovoj istinitosti, izvodi se drugi blok naredbi ili se program nastavlja nakon njega. Ako ni jedan uvjet nije istinit, izvršava se blok naredbi koji slijedi nakon krajnje naredbe else. Broj uvjeta nije ograničen.

Dijagram tijeka



5.1. Primjeri

Primjer 1.

Za upisani cijeli broj program na zaslonu ispisuje je li veći, manji ili je jednak nuli.

Strelice povezuju else s pripadnom naredbom if.

Zadatak smo mogli riješiti i drukčije.

Pogledajte kojoj naredbi if pripada koji else. Sve su kombinacije dopuštene uz poštovanje sintakse. O vama ovisi koju ćete kombinaciju naredbi if unutar if odabrati.

Sličan zadatak riješen je na treći način u video lekciji!

Primjer 2.

Napišite program koji će za zadani cijeli broj x izračunati i ispisati vrijednost funkcije  .

Rješenje

Zadatak možemo riješiti na više načina. Jedna od mogućnosti je uporabom triju if naredbi.

Drugi je način rješavanja takvih zadataka uporabom naredbe if ..else unutar naredbe if..else.

Primjer 3.

Kada se izvrši sljedeći program, što će se ispisati na zaslonu ako se upišu brojevi:

a)  5
b)  -12
c)  32?



Rješenje

a)      Broj je neparan
b)      Broj nije prirodan         
c)      Broj je paran

6. Dodatni materijali

Video lekcija "Škola za život"


6.1. Rješenja zadataka iz video lekcije

Zadatak 1.

Koliki su x i y nakon sljedećih naredbi?

int x = 10, y= 5;
if (x-y == x+y)
{
     x+=5;
}
y=x*3;


Rješenje:

Uvjet (x-y==x+y) je lažan (10 - 5 == 10 + 5 → 5 == 15 što nije istina) pa se naredba unutar funkcije if neće izvršiti. Naredba y=x*3; nije unutar funkcije if i ona se izvršava. Dakle na izlazu će vrijednost varijable x ostani nepromijenjena i jednaka 10, a y = 10 * 3 = 30.


Zadatak 2.

Koliki je y nakon izvođenja sljedećih naredbi?

int x=10;
if (x>4)
{
   y=x*x;
   y=y+2;
}
else
{
   y=3*x;
   y=y-2;
}
y=y-22;


Rješenje:

Uvjet u if (x>4) je istinit pa se izvršava blok naredbi unutar njega:

y=x*x;   →  y = 10 * 10 = 100
y=y+2;     y= 100 + 2 = 102 pripazite da uvijek uvrsite zadnju vrijednost od y!

Naredbe pod else se neće izvršiti! No posljednja naredba nije vezana uz if..else pa se izvršava:

y=y-22;   →   y= 102 - 22 = 80

Dakle vrijednost x se neće mijenjati tijekom ovog programa, a vrijednost y na kraju programa je 80.