Sunteți pe pagina 1din 25

CURSUL 1 verman@fmi.unibuc.

ro

PROGRAMA
Introducere n limbajul Java
Elemente de baz
Colecii. Tipuri generice
Aplicaii arbori, grafuri
Extinderi, interfee, awt
Introducere n algoritmi
Tehnici de programare:
Greedy
Divide et Impera
Programare dinamica
Backtracking
Branch and Bound
Algoritmi probabiliti. Algoritmi genetici
Algoritmi nedeterminiti. NP-completitudine
Principiul lui Dirichlet

BIBLIOGRAFIE
1. Horia Georgescu. Tehnici de programare. Editura Universitii din Bucureti 2005
2. T.H. Cormen, C.E. Leiserson, R.R. Rivest Introducere n algoritmi, MIT Press, trad.
Computer Libris Agora
3. Leon Livovschi, Horia Georgescu. Sinteza i analiza algoritmilor. 1986
4. http://infoarena.ro/
5. http://community.topcoder.com/tc
6.

http://www.oracle.com/technetwork/java/javase/documentation/index.html

7. Horia Georgescu. Introducere n universul Java. Editura Tehnic Bucureti 2002


8. Ivor Horton Beginning Java 2, Java 7 Edition, Wiley Pub., 2011
9. tefan Tanas, Cristian Olaru, tefan Andrei, Java de la 0 la expert, ediia a II-a, Polirom
2007
10. M. Naftalin, P. Wadler - Java Generics and Collections, OReilly, 2007

Principalele surse pentru materialele prezentate la curs sunt [1] i [7].

CURSUL 1 verman@fmi.unibuc.ro

Limbajul JAVA
Cuprins curs

Caracteristici
Un prim exemplu
ELEMENTE DE BAZ ALE LIMBAJULUI JAVA

Comentarii

Constante (literali), variabile i tipuri primitive

Operatori

Instruciuni

CLASE
TABLOURI UNIDIMENSIONALE
TABLOURI MULTIDIMENSIONALE
CITIREA DE LA TASTATUR
CLASE NFURTAORE
TRANSMITEREA PARAMETRILOR
ARBORI BINARI

CURSUL 1 verman@fmi.unibuc.ro

Limbajul JAVA
Caracteristici:
Orientat pe obiecte
Simplitate
Compilare prealabil urmat de executare pe maina gazd

Program.java
fiier sursa

COMPILATOR

javac Program.java

ClasaMain.class

INTERPRETOR

java ClasaMain

fiier bytecode

Colectorul de reziduuri. Java permite crearea explicit de obiecte (de tipul unei clase).

Distrugerea acestor obiecte este preluat de colectorul de reziduuri (garbage collector), care
marcheaz obiectele ce nu mai sunt folosite i elibereaz spaiul ocupat de ele; eliberarea nu se
face neaprat imediat, ci periodic sau atunci cnd spaiul disponibil curent nu mai poate
satisface o nou cerere de alocare de memorie.
Securitate ridicat.

lipsa pointerilor face ca accesarea unor zone de memorie pentru care accesul nu este
autorizat s nu fie posibil.
limbajul oblig programatorul s prevad aciunile ce trebuie ntreprinse la diferitele
erori (numite excepii) posibile.
se verific permanent, la executare, valorea indicelui unui tablou nainte de accesarea
componentei respective.

Este proiectat pentru lucru n reea.


Posibilitatea lansrii mai multor fire de executare.
Extensibilitate. Limbajul Java permite includerea de metode native, adic de funcii scrise n alt

limbaj (de obicei C++). Metodele native sunt legate dinamic la programul Java la momentul
executrii, rolul lor fiind n principal de a mri viteza de executare pentru anumite secvene din
program.
Applet-uri. Programele Java se mpart n dou categorii:

programe obinuite, de sine stttoare (stand alone), numite aplicaii.


applet-urile. Este folosit acelai limbaj, dar difer modalitatea de lansare n executare.
Cnd utilizatorul vizualizeaz o pagin Web ce include un applet, maina la care este
conectat transmite applet-ul mainii gazd, care este cea pe care se execut applet-ul (se
presupune c maina pe care lucreaz utilizatorul are un interpretor Java).

CURSUL 1 verman@fmi.unibuc.ro

Un prim exemplu
Exemplu Afiarea unui mesaj
class Unu{
public static void main(String arg[]) {
System.out.println("Prima clasa");
}
}

Salvm codul ntr-un fiier cu numele Unu.java (codul se poate scrie n orice editor i se
salveaz cu extensia java)
Compilarea: javac Unu.java
n urma compilrii ia natere fiierul Unu.class; mai general, pentru orice unitate de
compilare (format din mai multe clase), va lua natere pentru fiecare clas un fiier avnd numele
clasei i extensia class). Pentru acest fiier putem comanda executarea sa apelnd interpretorul
java.exe astfel (pentru clasa care conine metoda main)
Rularea:

java Unu

ELEMENTE DE BAZ ALE LIMBAJULUI JAVA


Comentarii
Exist trei tipuri de comentarii:
- de sfrit de linie: ncep cu // i se termin la sfritul liniei;
- generale: ncep cu /* i se termin la prima succesiune */.
- de documentare: ncep cu /** i se termin la prima succesiune */. Acest tip de
comentariu poate fi plasat doar imediat naintea unei clase, unui membru al unei clase sau a
unui constructor. Utilitarul javadoc este capabil s colecteze comentariile de documentare
din codul surs al claselor i s le introduc n documente HTML.

Constante (literali), variabile i tipuri primitive


n Java, ca i n C sau C++, o variabil se poate declara prin tipul ei urmat de nume.
[modificatori] tip lista_identificatori;

Tipul unei variabile poate fi un tip primitiv sau un tip referin (vectori, clase, interfee).
Menionm pentru moment doar urmtorii modificatori:
- modificatori de acces (public, private, protected); dac nu este specificat
nici unul dintre aceti modificatori, se consider c este ataat un modificator implicit;
- static ;
- final .
n funcie de locul n care sunt declarate, variabile se mpart n urmtoarele categorii:
1. Variabile membre (cmpuri), declarate n interiorul unei clase, vizibile pentru toate metodele
clasei respective si pentru alte clase, n funcie de nivelul lor de acces.

CURSUL 1 verman@fmi.unibuc.ro

2. Variabile locale, declarate ntr-o metod sau ntr-un bloc de cod, vizibile doar n metoda/blocul
respectiv
3. Parametrii metodelor, vizibili doar n metoda respectiv
4. Parametrii de la tratarea excepiilor
Enumerm n continuare tipurile primitive (de baz)

Tipuri ntregi byte, short, int, long

Tipuri n virgul mobil float, double

Tipul boolean

Tipul char

Tipuri ntregi

byte (octet)

short (ntreg scurt) 2 octei, valoare maxim 32767

long (ntreg lung) 8 octei, valoare maxim 91018

int (ntreg)

Nr
octei

Tip
byte
short
int
long

1
2
4
8

1 octet
4 octei, valoare maxim 2109

Valoare minim
-128
-32768
-2.147.483.648
-9.223.372.036.854.775.808

Valoare maxim
127
32767
2.147.483.647
9.223.372.036.854.775.807

Literali ntregi

normali (de tip int) reprezentai pe 32 de bii


lungi (de tip long) reprezentai pe 64 de bii, identificai prin faptul c au sufixul 'l' sau
'L'.
int x = 456789;
long z1 = 49999999999999L;
long z2 = 49_999_999_999_999L; //-java 7
byte y1 = 456789; //possible loss of precision
byte y2 = 1;

Baze :
10
16 prefixul 0x sau 0X
8 prefixul 0
2 (din versiunea 7) prefixul 0b sau 0B
int x1 = 0xA1B;
System.out.println(x1);
int x2 = 0B101; //-java 7
System.out.println(x2);

n calcule tipurile byte i short sunt convertite la int.


5

CURSUL 1 verman@fmi.unibuc.ro

Tipuri n virgul mobil

float 4 octei
double 8 octei.

Literali reali (n virgul mobil)

dubli reprezentai pe 64 de bii, pentru care scrierea este cea uzual.


numere zecimale ce conin opional punctul zecimal i pot fi urmate de un
exponent prefixat cu e sau E: 21.0 21. 2.1e1 .21E2

normali reprezentai pe 32 de bii, au n plus sufixul 'f' sau 'F'.


double d = 12345.2;
float f = 12345.2; //possible loss of precision
float f = 12345.2f;

Tipul boolean
Variabilele de acest tip pot lua doar valorile true i false.
Tipul char
Variabilele de acest tip sunt reprezentate pe 16 bii (2 octei) i pot primi ca valoare orice
simbol din codul Unicode.

O variabil de tip caracter poate fi folosit oriunde poate aprea o valoare ntreag: este
considerat numrul su de ordine n setul de caractere Unicode.

Un caracter poate fi reprezentat oriunde n textul surs i printr-o aa numit "secven


Escape", avnd forma \uhhhh sau \Uhhhh, unde am notat prin h o cifr hexazecimal

Secvenele escape pot fi folosite pentru a nlocui caractere speciale sau aciuni.
Exemple:
Secvena
\b
\t
\n
\"
\'
\\
\uhhhh

