Sunteți pe pagina 1din 11

Curs: Core Java Programming

Modul: Controlul fluxului


Unitate: Structura if - else

Programele pe care le-am creat până acum nu au un control foarte


mare. Ele sunt, pur şi simplu, prea liniare pentru a putea face orice.
Acesta este şi motivul pentru care nu am putut să facem operaţii mai
serioase. Pentru a depăşi această problemă, se folosesc diverse tehnici
de control al fluxului programului. Una dintre ele sunt ramurile de
instrucţiuni.

Ramurile de instrucţiuni se folosesc atunci când, pe baza îndeplinirii


unei condiţii, este necesar să executăm o parte sau alta din
continuarea codului.

Comanda if...else

Această comandă, în general, are următoarea sintaxă:

if (condi?ie1) {
comenzi 1
}
else if (condi?ie2) {
comenzi 2
}
else {
comenzi 3
}

Când programul ajunge la comanda if, el verifică prima condiţie. Dacă


condiţia este corectă, se execută primul grup de comenzi şi programul
trece la executarea codului care urmează după structura if...else. Dacă
prima condiţie nu este îndeplinită, se verifică condiţia din interiorul
comenzii else if (dacă aceasta există). Dacă această condiţie este
corectă, se execută cel de al doilea grup de comenzi. Dacă şi această
condiţie este incorectă, se execută grupul de comenzi din interiorul
blocului else. În interiorul unei structuri if...else se pot afla mai multe
blocuri else if. Dacă mai multe condiţii sunt îndeplinite, se va executa
doar prima dintre ele.

© Copyright Link group 1 / 11


Curs: Core Java Programming
Modul: Controlul fluxului
Unitate: Structura if - else

În mod evident, ceea ce este gestionat de mecanismul de condiţionare


este tipul boolean, astfel încât este clar că în expresie nu se poate
stoca ceva a cărui rezultat nu este de acest tip.

Exemplul următor va iniţializa variabila num cu valoarea 15. Apoi va


face trei verificări, dacă num este mai mic, mai mare sau egal cu 10 şi,
în funcţie de rezultat, va scrie mesajul corespunzător:

int num=15;
if(num<10){
System.out.println("Num?rul este mai mic decât 10"); }
else if (num>10) {
System.out.println("Num?rul este mai mare decât 10"); }
else if (num==10) {
System.out.println("Num?rul este egal cu 10"); }

Acest exemplu va emite la ieşire mesajul: Numărul este mai mare


decât 10. Dacă am efectua schimbarea la variabila num, s-ar ajunge la
schimbare şi la ieşire, respectiv, ar fi activată o altă linie de cod,
cauzată de îndeplinirea unei alte condiţii.

Condiţiile if-else pot fi şi încuibate.


De exemplu:

if(true)
if(true)
System.out.println("acest exemplu func?ioneaz?");

Acest exemplu (complet funcţional), pe lângă faptul că arată


încuibarea, mai arată şi un alt mod de folosire a acestui operator. Şi
anume, corpul fără paranteze acolade. O astfel de abordare este
posibilă numai dacă corpul subînţelege o singură linie de cod. Dacă
există mai multe linii, cel puţin două, paranteze acolade sunt
obligatorii, altfel, se vor produce iregularităţi logice în funcţionarea
aplicaţiei.

Să vedem un exemplu:

© Copyright Link group 2 / 11


Curs: Core Java Programming
Modul: Controlul fluxului
Unitate: Structura if - else

if(true)
System.out.println("executarea condiţionată");
System.out.println("partea aceasta se va executa în orice caz");

A doua linie se va executa în orice caz. În exemplu, aceasta este o


problemă banală, dar într-o aplicaţie serioasă poate duce la erori
semnificative.

Pe de altă parte, atâta timp cât respectaţi regula unei singure linii
condiţionate de bloc, puteţi scrie oricâte condiţii doriţi una după alta:

if(true)
else if(true)
else if(true)

sau le puteţi încuiba, aşa cum am arătat într-unul dintre exemplele de


mai sus.

Veţi întâlni abordarea scrierii blocurilor condiţionate fără paranteze


acolade şi la alte structuri ale controlului de flux, dar nu şi în funcţii
sau clase. În plus, de obicei, ceea ce v-aţi imaginat ca o singură linie
de cod (condiţionată), va creşte la mai multe linii. Astfel, pentru
gestionarea fluxului, este optim să respectaţi abordarea cu paranteze
acolade.

Mai există o problemă cu folosirea structurilor if-else pentru control de


