Sunteți pe pagina 1din 49

Cuvinte importante:

- expresii si operatori; prioritatea operatorilor si evaluarea expresiilor; conversii implicite si explicite; - instructiuni simple si blocuri de instructiuni; - structuri fundamentale de control: instructiunea if; instructiunea switch, instructiunea while, instructiunea do-while, instructiunea for, instructiunile break si continue.

3/2/2014

Expresii si operatori
O expresie este compusa dintr-o succesiune de operanzi, legati prin operatori. Un operand poate fi o constanta, o variabila, un apel de metoda, o expresie incadrata intre paranteze rotunde. Operatorii desemneaza operatiile care se executa asupra operanzilor si pot fi grupati pe categorii, in functie de tipul operatiilor realizate. Operatorii limbajului Java sunt unari (se aplica unui singur operand) sau sunt binari (se aplica asupra a doi operanzi). A. Operatorii aritmetici Operatorii aritmetici sunt: * - inmultirea; / - impartirea; % - restul impartirii intregi; + - adunarea; - - scaderea. De asemenea este folosit operatorul unar - (minus) pentru schimbarea semnului, precum si operatorul unar + (plus) (introdus pentru simetrie).

3/2/2014

Nota:
1. Operatorul % nu poate fi aplicat decat operanzilor intregi. 2. Operatorul / poate fi aplicat atat operanzilor intregi, cat si operanzilor reali, dar functioneaza diferit pentru operanzii intregi, fata de operanzii reali. Daca cei doi operanzi sunt numere intregi, operandul / are ca rezultat catul impartirii intregi (fara parte fractionara). Daca cel putin unul dintre cei doi operanzi este un numar real, operandul / furnizeaza rezultatul impartirii reale (cu parte fractionara). De exemplu: 1. Fie declaratiile de variabile:

int a=5, b=7


float x=3.5 Expresie Rezultat

b%2
a/2 x/2

1
2 1.75

3/2/2014

B. Operatorii de incrementare/decrementare Operatorul de incrementare este ++. Operatorul de decrementare este --. Acesti operatori sunt unari si au ca efect marirea (respectiv micsorarea) valorii operandului cu 1. Limbajul Java permite doua forme pentru operatorii de incrementare / decrementare: forma prefixata (inaintea operandului) si forma postfixata (dupa operand).

Instructiunile care urmeaza incrementeaza variabila total cu 1:


total++; ++total; Instructiunile care urmeaza decrementeaza variabila total cu 1: total--; --total; In cazul cand se foloseste operatorul de incrementare / decrementare in forma prefixata (inaintea operandului), limbajul Java va incrementa / decrementa mai intai valoarea variabilei si apoi va utiliza variabila intr-o alta expresie. In cazul cand se foloseste operatorul de incrementare / decrementare in forma postfixata (dupa operand), limbajul Java va utiliza mai intai valoarea variabilei intr-o alta expresie si apoi va efectua operatia de incrementare / decrementare.
3/2/2014 4

De exemplu, daca valoarea curenta a lui x este 5, atunci:

- evaluarea expresiei 3 * ++x conduce la rezultatul 18;


- evaluarea expresiei 3 * x++ conduce la rezultatul 15, dupa care valoarea lui x va fi in ambele cazuri 6. Operatorii de incrementare / decrementare pot fi aplicati operanzilor intregi, operanzilor in virgula mobila si operanzilor de tipul char. C. Operatori relationali Operatorii relationali sunt operatori binari si desemneaza relatia de ordine in care se gasesc cei doi operanzi: <, >, <=, >=.

Rezultatul aplicarii unui operator relational este true daca cei doi operanzi sunt in relatia indicata de operator, si false, altfel.
De exemplu, expresiile logice: 4 > 6 are ca rezultat valoarea false, 8 <= 3+13 are ca rezultat valoarea true. Un alt operator relational este instanceof care testeaza daca un anumit obiect este sau nu instanta a unei anumite clase de obiecte (adica, apartine unei clase de obiecte).
3/2/2014 5

De exemplu:
Object o = new Object( ); String s = new String( ); o instanceof Object - are ca rezultat valoarea true,

s instanceof String - are ca rezultat valoarea true


o instanceof String - are ca rezultat valoarea false. D. Operatori de egalitate Operatorii de egalitate sunt folositi pentru testarea unei egalitati sau inegalitati intre doua valori. Sunt operatori binari si arata relatia de egalitate (==) sau inegalitate (!=). Rezultatul aplicarii unui operator de egalitate este true, daca cei doi operanzi sunt in relatia indicata de operator si false altfel.

De exemplu, expresiile logice:


5 == 2+3 are ca rezultat valoarea true, 5 != 2+3 are ca rezultat valoarea false.
3/2/2014 6

E. Operatori logici se aplica asupra unor operanzi de tip boolean.

