9 java limbajul java. tablouri03.12.2018 curs - programare orientată pe obiecte 33 eliberarea...

67
Programare orientată pe obiecte # 9 Adrian Runceanu www.runceanu.ro/adrian 2018 JAVA Limbajul JAVA. Tablouri

Upload: others

Post on 05-Jan-2020

18 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

Programare orientată pe obiecte

# 9

Adrian Runceanu www.runceanu.ro/adrian

2018

JAVA Limbajul JAVA. Tablouri

Page 2: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Curs 9

Limbajul JAVA. Tablouri

03.12.2018 Curs - Programare orientată pe obiecte 2

Page 3: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Tablouri in Java

1. Tablouri unidimensionale(vectori) 2. Tablouri bidimensionale(matrici) 3. Tablouri multidimensionale

03.12.2018 Curs - Programare orientată pe obiecte 3

Page 4: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Un tablou este o structura de date care poate sa pastreze mai multe valori de acelasi tip (primitiv sau referinta), memorate intr-o zona de memorie contigua si reunite sub un nume simbolic comun (numele tabloului).

03.12.2018 Curs - Programare orientată pe obiecte 4

Page 5: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Un tablou poate fi:

1. unidimensional sau vector

2. bidimensional sau matrice

3. multidimensional In Java, un tablou este tratat ca un obiect, deci

el este un tip referinta.

03.12.2018 Curs - Programare orientată pe obiecte 5

Page 6: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Declararea si crearea unui tablou unidimensional Declararea si crearea tablourilor unidimensionale se realizeaza in doi pasi de catre compilatorul Java:

1. Se declara o variabila referinta la tablou de un

anumit tip (primitiv sau referinta). Prin declaratia unei referinte se aloca zona de

memorie necesara stocarii referintei in sine (adica a unei adrese de memorie).

In consecinta, dupa ce se declara o variabila referinta la un tablou, aceasta va contine valoarea null, ceea ce inseamna ca referinta inca nu indica un tablou valid.

03.12.2018 Curs - Programare orientată pe obiecte 6

Page 7: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Sintaxa folosita pentru declararea unei variabile referinta catre un tablou unidimensional este:

sau unde: - <tip> - specifica tipul de date primitiv sau tipul de obiecte

(dat de clasa) al elementelor tabloului; - <nume_tablou> - reprezinta numele unei variabile

referinta la tabloul de tipul <tip>; acesta variabila referinta la un tablou contine valoarea null.

Nota: parantezele drepte sunt obligatorii, nu delimiteaza o

constructie optionala 03.12.2018 Curs - Programare orientată pe obiecte 7

<tip> [ ] <nume_tablou>;

<tip> <nume_tablou> [ ];

Page 8: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

2. Se aloca, efectiv, zona de memorie pentru tabloul

declarat la pasul 1 si se initializeaza tabloul. Exista doua modalitati pentru a face acest lucu: a) folosind operatorul new

b) initializand direct continutul tabloului

03.12.2018 Curs - Programare orientată pe obiecte 8

Page 9: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

a) Sintaxa folosita pentru alocarea zonei de memorie a unui tablou unidimensional folosind operatorul new este:

unde: - <nume_tablou> - reprezinta numele variabilei

referinta declarata la pasul 1; - <tip> - specifica tipul de date primitiv sau tipul de

obiecte (dat de clasa) al elementelor tabloului; - <nr_elem> - reprezinta numarul de elemente ale

tabloului; poate fi: - o variabila de un tip primitiv - o expresie de un tip primitiv - sau o constanta de un tip primitiv

03.12.2018 Curs - Programare orientată pe obiecte 9

<nume_tablou> = new <tip> [<nr_elem>];

Page 10: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Nota: 1. De cele mai multe ori programatorii combina declararea

si alocarea zonei de memorie pentru un tablou intr-o singura instructiune, astfel:

sau 2. La crearea unui tablou folosind operatorul new, toate

elementele sale vor fi initializate automat cu: • 0 pentru cele numerice • false pentru boolean • ‘\0’ pentru tablouri tip caracter • null pentru obiecte

03.12.2018 Curs - Programare orientată pe obiecte 10

<tip> <nume_tablou> [ ] = new <tip> [<nr_elem>];

