Lucrarea de fa are rolul de a prezenta i familiariza studentul cu cteva instruciuni de baz ale limbajului Java: (if( )/else, switch( )), construciile iterative while( ), do/while( ), for( ), instruciunile de salt break, continue; cu importana i situaiile de utilizare a acestora. La sfritul acestei lucrri, studentul va avea posibilitatea s scrie programe Java n care s foloseasc instruciunile limbajului menionate anterior.
II. NOIUNI TEORETICE
Observaie: Vezi capitolul 1 din curs.
1. Instruciunea de selecie if( )/else
Instruciunea if( )/else primete un argument de tip boolean, ca baz a alegerii. Adesea se utilizeaz o expresie de comparare pentru a furniza argumentul. Exemplu:
1. if (x>=10) { 2. System.out.println(x este mai mare decat 10); 3. }
Linia 2 a codului se execut dac testul (x>=10) din linia 1 returneaz adevrat. Putem furniza cod care s se execute atunci cnd testul returneaz fals n partea else a instruciunii. Exemplu:
1. if (x>=10) { 2. System.out.println(x este mai mare sau egal decat 10); 3. } 4. else { 5. System.out.println(x este mai mic decat 10); 6. }
Construcia if( )/else efectueaz un test numai ntre dou posibile ci de execuie, dar se pot utiliza intruciuni if( )/else imbricate pentru a selecta ntre mai multe posibiliti. Exemplu:
class Selectie { public static void main(String args[]) { int x=7,y=20,z=2; if ((x>10) && (y>6)){ System.out.println(x+y); }
Dac este nevoie s se aleag ntre mai multe ci de execuie alternative, i dac alegerea se poate baza pe o valoare int, atunci se poate utiliza instruciunea switch( ). Exemplu:
switch(x) { case 1: System.out.println(1); case 2: System.out.println(2); case 3: System.out.println(3); break; default: System.out.println( altceva in afara de 1,2 sau 3); break; }
Observaii: Variabila x poate s fie numai de tipul byte, short, char sau int (sau pe scurt, valoarea lui x trebuie s fie compatibil la asignare cu tipul int). Compararea valorilor care urmeaz dup etichetele case cu valoarea expresiei furnizate de argumentul lui switch( ) determin calea de execuie. Argumentele etichetelor case trebuie s fie constante, sau cel puin expresii constante care s poat fi complet evaluate la momentul compilrii (nu se pot utiliza variabile sau expresii ce utilizeaz variabile). Fiecare etichet case primete un singur argument, dar cnd execuia sare la una dintre aceste etichete, continu n jos pn cnd atinge o instruciune break. Eticheta default este comparabil ca efect cu partea else a unei instruciuni if( )/else. Execuia sare la eticheta default dac nici unul dintre argumentele etichetelor case nu se potrivete cu argumentul furnizat de switch( ). Dei se obinuiete ca eticheta default s fie plasat la sfritul blocului switch( ), nu exist nici o regul care s impun acest lucru.
Exemplu:
class TestSwitch { public static void main(String args[ ]) { int i=7; switch(i) { case 1: System.out.println(i+1); break; case 2+5: P a g e | 3
i=i+3; System.out.println(i); case 8: System.out.println(i+4); break; default: System.out.println(i+10); break; case 10: System.out.println(i+2); } } }
3. Instruciunea de ciclare while( )
Vezi Curs 3, seciunea 2.10.1. Este o instruciune de ciclare cu test iniial i are numr necunoscut de pai.
Observaie: Se recomand utilizarea unui bloc pentru a conine codul corpului buclei iterative (chiar dac acesta const dintr-o singur instruciune; n general este puin probabil s rmn aa, iar lipsa acoladelor este o eroare greu de depistat ntr-un program mare). Observaia este valabil i pentru celelalte intruciuni.
Exemple:
class TestW1 { public static void main(String args[ ]) { char c=a; while(++c <= m) System.out.print(c+ ); System.out.println(\n); while(c-- > d) { System.out.print(c+ ); } } }
class TestW2 { public static void main(String args[ ]) { double d1=34.8,d2=7; while(d1 > 0) { d1-=d2; System.out.println(d1); } System.out.println(\n); while(d2<5.3) { System.out.println(d2--); } P a g e | 4
} }
4. Instruciunea de ciclare do/while( )
Vezi Curs 3, seciunea 2.10.2. Este o instruciune de ciclare cu test final (corpul se execut cel puin o dat) i are numr necunoscut de pai. Exemplu:
class TestDo { public static void main(String args[ ]) { char c=a; int j=9; do { System.out.println(c++); } while(++c <= i); j=c; System.out.println(\n j=+j); do { System.out.println(j--); }while(j<95); } }
5. Instruciunea de ciclare for( )
Vezi Curs 3, seciunea 2.10.3. Permite efectuarea de iteraii peste un interval de valori. Este o instruciune de ciclare cu test iniial i are numr cunoscut de pai. Exemple:
class TestFor1 { public static void main(String args[ ]) { int i; for(i=1;i<=5;i+=2) System.out.println(i=+i); } } class TestFor2 { public static void main(String args[ ]) { float f; char c; for(f=1.1f;f<=10.5;f++){ System.out.println(f=+f); } for(c=m;c>a;c-=2){ System.out.println(c=+c); } } }
Variabila cu rol de contor se poate declara chiar n cadrul intruciunii for( ). O astfel de variabil va avea domeniul de valabilitate restricionat la blocul instruciunii for( ). Acest fapt protejeaz mpotriva interferenei variabilelor contor i a reutilizrii accidentale a acestora.
{ int i=0; while(i<10) { System.out.println("i="+i); i++; } }
Astfel, se poate mai uor observa c: scopul variabilei i din cadrul instruciunii for( ) este restricionat la blocul corespunztor lui for( ), incrementarea contorului se face dup executarea corpului principal al intruciunii for( ), iar apoi se efectueaz din nou testul.
class TestFor3 { public static void main(String args[ ]) {
Dar nu se poate utiliza separatorul virgul n orice mod. Astfel urmtoarele utilizri sunt ilegale:
int i=7; for(i++,int j=0; i<10; j++) { } // ilegal
for(int i=7, long j=0; i<10; j++) { } // ilegal
6. Instruciunile de salt break, continue P a g e | 6
Instruciunile break i continue se utlizeaz atunci cnd este nevoie s se abandoneze execuia corpului unei instruciuni de ciclare, sau poate a unui numr de bucle iterative imbricate. Exemple:
Adevrata putere a instruciunii continue este aceea c permite ieirea din corpul unor bucle iterative imbricate. S observm i utilizarea etichetei (label) mainLoop care a fost aplicat instruciunii for( ) de la linia 13. De obicei etichetele se aplic la nceputul unor instruciuni de ciclare while( ), do/while( ), for( ). Cnd procesarea vectorului bidimensional de caractere ajunge la o valoare zero, aceasta este abandonat i se sare la efectuarea incrementrii i++ din cadrul instruciunii for( ) corespunztoare etichetei mainLoop de la linia 13.
class TestCont2 { public static void main(String args[ ]) { int vec[]=new int[10]; for(int i=0;i<vec.length;i+=2) vec[i]=i*i+20; for(int i=0;i<vec.length;i++) { if (vec[i]==0) continue; System.out.println(vec[i]); } } }
class TestB1 P a g e | 7
{ public static void main(String args[ ]) { int vec[]=new int[10]; for(int i=0;i<vec.length;i+=2) vec[i]=i*i+20; for(int i=0;i<vec.length;i++) { if (vec[i]==0) break; System.out.println(vec[i]); } } }
Utilizarea instruciunii break cauzeaz abandonarea ntregului ciclu. n acest caz, n loc de a se sri peste procesarea lui vec[i] i de a se continua cu procesarea lui vec[i+1] aa cum se ntmpl n cazul utilizrii instruciunii continue, se abandoneaz ntregul ciclu for( ) de ndat ce este ntlnit un element cu valoarea 0. Se pot utiliza etichete i n cazul instruciunilor break.
Observaie: Etichetele pot fi aplicate oricrei instruciuni, iar break poate fi utilizat pentru a se iei din orice bloc etichetat, chiar dac blocul este corpul unei instruciuni de ciclare sau nu.
class TestB2 { public static void main(String args[ ]) { int vec[]={1,4,6,8,12,56,77,2,5}; for(int i=0;i<vec.length;i++) { et: { System.out.println(++vec[i]); if(i%2==0) break et; System.out.println(--vec[i]); } System.out.println(vec[i]); } } }
Clasic: 1. Se editeaz codul surs al programului Java folosind un editor de text disponibil (de ex., se poate utiliza Notepad). 2. Se salveaz fiierul cu extensia .java. 3. Compilarea mini-aplicaiei Java se va face din linia de comand: javac nume_fiier_surs.java n cazul n care programul conine erori acestea vor fi semnalate i afiate. 4. Pentru rularea aplicaiei Java, se lanseaz interpretorul Java: java nume_clas_care_conine_main
Se folosete utilitarul disponibil n laborator J2SDK Net Beans.
IV. TEM
Se vor parcurge toate exemplele prezentate n platforma de laborator testndu-se practic (acolo unde este cazul). S se rspund la urmtoarele ntrebri gril, explicnd i alegerea rezultatului.
1. Ce se va afia dup executarea fragmentului de cod de mai jos?
int x=0, y=4, z=5; if (x>2) { if (y<5){ System.out.println(mesaj unu); } else { System.out.println(mesaj doi); } } else if (z>5) { System.out.println(mesaj trei); } else { System.out.println(mesaj patru); }
A. mesaj unu B. mesaj doi C. mesaj trei D. mesaj patru
2. Care afirmaie despre urmtorul fragment de cod este adevrat?
1. int j=2; 2. switch(j) { 3. case 2: P a g e | 9
4. System.out.println(valoarea este doi); 5. case 1+2: 6. System.out.println(valoarea este trei); 7. break; 8. default: 9. System.out.println(valoarea este +j); 10. break; 11. }
A. Codul este ilegal datorit expresiei de la linia 5 B. Tipurile acceptate pentru variabila j, care este argument al construciei switch(), pot fi byte, short, int sau long. C. Output-ul va fi: valoarea este doi D. Output-ul va fi: valoarea este doi, urmat de valoarea este trei E. Output-ul va fi: valoarea este doi, urmat de valoarea este trei, urmat de valoarea este 2
A. i=0 j=0 B. i=0 j=1 C. i=0 j=2 D. i=1 j=0 E. i=1 j=1 F. i=1 j=2
5. Care dintre urmtoarele construcii de ciclare sunt legale? (Alegei una sau mai multe.) P a g e | 10
A. while(int i<7) { i++; System.out.println(i=+i); }
B. int i=3; while(i) { System.out.println(i=+i); }
C. int j=0; for(int k=0;j+k !=10; j++,k++) { System.out.println(j=+j+ k=+k); }
D. int j=0; do { System.out.println(j=+j); if(j==3) { continue loop; } }while(j<10);
Scriei un program Java pentru a rezolva ecuaia de gradul doi. Scriei un program Java care s determine numrul de parametri furnizai n linia de comand la execuia programului. Dac acest numr este 0, atunci programul afieaz 0 argumente; dac n linia de comand se furnizeaz un singur parametru atunci programul afieaz 1 argument precum i valoarea acestui argument; altfel se va afia textul mai multe argumente i valorile acestora. Scriei un program Java ce const dintr-o clas care la rndul ei conine dou funcii. Prima este o funcie static String f(String s) care afieaz valoarea irului de caractere s la care se concateneaz irul de caractere < - - > i apoi returneaz s. A doua este metoda main n cadrul crei se apeleaz funcia f de mai sus n cadrul unor comenzi System.out.println; funcia f se va apela o dat pentru un ir de caractere oarecare (ales de programator) i apoi pentru primul argument din linia de comand dac acesta exist. Scriei un program Java ce const din urmtoarele: Se construiete un vector unidimensional cu elemente de tip float i se iniializeaz elementele cu valori arbitrare alese de programator (att pozitive ct i negative). ntr-o bucl iterativ se vor afia valorile acestor elemente cu urmtoarea specificare: dac se ntlnete un element negativ nu se va afia ci se va sri la urmtorul element din vector.