Utilizare
backspace
tab orizontal
line feed (linie nou)
ghilimele
apostrof
backslash
caracter Unicode numrul hhhh (n baza 16)

char c='a';
char c1='\u0061';
System.out.println(c1);

Tem. Scriei un program n care numele unei variabile conine diacritice. Studiai opiunea
encoding a compilatorului javac

Operatori

Operatori aritmetici +

CURSUL 1 verman@fmi.unibuc.ro

Reguli
- orice valoare ce depete limita admis este redus modulo aceast limit
- mprirea ntreag se face prin trunchiere
- operatorul % este definit prin: (x/y)*y+x%y==x
double x = 5*2/4+8/6;
System.out.println(x);

Dac ntr-o expresie apar doar variabile de tip short sau byte, acestea sunt convertite la
int i apoi se evalueaz expresia, rezultatul fiind de tip int

byte a = 10, b = 13;


a = (byte)(a*b);
System.out.println(a);

Dac ntr-o expresie apare o variabli de tip long, toate variabilele sunt convertite la long

Operatorii de incrementare i decrementare ++ i --, care pot fi aplicai operanzilor


numerici (ntregi sau n virgul mobil) att n form prefixat ct i n form postfixat.
Diferena ntre x++ i ++x const n faptul c incrementarea este realizat dup, respectiv
nainte de utilizarea lui x n contextul n care apare
double y = 3.5;
System.out.println(y++);
System.out.println(++y);
char c = 'a';
System.out.println(++c);
System.out.println(c+1);

Operatorii de atribuire = +=

Operatorii relaionali >

Operatori logici
(disjuncia logic, sau)
&& (conjuncia logic, i)
cu meniunea c la evaluare se face scurtcircuitare

-=
>=

/=

*=

==

%=

< <=

<<=

>>=

!=

Operatori pe bii
-

operatorii binari (sau) & (i) ^ (xor - sau excusiv)


1.
int f = 0b10001;
System.out.println(f);
System.out.println(f&16);
//testare bit
int mask = 0b100;
if( (f& mask) == 0)//!!!obligatoriu ()
System.out.println("bitul 3 este 0");

>>>= &= |= ^=

! (negaie)

CURSUL 1 verman@fmi.unibuc.ro

else
System.out.println("bitul 3 este 1");
//setare bit
f |= mask;
if( (f& mask) ==0)//!!!obligatoriu ()
System.out.println("bitul 3 este 0");
else
System.out.println("bitul 3 este 1");

2.
a ^= b;
b ^= a;
a ^= b;

operatorii de translaie (shift): <<, >> (cu propagarea bitului de semn), >>>
int b1 = -3;
System.out.println(Integer.toBinaryString(b1));
System.out.println(b1>>1);
System.out.println(b1<<1);
System.out.println(Integer.toBinaryString(b1>>>24));
System.out.println(b1>>>24);

Observaie: n clasele nfurtoare Integer i Long exist metode statice pentru operaii pe bii
(exemplu: bitCount, highestOneBit); vom reveni asupra acestor clase

Operatorul condiional ?:
Acest operator se utilizeaz n expresii sub forma:
( cond ? e1 : e2 )
a crei valoare este e1 dac cond este true, respectiv e2 dac cond este false; cond
trebuie s fie o expresie de tip boolean.

Operatori postfix
- cuprinderea ntre paranteze a indicilor (cu []);
- operatorul de calificare (.) folosit pentru accesarea membrilor claselor;
- parantezele rotunde folosite pentru specificarea listei de parametri din invocri;
- operatorii postfix de incrementare/decrementare ++ i -- de mai sus.

Operatorul de conversie a tipurilor


(tip) expresie
byte <

short <

int < long < float < double

Conversii implicite : de la un tip la altul care i urmeaz

Operatorul + pentru lucrul cu iruri


-

este folosit pentru concatenarea irurilor


8

CURSUL 1 verman@fmi.unibuc.ro

dac un membru al unei sume este un ir de caractere, atunci are loc o conversie
implicit a celorlali membri ai sumei (devenit acum concatenare) la iruri de
caractere;
printre membrii sumei pot aprea i variabile referin! (fiind apelat metoda
toString, de care vom discuta ulterior)
int u=2,v=4;
System.out.println(u+v+" suma");
System.out.println("suma "+u+v);

Operatorii pentru referine


- accesul la cmpuri (prin calificare);
- invocarea metodelor (prin calificare);
- operatorul de conversie;
- operatorii == i != ;
- operatorul condiional;
- operatorul instanceof , folosit n contextul:
ob instanceof Clasa

care produce o valoare boolean ce este true dac i numai dac obiectul ob este
diferit de null i este o instan a clasei Clasa sau poate fi convertit la tipul Clasa
String sir="abc";
System.out.println(sir instanceof String);
System.out.println(sir instanceof Object);