Exista trei operatori logici globali:


- negatia logica (not) reprezentata cu !; - conjunctie logica (si) reprezentata cu &&; - disjunctie logica (sau) reprezentata cu | | . Rezultatul aplicarii operatorilor logici este tot boolean. Iata toate posibilitatile de combinare: true && true == true true && false == false false && true == false false && false == false true | | true == true ! true == false ! false = true

true | | false == true


false | | true == true false | | false == true
3/2/2014 7

Nota: O regula importanta este ca operatorii logici && si | | folosesc evaluarea booleana partiala (scurcircuitata). Aceasta inseamna ca daca rezultatul poate fi determinat evaluand prima expresie, a doua expresie nu mai este evaluata.

De exemplu, in expresia:
x != 0 && 1/x != 5 Daca x este 0, atunci prima jumatate are valoarea false. Aceasta inseamna ca rezultatul conjunctiei va fi fals, deci a doua expresie nu mai este evaluata.

F. Operatori la nivel de biti


Operatorii logici pe biti se aplica numai operanzilor intregi (de tipul byte, short, int si long) si au acelasi rezultat ca si operatiile logice studiate (negatie, conjunctie, disjunctie si disjunctie exclusiva) dar bit cu bit. De fapt, operatorii se aplica reprezentarii binare a numerelor implicate

3/2/2014

Operatorii logici pe biti sunt:


Operator ~ & ^ | Denumire Complementare (negatie) pe biti Conjunctia logica (si) pe biti Disjunctie exclusiva (sau exclusiv) pe biti Disjunctie logica (sau) pe biti Tip unar binar binar binar

Rezultatul aplicarii operatorilor de complementare pe biti, de disjunctie logica pe biti si de conjunctie logica pe biti este acelasi cu cel prezentat la operatorii logici globali, daca consideram ca 1 ar reprezenta adevarul si 0 falsul. Rezultatul aplicarii operatorului de disjunctie exclusiva pe biti este:
^ 0 1

0
1

0
1

1
0

3/2/2014

Operatiile logice la nivel de biti constau in aplicarea operatiei respective perechilor de biti de pe pozitii egale in cele doua numere (cu exceptia operatiei de negare care este unara). In situatia in care numerele nu au reprezentare binara de aceeasi lungime, reprezentarea mai scurta este completata cu zerouri nesemnificative (inserate in fata reprezentarii) pana se obtin dimensiuni egale.
Iata cateva exemple de folosire: 3 | 4 == 7 3 4 7 0011 0100 --------0111 5 ^ 7 == 2 5 7 2 0101 0111 --------0010

5 & 7 == 5 5 7 5 0101 0111 --------0101

~5 == -6 5 -6 00101 ---------11010

3/2/2014

10

Operatorii de deplasare pe biti au ca efect deplasarea reprezentarii interne binare a primului operand cu semn spre stanga (<<) cu n pozitii, spre dreapta (>>) cu n pozitii sau deplasarea primului operand fara semn spre dreapta (>>>) cu n pozitii. Numarul n de pozitii care se deplaseaza este specificat de cel de-al doilea operand. La deplasarea la stanga (<<), pozitiile ramase libere in dreapta se completeaza cu 0. La deplasarea la dreapta (>>), in pozitiile ramase libere in stanga se copiaza in mod repetat bitul de semn. La deplasarea la dreapta fara semn (>>>), pozitiile ramase libere in stanga se completeaza cu 0. Observatie:

1. Expresia x << n are ca efect inmultirea operandului x cu 2n. Expresia x >> n are ca efect impartirea intreaga a operandului x cu 2n. Aceasta afirmatie este valabila pentru numere intregi pozitive.
De exemplu:

5 >> 1 = 2 adica reprezentarea binara 101 devine dupa deplasarea cu un bit la dreapta 010.
5 << 1 = 10 adica reprezentarea binara 101 devine dupa deplasarea cu un bit la stanga 1010.
3/2/2014 11

H. Operatori de atribuire
Operatorii de atribuire sunt operatori binari care permit modificarea valorii unei variabile. Exista un operator de atribuire simplu (=) si 10 operatori de atribuire compusi cu ajutorul operatorului = si al unui alt operator binar (aritmetic sau logic pe biti). O varianta de sintaxa folosita este: <nume_variabila> = <expresie> Efectul aplicarii operatorului este: Se evalueaza <expresie>, apoi se atribuie variabilei <nume_variabila> valoarea expresiei. Nota: <expresie> poate fi la randul ei o expresie de atribuire, caz in care se realizeaza o atribuire multipla. Atunci cand compilatorul intalneste o operatie de atribuire multipla, el atribuie valorile de la dreapta la stanga. <nume_variabila1> = <nume_variabila2> = = <nume_variabilan> = <expresie>; Se foloseste atunci cand se doreste sa se atribuie aceeasi valoare mai multor variabile.