flux. Anume, aceea că vizibilitatea codului se pierde foarte repede
(deja după câteva condiţii). De exemplu:

if(true) { //CONŢINUT CONDIŢIONAT


if(true) { //CONŢINUT CONDIŢIONAT
} } else if(true) { //CONŢINUT CONDIŢIONAT
}

sau:

int a=0;
if(a==1)

© Copyright Link group 3 / 11


Curs: Core Java Programming
Modul: Controlul fluxului
Unitate: Structura if - else

System.out.println("a este unu");


if(a==2)
System.out.println("a este doi");
if(a==3)
System.out.println("a este trei");

De aceea, de cele mai multe ori, practica cea mai bună când ajungem
la mai multe condiţii asemănătoare, este folosirea structurilor Switch,
despre care vom vorbi în lecţia următoare.

Uneori, pentru condiţionare se foloseşte şi operatorul ternar. Acest


operator se foloseşte predominant pentru atribuirea valorii
condiţionate şi nu conţine blocuri de cod, astfel încât nu este tocmai o
structură reală pentru control de flux, ci mai mult un operator de
atribuire. Totuşi, valoarea se atribuie condiţionat şi acest operator
afectează fluxul aplicaţiei:

int a = 0;
int b = (a==0) ? 10 : a;
System.out.println(b);

Operatorul ternar subînţelege patru părţi:

variabila căreia i se atribuie o valoare (b),

condiţie (a==0),

valoarea care se atribuie dacă condiţia este îndeplinită (10),

valoarea care se atribuie dacă condiţia nu este îndeplinită (a).

Să presupunem că undeva înainte, în cod există o variabilă a, care are


valoarea zero. Când se activează operatorul ternar, am spus
programului să verifice o condiţie şi i-am dat alternative pentru

© Copyright Link group 4 / 11


Curs: Core Java Programming
Modul: Controlul fluxului
Unitate: Structura if - else

ambele opţiuni ale condiţiei respective: opţiunea 1 pentru cazul în


care condiţia este îndeplinită şi opţiunea 2 pentru cazul în care nu
este îndeplinită. Operatorul ternar din exemplu ar fi alternativa unei
astfel de structuri if:

if(a==0)
b=10;
else b=a;

În exemplul care urmează, se face verificarea a două date. În funcţie


de rezultatul verificării, se scrie mesajul corespunzător (prima dată
este mai mică, mai mare sau egală cu a doua dată):

Calendar date = Calendar.getInstance();