Precedena operatorilor

Ordinea n care are loc efectuarea prelucrrilor determinate de operatori este dat n
urmtorul tabel de prioriti ale operatorilor (de la prioritate maxim la prioritate minim):
- operatorii postfix
- operatorii unari de incrementare/decrementare, operatorii + i - unari, operatorul de negaie !
- operatorul new de creare de obiecte i cel de conversie: (tip) expresie
- operatorii multiplicativi: * / %
- operatorii aditivi: + - operatorii relaionali i instanceof
- operatorii de egalitate: ==
!=
- operatorul &
- operatorul
- conjuncia logic &&
- disjuncia logic
- operatorul condiional ( ? : )
- operatorii de atribuire.
Observaii:
- la prioritate egal, operatorii "vecini" acioneaz conform regulilor de asociativitate
prezentate n continuare;
9

CURSUL 1 verman@fmi.unibuc.ro

- utilizarea parantezelor este mai puternic dect prioritatea operatorilor. Astfel, spre
deosebire de x+y*z, n (x+y)*z prima operaie care va fi executat este adunarea.

Asociativitate
Regula general o constituie asociativitatea la stnga. Fac excepie urmtorii
operatori, pentru care este folosit asociativitatea la dreapta:
- operatorii unari;
- operatorii de atribuire.
- operatorul ( ? : ).

Exemple.
1) n expresia x-y+z nti se va efectua scderea i apoi adunarea;
2) Instruciunea:
x = y = z = 0;

este echivalent cu:


x = ( y = (z = 0));
i are ca efect atribuirea valorii 0 variabilelor x,y,z.

Instruciuni
- Instruciunea compus grupeaz mai multe instruciuni prin includerea lor ntre acolade; ia
natere astfel un bloc.
- Instruciunea de declarare asociaz unei variabile un anumit tip i eventual i atribuie o valoare
iniial; variabila devine local celui mai interior bloc care o conine n sensul c exist atta timp
ct se execut instruciuni ale blocului. O instruciune de declarare poate s apar oriunde n
interiorul unui bloc.
nainte de utilizarea lor, variabilele locale trebuie s fi primit valori fie prin iniializare la
declarare, fie printr-o instruciune de atribuire (n caz contrar va fi semnalat o eroare la
compilare).
- Instruciunea de atribuire conine semnul =, eventual prefixat cu un operator.
- Instruciunea vid este format numai din ; i nu prevede vreo prelucrare.
- Instruciunea prin care este creat un obiect folosete n acest scop operatorul new.
- Instruciunile ce controleaz ordinea de executare, ca de exemplu: if-else, for, while ,
do - while

Din versiunea 5 exist o form a instruciunii for, pentru obiecte iterabile (for-each):
for (tip identificator : obiect_iterabil) instr;
De exemplu, pentru a afia elementele unui tablou unidimensional de numere ntregi putem
folosi una din variantele
for(int i=0;i<a.length;i++)
System.out.print(a[i]+" ");

sau
for(int x:a)

10

CURSUL 1 verman@fmi.unibuc.ro

System.out.print(x+" ");

- Instruciunea break.
- Instruciunea continue
- Instruciunea switch evalueaz o expresie ntreag, a crei valoare este folosit pentru a detecta
o secven de instruciuni ce urmeaz a fi executat.
O prim form a ei este:
switch (expresie) {
case val1 : secven_instruciuni1
. . .
case valk : secven_instruciunik
default
: secven_instruciuni
}

unde:
- tipul expresiei poate fi char, byte, short sau int;
- din versiunea 7 tipul expresiei poate fi i String (i enumerare)
- val1, ..., valk sunt constante (literali sau cmpuri statice finale iniializate cu expresii
constante) de acelai tip cu al expresiei;
- alternativa default este opional.
1.
int i = 2;
switch (i)
case 1 :
case 2 :
case 3 :
}