3/2/2014

12

De exemplu: total = 0; suma = 0; a = 0;

folosind atribuirea multipla rezulta:


total = suma = a = 0 A doua varianta de sintaxa folosita este: <nume_variabila> <operator_binar> = <expresie>; unde: - <operator_binar> - este din multimea {*, /, %, +, -, <<, >>, &, |, ^}. Efectul aplicarii operatorilor de atribuire compusi este echivalent cu instructiunea: <nume_variabila> = <nume_variabila> <operator_binar> <expresie>;

3/2/2014

13

De exemplu instructiunile:

total = total + 100; jumatate = jumatate/2; b = a = a*2;


sunt echivalente cu: total+ =100; jumatate/ =2; b = a* = 2; I. Operatorul de concatenare ( + ) de siruri de caractere este un operator binar folosit pentru lipirea mai multor siruri de caractere

La concatenarea sirurilor de caractere, lungimea sirului rezultat este suma lungimii sirurilor care intra in operatie. Carcterele din sirul rezultat sunt caracterele din primul sir, urmate de cele dintr-al doilea sir in ordine. Daca cel de-al doilea operand este un tip primitiv de data, acesta este convertit la un sir de caractere care sa reprezinte valoarea operandului.
De exemplu: Acesta este + un sir este echivalent cu Acesta este un sir Variabila a are valoarea + 3 este echivalent cu Variabila are valoarea 3
3/2/2014 14

J. Operatorul conversie de tip (sau conversie explicita de tip sau cast) este un operator unar utilizat pentru a genera o variabila temporara de un nou tip. Rezultatul unui cast este valoarea operandului convertita la noul tip de data exprimat de cast. O conversie explicita de tip (un cast) este de forma:

(<tip_nou>) <expresie>
unde: - <tip_nou> - este noul tip de data al expresiei <expresie> altul decat cel declarat initial sau implicit;

- <expresie> - este o variabila sau o expresie care se doreste a fi convertita la tipul nou.
De exemplu, in secventa de instructiuni: double f = 7.8;

int i = (int)f;
valoarea variabilei f este convertita la o valoare intreaga si anume 7, si noua valoare este atribuita variabilei i.
3/2/2014 15

Observatie: Nu toate cast-urile sunt valide in Java. Vom reveni la descrirea conversiilor explicite intr-un paragraf separat a acestei lectii. K. Operatorul conditional ?: Operatorul conditional examineaza o conditie si returneaza o valoare daca conditia este adevarata si alta daca conditia este falsa. Sintaxa operatorului conditional este: (<conditie>) ? <rezultat_adevar> : <rezultat_fals> unde: - <conditie> - o expresie de evaluat ; - <rezultat_adevar> -rezultatul returnat daca conditia are valoarea true; - <rezultat_fals> - rezultatul returnat daca conditia are valoarea false. De exemplu: int i = 5;

int j = 4;
double f = (i < j) ? 100.5 : 100.4; Instructiunea este similara unei instructiuni if-else.
3/2/2014 16

Prioritatea operatorilor si evaluarea expresiilor Ordinea in care are loc efectuarea prelucrarilor determinate de operatori este data in urmatorul tabel de prioritati (de la prioritate maxima la prioritate minima):
Categorie operator Exemple de operatori din categorie . [] ++ -- ! operatorii + si - unari cast-ul * / % + << >> >>> < <= > >= instanceof == != & ^ | Regula de asociativitate la prioritate egala Stanga la dreapta Dreapta la stanga Stanga la dreapta Stanga la dreapta Stanga la dreapta Stanga la dreapta Stanga la dreapta Stanga la dreapta Stanga la dreapta Stanga la dreapta

Operatori de referinta Unari Multiplicativi Aditivi Deplasare pe biti Relationali Egalitate AND pe biti XOR pe biti OR pe biti

3/2/2014

17

Prioritati ale operatorilor - continuare

Categorie operator
AND logic OR logic Conditional

Exemple de operatori
&& || ?:

Regula de asociativitate la prioritate egala


Stanga la dreapta Stanga la dreapta Dreapta la stanga

Atribuire

= si cei 10 operatori de atribuire compusi

Dreapta la stanga

Evaluarea expresiilor Evaluarea unei expresii presupune calculul valorii expresiei, prin inlocuirea in expresie a fiecarei variabile cu valoarea ei si a fiecarei functii cu valoarea returnata de functia respectiva si efectuarea operatiilor specificate de operatori. In timpul evaluarii expresiei se tine cont de existenta parantezelor, de asociativitate si de prioritatea operatorilor: 1. In cadrul unei expresii fara paranteze, se efectueaza operatiile in ordinea prioritatii operatorilor; 2. La prioritate egala, operatorii vecini actioneaza conform regulilor de asociativitate prezentate in tabelul de mai sus. 3. Utilizarea parantezelor rotunde este mai puternica decat prioritatea operatorilor.
3/2/2014 18

