Fundamentele programării (V) - Java

Am văzut în cadrul episodului anterior cum pot lua programele decizii în funcție de circumstanțe, cum se execută o instrucțiune sau alta în funcție de anumite condiții. În cadrul acestui episod vom continua prezentarea modului în care sunt luate decizii.

Mai multe variante

Până acum doream să se execute anumite instrucțiuni dacă o anumită condiție era adevărată și altele dacă era falsă. Dar, ce am face dacă nu avem doar două variante, ci mai multe.

Să ne imaginăm o situție în care dorim să scriem cifrele folosind litere. Avem o variabilă c care ar trebui să conțină o cifră. Dacă valoarea este 1, ar trebui să scriem string-ul "unu"; dacă valoarea este 2, ar trebui să scriem "doi" și așa mai departe. Variabila conține numere, deci probabil nu va avea neapărat valori cuprinse între zero și nouă; în cazul în care valoarea nu este o cifră, am vrea să scriem textul "nu este o cifră".

Cea mai simplă variantă este să comparăm, pe rând, valoarea variabilei c cu fiecare cifră și să scriem mesajul corespunzător în cazul în care identificăm cifra; începem comparând cu zero; dacă am găsit valoarea scriem textul "zero"; dacă nu am găsit-o încercăm să comparăm cu unu și așa mai departe; dacă am ajuns la nouă și tot nu am găsit cifra, putem concluziona că nu avem o cifră. Codul ar arăta astfel:

Am respectat recomandarea de a folosi blocuri de instrucțiuni chiar dacă avem o singură instrucțiune și nu arată prea bine...

Trebuie să ne obișnuim ca, în funcție de situație, să avem recomandări, excepții de la recomandări, excepții de la excepții etc. De data aceasta recomandarea nu a dus la ceva bun, deci vom introduce o excepție (tot sub formă de recomandare). Avem aici o succesiune if, else, if, else, if, else, etc. În situația în care pe ramura else avem doar un if, noua recomandare este să nu folosim un bloc de instrucțiuni, ci o instrucțiune condițională simplă. Se poate vedea că arată mult mai bine:

Switch

Chiar și așa, pare totuși cam complicat; ar trebui să putem mai simplu. Ni se pune la dispoziție instrucțiunea switch; aceasta seamănă cu instrucțiunea if, dar are mai multe "ramuri"; în locul condiției avem o expresie al cărei rezultat trebuie să fie un număr întreg sau un string. Putem apoi specifica instrucțiunile care trebuie executate pentru fiecare valoare în parte; de asemenea, putem specifica instrucțiuni care să se execute în cazul în care nu se potrivește nicio valoare.

Fiecare alternativă este specificată folosind cuvântul case, urmat de o valoare, apoi de semnul : și, în sfârșit, instrucțiunile care trebuie executate. Pot fi mai multe instrucțiuni; acestea nu trebuie grupate într-un bloc.

Putem specifica și o ultimă alternativă (nicio valoare nu se potrivește) folosind cuvântul default, urmat de semnul : și de instrucțiunile care trebuie executate în acest caz.

Alternativele sunt cuprinse între acolade.

Limbajul Java (la fel ca multe altele) are o abordare puțin ciudată. Dacă expresia se potrivește cu una din valorile specificate, atunci se execută toate instrucțiunile care urmează, inclusiv de la alternativele prezentate ulterior.

Să vedem exact ce înseamnă acest lucru... Pe baza celor prezentate, ne-am aștepta ca problema noastră inițială să poată fi rezolvată folosind următorul cod:

Dacă am avea valoarea 4, ne-am aștepta să fie afișat textul "patru". Dar, în realitate, afișăm mult mai mult:

Nu este ceea ce ne dorim, dar așa funcționează în Java. Totuși, avem o soluție: Java ne pune la dispoziție instrucțiunea break  care duce la întreruperea executării instrucțiunilor. O putem folosi pentru a spune că nu dorim să se execute ceea ce urmează. Obținem ceea ce ne-am dori dacă rescriem codul astfel:

Nu are sens să punem break și pentru alternativa default fiindcă e ultima. Această variantă face ceea ce ne dorim.

Operatorul condițional

De multe ori dorim să verificăm o anumită condiție booleană și, în funcție de rezultatul verificării să atribuim unei variabilă o valoare sau alta. De exemplu, am putea avea o variabilă nr care conține numere întregi și am dori să atribuim unei variabile s care conține string-uri valoarea "negativ" dacă numărul respectiv este mai mic decât zero și valoarea "nenegativ" în caz contrar (numărul este mai mare sau egal cu zero).

Putem face asta simplu:

Totuși, situația este atât de frecventă încât limbajele oferă o prescurtare și anume operatorul condițional. Acesta este interesant: are trei operanzi; nu am mai văzut așa ceva până acuma. Primul este o condiție booleană, iar ceilalți doi sunt expresii. Rezultatul aplicării operatorului este detrminat astfel: în cazul în care econdiția este îndeplinită, rezultatul este obținut prin evaluarea primeia dintre cele două expresii; altfel, rezultatul este obținut prin evaluarea celeilalte expresii; tipurile rezultatelor celor două expresii trebuie să fie compatibile.

Următoarea instrucțiune este echivalentă cu secvența anterioară:

Așadar, avem condiția, urmată de semnul ?, de prima expresie, semnul : și apoi de a doua expresie.

Cum acest operator are ca rezultat o valoare, putem folosi astfel de expresii și pentru inițializări de variabile. Următoarea inițializare este validă:

Va urma

În următorul episod vom introduce conceptul de funcție. Vom vedea cum putem grupa instrucțiunile și cum putea evita să scriem același lucru de mai multe ori.