<tip> [ ] <nume_tablou> = new <tip> [<nr_elem>];

Page 11: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

De exemplu, pentru declararea si alocarea

zonei de memorie pentru un tablou unidimensional cu numele temp de tipul int cu 100 de elemente se foloseste instructiunea:

int [ ] temp = new int[100];

03.12.2018 Curs - Programare orientată pe obiecte 11

Page 12: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

b) Alocarea zonei de memorie pentru tablou se poate face initializand direct continutul tabloului (la fel ca in limbajul C/C++), dupa urmatoarea sintaxa:

sau unde: - <valoare1>, <valoare2>, …. - reprezinta valorile de

initializare al caror numar determina si numarul de elemente ale tabloului.

03.12.2018 Curs - Programare orientată pe obiecte 12

<tip> [ ] <nume_tablou>; <nume_tablou> = {<valoare1>, <valoare2>, ….};

<tip> [ ] <nume_tablou> = {<valoare1>, <valoare2>, ….};

Page 13: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

De exemplu, pentru declarea si alocarea zonei de

memorie pentru un tablou unidimensional cu numele temp de tip int cu patru elemente se foloseste instructiunea:

int [ ] temp = {3, 4, 6, 19};

03.12.2018 Curs - Programare orientată pe obiecte 13

Page 14: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Declararea si alocarea zonei de memorie pentru un

tablou unidimensional de obiecte (deci nu tipuri

primitive) foloseste aceeasi sintaxa.

Trebuie retinut insa ca dupa alocarea zonei de memorie

pentru tabloul de referinte la obiectele respective,

fiecare element (de tip referinta) din tablou va avea

valoarea null.

Apoi, pentru fiecare element-tip referinta din tablou

trebuie alocata memorie, separat, corespunzatoare

fiecarui obiect referit.

Aceasta se intampla, deoarece un tablou de obiecte in

Java este un tablou de referinte la obiectele respective.

03.12.2018 Curs - Programare orientată pe obiecte 14

Page 15: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

De exemplu, pentru declararea si alocarea memoriei

pentru un tablou de tip Cerc cu numele tablouDeCercuri

care are ca elemente 5 obiecte (instante) se foloseste

urmatoarea secventa de instructiuni:

Cerc [ ] tablouDeCercuri; // declaram un tablou de referinte de tip

Cerc

tablouDeCercuri = new Cerc[5]; //alocam memorie pentru 5

referinte la obiecte de tip Cerc

for (int i = 0; i < 5; i++)

{

tablouDeCercuri[i] = new Cerc(); // se aloca memorie pentru un

obiect de tip Cerc in elementul i al tabloului cu numele tablouDeCercuri

}

03.12.2018 Curs - Programare orientată pe obiecte 15

Page 16: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Lungimea tablourilor unidimensionale

Tablourile Java sunt alocate dinamic, ceea ce inseamna ca ele isi pot schimba dimensiunile pe parcursul executiei programului. Numarul de elemente care pot fi stocate intr-un tablou oarecare, este permanent retinut in variabila <nume_tablou>.length.

De exemplu: float [] tablou = new float [25]; int dimensiune = tablou.length; // dimensiune primeste

valoarea 25

03.12.2018 Curs - Programare orientată pe obiecte 16

Page 17: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Accesarea (identificarea) unui element al tabloului unidimensional

Deoarece elementele unui tablou sunt memorate in ordine, unul dupa altul, intr-o zona contigua, pentru a accesa (sau a referi) un element al unui tablou se specifica numele tabloului din care face parte elementul si pozitia sa in tablou, prin numarul sau de ordine (numerotarea incepe de la 0), astfel:

in care: <indice> reprezinta numarul de ordine al elementului in

tablou, cuprins intre 0 si <nr_elemente> - 1; parantezele patrate ([ ]) constituie operatorul de indexare.

03.12.2018 Curs - Programare orientată pe obiecte 17

<nume_tablou>[<indice>]

Page 18: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Exemple: int punctaje[5]; elementele tabloului sunt: punctaje[0], punctaje[1],