De exemplu, programul urmator (operatori.java) ilustreaza cativa operatori Java inclusiv operatorul de concatenare pentru sirurile de caractere care se afiseaza la ecran.
/** Utilizarea operatorilor. */ public class operatori { public static void main(String[] args) { int a = 6, b = 7, c = 3; System.out.println("a=" + a); System.out.println("b=" + b); System.out.println("c=" + c); System.out.println(); b += c; System.out.println("a=" + a); System.out.println("b=" + b); System.out.println("c=" + c); System.out.println(); c++; System.out.println("a=" + a); System.out.println("b=" + b); System.out.println("c=" + c); System.out.println();
3/2/2014 19

++a; System.out.println("a=" + a); System.out.println("b=" + b); System.out.println("c=" + c); System.out.println(); b = ++a - c++; System.out.println("a=" + a); System.out.println("b=" + b); System.out.println("c=" + c); System.out.println(); } }

In urma executiei programului operatori.class pe ecran sunt afisate valorile:


a=6 b=7 c=3
a=6 b=10 c=3 a=6 b=10 c=4
3/2/2014 20

a=7 b=10 c=4


a=8 b=4 c=5

Conversii
Java acorda o atentie deosebita tipurilor. Fiecare expresie are un tip ce poate fi dedus din structura expresiei si din tipul operanzilor ce intra in alcatuirea sa: constante, variabile si apeluri de metode. Sunt insa permise, in anumite conditii bine precizate, conversii de la un tip la un alt tip. Conversiile pot aparea in urmatoarele situatii: - la atribuire, cand tipul unei expresii trebuie convertit la tipul variabilei ce primeste valoarea expresiei; - la apelul unei metode cand are loc transferul parametrilor actuali (reali) catre parametrii formali; - la conversii ce implica tipul String: ori ce tip poate fi convertit la tipul String; - la evaluarea unei expresii aritmetice: operanzii trebuie adusi la un tip comun, astfel incat expresia sa poata fi evaluata; - la o conversie explicita.

3/2/2014

21

Conversii implicite la evaluarea expresiilor In aceasta categorie intra conversiile efectuate automat, fara vreo precizare explicita in program. Pentru tipurile primitive de date, urmatoarele conversii sunt implicite: byte la short, int, long, float, double; short la int, long, float, double; int la long, float, double; char la int, long, float, double; long la float, double; float la double. Regula conversiilor implicite la evaluarea expresiilor este: operandul care are un domeniu de valori mai restrans este convertit la tipul operandului care are multimea valorilor mai ampla.

3/2/2014

22

Observatii:

1. Unele din aceste conversii pot conduce la o pierdere a preciziei. De exemplu, la conversia unui long intr-un float, caz in care se pierde o parte din cifrele semnificative pastrandu-se insa ordinul de marime. Precizia se pierde si in cazul conversiei long la double sau int la float pentru ca, desi dimensiunea zonei alocate pentru cele doua tipuri este aceeasi, numerele flotante au nevoie de o parte din aceasta zona pentru a reprezenta exponentul. In aceste situatii, se va produce o rotunjire a numerelor convertite.
2. Conversiile implicite legate de tipul String se aplica numai operanzilor cu tipuri primitive asupra carora se aplica operatorul de concatenare (+); in acest caz operanzii de un anumit tip diferit sunt convertiti la String.

3. Conversiile implicite la tipul referinta vor fi abordate intr-o lectie viitoare.


Conversii implicite la operatia de atribuire Pentru tipurile primitive sunt admise urmatoarele conversii implicite la atribuire: - tipul char poate fi atribuit unei variabile de tip char, byte, short, int, long, float, double; - tipul byte poate fi atribuit unei variabile de tip char, byte, short, int, long, float, double;
3/2/2014 23

- tipul short poate fi atribuit unei variabile de tip char, short, int, long, float, double; - tipul int poate fi atribuit unei variabile de tip int, long, float, double; - tipul long poate fi atribuit unei variabile de tip long, float, double; - tipul float poate fi atribuit unei variabile de tip float, double; - tipul double poate fi atribuit unei variabile de tipul double. - tipul boolean nu poate fi atribuit la o variabila de alt tip.

Observatii:
1. Valorile de tip primitiv nu pot fi atribuite variabilelor de referinta si, la fel, valorile de tip referinta nu pot fi memorate in variabile de tip primitiv. 2. Conversiile implicite intre tipurile referinta vor fi descrise intr-o lectie viitoare dupa prezentarea tipului referinta si a conceptului de clasa de obiecte.

3/2/2014

24

