Vous êtes sur la page 1sur 24

Licence Génie Logiciel Le langage Java année universitaire 2016/2017

Les tableaux statiques

Professeur : C. Fessard Les tableaux statiques 1


Licence Génie Logiciel Le langage Java année universitaire 2016/2017

Notion de types composés et tableaux


Un langage de programmation évolué doit fournir le moyen de composer les types élémentaires (type de base) pour
construire des types plus complexes, les types composés (type évolué).

Exemples de données structurées

Un tableau est une variable de type composée (évoluée).

Un tableau (variable indicée) est une collection de valeurs homogènes,


constitué d’éléments qui sont tous du même type.
Ensemble de valeurs portant le même nom de variable et repérées par un indice
(indice(indice)

Il existe deux sortes de tableaux


 Ceux de taille fixe, les tableaux statiques
 Ceux dont la taille peut varier en cours d’exécution, les tableaux dynamiques

Professeur : C. Fessard Les tableaux statiques 2


Licence Génie Logiciel Le langage Java année universitaire 2016/2017

Gestion mémoire des variables bases/évoluées


Type de base
Toute variable de type primitif (ou de base) stocke directement une valeur :

Type évolué
Toute variable de type évolué, comme les tableaux, les chaînes de caractères (String) ou objet que vous allez voir dans
ce cours, stocke une référence (adresse) vers une valeur :

Professeur : C. Fessard Les tableaux statiques 3


Licence Génie Logiciel Le langage Java année universitaire 2016/2017

Les tableaux statiques (taille fixe)


Exemple : Tableau scores contenant 4 int
scores[0] scores[1] scores[2] scores[3]

1000 1500 2490 6450

 On peut définir des tableaux de int, de double, de bool , ... de n’importe quel autre type (de base ou évolué).
 Un tableau est une variable de type évolué donc une référence (adresse) vers une valeur.
 Attention ! Les indices correspondant aux éléments d’un tableau de taille T varient entre 0 et T-1
 Attention ! L’indice est toujours un entier

Déclaration d’un tableau de taille fixe ou

Déclaration d’une variable évolué scores qui référence un tableau d’entiers de taille fixe.

Exemples d’erreur sur l’indice

Il existe deux techniques pour initialiser les éléments :


1. Dans l’instruction de déclaration
2. Dans des instructions séparées

Professeur : C. Fessard Les tableaux statiques 4


Licence Génie Logiciel Le langage Java année universitaire 2016/2017

Initialisation d’un tableau dans l’instruction de déclaration


L’on connaît les valeurs de tous les éléments lors de la déclaration du tableau

Situation en mémoire
Important : Un tableau n’est pas de type de base, il est donc manipulé via une référence !

On dit que la variable scores référence (ou pointe vers) un tableau d’entiers.
La variable scores contient une adresse : l’emplacement du tableau en mémoire !

Professeur : C. Fessard Les tableaux statiques 5


Licence Génie Logiciel Le langage Java année universitaire 2016/2017

Initialisation d’un tableau dans des instructions séparées


Dans le cas général, on ne connaît pas les valeurs de tous les éléments lors de la déclaration du tableau
On utilise alors plusieurs instructions pour déclarer et initialiser :
1. Déclarer le type du tableau
2. Construire le tableau avec : new type [ taille ]
3. remplir le tableau élément par élément

Déclaration-construction d’un tableau de taille fixe


Deux instructions distinctes

Une seule instruction

 L’instruction new int[4]; alloue l’emplacement nécessaire à un tableau de 4 éléments de type entier et en place la
référence dans scores (notez que la variable tableau une fois créé ne pourra pas voir sa taille modifiée).
 En revanche, comme n’importe quelle référence à un objet, la référence contenue dans scores pourra très bien
évoluer au fil de l’exécution et désigner finalement des tableaux différents.

Valeurs par défaut


Chaque élément d’un tableau reçoit une valeur par défaut lors de la construction avec new

Professeur : C. Fessard Les tableaux statiques 6


Licence Génie Logiciel Le langage Java année universitaire 2016/2017

Une fois le tableau déclaré et construit, il faut le remplir élément par élément :

Professeur : C. Fessard Les tableaux statiques 7


Licence Génie Logiciel Le langage Java année universitaire 2016/2017

Accès direct aux éléments d’un tableau


Exemple : Tableau scores contenant 4 entiers
Scores[0] Scores[1] Scores[2] Scores[3]

1000 1500 2490 6450

- Les indices des tableaux commencent 0 et non à 1. Donc attention, tab [2] est le troisième élément du tableau tab!

Attention !
 Les indices correspondant aux éléments d’un tableau de taille T varient entre 0 et T-1
 Il n’y a pas de contrôle de débordement ! ! Il est impératif que l’élément que vous référencez existe effectivement.

Démo : Erreur accès mémoire

Il est impératif que l’élément auquel vous voulez accéder existe effectivement !

Attention ! En cas de débordement une exception est lancée par le programme


=> situation d’erreur provoquant l’arrêt du programme si on ne la traite pas

Professeur : C. Fessard Les tableaux statiques 8


Licence Génie Logiciel Le langage Java année universitaire 2016/2017

Afficher un tableau de taille fixe

=> affiche la référence au tableau tab, donc une adresse.

Si l’on veut faire afficher les éléments du tableau référencé par tab, il faut prévoir une structureitérative.

Il existe en fait au moins trois façons d’itérer sur un tableau :

1. avec les itérations sur ensemble de valeurs

Attention Cette structure ne s’applique qu’à des consultations de valeurs, et en aucun cas à des modifications.

2. avec une itération for « classique »

3. avec des itérateurs (non présenté dans ce cours)

Professeur : C. Fessard Les tableaux statiques 9


Licence Génie Logiciel Le langage Java année universitaire 2016/2017

Nombre d’éléments d’un tableau (taille)


Pour connaître la taille d’un tableau :

Erreur classique : accès avant construction

Professeur : C. Fessard Les tableaux statiques 10


Licence Génie Logiciel Le langage Java année universitaire 2016/2017

Types de base / Types évolué (rappel)

Professeur : C. Fessard Les tableaux statiques 11


Licence Génie Logiciel Le langage Java année universitaire 2016/2017

Tableaux : sémantique de l’opérateur =

L’objet que constitue le tableau de trois entiers anciennement


désigné par t1 n’est plus référencé, il deviendra candidat au
ramasse-miettes.

Professeur : C. Fessard Les tableaux statiques 12


Licence Génie Logiciel Le langage Java année universitaire 2016/2017

Exercice
Donner le schémé mémoire de l’exécution de ces deux codes.

Professeur : C. Fessard Les tableaux statiques 13


Licence Génie Logiciel Le langage Java année universitaire 2016/2017

Tableaux : sémantique de l’opérateur ==


 L’opérateur a == b teste si les variables a et b référencent le même emplacement mémoire.
 L’opérateur a == b ne teste pas l’égalité des valeurs contenues dans les tableaux pointés par a et b !

Professeur : C. Fessard Les tableaux statiques 14


Licence Génie Logiciel Le langage Java année universitaire 2016/2017

Quelques exemples de manipulation de tableaux


 si l’on n’a pas besoin d’expliciter les indices

 si l’on veut expliciter les indices

Professeur : C. Fessard Les tableaux statiques 15


Licence Génie Logiciel Le langage Java année universitaire 2016/2017

Tableaux à plusieurs dimensions


 On connaît tous les éléments lors de la déclaration

 On ne connaît pas tous les éléments lors de la déclaration

Professeur : C. Fessard Les tableaux statiques 16


Licence Génie Logiciel Le langage Java année universitaire 2016/2017

Parcourir un Tableau à plusieurs dimensions


Le moyen le plus naturel de parcourir un tableau multidimensionnel consiste à utiliser des boucles for imbriquées :

Professeur : C. Fessard Les tableaux statiques 17


Licence Génie Logiciel Le langage Java année universitaire 2016/2017

Annexe code source


Initialisation d’un tableau dans des instructions séparées
int[] scores = new int[4];
scores[0] = 1000;
scores[1] = 1500;
scores[2] = 2490;
scores[3] = 6450;

Accès direct aux éléments d’un tableau


Démo : Erreur accés mémoire
public class Principale {
public static void main(String[] args) {
int[] scores = { 1000, 1500, 2490, 6450 };
System.out.println("scores[4]="+scores[4]);
}

Afficher un tableau de taille fixe


double[] t1 = {1.1, 2.2, 3.4} ;
System.out.println(t1);

Afficher un tableau de taille fixe


double[] tab = {1.1, 2.2, 3.4} ;
for(double element : tab){
System.out.print(element + " ");
}

Professeur : C. Fessard Les tableaux statiques 18


Licence Génie Logiciel Le langage Java année universitaire 2016/2017
double[] tab = {1.1, 2.2, 3.4} ;
for(int i=0; i < tab.length ; ++i){
System.out.print(tab[i] + " ");
}

Nombre d’éléments d’un tableau (taille)


int[] scores1 = {1000, 1500, 2490, 6450};
System.out.println(scores1.length); // 4
int[] scores2 = new int[2];
System.out.println(scores2.length); // 2

Erreur classique : accès avant construction


int[] entiers1 = {1, 2, 3}; // Déclaration-initialisation
entiers1[0] = 4; // OK
int[] entiers2; // Déclaration
entiers2[0] = 4; // Erreur !

int[] entiers1 = {1, 2, 3}; // Déclaration-initialisation


entiers1[0] = 4; // OK
int[] entiers2; // Déclaration
entiers2 = new int[10]; // Initialisation
entiers2[0] = 4;

Tableaux : sémantique de l’opérateur =


int tab1[] = new int[3] ;
for (int i=0 ; i<3 ; i++)
tab1[i] = i ;
int [] tab2 = new int[2] ;
for (int i=0 ; i<2 ; i++)
tab2[i] = 10 + i ;
tab1 = tab2 ;

// Les tableaux a et b pointent vers deux emplacements


// différents en memoire

Professeur : C. Fessard Les tableaux statiques 19


Licence Génie Logiciel Le langage Java année universitaire 2016/2017
int[] a = new int[10]; // tableau de 10 entiers
int[] b = new int[10]; // tableau de 10 entiers
for (int i = 0; i < a.length; ++i) {
a[i] = i; // remplissage du tableau pointé par a
}
b = a; // opérateur = (affectation)
System.out.println("a[2] vaut " + a[2] + " et b[2] vaut " + b[2]);
a[2] = 42;
System.out.println("a[2] vaut " + a[2] + " et b[2] vaut " + b[2]);

// Les tableaux a et b pointent vers deux emplacements


// différents en memoire
int[] a = new int[10]; // tableau de 10 entiers
int[] b = new int[10]; // tableau de 10 entiers
for (int i = 0; i < a.length; ++i) {
a[i] = i; // remplissage du tableau pointé par a
}
for(int i = 0; i < a.length; ++i) {
b[i] = a[i];
}
System.out.println("a[2] vaut " + a[2] + " et b[2] vaut " + b[2]);
a[2] = 42;
System.out.println("a[2] vaut " + a[2] + " et b[2] vaut " + b[2]);

Tableaux : sémantique de l’opérateur ==


public class Principale {
public static void main(String[] args) {

// Les tableaux a et b pointent vers deux emplacements


// différents en memoire
int[] a = new int[10]; // tableau de 10 entiers
int[] b = new int[10]; // tableau de 10 entiers
for (int i = 0; i < a.length; ++i) {
a[i] = i; // remplissage du tableau pointé par a
}
for(int i = 0; i < a.length; ++i) {
b[i] = a[i];
}
if (a == null || b == null || a.length != b.length) {
System.out.println("contenus différents ou nuls");
}

Professeur : C. Fessard Les tableaux statiques 20


Licence Génie Logiciel Le langage Java année universitaire 2016/2017
else {
int i = 0;
while(i < a.length && (a[i] == b[i])) {
++i;
}
if (i >= a.length) {
System.out.println("contenus identiques");
}
else {
System.out.println("contenus différents");
}
}

}
}

Quelques exemples de manipulation de tableaux


System.out.print("Le tableau contient : ");
for(int element : tab) {
System.out.print(element + " ");
}
System.out.println();

System.out.println("Le tableau contient : ");


for(int element : tab) {
for(int i = 0; i < tab.length; ++i) {
System.out.println("L'élément " + i + " vaut " + tab[i]);
}
}

Scanner scanner = new Scanner(System.in);


int[] tab = new int[4];
for(int i = 0; i < tab.length; ++i) {
System.out.println("Entrez l'élément " + i + ":");
tab[i] = scanner.nextInt();
}

Professeur : C. Fessard Les tableaux statiques 21


Licence Génie Logiciel Le langage Java année universitaire 2016/2017

Tableaux à plusieurs dimensions


int[][] y = { {1, 2}, {3, 4}, {5, 6} };

int[][] y = new int[3][2];

y[0][0] = 1;
y[0][1] = 2;
y[1][0] = 3;
y[1][1] = 4;
y[2][0] = 5;
y[2][1] = 6;

Parcourir un Tableau à plusieurs dimensions


int[][] y = { {1, 2}, {3, 4}, {5, 6} };
System.out.println(y[0].length); // 2
System.out.println(y[1].length); // 2
System.out.println(y[2].length); // 2
for(int i = 0; i < y.length; ++i) {
for(int j = 0; j < y[i].length; ++j) {
System.out.print(y[i][j] + " " );
}
System.out.println();
}

Professeur : C. Fessard Les tableaux statiques 22


Licence Génie Logiciel Le langage Java année universitaire 2016/2017

Figures
Notion de types de bases et types composés
Un langage de programmation évolué doit fournir le moyen de composer les types élémentaires pour construire des
types plus complexes, les types composés.
Exemples de données structurées

Tableau Autre (plus tard)

Professeur : C. Fessard Les tableaux statiques 23


Licence Génie Logiciel Le langage Java année universitaire 2016/2017

Ajout
Types de base et types évolués (2) I Toute variable de type de base stocke directement une valeur
I Toute variable de type évolué stocke une référence vers une valeur
+ Attention : ceci a une très grande incidence sur la sémantique des
opérateurs = et == en Java !
+ Cela a aussi un incidence sur l’affichage
I double x = 13.5 veut dire « J’affecte à x la valeur 13.5 »
I String s = "coucou" veut dire « J’affecte à s une référence à la chaîne de
caractères coucou »
En clair, si v1 et v2 sont de type évolué :
I v1 = v2 affecte l’adresse de v2 à la variable v1
I v1 == v2 compare l’adresse de v2 avec celle de v1
I System.out.println(v1); affiche l’adresse de v1 (dans le cas général)
Nous y reviendrons . . .

Professeur : C. Fessard Les tableaux statiques 24

Vous aimerez peut-être aussi