04. Naredbe izbora - grananje

 

KONTROLA TOKA
(Upravljačke strukture)

U Javi se koriste sledeće upravljacke strukture :

  • naredbe izbora (selekcije): if-else i switch
  • naredbe iteracije (petlje) for, while, do while
  • naredba za obradu izuzetaka try/catch/finally

 

GRANANJA - naredbe izbora (selekcije)

Kontrola toka omogućava donošenje odluka (izbor) u programima. Potrebno je izabrati, na primer "Ako je na semaforu zeleno svetlo prolazim kroz raskrsnicu, ako je crveno - čekam". Programerski rečeno pravi se poređenje između promenljivih, konstanti i vrednosti izraza, a onda se izvršava jedna ili druga grupa izraza u zavisnosti od rezultata datog poređenja.

if-else

if-else konstrukcija omogućava izvršenje određenog bloka instrukcija ako je uslov konstrukcije ispunjen. Opšti oblik je:

if (boolean_izraz) blok1;
[else blok2;]

gde je else klauzula opciona (i ako postoji, blok2 se izvršava ako uslov nije ispunjen) a boolean_izraz je uslov koji može biti bilo koji izraz koji vraća vrednost tipa boolean. blok1 i blok2 su proizvoljni blokovi instrukcija, koji mogu da budu i samo jedna instrukcija.

int a = 33;
short b = 28;
boolean d=a>b;
int min,max;
if (a<b) min=a;
else min=b;
if (d) max=a;
else max=b;
System.out.println( " d = " + d);
System.out.println( " min = " + min);
System.out.println( " max = " + max);

Na izlazu se dobija:

d = true
min = 28
max = 33

Umesto inicijalizacija a i b mogli smo ih uneti sa tastature:

int a=ulaz.nextInt();
short b=ulaz.nextShort();

Svaki od blokova, bilo u if ili u else delu može biti nova if-else konstrukcija. else pripada najbližem if koji mu prethodi koje nije u izdvojenom bloku i nije već rezervisano od strane nekog drugog else.

int a = 54;
if (a % 2 == 0)
if (a<50) //paran broj manji od 50
System.out.println( "\nprvi print");
else //paran broj > od 50 ili neparan broj???
System.out.println( "\ndrugi print");
a = 23;
if (a % 2 == 0)
if (a<50) //paran broj manji od 50
System.out.println( "\ntreći print");
else //paran broj > od 50 ili neparan broj???
System.out.println( "\nčetvrti print");

Na izlazu se dobija:

drugi print

Nazad na početak: 04. Naredbe izbora - grananje

 

switch

Naziva se još i iskaz izbora. Opšti oblik switch naredbe je:

switch (izraz) {
case vr1: blok1; [break];
...
case vrN: blokN; [break];
[default: blok_def]
}

Pri tome izraz mora biti bilo kog prostog tipa, a vrednosti specificirane u case klauzulama (vr1, vr2, ... , vrN) moraju biti kompatibilnog tipa i ne smeju se duplirati. Svi navedeni blokovi instrukcija kao i break klauzule su opcioni.

Na početku switch-a se izračunava vrednost izraza izraz i dobijena vrednost se poredi sa vrednostima vr1, vr2 ... vrN. Tamo gde dodje do uparivanja izvršava se blok instrukcija u odgovarajućem case-u. break dovodi do skoka na kraj tekućeg bloka što u ovom slučaju znači na kraj switch konstrukcije. Ukoliko se vrednost izraza izraz ne nalazi medju vrednostima vr1,..., vrN tada se izvršava blok naredbi blok_def;

Treba napomenuti da ukoliko se izostavi neka od break klauzula dolazi do propagiranja kontrole u sledeći case.

Primer:

switch(mesec) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: broj_dana=31; break;
case 4:
case 6:
case 9:
case 11: broj_dana=30; break;
case 2: broj_dana=28;
default: System.out.print("greška");
}

ili

switch(mesec) {
case 4:
case 6:
case 9:
case 11: broj_dana=30; break;
case 2: broj_dana=28;break;
default: broj_dana=31;
}

Ovde se switch konstrukcija koristi za određivanje broja dana u mesecu na osnovu rednog broja meseca (ne vodeći računa o prestupnim godinama). Moguće je skratiti pisanje tako što će se za mesece sa 31 danom broj dana određivati u default klauzuli (drugi primer), u tom slučaju moramo biti sigurni da promenljiva mesec sigurno ima vrednosti između 1 i 12.

Nazad na početak: 04. Naredbe izbora - grananje

 

