Curs02 Java
Curs02 Java
Curs02 Java
- 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:
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).
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,
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.
3/2/2014
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 == -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
3/2/2014
13
De exemplu instructiunile:
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
Categorie operator
AND logic OR logic Conditional
Exemple de operatori
&& || ?:
Atribuire
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(); } }
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.
- 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
Nota: Declaratiile de variabile locale care apar intr-un bloc sunt valabile numai in interiorul blocului, din momentul declararii lor pana la sfarsitul blocului.
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
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;
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
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
3/2/2014
48
Urmatorul fragment de cod tipareste primele 50 de numere intregi, cu exceptia celor divizibile cu 10:
3/2/2014
49