Cours 4 du 15 février

 

Tableaux (suite)

Tableaux, boucles et invariants

 

(1)   Généralités

 

·        Un tableau est un regroupement d’éléments de même type auxquels on accède par un indice entier.

·        En java on peut construire des tableaux à partir de n’importe quel type.

·        En java un tableau est un objet.

·        En java un tableau a une taille fixe (qui peut être nulle) obtenue par length

·        En java les indices du tableau vont de 0 à length-1

·        En java une tentative d’accès hors des bornes du tableau provoque un erreur (exception IndexOutOfBoundException)

 

Il faut distinguer entre une variable d’un type et un objet tableau.

 

Déclaration d’une variable de type tableau d’entiers :

int [] tab ;

 

 

 

 


Création d’un objet tableau de 4 entiers :

tab=new int[4] ;

 

 

 

 

 

 

 

 


Un objet tableau a une taille fixe.

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

t[4] provoque une exception

 

(les entiers sont directement dans les cases du tableau parce que int est un type primitif)

 

 

 

 

 

 

 

 

 

 

 


(2)   Les tableaux sont des objets

·        L’affectation ne copie pas le tableau.

int [] t ;

t=tab ;

 

 

 

 

 

 

 

 

 

 

 


o       On peut définir une copie de tableau :

 

 

    static int[] copier(int[] x){

        int n = x.length;

        int[] y = new int[n];

       

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

            y[i] = x[i];

        return y;

    }

 

        t=copier(tab) ;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


·        L’égalité == teste si les variables sont des références sur le même tableau. On peut tester l’égalité des contenus. (S’il s’agit d’un tableau d’objets –et non d’int- cette égalité serait l’égalité des références)

 

    static boolean estEgal(int[] x, int[] y){

        if(x.length != y.length) return false;

        for(int i = 0; i < x.length; i++)

            if(x[i] != y[i])

                return false;

        return true;

    }

 

·       Une méthode peut avoir un tableau en paramètre :

 

    public static void remplir(int [] t){

        for(int i=0;i<t.length;i++){

            t[i]=(int)(Math.random()*1000);

        }

    } 

 

On remarquera :

§         le contenu du tableau t est modifié dans la méthode (même si le passage de paramètre est un passage par valeur, le paramètre est une référence sur un objet tableau, la valeur de la référence n’est pas modifiée)

§         la méthode (static) Math.random() retourne un double compris entre 0 et 1, ici en multipliant par 1000 et en forçant le type à int on obtient un entier aléatoire entre 0 et 1000.

·        Une méthode peut retourner un tableau.

 

    public static int [] retourne(int [] t){

        int [] r=new int[t.length];

        for(int i=0;i<t.length;i++){

            r[r.length-i-1]=t[i];

        }

        return r;

    }

 

Cette méthode retourne un tableau de même taille contenant le tableau « à l’envers»

 

Manipulations sur les identite et les comptes

 

 

 

 

Compléments sur les tableaux

(b)Initialisations
On peut initialiser les tableaux  (on notera que le dernier exemple crée un objet tableau sans passer par une variable).


int [] t={1,2,3} ;

String [] animaux={"chien", "chat", "souris"} ;

int [][]tab={{1,2},{0,3}};

somme(new int [] {1,2,3});

 

(c) tableaux à plusieurs dimensions

Comme on peut construire des tableaux à partir de n'importe quel type, on peut construire des tableaux sur des types tableaux: les tableaux de tableaux correspondent à des tableaux à plusieurs dimensions.

 

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

int [][] tab= new int [3][];

 

Notons que : t.length vaudra 2 (car t est un tableau de 2 tableaux de 3 entiers) et tab est un tableau de 3 tableaux d'entiers (les objets associés ne sont pas créés). t[0].length vaut 3 car c'est un tableau de 3 entiers.

 

Exemples:

Produit de matrices:

    // un produit de matrices

    public static int[][] produit(int [][]t1,int [][]t2){

        int [][]r=new int[t1.length][t2[0].length];

        for(int i=0;i<t1.length;i++)

            for(int j=0;j<t2[0].length;j++){

            r[i][j]=0;

            for(int k=0;k<t1[0].length;k++)

                r[i][j]+=t1[i][k]*t2[k][j];

            }

        return r;

    }

 

Comme un tableau à plusieurs dimensions est un tableau de tableau, rien n'oblige à ce que chacun de ces tableaux aient la même dimension. On peut par exemple faire des tableaux triangulaires. L'exemple suivant construit un triangle de Pascal.

 

    // tableaux de tableaux...

    // un tableau triangulaire...

    // le triangle de pascal

    public static int[][] pascal(int n){

        int[][] p=new int[n][];

        p[0]=new int[1];

        p[0][0]=1;

        for(int i=1;i<p.length;i++){

            p[i]=new int[i+1];

            p[i][0]=1;

            for(int j=1; j<i;j++){

                p[i][j]=p[i-1][j-1]+p[i-1][j];

            }

            p[i][i]=1;

        }

        return p;

    }