Conversii explicite
Conversiile explicite sunt realizate de programator folosind operatorul de conversie explicita (sau cast-ul). Pentru tipurile primitive sunt admise, in plus fata de cele implicite, urmatoarele conversii explicite: byte la chart; char la byte, short; short la byte, char; int la byte, short, chart; long la byte, short, char, int, long; float la byte, short, char, int, long; double la byte, short, char, int, long, float. Conversiile explicite pot produce pierderi de precizie si, de asemenea, pot conduce la o modificare a ordinului de marime. Observatii: 1.Nu se pot face conversii explicite intre valorile de tip referinta si valorile de tip primitiv. 2. Valorile de tip boolean nu pot fi convertite la nici un alt tip. 3. Conversiile explicite intre tipurile referinta vor fi descrise intr-o lectie viitoare dupa prezentarea tipului referinta si a conceptului de clasa de obiecte.
3/2/2014 25

Instructiuni simple si blocuri de instructiuni


O instructiune simpla este o singura instructiune, cum ar fi aceea prin care se atribuie o valoare unei variabile (instructiunea de atribuire) sau se apeleaza o metoda.
Un bloc de instructiuni (numit si instructiune compusa) este o secventa de instructiuni simple si declaratii de variabile locale. Aceste instructiuni se executa in ordinea in care apar in interiorul blocului. Sintactic, blocurile de instructiuni sunt delimitate de acolade. Blocurile de instructiuni pot fi incluse (imbricate) in cadrul altor blocuri de instructiuni. Sintaxa unui bloc de instructiuni este:
{

<declaratii_de_variabile_locale>; <instructiune_1>; <instructiune_2>; <declaratii_de_variabile_locale>; <instructiune_n>;


} unde: - <declaratii_de_variabile_locale> - reprezinta instructiuni de declarare a unor variabile locale; o instructiune de declarare poate sa apara oriunde in interiorul unui bloc.
3/2/2014 26

Nota: Declaratiile de variabile locale care apar intr-un bloc sunt valabile numai in interiorul blocului, din momentul declararii lor pana la sfarsitul blocului.

Instructiunea vida este o instructiune care nu executa nimic. Ea este formata


numai din ; si se foloseste atunci cand este obligatoriu sa avem o instructiune, dar nu dorim sa executam nimic in acea instructiune.

Structuri fundamentale de control


A. Structuri alternative (de decizie) Instructiunea if
Sintaxa instructiunii este:
if (<expresie>) <instructiune_1>; [else <instructiune_2>]; unde: - <expresie> - specifica expresia de evaluat; - <instructiune_1>, <instructiune_2> - specifica instructiunile (simple sau compuse) de executat.
3/2/2014 27

Semantica: se evalueaza <expresie> si daca valoarea expresiei este true, se executa <instructiune_1>, altfel se executa <instructiune_2>.
Nota: Instructiunea if poate sa faca parte dintr-o alta instructiune if sau else, adica instructiunile if pot fi incluse (imbricate) in alte instructiuni if. De exemplu, urmatorul program (denumit arie_triunghi.java) testeaza daca trei numere pot forma laturile unui triunghi si daca da calculeaza aria triunghiului folosind formula lui Heron.
/** Utilizarea instructiunii if pentru determinarea ariei triunghiului*/ import java.io.*; public class arie_triunghi { public static void main(String[] args) throws IOException { double x, y, z, p, aria; String s; System.out.print ("Introduceti x= "); InputStreamReader isrx = new InputStreamReader(System.in); BufferedReader brx = new BufferedReader(isrx); s = brx.readLine(); x = Double.parseDouble(s);
3/2/2014 28

System.out.print ("Introduceti y= "); InputStreamReader isry = new InputStreamReader(System.in); BufferedReader bry = new BufferedReader(isry); s = bry.readLine(); y = Double.parseDouble(s); System.out.print ("Introduceti z= "); InputStreamReader isrz = new InputStreamReader(System.in); BufferedReader brz = new BufferedReader(isrz); s = brz.readLine(); z = Double.parseDouble(s); if (x<=0 || y<=0 || z<=0) System.out.println("Numerele introduse nu sunt laturi ale unui triunghi"); else if (x+y<=z || x+z<=y || y+z<=x) System.out.println("Numerele introduse nu sunt laturi ale unui triunghi"); else { p = (x+y+z)/2; aria = Math.sqrt(p*(p-x)*(p-y)*(p-z)); System.out.println("Aria triunghiului = " + aria); } } }
3/2/2014 29

Observatie: Metoda sqrt() face parte din clasa de obiecte Math care este implementata in pachetul java.lang. Metoda sqrt() este de tip double si are un parametru de tip double.

Instructiunea switch
Sintaxa instructiunii este:

switch (<expresie>) { case <constanta_1> : <grup_de_instructiuni_1>; case <constanta_2> : <grup_de_instructiuni_2>; case <constanta_n> : <grup_de_instructiuni_n>; [default: <grup_de_instructiuni_n+1>;] }
unde: - <expresie> - specifica variabila sau expresia de evaluat; - <constanta_1>, <constanta_2>, , <constanta_n> - specifica valorile constantelor cu care se face compararea rezultatului evaluarii expresiei; - <grup_de_instructiuni_1>, - o instructiune sau un grup de instructiuni care se executa in cazul in care o alternativa case se potriveste.
3/2/2014 30

Semantica: se evalueaza <expresie>; se compara succesiv valoarea expresiei cu valorile constantelor <constanta_1>, <constanta_2>, , <constanta_n> din alternativele case: - daca se intalneste o constanta din alternativa case cu valoarea expresiei, se executa secventa de instructiuni corespunzatoare si toate secventele de instructiuni care urmeaza, pana la intalnirea instructiunii break sau pana la intalnirea acoladei inchise (}) care marcheaza sfarsitul instructiunii switch; - daca nici una dintre valorile constantelor din alternativa case nu coincide cu valoarea expresiei, se executa secventa de instructiuni din alternativa default (alternativa implicita sau prestabilita). Observatii: 1. Spre deosebire de if-else, care permite selectarea unei alternative din maximum doua posibile, switch permite selectarea unei alternative din maximum n+1 posibile. 2. In instructiunea if-else se executa instructiunea (instructiunile) corespunzatoare valorii expresiei si atat, in timp ce in instructiunea switch se executa si toate secventele de instructiuni ale alternativelor case urmatoare.

3/2/2014

31

Nota: Mai general, o alternativa poate avea mai multe valori, ca in exemplul urmator: case 1 : case 2 : case 3: case 5: a=b; b=c; c= a; Instructiunea break din switch Sintaxa instructiunii este: break; Semantica: determina iesirea neconditionata din instructiunea switch, adica opreste executia secventelor de instructiuni ale alternativelor case urmatoare. Exemplu urmator (vocale_consoane.java) citeste de la tastatura o litera si determina daca aceasta este o vocala sau o consoana.

3/2/2014

32

// Exemplu pentru instructiunea switch import java.io.*; public class vocale_consoane { public static void main(String[] args) throws IOException { System.out.print("Introduceti o litera mica: "); char c = (char) System.in.read(); System.out.print(c + ": "); switch(c) { case 'a': case 'e': case 'i': case 'o': case 'u': System.out.println("vocala"); break; case 'y': case 'w': System.out.println("Uneori vocale "); break; //doar in limba engleza! default: System.out.println("consoana"); } } }

3/2/2014

33

B. Structuri repetitive (iterative) Instructiunea while


Sintaxa instructiunii este:

while (<expresie>)
<instructiune>; unde: - <expresie> - specifica expresia de testat; Semantica: se evalueaza <expresie>: - daca valoarea expresiei este false se iese din ciclul while; - daca valoarea expresiei este true, se executa instructiunea atita tip cat valoarea expresiei este true.

3/2/2014

34

Nota: 1. Daca testul initial este false, instructiunea din cadrul ciclului nu este executata niciodata. 1. Pentru ca ciclul sa nu fie infinit, este obligatoriu ca una din instructiunile care se executa in ciclul while sa modifice cel putin una dintre variabilele care intervin in <expresie>, astfel incat aceasta sa poata lua valoarea false sau sa contina o operatie de iesire neconditionata din ciclu folosind instructiunea break. 2. Instructiunea while poate contine o secventa de instructiuni si atunci aceasta secventa se grupeaza intr-o singura instructiune compusa (incadrata intre acolade). Exemple:

1. Urmatorul program (suma_cifre.java) citeste de la tastatura un numar natural x (folosind fluxul de intrare System.in) si calculeaza suma cifrelor lui x.
Pentru a calcula suma cifrelor lui x se procedeaza astfel: - pasul 1 - se obtine ultima cifra din numar (cifra unitatilor) ca fiind restul impartirii numarului x la 10 (x%10), iar aceasta cifra se adauga la suma; - pasul 2 - se elimina din numar ultima cifra (n=n/10); cifra zecilor a devenit acum ultima cifra; - pasul 3 - se repeta pasul 1 si pasul 2 pana cand numarul nu mai are cifre.
3/2/2014 35