punctaje[2], …. punctaje[4]. Nota: Toate pozitiile unui tablou sunt verificate, de interpretorul Java, daca se incadreaza in limitele tabloului asa cum s-au specificat la crearea tabloului. In Java este imposibil sa se acceseze sau sa se atribuie o valoare unei pozitii a tabloului aflata in afara granitelor acestuia. Pentru a se evita, in programe, depasirea accidentala a sfarsitului tabloului se testeaza lungimea acestuia prin folosirea variabilei de instanta length.

03.12.2018 Curs - Programare orientată pe obiecte 18

Page 19: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

O parcurgere a unui tablou unidimensional se face cu ajutorul instructiunii for astfel:

for (int i = 0 ; i < numere.length; i++) numere[i] = i; Observatie: Dat fiind ca tabloul este un tip referinta, operatorul de

atribuire (=) nu copiaza tablouri. De aceea, daca x si y sunt tablouri, efectul secventei de

instructiuni: int [ ] x = new int [50]; int [ ] y = new int [50]; … x = y; este ca x si y refera acum al doilea tablou cu numele y.

03.12.2018 Curs - Programare orientată pe obiecte 19

Page 20: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Tablouri in Java

1. Tablouri unidimensionale(vectori) 2. Tablouri bidimensionale(matrici) 3. Tablouri multidimensionale

03.12.2018 Curs - Programare orientată pe obiecte 20

Page 21: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

03.12.2018 Curs - Programare orientată pe obiecte 21

2. Tablouri bidimensionale

Tablourile bidimensionale in Java sunt tablouri unidimensionale de referinte catre tablouri unidimensionale (adica, sunt tablouri de referinte la tablouri unidimensionale).

Declararea si crearea tablourilor bidimensionale se

realizeaza tot in doi pasi: 1. declararea tabloului de un anumit tip (primitiv sau

referinta) 2. alocarea zonei de memorie pentru tabloul declarat

si initializarea lui

Page 22: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

03.12.2018 Curs - Programare orientată pe obiecte 22

1. Sintaxa folosita pentru declararea unei variabile referinta catre un tablou bidimensional este:

<tip> <nume_tablou> [ ][ ]; sau

<tip> [ ][ ] <nume_tablou>; sau

<tip> [ ] <nume_tablou> [ ];

Page 23: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

03.12.2018 Curs - Programare orientată pe obiecte 23

unde: - <tip> - specifica tipul de date primitiv sau tipul de

obiecte (dat de clasa) al elementelor tabloului - <nume_tablou> - reprezinta numele unei variabile

referinta la tabloul de tipul <tip> acesta variabila referinta la un tablou bidimensional

contine valoarea null, la fel ca si variabila referinta <nume_tablou>[i] care contine valoarea null pentru referinta la linia i a tabloului

Nota: parantezele drepte sunt obligatorii, nu

delimiteaza o constructie optionala.

Page 24: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

03.12.2018 Curs - Programare orientată pe obiecte 24

2. Alocarea zonei de memorie pentru tabloul declarat si initializarea lui se face in doua feluri ca si la tablourile unidimensionale:

a) folosind operatorul new b) initializand direct continutul tabloului

Page 25: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

03.12.2018 Curs - Programare orientată pe obiecte 25

a) Sintaxa folosita pentru alocarea zonei de memorie unui tablou bidimensional folosind operatorul new este:

unde: - <nume_tablou> - reprezinta numele variabilei referinta declarata

la pasul 1 - <tip> - specifica tipul de date primitiv sau tipul de obiecte (dat de

clasa) al elementelor tabloului - <nr_linii> - reprezinta numarul de linii ale tabloului - <nr_coloane> - reprezinta numarul de coloane ale tabloului - <nr_linii> si <nr_coloane> pot fi:

– o variabila de un tip primitiv – o expresie de un tip primitiv – sau o constanta de un tip primitiv

<nume_tablou> = new <tip> [<nr_linii>][<nr_coloane>];

Page 26: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

03.12.2018 Curs - Programare orientată pe obiecte 26

Nota: De cele mai multe ori programatorii combina

declararea si alocarea zonei de memorie pentru un tablou intr-o singura instructiune, astfel

sau

<tip> <nume_tablou> [ ][ ] = new <tip> [<nr_linii>][<nr_coloane>];

<tip> [ ][ ] <nume_tablou> = new <tip> [<nr_linii>][<nr_coloane>];

Page 27: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