{
System.out.print("unu ");
System.out.print("doi ");
System.out.println("trei");

2.
String s = "stergere";
switch (s){
case "stergere":System.out.println("sters");break;
case "adaugare":System.out.println("adaugat");break;
default:System.out.println("nimic");
}

- Instruciunea return are una dintre formele:


return;
return expresie;

11

CLASE
Exemplu la curs
Clasa este unitatea de programare fundamental n Java. Orice clas este format din
cmpuri, metode i constructori. Cmpurile i metodele unei clase formeaz mpreun membrii
acelei clase.
O clas se definete astfel:
[modificator] class NumeClasaDefinita [extends NumeClasa] [implements
NumeInterfete]{
corp;
}

Cmpurile unei clase sunt variabile ataate clasei respective i se declar astfel:
[modificatori] tip lista_identificatori;

Metodele sunt funciile declarate n interiorul clasei:


[modificatori] tip_returnat numeMetoda(lista_parametrii);

Lista tipurilor parametrilor, n ordinea lor de apariie, formeaz signatura metodei. n


aceeai clas pot aprea mai multe metode cu acelai nume, dar cu signaturi diferite
Clasele sunt considerate tipuri. Entitile al cror tip este o clas se numesc obiecte ale clasei
respective. Se mai spune c obiectele sunt instanieri (instane) ale claselor.
Constructorii unei clase seamn cu metodele, dar numele lor este obligatoriu numele clasei
i nu ntorc valori.
Unul dintre constructori este automat invocat la crearea unui obiect de tipul clasei
respective.
Aciunea constructorilor poate fi orict de complex, dar n principal sunt folosii
pentru iniializarea unor cmpuri ale obiectului.
Ca i pentru metode, pot exista mai muli constructori, dar cu signaturi diferite.
Aceast posibilitate de a exista mai muli constructori, respectiv mai multe metode cu acelai nume,
dar cu signaturi diferite, poart numele de suprancrcare (overloading).
Crearea obiectelor se face cu ajutorul operatorului new.
Declararea i crearea unui obiect de tipul C
C ob; //variabila referinta poate memora o referinta la un obiect de tip C
ob = new C();

sau
C ob = new C(1,true);

La folosirea operatorului new se ntmpl mai multe lucruri:

se creeaz o nou instan a clasei date


se aloc memorie pentru aceasta
este invocat constructorul corespunztor (cu aceeai signatur cu cea din lista de
argumente).

Dac n clasa C nu exist vreun constructor (declarat explicit), se presupune c exist totui un
constructor fr parametri, care nu prevede nici o aciune. De aceea, n acest caz, la creare
trebuie folosit forma new C().
Invocarea metodelor:
int i = ob.met(2);
ob.met();

Observaii.
O variabil de tip referin poate avea valoarea null, care indic o referin ctre "nimic"; drept
urmare variabila nu conine o referin valid, deci nu poate fi folosit pentru a accesa
cmpuri sau invoca metode.
Gestionarea memoriei se face automat, Java avnd colector de reziduuri (garbage collector). De
aceea nu este nevoie s fie dezalocat memoria ocupat de obiect.
La invocarea metodelor se folosete apelul prin valoare
Dac metoda este declarat cu modificatorul static, ea poate fi invocat i prin numele clasei.
Astfel, dac metoda met cu signatura vid era declarat prin:
static int met() { . . . }

atunci ea putea fi invocat i prin:


C.met();

Dac un cmp w este declarat cu modificatorul static, el este comun tuturor obiectelor de tipul
C, deci este memorat o singur dat (joac rolul de memorie comun pentru toate obiectele ce
instaniaz clasa). n plus el poate fi referit i prin C.w
Exemplu cmpuri i metode statice
class ExpStatic{
static int nr=1;
int x=1;
static void cresteNr(){
void cresteX(){
void afis(){

x++;

nr++; }
} //NU static

System.out.println(nr+" "+x ); }

public static void main(String s[]){


ExpStatic.cresteNr();
System.out.println(ExpStatic.nr);
ExpStatic ob1,ob2;
ob1=new ExpStatic();
ob2=new ExpStatic();
ob1.cresteNr();
ob1.cresteX();
ob1.afis();
ob2.afis();
}
}

13

TABLOURI UNIDIMENSIONALE

Definiie, declarare
Un tablou a poate fi declarat folosind una dintre urmtoarele modaliti:
tip[] a;
tip a[];

unde tip este tipul componentelor tabloului (poate fi un tip primitiv sau un tip referin).
Declararea unui tablou nu are drept consecin crearea sa.
Crearea tabloului a declarat mai sus trebuie fcut explicit, prin:
a = new tip[n];

unde n este o constant sau o variabil ntreag ce a primit o valoare strict pozitiv.
Un tablou este un tip referin. Prin creare se obine un obiect de tip tablou (obiect numit prin
abuz de limbaj tot tablou).
Componentele tabloului pot fi referite prin a[i], cu i lund valori n intervalul 0..n-1; dac i
nu este n acest interval, va fi semnalat o eroare la executare. Lungimea tabloului poate fi referit
prin a.length.
Declararea i crearea pot fi fcute i simultan:
int[] a = new int[10];

sau printr-o iniializare efectiv, ca de exemplu:


int[] a = {0,3,2,5,1}

prin care, evident, a.length devine 5.


Cmpul length al unui (obiect de tip) tablou este un cmp constant (cu modificatorii
public i final) de tip int; deci, odat creat, un obiect tablou nu i poate schimba
dimensiunea (numrul de componente). Pe de alt parte, variabilei referin la tablou i se poate
asocia o referin la un tablou de acelai tip.
Exemple
1.
int[] a = {1,2,3,4};
a = new int[20];
//?? a[0]

Noul tablou nu are nici o legtur cu cel vechi.


2.
int[] a = {1,2,3,4}, b = {11,12,13}, c;
c = a; a = b; b = c;

Observaie O atribuire de genul b = a are alt semnificaie dect copierea elementelor lui a n b
i nu poate fi folosit n acest scop. Este o atribuire de referine, n urma acestei atribuiri
variabilele b i a vor referi acelai obiect (tablou). Dac modificm un element al lui a se modific
i b i invers.
14

3. ncercai pe rnd fiecare dintre cele 3 variante propuse pentru copierea elementelor unui
vector a n alt vector b. Justificai rezultatele afiate.
int a[] = {1, 2, 3, 4};
int b[] = new int[4]; //atentie, b trebuie alocat
// Varianta 1 - Nu are efectul dorit
b = a;
System.out.println(a[0]+" "+b[0]);
b[0] = 5;
System.out.println(a[0]+" "+b[0]);
a[0] = 6;
System.out.println(a[0]+" "+b[0]);
// Varianta 2
for(int i=0; i<a.length; i++)
b[i] = a[i];
// Varianta 3
System.arraycopy(a, 0, b, 0, a.length);

n clasa Arrays din pachetul java.util exist metode utile pentru lucrul cu tablouri :
fill(int[] a, int fromIndex, int toIndex, int val)
sort(int[] a)

15

TABLOURI MULTIDIMENSIONALE
Tablourile multidimensionale trebuie gndite ca tablouri unidimensionale ale cror
elemente sunt tablouri unidimensionale etc. De aceea referirea la un element al unui tablou
multidimensional a se face prin:
a[indice1]...[indicen].

1.
int[][] a = new int[5][3];

2.
int[][] a = new int[3][];
a[0] = new int[3];
a[1] = new int[4];
a[2] = new int[2];

Ia natere astfel un tablou de forma:

Evident, a[1].length=4.
La aceeai structur se poate ajunge i printr-o iniializare efectiv:
int[][] a = { {0,1,2}, {1,2,3,4}, {2,3} };

care n plus atribuie valori elementelor tabloului.


Dac n referirea la un element al unui tablou unul dintre indici nu este n intervalul
corespunztor, va aprea excepia IndexOutOfBoundsException.
Exemplu Afiarea elementelor unui tablou bidimensional cu for-each
int x[][]={{1,2,3,7},{4,5},{8}};
for(int[] linie:x){
for(int elem:linie)
System.out.printf("%2d",elem);
System.out.println();
}

16

CLASE NFURTOARE
Pentru fiecare tip primitiv exist o clas corespunztoare, numit clas nfurtoare
(wrapper class) care pune la dispoziie diverse constante i metode, de exemplu de conversie

int - clasa Integer

double clasa Double

long clasa Long

short clasa Short

byte clasa Byte

boolean clasa Boolean

char clasa Character

n clasele nfurtoare exist cmpuri constante (static final) pentru - i + i "nu


este un numr":
Double.NaN
Double.NEGATIVE_INFINITY
Double.POSITIVE_INFINITY

Pentru conversia din iruri de caractere n numere se pot folosi metode statice de tipul
parseTipNumeric aflate n clasa nfurtoare corespunztoare tipului n care vrem s facem
conversia:
String sir = "123";
int i = Integer.parseInt(sir);
double j = Double.parseDouble(sir);
System.out.println(i);
System.out.println(j);

Legtura tip primitiv clas nfurtoare


Pn la versiunea 5 :
int i = 1;
Integer wi = new Integer(i);
int j = wi.intValue();
System.out.println(j);

Din versiunea - implicit (autoboxing / unboxing)


int i = 1;
Integer wi = i;
int j = wi;
System.out.println(j);

Obserervaie Nu este indicat folosirea claselor nfurtoare n operaii aritmetice, ci doar


n lucrul cu colecii

17

CITIREA DE LA TASTATUR
O clas care se poate folosi pentru citirea datelor de tipuri primitive sau String este clasa
Scanner din pachetul java.util.
Aceast clas se poate folosi pentru citirea din diferite surse: de la tastatur, din fiier, din
obiecte de tip String, n funcie de tipul obiectul trimis ca parametru constructorului clasei:
InputStream, File, String.
n mod predefinit un obiect de tip Scanner citete entiti delimitate prin caractere albe i
apoi ncearc s le interpreteze n modul cerut.
Pentru tipurile primitive de date exist metodele nextByte(), nextShort(),
nextInt(), nextLong(), nextFloat(), nextDouble(), nextBoolean().
Pentru a testa dac sunt disponibile valori de anumit tip exist metode ca hasNextInt(),
hasNextDouble() etc.
Exist i metodele hasNext() i next() pentru a testa existena unei urmtoare entiti
(fr un tip specificat), respectiv pentru citirea urmtoarei entiti (tipul rezultatului ntors de
metoda next() este String).
Mai menionm metodele nextLine() i hasNextLine() (utile de exemplu dac dorim
s citim un ir de caractere care conine i spaii)
Exemplu la curs

TRANSMITEREA PARAMETRILOR
Dup cum aminteam, n Java parametrii se transmit prin valoare. Pentru a nelege ce nseamn
acest lucru i n cazul variabilelor referin considerm exemplele urmtoare.
1.
class C{
int a;
C(){ }
C(int a1){ a=a1; }
void afis(){System.out.println(a); }
}
class TestParam{
static void modif(C ob){
ob.a++;
}
static void modifOb(C ob){
ob=new C(5);
}
static void creste(int x){
x++;
}

18

public static void main(String arg[]){


int x=1;
creste(x);
System.out.println(x);
C ob=new C(1); ob.afis();
modifOb(ob); ob.afis();
modif(ob); ob.afis();
}
}

2.
import java.util.*;
class Tablou {
static void met(int[] a) {
a[0] = 7;
a = new int[5];
Arrays.fill(a,0,4,1);
}
public static void main(String[] s) {
int[] a = {1,2,3,4};
for (int i=0 ; i<a.length; i++)
System.out.print(a[i]+" ");
System.out.println();
met(a);
for (int el:a)
System.out.print(el+" ");
}
}

Exemplificm n cele ce urmeaz principalele elemente de limbaj discutate implementnd


parcurgerea arborilor binari folosind reprezentarea arborelui cu tablouri sau cu legturi (nlnuit).

19

ARBORI BINARI
Numim arbore un graf neorientat conex i fr cicluri (pentru alte definiii echivalente
consultai cursul de Algoritmica Grafurilor).
n foarte multe probleme referitoare la arbori este pus n eviden un vrf al su, numit
rdcin. Dup alegere unui vrf drept rdcin arborele se poate aeza pe niveluri.
Exemplu Considerm urmtorul arbore i modul n care el este aezat pe niveluri prin alegerea
vrfului 5 drept rdcin.
5
0
1
2
4
6
1
3
6
4
8
7
2
9 3
2
9
5
7
10
3
10
1
8
Reprezentarea pe niveluri a arborilor face ca noiunile de fii / descendeni, tat / ascendeni
ai unui vrf s aib semnificaii evidente. Un vrf fr descendeni se numete frunz.

Arbori binari
Un arbore binar este un arbore n care orice vrf are cel mult doi descendeni, cu precizarea
c se face distincie ntre descendentul stng i cel drept (nu este propriu-zis un caz particular de
arbore).
-

Primele probleme care se pun pentru arborii binari sunt:


modul de reprezentare;
parcurgerea lor.

Forma standard de reprezentare a unui arbore binar const n:


- a preciza rdcina rad a arborelui;
- a preciza pentru fiecare vrf i tripletul st(i), dr(i) i info(i), unde acestea sunt respectiv
descendentul stng, descendentul drept i informaia ataat vrfului.
Trebuie stabilit o convenie pentru lipsa unuia sau a ambilor descendeni, ca de exemplu
specificarea lor prin simbolul .
Exemplu Considerm de exemplu urmtorul arbore binar:
1

8
5

20

Presupunnd c informaia ataat fiecrui vrf este chiar numrul su de ordine, avem:
rad = 1;
st = (2,3,4,,6,,,,);
dr = (8,5,,,7,,,9,);
info= (1,2,3,4,5,6,7,8,9).

Dintre diferitele alte reprezentri posibile, mai menionm doar pe cea care se reduce la
vectorul su tata i la vectorul info. Pentru exemplul de mai sus:
tata=(,1,2,3,2,5,5,1,8).
Problema parcurgerii unui arbore binar const n identificarea unei modaliti prin care,
plecnd din rdcin i mergnd pe muchii, s ajungem n toate vrfurile; n plus, atingerea fiecrui
vrf este pus n eviden o singur dat: spunem c vizitm vrful respectiv. Aciunea ntreprins
la vizitarea unui vrf depinde de problema concret i poate fi de exemplu tiprirea informaiei
ataate vrfului.
Distingem trei modaliti standard de parcurgere a unui arbore binar:

Parcurgerea n preordine
Se parcurg recursiv n ordine: rdcina, subarborele stng, subarborele drept.
Concret, se execut apelul preord(rad) pentru procedura:
procedure preord(x)
if x!=
vizit(x); preord(st(x)); preord(dr(x))
end

Ilustrm acest mod de parcurgere pentru exemplul de mai sus, figurnd ngroat rdcinile
subarborilor ce trebuie dezvoltai:
1
1, 2, 8
1, 2, 3, 5, 8, 9
1, 2, 3, 4, 5, 6, 7, 8, 9

Parcurgerea n inordine
Se parcurg recursiv n ordine: subarborele stng, rdcina, subarborele drept.
Ilustrm acest mod de parcurgere pentru exemplul de mai sus

1
2, 1, 8
3, 2, 5, 1, 8, 9
4, 3, 2, 6, 5, 7, 1, 8, 9
Concret, se execut apelul inord(rad) pentru procedura:
procedure inord(x)
if x!=
inord(st(x)); vizit(x); inord(dr(x))
end

21

Parcurgerea n postordine
Se parcurg recursiv n ordine; subarborele stng, subarborele drept, rdcina.
Ilustrm parcurgerea n postordine pentru exemplul de mai sus:

1
2, 8, 1
3, 5, 2, 9, 8, 1
4, 3, 6, 7, 5, 2, 9, 8, 1
Concret, se execut apelul postord(rad) pentru procedura:
procedure postord(x)
if x!=
postord(st(x)); postord(dr(x)); vizit(x)
end

Exemplu Parcurgerea arborilor binari reprezentai folosind tablouri.


import java.util.*;
class ArbBinT {
int rad, nv;
int[] st,dr; //int st[],dr[];
void creare() {
Scanner sc = new Scanner(System.in);
System.out.print("Nr. varfuri : ");
nv = sc.nextInt();
st = new int[nv];
dr = new int[nv];
System.out.print("Radacina (numerotare de la 0): ");
rad = sc.nextInt();
for (int i=0; i<nv; i++) {
System.out.print("fii st si dr ai varfului " + i + " (-1 daca nu
exista): ");
st[i] = sc.nextInt();
dr[i] = sc.nextInt();
}
}
void pre(){
pre(rad);
}
void pre(int x) {
if( x>=0 ){
System.out.print(x + "
pre(st[x]);
pre(dr[x]);
}
}

");

22

void in(){
in(rad);
}
void in(int x) {
if( x>=0 ){
in(st[x]);
System.out.print(x + "
in(dr[x]);
}
}

");

void post(){
post(rad);
}
void post(int x) {
if( x>=0 ){
post(st[x]);
post(dr[x]);
System.out.print(x + "
}
}

");

}
class Exp1ArbBin {
public static void main(String[] args) {
ArbBinT ob = new ArbBinT();
ob.creare();
System.out.print("Preordine :\t");
ob.pre();
System.out.print("\nInordine :\t");
ob.in();
System.out.print("\nPostordine :\t");
ob.post();
}
}

Exemplu Parcurgerea arborilor binari reprezentai folosind legturi.


import java.util.*;
class Varf{
int info;
Varf st,dr;
Varf () {
}
Varf (int i) {
info = i;
}
}

23

class ArbBinL {
Varf rad;
static Scanner sc = new Scanner(System.in);
void creare() {
System.out.print("rad : ");
rad = new Varf(sc.nextInt());
subarb(rad);
}
void subarb(Varf x) { //x deja alocat
// ataseaza subarb. st. si subarb. dr.
int v;
// v<0 <==> nu exista descendent
System.out.print("Desc. stang al lui " + x.info + ": ");
v = sc.nextInt();
if( v>=0 ) {
x.st = new Varf(v);
subarb(x.st);
}
System.out.print("Desc. drept al lui " + x.info + ": ");
v = sc.nextInt();
if( v>=0 ) {
x.dr = new Varf(v);
subarb(x.dr);
}
}
void pre(){
pre(rad);
}
void pre(Varf x) {
if( x != null ){
System.out.print(x.info + "
pre(x.st);
pre(x.dr);
}
}

");

void in(){
in(rad);
}
void in(Varf x) {
if( x != null ) {
in(x.st);
System.out.print(x.info + "
in(x.dr);
}
}

");

24

void post(){
post(rad);
}
void post(Varf x) {
if( x != null ){
post(x.st);
post(x.dr);
System.out.print(x.info + "
}
}

");

}
class Exp2ArbBin {
public static void main(String[] args) {
ArbBinL ob = new ArbBinL();
ob.creare();
System.out.print("Preordine :\t");
ob.pre();
System.out.print("\nInordine :\t");
ob.in();
System.out.print("\nPostordine :\t");
ob.post();
}
}

Tem: Modificai programul anterior astfel nct lipsa unui fiu s fie marcat la citire printro liter, nu prin valoarea -1

25

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