Vežbe

Z4.1. Najveći broj
Odrediti i ispisati najveći (max) od unetih:
a) dva,
b) tri,
c) pet
brojeva.

Pod a) može ovako:

Scanner ul=new Scanner(System.in);
int a, b, max;
System.out.print("Unesi brojeve a i b :");
a=ul.nextInt(); b=ul.nextInt();
if (a>b) max=a;
else max=b;
System.out.print("Veći od "+a+" i "+b+" je "+max);

Pod b) još uvek može ovako:

int a, b, c, max;
System.out.print("Unesi brojeve a, b i c :");
a=ul.nextInt(); b=ul.nextInt(); c=ul.nextInt();
if (a>b) if (a>c) max=a;
else max=c;
else if (b>c) max=b;
else max=c;
System.out.print("Veći od "+a+", "+b+", "+c+" je "+max);

Dalje ne može, koristimo pretpostavku da je prvi broj najveći i max upoređujemo ga redom sa ostalim brojevima:

 

Z4.2. Proizvod pozitivnih
Izračunati i prikazati proizvod pozitivnih od unetih pet brojeva.

Scanner ul=new Scanner(System.in);
int a, b, c, d, e, P=1;
System.out.print("Unesi brojeve a, b, c, d i e :");
a=ul.nextInt(); b=ul.nextInt(); c=ul.nextInt(); d=ul.nextInt(); e=ul.nextInt();
if (a>0) P*=a;
if (b>0) P*=b;
if (c>0) P*=c;
if (d>0) P*=d;
if (e>0) P*=e;
System.out.print("Proizvod pozitivnih je "+P);

 

Nazad na početak: 04. Naredbe izbora - grananje

Z4.3. Brojanje
Koliko je od unetih 6 brojeva :
a) negativno
b) neparno
c) deljivo sa 7

Scanner ul=new Scanner(System.in);
int a, b, c, d, e, f, brNeg=0, brNep=0, brDelj7=0;
System.out.print("Unesi brojeve a, b, c, d, e i f :");
a=ul.nextInt(); b=ul.nextInt(); c=ul.nextInt(); d=ul.nextInt(); e=ul.nextInt(); f=ul.nextInt();
//broj negativnih
if (a<0) brNeg++;
if (b<0) brNeg++;
if (c<0) brNeg++;
if (d<0) brNeg++;
if (e<0) brNeg++;
if (f<0) brNeg++;
System.out.print("Broj negativnih je "+brNeg);
//broj neparnih
if (a%2==1) brNep++;
........
//broj deljivih sa 7
if (a%7==0) brDelj7++;
.....

Z4.4. Ocene 2
Ispisati ocenu koju je učenik dobio na osnovu broja bodova koji se unose. 0-27=1, 28-46=2, 47-65=3, 66-83=4, 84-100=5.

Z4.5. Idealna težina
Ako se idealna težina za muškarce računa po formuli Visina - 100, a za žene Visina-110. Dozvoliti toleranciju od 5%. Na osnovu unete visine i težine ispisati: "Idealna težina", "Imate viška / manjka kilograma".

Nazad na početak: 04. Naredbe izbora - grananje

Z4.6. Uređenost brojeva
Za unete brojeve proveriti da li su uređeni u opadajući.

Z4.7. Redni broj dana u godini
Uneti su redni broj meseca mes i dana u mesecu (datum) dan. Odrediti redni broj dana u godini. Pretpostavlja se da je godina prosta.

Scanner ul=new Scanner(System.in);
int dan, mes, brDanaUgod;
System.out.print("Unesi datum u obliku broj dana u mesecu i broj meseca u godini");
dan=ul.nextInt(); mes=ul.nextInt();
brDanaUgod=dan;
switch(mes) {
case 12: brDanaUgod+=30;//dodajemo broj dana iz prethodnog meseca
case 11: brDanaUgod+=31;
case 10: brDanaUgod+=30;
case 9: brDanaUgod+=31;
case 8: brDanaUgod+=31;
case 7: brDanaUgod+=30;
case 6: brDanaUgod+=31;
case 5: brDanaUgod+=30;
case 4: brDanaUgod+=31;
case 3: brDanaUgod+=28;
case 2: brDanaUgod+=31;
}
System.out.print("Redni broj dana "+dan+"."+mes+". u godini je "+brDanaUgod);


Z4.8. Broj dana između dva datuma
a) iste godine,
b) različitih godina.

Nazad na početak: 04. Naredbe izbora - grananje