/** Utilizarea instructiunii while pentru calculul sumei cifrelor unui numar natural x*/ import java.io.*; public class suma_cifre { public static void main(String[] args) throws IOException { int x, suma=0; String s; System.out.print ("Introduceti numarul natural= "); InputStreamReader isrx = new InputStreamReader(System.in); BufferedReader brx = new BufferedReader(isrx); s = brx.readLine(); x = Integer.parseInt(s); while (x !=0) { suma+=x%10; // adun la s ultima cifra a lui x x/=10; //elimin ultima cifra a lui x } System.out.println("Suma cifrelor este: " + suma); } }
3/2/2014 36

2. Urmatorul program (vocale_consoane1.java) citeste de la tastatura un sir de litere mici si determina daca acestea sunt consoane sau vocale.
// Exemplu pentru instructiunea While - citire de litere si stabilire vocale sau consoane import java.io.*; public class vocale_consoane1 {public static void main(String[] args) throws IOException {char c; System.out.print("Introduceti litere mici despartite de spatii sau nu: "); c = (char) System.in.read(); while (c !='\r' ) { switch(c) { case 'a': case 'e': case 'i': case 'o': case 'u': System.out.println(c+":" +"vocala"); break; case 'y': case 'w': System.out.println(c+":" +"Uneori vocale "); break; //doar in limba engleza! case ' ': break; default: System.out.println(c+":"+"consoana"); } c = (char) System.in.read(); } }}
3/2/2014 37

Instructiunea do-while
Sintaxa instructiunii este: do <instructiune>; while (<expresie>); unde: - <instructiune> - o instructiune simpla de executat;

- <expresie> - specifica expresia de testat (de evaluat);


Semantica: se executa instructiunea si apoi se evalueaza expresia: - daca valoarea expresiei este false se iese din ciclul do-while; - daca valoarea expresiei este true se executa instructiunea (din ciclul do-while) atita tip cat valoarea expresiei este adevarata.

3/2/2014

38

Nota:

1. Spre deosebire de instructiunea while, instructiunea do-while executa instructiunea specificata in corpul ciclului cel putin o data, chiar daca de la inceput valoarea expresiei este false, deoarece evaluarea expresiei se face dupa executia instructiunii.
2. Pentru ca ciclul sa nu fie infinit, este obligatoriu ca una din instructiunile care se executa in ciclul do-while sa modifice cel putin una dintre variabilele care intervin in <expresie>, astfel incat aceasta sa poata lua valoarea false sau sa contina o operatie de iesire neconditionata din ciclu folosind instructiunea break. 3. Instructiunea do-while poate contine o secventa de instructiuni si atunci aceasta secventa se grupeaza intr-o singura instructiune compusa (incadrata intre acolade). Instructiunile while si do-while sunt folosite in functie de momentul la care dorim sa testam o conditie care determina efectuarea unor prelucrari repetate. Cand este necesar sa testam o conditie inainte de efectuarea unor prelucari repetate atunci se foloseste instructiunea while. Cand conditia depinde de la inceput de prelucrarile repetate din ciclu (prin urmare, este necesar sa fie testata dupa executarea prelucrarilor din ciclu) atunci se foloseste instructiunea do-while.
3/2/2014 39

Urmatorul program (cifra_control.java) citeste de la tastatura un numar natural x si calculeaza cifra de control a lui x. Cifra de control a unui numar natural se obtine calculand suma cifrelor numarului, apoi suma cifrelor sumei, s.a.m.d. pana la obtinerea unei singure cifre. De exemplu, pentru x = 335 calculam suma cifrelor 3+3+5 = 11. Cum suma nu este formata dintr-o singura cifra, repetam procedeul: 1+1=2. Deci 2 este cifra de control a lui 335.
/** Utilizarea instructiunii while pentru calculul cifrei de control a unui numar natural x */ import java.io.*; public class cifra_control { public static void main(String[] args) throws IOException { int x, suma=0; String s; System.out.print ("Introduceti numarul natural= "); InputStreamReader isrx = new InputStreamReader(System.in); BufferedReader brx = new BufferedReader(isrx); s = brx.readLine(); x = Integer.parseInt(s);

3/2/2014

40

do { while (x !=0) { suma+=x%10; // adun la s ultima cifra a lui x x/=10; //elimin ultima cifra a lui x } System.out.println("Suma cifrelor numarului: " + suma); x = suma; //actualizez numarul cu suma cifrelor sumei suma = 0; } while (x >9); // suma cifrelor sumei trebuie sa aiba o singura cifra System.out.println("Cifra de control a numarului este: " + x); } }

3/2/2014

41

Instructiunea for
Este folosita pentru efectuarea unor prelucrari de un anumit numar de ori.
Sintaxa instructiunii este: for (<valoare_initiala>; <conditie_sfarsit>; <valoare_increment>) <instructiune>; Instructiunea for foloseste, de obicei, o variabila denumita variabila de control care indica de cate ori s-a executat instructiunea (<instructiune>) din corpul ciclului. Instructiunea for contine patru sectiuni: - sectiunea <valoare_initiala> atribuie variabilei de control o valoare initiala, care, de cele mai multe ori, este 0 sau 1; - sectiunea <conditie_sfarsit> testeaza valoarea variabilei de control pentru a stabili daca programul a executat instructiunea de atatea ori cat s-a dorit; - sectiunea <valoare_increment> adauga (scade), de obicei, valoarea 1 la variabila de control, de fiecare data, dupa ce se executa instructiunea din corpul ciclului; valoarea de incrementare sau decrementare poate fi diferita de 1; - sectiunea <instructiune> reprezinta instructiunea (sau instructiunile) care se doreste (doresc) a fi repetata (repetate).
3/2/2014 42

Pentru intelegerea efectului instructiunii for, sa luam de exemplu urmatoarea instructiune for, care va afisa pe ecran numerele de la 1 la 10: for ( contor = 1; contor <= 10; contor++) System.out.println(contor); In acest exemplu, contor este variabila de control a ciclului for. Instructiunea for se executa astfel: - pasul 1: se atribuie valoarea 1 variabilei contor; - pasul2: se evalueaza conditia (de sfarsit a ciclului) contor <= 10 : - pasul 3: - daca contor > 10 (valoarea conditiei este false) se iese din instructiunea repetitiva for; - daca contor <= 10 (valoarea conditiei este true): - se executa instructiunea imediat urmatoare (din corpul ciclului) care, in exemplul dat, este println ; - se incrementeaza valoarea variabilei contor cu 1; - se revine la pasul 2.
3/2/2014 43

Nota:
1. Instructiunea for poate contine o secventa de instructiuni si atunci aceasta secventa se grupeaza intr-o singura instructiune compusa (incadrata intre acolade). 2. Atat <valoare_initializare> cat si <valoare_increment> pot folosi operatorul virgula (,) pentru a permite expresii multiple. Urmatorul fragment de cod ilustreaza aceasta tehnica: for (i = 0, sum = 0; i <= n; i++, sum +=i) { System.out.println(i + \t +sum); } 2. Oricare dintre primele trei sectiuni care intervin in for poate sa fie omisa. Dar si in acest caz, caracterul separator punct si virgula (;) trebuie sa apara; daca <conditie_sfarsit> lipseste valoarea sa implicita este true.

3. Poate fi omisa si sectiunea de instructiuni din corpul ciclului (buclei) for, caz in care se spune ca avem o bucla for vida.

3/2/2014

44

Pentru a exemplifica instructiunea for, programul urmator (vocale_consoane_random.java) creaza 10 litere aleator si determina daca acestea sunt vocale sau consoane. Metoda Math.random face parte din clasa Math care se gaseste in pachetul java.lang si este folosita in program pentru a genera o valoare aleatoare in intervalul [0, 1). Prin inmultirea valorii returnate de aceasta functie cu numarul de litere din alfabet (26 litere) se obtine un numar in intervalul [0, 26). Adunarea cu prima litera (a, care are de fapt valoarea 97, codul ASCII al literei a) are ca efect transpunerea in intervalul [97, 123). In final se foloseste operatorul de conversie explicita de tip pentru a trunchia numarul la o valoare din multimea 97, 98, , 122, adica un cod ASCII al unui caracter din alfabetul englez.

3/2/2014

45

// Program demonstrativ pentru instructiunea For - vocale/consoane public class vocale_consoane_random { public static void main(String[] args) { for (int i = 0; i < 10; i++) { char c = (char) (Math.random() * 26 + 'a'); System.out.print(c + ": "); switch(c) { case 'a': case 'e': case 'i': case 'o': case 'u': System.out.println("vocala"); break; case 'y': case 'w': System.out.println("Uneori vocale "); break; default: System.out.println("consoana"); } } } }
3/2/2014 46

Instructiunile break si continue


Instructiunea break permite intreruperea instructiunilor care se repeta in corpul ciclului for, while sau do-while. De obicei, instructiunea break apare in cadrul unei instructiuni if, ca in exemplul urmator:
while () { if (conditie) { break; } } In cazul in care sunt doua cicluri imbricate, instructiunea break intrerupe doar ciclul cel mai interior.

Instructiunea breack etichetata este folosita cand sunt mai mult de doua cicluri imbricate. In acest, o anumita instructiune de ciclare este etichetata si instructiunea breack poate fi aplicata acelei instructiuni de ciclare, indiferent de numarul de cicluri imbricate.
3/2/2014 47

Un exemplu: eticheta: while () {

while () { if (conditie) { breack eticheta; } }


} Instructiunea continue permite terminarea iteratiei curente din ciclu for, while sau do-while si trecerea la urmatoarea iteratie a ciclului. Se aplica doar ciclului cel mai interior, in cazul ciclurilor imbricate.

3/2/2014

48

Urmatorul fragment de cod tipareste primele 50 de numere intregi, cu exceptia celor divizibile cu 10:

for (int i=1; i<=50; i++) { if (i%10 == 0) { continue; } System.out.println(i); }

3/2/2014

49

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