date.set(2000, 01, 01);
Calendar now = Calendar.getInstance();
int res = date.getTime().compareTo(now.getTime());
if(res<0)
System.out.println("Data ini?ial? " + date.getTime() + "
este mai mic? decât data de azi " + now.getTime());
else if(res>0)
System.out.println("Data ini?ial? " + date.getTime() + "
este mai mare ca data de azi " + now.getTime());
else if(res==0)
System.out.println("Data ini?ial? " + date.getTime() + "
este identic? cu data de azi " + now.getTime());

În final, iată şi cea mai frecventă eroare care apare în timpul creării
blocurilor condiţionate. Folosirea operatorului de atribuire (=) în locul
operatorului de comparare (==).

Java interpreter are un mecanism integrat care va preveni


interpretarea unei astfel de linii:

...
if(i=x)
...

© Copyright Link group 5 / 11


Curs: Core Java Programming
Modul: Controlul fluxului
Unitate: Structura if - else

dar, totuşi, trebuie să fim atenţi.

Exemplul următor calculează două numere în relaţie cu operatorul


definit:

char op = /;
double a=5;
double b=3;

if(op==+)
System.out.println(a+b);
if(op==-)
System.out.println(a-b);
if(op==/)
System.out.println(a/b);
if(op==*)
System.out.println(a*b);

La construirea condiţiei, se pot folosi combinaţii de expresii, atâta timp


cât întreaga combinaţie dă tipul boolean ca rezultat. Să presupunem
că dorim o valoare care să fie mai mare ca unu, dar mai mică decât
cinci. Aceasta nu se poate scrie într-o singură expresie, dar putem uni
aceste două expresii prin operatorul logic && (şi):

int x = 3;
if(x>1 && x<5)
System.out.println("x este între unu ?i cinci");
else
System.out.println("x nu este între unu ?i cinci");

În mod identic, putem crea şi o condiţie mult mai complexă.

De exemplu, să zicem că dorim ca un număr să fie mai mare decât


unu şi mai mic decât 25, dar să nu fie zece. Însă, de asemenea dorim
şi să existe o condiţie prin care numărul poate să fie mai mare ca 25,
şi anume ca numărul să fie exact 35:

int x = 15;

© Copyright Link group 6 / 11


Curs: Core Java Programming
Modul: Controlul fluxului
Unitate: Structura if - else

if((x>1 && x<25 && x!=10) || (x==35))


System.out.println("Condi?ia este îndeplinit?");
else
System.out.println("Condi?ia nu este îndeplinit?");

Exerciţiu 1

Problemă:

Trebuie să creăm un program care preia trei note din şirul de note,
calculează media lor şi, în funcţie de medie, scrie mesajul dacă nota
este de trecere sau nu.

Rezolvare:

int[] grades = { 2 , 5 , 3 };
int avg = (grades[0] + grades[1] + grades[2]) /
grades.length;
if(avg>1)
System.out.println("Nota " + avg + " este de trecere");
else
System.out.println("Nota " + avg + " nu este de trecere");

Exerciţiu 2

Problemă:

Aplicaţia procesează statusul vehiculelor. Este necesar, dacă vehicul


se deplasează, să verificăm dacă viteza lui este mai mare de 20. Dacă
este, trebuie emis un mesaj. În caz contrar, trebuie să emitem mesajul
că vehiculul se deplasează cu viteza permisă.

Dacă vehicul nu se deplasează, trebuie să activăm mesajul despre


statusul vehiculului.

© Copyright Link group 7 / 11


Curs: Core Java Programming
Modul: Controlul fluxului
Unitate: Structura if - else

Aplicaţia conţine codul existent:

String[] status = { "st?","se


deplaseaz?","disp?rut","dezactivat","scos" };
String currentStatus = status[0];
int speed = 25;

Rezolvare:

String[] status = { "st?","se


deplaseaz?","disp?rut","dezactivat","scos" };
String currentStatus = status[0];
int speed = 25;
if(currentStatus == "se deplaseaz?")
{
if(speed>20)
System.out.println("S-a dep??it viteza permis?");
else
System.out.println("Viteza permis? nu este dep??it?");
}
else
System.out.println(currentStatus);

© Copyright Link group 8 / 11


Curs: Core Java Programming
Modul: Controlul fluxului
Unitate: Structura if - else

CJPro_08 - Core Java Programming


1. Care tip de dată este acceptat de expresia condiţionată a
structurii <i&gtif else</i&gt ?
a) boolean
b) int
c) String
d) float
2. Care operator folosim în expresie condiţionată a structurii if
else ?
a) de comparare
b) de atribuire
c) aritmetic
d) logic
3. Ce este operator ternar?
a) operatorul care atribuie valoare pe baza expresiei
condiţionate
b) operator logic
c) operatorul de comparaţie care execută un bloc de cod pe
baza expresiei condiţionate
d) operator aritmetic
4. Dacă dorim să mai adăugăm o condiţie la condiţia if ,
folosim:
a) else if
b) while
c) for
d) switch
5. Dacă scriem:
   if(true)
     if(true)
         System.out.println(2+2);

© Copyright Link group 9 / 11


Curs: Core Java Programming
Modul: Controlul fluxului
Unitate: Structura if - else

a) toate liniile de cod vor fi executate


b) programul va semnala eroare
c) linia println nu se va executa
d) a doua condiţie nu se va executa, astfel că nici linia
println nu se va executa
6. Care este ieşirea codului?
   if(false)
      System.out.println(2+2);
      System.out.println(3+2);
a) 5
b) nu are ieşire, condiţia este false
c) 4
d) 45
7. Care este ieşirea codului?
   int x=20;
   if(x=10)
   System.out.println(x);
a) codul nu se va interpreta
b) nu are ieşire, condiţia nu este îndeplinită
c) 20
d) null

© Copyright Link group 10 / 11


Curs: Core Java Programming
Modul: Controlul fluxului
Unitate: Structura if - else

1. Care tip de dată este acceptat de expresia condiţionată a


structurii <i&gtif else</i&gt ?
a
2. Care operator folosim în expresie condiţionată a structurii if
else ?
a
3. Ce este operator ternar?
a
4. Dacă dorim să mai adăugăm o condiţie la condiţia if ,
folosim:
a
5. Dacă scriem:
   if(true)
     if(true)
         System.out.println(2+2);
a
6. Care este ieşirea codului?
   if(false)
      System.out.println(2+2);
      System.out.println(3+2);
a
7. Care este ieşirea codului?
   int x=20;
   if(x=10)
   System.out.println(x);
a

© Copyright Link group 11 / 11

S-ar putea să vă placă și