Adloun

Tableaux

Cours · programmation Java (école d'ingénieur), chapitre 5 · école d'ingénieur, informatique · le début du chapitre, la suite sur Adloun

Un professeur veut calculer la moyenne de sa classe, puis afficher les notes supérieures à cette moyenne. Avec cinq élèves, on pourrait déclarer cinq variables n0, n1, …, n4. Avec trente élèves, ou un nombre d'élèves connu seulement à l'exécution, c'est impossible. Il faut une variable capable de contenir plusieurs valeurs, que l'on désigne par leur numéro : un tableau.


/** Chapitre 5 — un tableau de notes : moyenne et notes au-dessus de la moyenne. */
public class Notes {
    public static void main(String[] args) {
        double[] notes = {12.5, 8.0, 15.0, 17.5, 9.5};
        double somme = 0;
        for (int i = 0; i < notes.length; i++) {
            somme = somme + notes[i];
        }
        double moyenne = somme / notes.length;
        System.out.println("Moyenne : " + moyenne);
        System.out.print("Au-dessus de la moyenne :");
        for (int i = 0; i < notes.length; i++) {
            if (notes[i] > moyenne) {
                System.out.print(" " + notes[i] + " (élève " + i + ")");
            }
        }
        System.out.println();
    }
}

Moyenne : 12.5
Au-dessus de la moyenne : 15.0 (élève 2) 17.5 (élève 3)

Le programme fonctionne tel quel pour trente notes, ou pour mille : seule la première ligne change. Les tableaux sont la première structure de données de ce livre ; on les retrouvera dans presque tous les programmes.

Objectifs du chapitre

  • Déclarer, créer et initialiser un tableau ; accéder à ses cases par leur indice, de à length - 1.
  • Parcourir un tableau avec une boucle for ou for-each.
  • Comprendre qu'un tableau est désigné par une référence : partage, comparaison, passage en paramètre, copie.
  • Utiliser la classe Arrays et les tableaux à deux dimensions.
  • Programmer les algorithmes classiques : somme, maximum, recherche, comptage, renversement, insertion, tri.

5.1 Créer et utiliser un tableau

5.1.1 Déclaration, création, accès

Définition 5.1Tableau

Un tableau est une suite de cases de même type, en nombre fixé à sa création. Les cases sont numérotées de à , où est la longueur du tableau, accessible par t.length. La case d'indice se note t[i].

Le type « tableau d'entiers » s'écrit int[]. Il y a deux façons de créer un tableau :


/** Chapitre 5 — créer un tableau ; valeurs par défaut. */
public class Creation {
    public static void main(String[] args) {
        int[] carres = new int[6];               // 6 cases, toutes à 0
        for (int i = 0; i < carres.length; i++) {
            carres[i] = i * i;
        }
        System.out.println(carres[0] + " " + carres[1] + " " + carres[5]);

        double[] d = new double[2];
        boolean[] b = new boolean[2];
        char[] c = new char[2];
        String[] s = new String[2];
        System.out.println(d[0] + " " + b[0] + " " + (int) c[0] + " " + s[0]);
    }
}

0 1 25
0.0 false 0 null
Proposition 5.2Valeurs par défaut

Un tableau créé par new a toutes ses cases initialisées à une valeur par défaut : 0 pour les nombres, false pour les booléens, le caractère de code pour les char, et null (« aucun objet ») pour les chaînes et autres objets.

La longueur d'un tableau est fixée une fois pour toutes : on ne peut ni ajouter ni retirer de case. Pour « agrandir » un tableau, il faut en créer un plus grand et y recopier les valeurs (section 5.3). Les listes du chapitre 12 lèveront cette limitation.

5.1.2 Les indices vont de 0 à length - 1

C'est la source d'erreur la plus fréquente sur les tableaux. Dans un tableau de longueur , les indices valides sont , et ; l'indice n'existe pas.


/** Chapitre 5 — accès en dehors des indices valides. */
public class HorsBornes {
    public static void main(String[] args) {
        int[] t = {10, 20, 30};
        for (int i = 0; i <= t.length; i++) {   // <= : une case de trop
            System.out.println(t[i]);
        }
    }
}

10
20
30
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
    at HorsBornes.main(HorsBornes.java:6)

Le programme compile : le compilateur ne connaît pas les valeurs des indices. C'est à l'exécution que Java vérifie chaque accès, et arrête le programme sur une exception dès qu'un indice sort de l'intervalle. Le message est précis : l'indice fautif (), la longueur du tableau (), et la ligne du programme ().

Écrire i < t.length, pas i <= t.length

La boucle canonique de parcours d'un tableau est for (int i = 0; i < t.length; i++). Elle parcourt exactement les indices , c'est-à-dire l'intervalle . Le dernier élément est t[t.length - 1], et non t[t.length].

5.1.3 Le parcours for-each

Quand on veut seulement lire toutes les cases, dans l'ordre, sans avoir besoin de leur indice, Java propose une boucle plus courte.


/** Chapitre 5 — la boucle for-each. */
public class PourChaque {
    public static void main(String[] args) {
        String[] jours = {"lundi", "mardi", "mercredi"};
        for (String j : jours) {
            System.out.println(j.toUpperCase());
        }
        int[] t = {3, 1, 4, 1, 5};
        int max = t[0];
        for (int x : t) {
            if (x > max) max = x;
        }
        System.out.println("max = " + max);
    }
}

LUNDI
MARDI
MERCREDI
max = 5

On lit for (int x : t) « pour chaque x de t ». À chaque tour, x reçoit une copie de la case suivante.

Le for-each ne modifie pas le tableau

Dans for (int x : t) { x = 0; }, c'est la copie x qui est mise à zéro, pas la case du tableau. Pour modifier les cases, ou si l'on a besoin de l'indice (afficher « élève 2 », comparer t[i] et t[i+1]), on garde la boucle for avec indice.

5.2 Un tableau est une référence

5.2.1 Pile et tas

Les variables de type int ou double contiennent directement leur valeur. Une variable de type tableau, elle, ne contient pas les cases : elle contient une référence, c'est-à-dire l'adresse en mémoire où se trouve le tableau.

Définition 5.3Référence

Les tableaux (et, plus généralement, les objets) sont créés dans une zone de la mémoire appelée le tas. Une variable de type tableau contient une référence vers un tableau du tas, ou la valeur spéciale null si elle ne désigne aucun tableau.

Une conséquence importante : l'affectation b = a recopie la référence, pas le tableau. Les deux variables désignent alors le même tableau.

La suite du cours est sur Adloun

Le chapitre en entier, formules et figures comprises, avec le tuteur, les fiches, les QCM et les exercices.

Lire la suite du cours

En accès libre, sans inscription.

Exercices corrigés de ce chapitre

Lire la suite du cours →