Laborator 2: Instrucţiuni Java şi lucru cu şiruri de caractere Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 18 octombrie 2011
I. NOŢIUNI TEORETICE A. Instrucţiuni condiţionale 1. Intrucţiunea if else if(expresie_condiţională) secvenţă_if; else secvenţă_else; Dacă expresie_condiţională este evaluată la true, atunci se execută secvenţă_if. În caz contrar, se execută secvenţă_else. Este necesar ca expresie_condiţională să fie evaluată la o valoare booleană. În plus, prezenţa structurii else nu este obligatorie şi pot exista cazuri de folosire a instrucţiunii if else în cascadă. 2. Intrucţiunea switch switch(expresie_condiţie) { case val1: secvenţa1; <break>;... ; case valn: secvenţan; <break>; <default:> secvenţa_default; } Pentru utilizarea acestei instrucţiuni este necesar ca atât tipul de date al lui expresie_condiţie cât şi cel al valorilor val1,..., valn să fie din categoria tipurilor numerice: byte, char, short, 2
int. Astfel că, primul pas constă în evaluarea valorii expresiei expresie_condiţie. Apoi se compară valoarea evaluată cu prima valoare a lui case, val1. Dacă această valoare este egală cu val1 atunci se execută secvenţa1 până la întâlnirea lui break. Dacă instrucţiunea break nu este prezentă, atunci se trece la execuţia celorlalte secvenţe de tipul secvenţan, fără a mai testa celelalte valori din case. În cazul în care valoarea din condiţie nu este egală cu nici o valoare din case atunci se execută secvenţa_default ce urmează lui default:. Cazul default permite executarea secvenţei de după el indiferent de valoarea expresiei de evaluat. Acesta poate lipsi. B. Instrucţiuni de ciclare 1. Intrucţiunea for for(<secvenţă_iniţializare>;<expresie_condiţie>;<secvenţă_incrementare>) <secvenţă_repetată>; Intrucţiunea for face parte din instrucţiunile de ciclare cu test iniţial. De reţinut că secvenţă_repetată se execută înaintea secvenţă_incrementare şi că variabilele definite în secvenţă_iniţializare sunt valabile doar în interiorul for-ului. Tot ce este între <> poate lipsi, astfel încât putem avea for(;;) pentru a putea realiza un ciclu infinit. 2. Intrucţiunea while while(expresie_condiţie) secvenţă_repetată; În execuţia instrucţiunii while, la început, se evaluează expresie_condiţie. Dacă aceasta are valoarea true atunci se trece la execuţia secvenţă_repetată. Dacă valoarea este de la bun început false, secvenţa din cadrul buclei nu va mai fi deloc executată. Se observă că şi această instrucţiune face parte din cele de ciclare cu test iniţial. 3
3. Intrucţiunea do while do secvenţă_repetată while(expresie_condiţie); În execuţia instrucţiunii do while, întâi se execută secvenţă_repetată şi abia apoi se evaluează expresie_condiţie. Astfel, chiar dacă expresia de evaluat este falsă, secvenţă_repetată tot se execută măcar o dată. De aceea, instrucţiunea do while face parte din cele de ciclare cu test final. C. Instrucţiuni de salt Intrucţiunea: 1. break este utilizată pentru întreruperea execuţiei instrucţiunilor de ciclare şi a celor switch; 2. continue poate fi folosită doar în interiorul instrucţiunilor de ciclare forţând trecerea la un nou ciclu; 3. return este utilizată pentru ieşirea forţată dintr-o metodă. D. Lucru cu şiruri de caractere Cele mai cunoscute clase care lucrează cu şiruri de caractere sunt: String, StringBuffer. 1. Clasa String Cea mai importantă caracteristică a clasei String este că obiectele o dată iniţializate nu se mai pot modifica, fiecare dintre aceste obiecte indicând spre o zonă diferită de memorie. O altă proprietate a obiectelor de tip String este că pot fi utilizate impreună cu operatorul +, pentru concatenarea şirurilor. Prin concatenare se instanţiază un nou obiect de tip String care va referenţia un şir alcătuit din şirurile alipite cu ajutorul operatorului +. Această clasă oferă o serie de metode pentru lucru cu şiruri de caractere. Aceste metode au în vedere compararea şirurilor, căutarea în şiruri, şamd. Se recomandă studierea API-ului. 4
2. Clasa StringBuffer Un obiect StringBuffer reprezintă ca şi în cazul clasei String un şir de caractere. Diferenţa între cele două este că primul obiect poate suferi modificări. Acest lucru este posibil datorită metodelor insert() şi append() care permit inserarea, respectiv adăugarea unor şiruri de caractere. Pentru mai multe informaţii se recomandă studierea API-ului. II. PREZENTAREA LUCRĂRII DE LABORATOR A. Instrucţiuni Java Codul sursă de mai jos exemplifică modul de utilizare al instrucţiunilor din secţiunile I A, I B, I C. 1 import j a v a. u t i l. Scanner ; 2 3 public c l a s s T e s t I n t r u c t i u n i { 4 public s t a t i c void main ( String args [ ] ) { 5 Scanner s = new Scanner ( System. i n ) ; // cu a j u t o r u l a c e s t e i i n s t r u c t i u n i s e c i t e s t e t e x t de l a t a s t a t u r a 6 System. out. p r i n t l n ( " I n t r o d u c e t i un numar : " ) ; 7 int x = s. n e x t I n t ( ) ; // i n x s e va r e t i n e numarul t a s t a t 8 System. out. p r i n t l n ( " R e z u l t a t u l f u n c t i e i e s t e : " + t e s t ( x ) ) ; / s e a p e l e a z a metoda t e s t cu parametru x / 9 } 10 11 public s t a t i c int t e s t ( int x ) { 12 int suma = 0 ; // s e i n i t i a l i z e a z a v a r i a b i l a suma cu 0 13 f o r ( int i = 0 ; i < 4 ; i ++) { 14 System. out. p r i n t l n ( "Am i n t r a t i n n i v e l 1 " ) ; 15 int j = 0 ; 16 while ( j++ < x ) { // i n t a i s e e f e c t u e a z a e v a l u a r e a e x p r e s i e i j < x s i a b i a a p o i s e i n c r e m e n t e a z a v a r i a b i l a j 17 System. out. p r i n t l n ( "Am i n t r a t i n n i v e l 2 " ) ; 18 System. out. p r i n t l n ( " i= " + i + " ; j= " + j ) ; 19 switch ( i ) { 20 // i n c a z u l i n c a r e i =0, 1 sau 2 s e s a r e l a urmatorul pas s i s e i g n o r a r e s t u l i n s t r u c t i u n i l o r de dupa continue din c i c l u l curent ( while ) 21 case 0 : 22 continue ; 23 case 1 : 24 continue ; 25 case 2 : 26 continue ; 27 case 3 : // i n c a z u l i n c a r e i =3 s e a c t u a l i z e a z a suma s i a p o i s e i e s e f o r t a t d in s w i t c h 28 suma += i+j ; 29 break ; 30 } 31 } 32 System. out. p r i n t l n ( "Am i e s i t din n i v e l 2 " ) ; 5
33 } 34 System. out. p r i n t l n ( "Am i e s i t din n i v e l 1 " ) ; 35 return suma ; // s e i e s e f o r t a t din metoda t e s t 36 } 37 38 } B. Lucru cu şiruri de caractere Exemplul următor evidenţează caracterul imuabil pe care-l au obiectele de tip String. Se citeşte de la tastatură un şir de caractere şi se verifică dacă acesta coincide cu un alt şir de caractere. 1 import j a v a. u t i l. ; 2 public c l a s s CheckPassword { 3 public s t a t i c void main ( String args [ ] ) { 4 Scanner s = new Scanner ( System. in ) ; 5 S t r i n g password = " j a v a " ; 6 String userinput ; 7 System. out. p r i n t l n ( " Care e p a r o l a? " ) ; 8 u s e r I n p u t= s. next ( ) ; 9 10 System. out. p r i n t l n ( " Ai t a s t a t : " ) ; 11 System. out. p r i n t l n ( u s e r I n p u t ) ; 12 System. out. p r i n t l n ( " Dar p a r o l a e s t e : " ) ; 13 System. out. p r i n t l n ( password ) ; 14 15 // i f ( password. e q u a l s ( u s e r I n p u t ) ) { 16 i f ( password == u s e r I n p u t ) { 17 System. out. p r i n t l n ( " Ai t r e c u t mai d e p a r t e! " ) ; 18 } e l s e { 19 System. out. p r i n t l n ( "NU a i t r e c u t mai d e p a r t e! " ) ; 20 } 21 } 22 } Deşi variabila userinput ar conţine aceleaşi caractere ca variabila password, folosind operatorul == se va afişa textul de pe ramura else a instrucţiunii if. Acest lucru se întâmplă din cauza faptului că se compară adresele de memorie ale variabilelor şi nu conţinutul de la acele zone de memorie. Decomentaţi linia 15 şi comentaţi linia 16. acelaşi şir de caractere. Observaţi ce se intâmplă dacă variabilele conţin Următorul exemplu citeşte de la tastatură un şir de caractere şi înlocuieşte fiecare vocală întâlnită cu următorul caracter din alfabet. Acesta foloseşte clasa StringBuffer. 6
1 import j a v a. u t i l. Scanner ; 2 public c l a s s ReplaceVowel { 3 public s t a t i c void main ( String args [ ] ) { 4 Scanner s = new Scanner ( System. in ) ; 5 System. out. p r i n t l n ( " I n t r o d u c e t i c u v a n t u l : " ) ; 6 S t r i n g word = s. n e x t L i n e ( ) ; 7 System. out. p r i n t l n ( " Cuvantul r e z u l t a t e s t e : "+r e p l a c e V o w e l ( word. tolowercase ( ) ) ) ; 8 } 9 10 public s t a t i c boolean checkvowel ( char c ) { 11 c = C h a r a c t e r. tolowercase ( c ) ; 12 return ( " a e i o u ". indexof ( c ) >= 0) ; / s e r e t u r n e a z a t r u e daca metoda indexof a p l i c a t a s i r u l u i de 13 c a r a c t e r e " a e i o u " impreuna cu parametru c r e t u r n e a z a o v a l o a r e p o z i t i v a / 14 } 15 16 public s t a t i c String replacevowel ( String word ) { 17 S t r i n g B u f f e r sb = new S t r i n g B u f f e r ( word ) ; / v a r i a b i l a sb e s t e i n t i a l i z a t a cu v a l o a r e a 18 v a r i a b i l e i word / 19 f o r ( int i =0; i <sb. l e n g t h ( ) ; i ++){/ sb s e p a r c u r g e c a r a c t e r cu c a r a c t e r / 20 i f ( checkvowel ( sb. charat ( i ) ) ) {/ f i e c a r e c a r a c t e r a l l u i sb e s t e v e r i f i c a t daca e s t e v o c a l a / 21 sb. setcharat ( i, ( char ) ( sb. charat ( i ) +1) ) ; / s e pune pe p o z i t i a i i n sb urmatorul c a r a c t e r 22 din a l f a b e t / 23 } 24 } 25 return sb. t o S t r i n g ( ) ; 26 } 27 } III. TEMĂ 1. Rulaţi programele din secţiunea II. 2. Citiţi un şir de caractere de la tastatură. Folosind intrucţiunea switch, realizaţi un meniu pentru următoarele cerinţe: (a) să se afişeze lungimea şirului de caractere; (b) să se returneze ultima poziţie pe care se întâlneşte caracterul a ; (c) să se numere de câte ori apare în şirul de caractere secvenţa abc ; (d) să se verifce dacă şirul de caractere este palindrom. (e) să se şteargă toate caracterele de pe poziţiile pare. Implementaţi cerinţele de la punctele 2a pana la 2e. 7