Z4.9. Kvadrat u krug ili obratno.
Dati su krug preko poluprečnika i kvadrat preko stranice. Odrediti da li:
a) kvadrat može da stane u krug
b) krug može da stane u kvadrat

Z4.11. Kvadrant u kome se nalazi tačka.
Ispisati broj kvadranta u kome se nalazi tačka zadata pomoću koordinata. Ako se tačka nalazi na osama ispisati "0".

Z4.11. Duž seče ose
Da li duž zadata krajnjim tačkama seče x (ili y) osu.

Scanner ul=new Scanner(System.in);
int Ax, Ay, Bx, By;
System.out.print("Unesi koordinate krajnjih tacaka duzi Ax, Ay, Bx, By: ");
Ax=ul.nextInt(); Ay=ul.nextInt(); Bx=ul.nextInt(); By=ul.nextInt();
//da li sece x - proveravamo y koordinate, da li su sa suprotne strane
if(Ay*By<0) System.out.println("Duz sece x osu."); //koordinate su suprotnih znakova
else System.out.println("Duz ne sece x osu.");
//da li sece y
if(Ax*Bx<0) System.out.print("Duz sece y osu.");
else System.out.print("Duz ne sece y osu.");

Nazad na početak: 04. Naredbe izbora - grananje

Z4.12. Tačka u krugu
Da li se tačka A zadata pomoću koordinata Ax i Ay nalazi u krugu K zadatom pomoću koordinata centra Ox, Oy i poluprečnika r.

Z4.13. Duž u krugu
Da li se duž zadata pomoću krajnjih tačaka A i B nalazi cela u krugu K.

Z4.14. Krug seče osu
Da li krug k seče x (ili y) osu?

Nazad na početak: 04. Naredbe izbora - grananje

Z4.15.
(nastavak Z2.7.) Pravougaonik ima stranice koje su paralelne koordinatnim osama. Zadat je temenima A, C. Da li je:
a) Tačka E u pravougaoniku?
b) Tačka E u opisanom krugu?
c) Tačka E između pravougaonika i opisanog kruga?

Z4.16.Odnos dva kruga K1 i K2.
Da li se seku, dodiruju (spolja, iznutra), K1 je unutar K2.

Z4.17. Ceo krug K u pravougaoniku

Nazad na početak: 04. Naredbe izbora - grananje

Z4.18.
Redovi i kolone na šahovskoj tabli označeni su brojevima od 1 do 8. Svako polje je označeno uređenim parom (A,B). Za dva uneta polja (A,B) i (C,D) odrediti da li :
a) su iste boje,
b) kraljica sa polja (A,B) tuče polje (C,D)
c) skakač sa polja (A,B) tuče polje (C,D)

a) Polja jedne boje su (1,1), (1,3), (1,5), (1,7), (2,2), (2,4)... Sledi, A+B je paran broj. Sledi, polja su iste boje ako je (A+B)%2==(C+D)%2

b) Kraljica sa polja (A,B) tuče:
- po horizontali sva polja (A,x), sledi A==C,
- po vertikali sva polja (x,B), sledi B==D,
- po rastućoj dijagonali sva polja A+B==C+D,
- po opadajućoj dijagonali sva polja A-B==C-D,

c) Skakač sa polja (A,B) tuče okolna polja koja su podjednako udaljena na rastojanju 2 polja po horizontali i 1 po vertikali ili obratno, tj polja koja se nalaze na kružnici na rastojanju (A-C)^2+(B-D)^2==5

         Scanner ul=new Scanner(System.in);
        int A, B, C, D;
        System.out.print("Unesi A, B, C i D :");
        A=ul.nextInt(); B=ul.nextInt(); C=ul.nextInt(); D=ul.nextInt();
        //a)
        if((A+B)%2==(C+D)%2) System.out.println("Polja su iste boje.");
        else System.out.println("Polja nisu iste boje.");
        //b
        if(A==C || B==D || A+B==C+D || A-B==C-D) System.out.println("Kraljica na polju ("+A+","+B+") tuče polje ("+C+","+D+").");
        else System.out.println("Kraljica na polju ("+A+","+B+") ne tuče polje ("+C+","+D+").");
        //c
        if(Math.pow(A-C, 2)+Math.pow(B-D, 2)==5) System.out.println("Skakač na polju ("+A+","+B+") tuče polje ("+C+","+D+").");
        else System.out.println("Skakač na polju ("+A+","+B+") ne tuče polje ("+C+","+D+").");

Z4.19. Koji je datum sutra

Nazad na početak: 04. Naredbe izbora - grananje