03.12.2018 Curs - Programare orientată pe obiecte 27

De exemplu, urmatoarea instructiune de declarare si alocare de memorie pentru un tablou bidimensional de caractere:

char [][] caractere = new char [5][]; Variabila referinta numita caractere contine

deocamdata un tablou de 5 referinte la tablouri de caractere.

Tabloul de referinte caractere

Page 28: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

03.12.2018 Curs - Programare orientată pe obiecte 28

Cele cinci referinte sunt initializate implicit la valoarea null.

Putem aloca cele 5 tablouri de caractere folosind operatorul new astfel:

caractere[0] = new char [3]; … caractere[4] = new char[5];

Page 29: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

03.12.2018 Curs - Programare orientată pe obiecte 29

Noile tablouri sunt referite din interiorul tabloului original. Elementele noilor tablouri sunt caractere:

Tabloul de referinte original caractere

Noile tablouri alocate

Elemente de tip caracter

Page 30: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

03.12.2018 Curs - Programare orientată pe obiecte 30

La fel, putem scrie: char [] tablouDeCaractere = caractere[0]; Variabilele de tip referinta caractere[0] si

tablouDeCaractere trimit spre acelasi tablou de caractere rezervat in memorie.

caractere

tablouDeCaractere

Tabloul de referinte original

Page 31: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

03.12.2018 Curs - Programare orientată pe obiecte 31

Un alt exemplu se refera la declararea si

alocarea zonei de memorie pentru un tablou bidimensional cu numele temp de tipul int cu 100 de elemente pe linie si 100 de elemente pe coloane se poate folosi instructiunea:

int [][] temp = new int[100] [100];

Page 32: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

03.12.2018 Curs - Programare orientată pe obiecte 32

b) Alocarea zonei de memorie pentru un tablou bidimensional se poate face initializand direct continutul tabloului (la fel ca in limbajul C/C++).

De exemplu, pentru declarea si alocarea zonei

de memorie pentru un tablou bidimensional cu numele b de tip int cu doua linii si trei coloane se foloseste instructiunea:

int b[][]={{1, 2, 3}, {7, 8, 9}};

Page 33: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

03.12.2018 Curs - Programare orientată pe obiecte 33

Eliberarea memoriei ocupate de un tablou

Pentru eliberarea memoriei ocupate de un tablou, este suficient sa anulam toate referintele catre tablou.

Interpretorul Java va sesiza automat ca tabloul nu mai este referit si mecanismul de colectare de gunoaie va elibera zona.

Pentru a anula o referinta catre un tablou se da o alta valoare variabilei care refera tabloul.

Valoarea poate fi null sau o referinta catre un alt tablou.

Page 34: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

03.12.2018 Curs - Programare orientată pe obiecte 34

Lungimea tablourilor bidimensionale

Numarul de linii care poate fi stocat intr-un tablou

bidimensional oarecare, este permanent retinut in variabila <nume_tablou>.length

Numarul de coloane ale fiecarei linii i este

permament retinut in variabila <nume_tablou>[i].length

Page 35: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

03.12.2018 Curs - Programare orientată pe obiecte 35

De exemplu: float [][] matrice = new float [3][4]; int dimensiune1 = matrice.length; // dimensiune1

stocheaza valoarea 3

int dimensiune2 = matrice[1].length; // dimensiune2

stocheaza valoarea 4 pentru linia 1

Page 36: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

03.12.2018 Curs - Programare orientată pe obiecte 36

Accesarea (identificarea) unui element al tabloului bidimensional

Pentru a accesa un element al unei matrice se specifica numele matricei din care face parte elementul si pozitia sa in matrice, prin numarul liniei si numarul coloanei corespunzatoare (numerotarea incepe de la linia 0 si coloana 0), astfel:

Nota: Parantezele patrate reprezinta operatorul

de indexare.

<nume_tablou> [<indice_linie>] [<indice_coloana]

Page 37: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

03.12.2018 Curs - Programare orientată pe obiecte 37

Exemplu: int a[4][3]; elementele tabloului sunt: a[0][0], a[0][1], a[0][2], a[1][1], a[1][2], …, a[3][2].

Page 38: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

03.12.2018 Curs - Programare orientată pe obiecte 38

O parcurgere a unui tablou bidimensional se face cu ajutorul instructiunii for astfel:

for (int i = 0 ; i < matrice.length; i++) for (int j = 0; j < matrice[i].length; j++) matrice[i][j] = j;

Page 39: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

03.12.2018 Curs - Programare orientată pe obiecte 39

Exemplu Sa se citeasca elemente de tip intreg si sa se

stocheze intr-un tablou bidimensional, iar apoi sa se

afiseze aceste elemente.

Codul sursa al programului cu numele

matrice.java este urmatorul:

import java.util.*;

public class matrice

{

public static void main(String[] args)throws

IOException

{

Page 40: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

03.12.2018 Curs - Programare orientată pe obiecte 40

/* declararea si citirea variabilelor de memorie in care se vor retine numarul de linii, respectiv numarul de coloane ale tabloului bidimensional */

int n,m; Scanner input = new Scanner(System.in); System.out.print("dati numarul de linii: "); n = input.nextInt(); System.out.print(" dati numarul de coloane: "); m = input.nextInt();

Exemplu

Page 41: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

03.12.2018 Curs - Programare orientată pe obiecte 41

/* declararea variabilei de tip tablou bidimensional A[][] */ int A[ ][ ]= new int[n][m]; // citirea elementelor in tabloul dat int i,j; for(i=0;i<n;i++) for(j=0;j<m;j++) { System.out.print("A["+i+"]["+j+"]="); A[i][j] = input.nextInt(); }

Exemplu

Page 42: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

03.12.2018 Curs - Programare orientată pe obiecte 42

// afisarea elementelor tabloului System.out.println ("Matricea citita este: "); for(i=0;i<n;i++) { for(j=0;j<m;j++) System.out.print(" "+A[i][j]); System.out.println(); }

Exemplu

Page 43: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

03.12.2018 Curs - Programare orientată pe obiecte 43

Executia programului dat, pentru urmatoarele date de intrare are ca efect obtinerea urmatorului rezultat:

Exemplu

Page 44: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

03.12.2018 Curs - Programare orientată pe obiecte 44

Transmiterea de parametri tablou catre metodele unui obiect

Sa presupunem, ca avem o metoda numita

functie care are ca parametru un tablou unidimensional de tip int.

Apelul si definitia metodei arata astfel:

functia(tablouActual); //apelul metodei

void functia(int [ ] tablouFormal); //declaratia

metodei

Page 45: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

03.12.2018 Curs - Programare orientată pe obiecte 45

Conform conventiilor de transmitere a parametrilor in Java pentru tipurile referinta, variabilele tablouActual si tablouFormal refera acelasi obiect-tablou.

Adica, la transmiterea parametrului se copiaza valoarea lui tablouActual, care este o adresa.

Astfel, accesul metodei la elementul tablouFormal[i] este de fapt un acces la elementul tablouActual[i].

Aceasta inseamna ca variabilele continute in sir pot fi modificate de catre metoda.

Observatie: Deoarece tablourile sunt de tip referinta, o metoda poate sa returneze un tablou.

Page 46: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

03.12.2018 Curs - Programare orientată pe obiecte 46

Prelucrari elementare pe tablouri

Programul urmator (loto.java) ilustreaza modul de folosire al tablourilor in Java.

In jocul de loterie, se selecteaza saptamanal sase numere de la 1 la 49.

Programul alege aleator numere pentru 1000 de jocuri si afiseaza apoi de cate ori a aparut fiecare numar in cele 1000 de jocuri.

Page 47: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

03.12.2018 Curs - Programare orientată pe obiecte 47

import java.io.*; public class loto { public static void main(String[ ] args) throws IOException { int[ ] numere = new int[50]; for (int i = 0; i < numere.length; ++i) numere[i] = 0; for (int i = 0; i < 1000; ++i) for (int j = 0; j < 6; ++j) //genereaza numere de loterie intre 1 si 49

numere[(int) (Math.random() * 49) +1]++ ; //numara aparitiile de numere pe joc

for (int k = 1; k <= 49; k++) System.out.println(k + ": " + numere[k]); } }

Page 48: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

03.12.2018 Curs - Programare orientată pe obiecte 48

O executie a programului, in mediul de dezvoltare ECLIPSE, are ca efect obtinerea urmatoarelor rezultate:

31: 113 32: 120 33: 105 34: 130 35: 134 36: 128 37: 109 38: 126 39: 103 40: 131

11: 121 12: 116 13: 133 14: 148 15: 142 16: 129 17: 137 18: 129 19: 120 20: 124

21: 131 22: 114 23: 127 24: 124 25: 111 26: 141 27: 122 28: 107 29: 121 30: 121

41: 128 42: 149 43: 121 44: 142 45: 119 46: 107 47: 122 48: 107 49: 123

1: 139 2: 118 3: 115 4: 108 5: 113 6: 97 7: 108 8: 135 9: 118 10: 114

Page 49: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Tablouri in Java

1. Tablouri unidimensionale(vectori) 2. Tablouri bidimensionale(matrici) 3. Tablouri multidimensionale

03.12.2018 Curs - Programare orientată pe obiecte 49

Page 50: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Tablouri multidimensionale

In Java tablourile multidimensionale sunt de fapt vectori de tablouri.

De exemplu, crearea si instantierea unui tablou cu 3 dimensiuni va fi realizata astfel:

tablou[i] este linia i a tabloului si reprezinta o matrice cu

dim2*dim3 elemente iar tablou[i][j][k] este elementul de pe pozitia i, linia j,

coloana k.

03.12.2018 Curs - Programare orientată pe obiecte 50

Tip tablou[][][] = new Tip[dim1][dim2][dim3];

Page 51: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Copierea vectorilor

Copierea elementelor unui vector a intr-un alt vector b se poate face:

1. fie element cu element

2. fie cu ajutorul metodei System.arraycopy Dupa cum vom vedea, o atribuire de genul b = a are

alta semnificatie decat copierea elementelor lui a in b si nu poate fi folosita in acest scop.

03.12.2018 Curs - Programare orientată pe obiecte 51

Page 52: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Copierea vectorilor

int a[] = {1, 2, 3, 4}; int b[] = new int[4]; // Varianta 1 for(int i=0; i<a.length; i++) b[i] = a[i]; // Varianta 2 System.arraycopy(a, 0, b, 0, a.length); // Nu are efectul dorit b = a;

03.12.2018 Curs - Programare orientată pe obiecte 52

Page 53: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Sortarea vectorilor - clasa Arrays

In Java s-a pus un accent deosebit pe implementarea unor structuri de date si algoritmi care sa simplifice procesul de creare a unui algoritm, programatorul trebuind sa se concentreze pe aspectele specifice problemei abordate.

03.12.2018 Curs - Programare orientată pe obiecte 53

Page 54: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Sortarea vectorilor - clasa Arrays

Clasa java.util.Arrays ofera diverse metode

foarte utile in lucrul cu vectori cum ar fi:

int v[]={3, 1, 4, 2, 0, 8, 5, 9 , 7, 6};

java.util.Arrays.sort(v); // Sorteaza vectorul v

// Acesta va deveni {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

03.12.2018 Curs - Programare orientată pe obiecte 54

sort - sorteaza ascendent un vector, folosind un algoritm de tip Quick-Sort performant, de complexitate O(n*log(n)).

Page 55: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

import java.util.Arrays;

public class SortIntArrayExample {

public static void main(String[] args) {

int[] i1 = new int[]{3,2,5,4,1};

System.out.print("Vector initial: ");

for(int index=0; index < i1.length ; index++)

System.out.print(" " + i1[index]);

Arrays.sort(i1);

System.out.print("Vectorul sortat: ");

for(int index=0; index < i1.length; index++)

System.out.print(" " + i1[index]); } }

03.12.2018 Curs - Programare orientată pe obiecte 55

Executia programului Vector initial: 3 2 5 4 1 Vectorul sortat: 1 2 3 4 5

Sortarea vectorilor - clasa Arrays

Page 56: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Sortarea vectorilor - clasa Arrays

import java.util.Arrays;

public class ArrayDemo {

public static void main(String[] args) {

int intArr[] = {30,20,5,12,55};

Arrays.sort(intArr);

System.out.println("Numerele sortate din vector sunt:");

for(int index=0; index < intArr.length ; index++) {

System.out.println("Numar = " + index);

}

int searchVal = 12;

int retVal = Arrays.binarySearch(intArr, searchVal);

System.out.println("Pozitia valorii 12 este : " + retVal);

}

} 03.12.2018 Curs - Programare orientată pe obiecte 56

Numerele sortate din vector sunt: Numar = 5 Numar = 12 Numar = 20 Numar = 30 Numar = 55 Pozitia valorii 12 este : 1

binarySearch - cautarea binara a unei anumite valori intr-un vector sortat

Page 57: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Sortarea vectorilor - clasa Arrays

03.12.2018 Curs - Programare orientată pe obiecte 57

equals - testarea egalitatii valorilor a doi vectori (au aceleasi numar de elemente si pentru fiecare indice valorile corespunzatoare din cei doi vectori sunt egale)

Page 58: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Sortarea vectorilor - clasa Arrays

import java.util.*; public class FillTest { public static void main(String args[]) { int array[] = new int[6]; Arrays.fill(array, 100); for (int i=0, n=array.length; i < n; i++) { System.out.println(array[i]); } System.out.println(); Arrays.fill(array, 3, 6, 50); for (int i=0, n=array.length; i< n; i++) { System.out.println(array[i]); } } } 03.12.2018 Curs - Programare orientată pe obiecte 58

100 100 100 100 100 100 100 100 100 50 50 50

fill - atribuie fiecarui element din vector o valoare specificata

Page 59: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Exemplu de program cu vectori

Se citeste un numar n.

Sa se calculeze si sa se afiseze un vector care sa contina cifrele numarului dat.

03.12.2018 Curs - Programare orientată pe obiecte 59

Page 60: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Exemplu program cu vectori

import java.util.*;

public class VectorCifre {

public static void main(String[] args) throws IOException

{

int n;

Scanner input = new Scanner(System.in);

System.out.print("dati numarul n: ");

n = input.nextInt();

03.12.2018 Curs - Programare orientată pe obiecte 60

Page 61: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Exemplu de program cu vectori

int V[]= new int[20];

int i=0;

while(n!=0) {

V[i]=n%10;

n=n/10;

i++;

}

int cifre=i;

for(i=0;i<cifre;i++)

System.out.print(V[i]+" ");

}

} 03.12.2018 Curs - Programare orientată pe obiecte 61

Page 62: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Exemplu de program cu vectori

Executia programului:

03.12.2018 Curs - Programare orientată pe obiecte 62

Page 63: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Exemplu de program cu matrici

Se consideră o matrice A cu nxm numere întregi. Se cere să se obţină transpusa sa.

import java.util.*; public class matrice { public static void main(String[] args)throws IOException { int n,m; Scanner input = new Scanner(System.in); System.out.print("dati numarul de linii: "); n = input.nextInt(); System.out.print("dati numarul de coloane: "); m = input.nextInt();

03.12.2018 Curs - Programare orientată pe obiecte 63

Page 64: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Exemplu de program cu matrici

int A[][]= new int[n][m];

int i,j;

for(i=0;i<n;i++)

for(j=0;j<m;j++) {

System.out.print("A["+i+"]["+j+"]=");

A[i][j]= input.nextInt();

}

System.out.println ("Matricea citita este: ");

for(i=0;i<n;i++) {

for(j=0;j<m;j++) System.out.print(" "+A[i][j]);

System.out.println();

} 03.12.2018 Curs - Programare orientată pe obiecte 64

Page 65: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Exemplu de program cu matrici

int B[][]= new int[m][n]; for(i=0;i<n;i++) for(j=0;j<m;j++) B[j][i]=A[i][j]; System.out.println ("Matricea transpusa este: "); for(i=0;i<m;i++) { for(j=0;j<n;j++) System.out.print(" "+B[i][j]); System.out.println(); } } }

03.12.2018 Curs - Programare orientată pe obiecte 65

Page 66: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Exemplu de program cu matrici Executia programului:

03.12.2018 Curs - Programare orientată pe obiecte 66

Page 67: 9 JAVA Limbajul JAVA. Tablouri03.12.2018 Curs - Programare orientată pe obiecte 33 Eliberarea memoriei ocupate de un tablou Pentru eliberarea memoriei ocupate de un tablou, este suficient

[email protected]

Întrebări?

03.12.2018 Curs - Programare orientată pe obiecte 67