26
IFT 1010 - Programmation 1 Tableaux ebastien Roy & Fran¸ cois Duranleau epartement d’informatique et de recherche op´ erationelle Universit´ e de Montr´ eal automne 2004

IFT 1010 - Programmation 1 Tableauxpift1015/cours/tableaux.pdf · 2007. 1. 15. · IFT 1010 - Programmation 1 Tableaux S¶ebastien Roy & Fran»cois Duranleau D¶epartement d’informatique

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: IFT 1010 - Programmation 1 Tableauxpift1015/cours/tableaux.pdf · 2007. 1. 15. · IFT 1010 - Programmation 1 Tableaux S¶ebastien Roy & Fran»cois Duranleau D¶epartement d’informatique

IFT 1010 - Programmation 1

Tableaux

Sebastien Roy & Francois Duranleau

Departement d’informatique et de recherche operationelle

Universite de Montreal

automne 2004

Page 2: IFT 1010 - Programmation 1 Tableauxpift1015/cours/tableaux.pdf · 2007. 1. 15. · IFT 1010 - Programmation 1 Tableaux S¶ebastien Roy & Fran»cois Duranleau D¶epartement d’informatique

Au programme

[Tasso :9] et [Nino : 22.1]

• Concept des tableaux

• Declaration et instanciation

• Indexation

• Tableaux en Java

• Bornes des tableaux

• Limite des tableaux

• Tableaux d’objets

• Tableaux a deux dimensions

• Tableaux a N dimensions

1

Page 3: IFT 1010 - Programmation 1 Tableauxpift1015/cours/tableaux.pdf · 2007. 1. 15. · IFT 1010 - Programmation 1 Tableaux S¶ebastien Roy & Fran»cois Duranleau D¶epartement d’informatique

Stockage d’information

– Limite du seul usage de types simples ou des objets tels que

presentes jusqu’ici : on ne peut pas traiter une quantite

arbitraire d’information a la fois.

– Et si la quantite d’element a manipuler et a conserver en

memoire n’etait pas connue au moment de la compilation ?

Ex. : Trier des nombres lus au clavier.

– Soit un programme qui manipule 8 colis postal a la fois.

On aurait les declarions suivantes :

ColisPostal c1, c2, c3, c4, c5, c6, c7, c8 ;

Et si on voulait maintenant 9 colis ? 1000 ?

→ On a besoin d’une facon de stocker des ensembles arbi-

traires d’information ⇒ les tableaux.2

Page 4: IFT 1010 - Programmation 1 Tableauxpift1015/cours/tableaux.pdf · 2007. 1. 15. · IFT 1010 - Programmation 1 Tableaux S¶ebastien Roy & Fran»cois Duranleau D¶epartement d’informatique

Definitions

Tableau

Une structure composee d’une sequence contigue de va-

riables, toutes de meme type.

Cellule

Element d’un tableau. Il s’agit du sous-ensemble de l’espace

memoire du tableau ou est stocke l’une de ses variables.

Exemple :

Un tableau de 5 entiers (rappel : un entier prend 4 octets

en memoire).

Cellule 1 Cellule 2 Cellule 3 Cellule 4 Cellule 5

0 4 8 12 16 20

Cellules:

Octets:

3

Page 5: IFT 1010 - Programmation 1 Tableauxpift1015/cours/tableaux.pdf · 2007. 1. 15. · IFT 1010 - Programmation 1 Tableaux S¶ebastien Roy & Fran»cois Duranleau D¶epartement d’informatique

Instanciation

– La methode d’instanciation (ou d’allocation) des tableaux

varient beaucoup d’un langage a l’autre.

– En Java, on cree un tableau ainsi :

Type[] nomDuTableau ;

nomDuTableau = new Type[ combien ] ;

ou

– Type est le type de chaque cellule du tableau.

– combien est une expression de type entier qui indique

combien de cellules le tableau contiendra. Evidemment,

cette valeur doit etre ≥ 1.

– nomDuTableau est une reference sur l’espace memoire

totale du tableau.

4

Page 6: IFT 1010 - Programmation 1 Tableauxpift1015/cours/tableaux.pdf · 2007. 1. 15. · IFT 1010 - Programmation 1 Tableaux S¶ebastien Roy & Fran»cois Duranleau D¶epartement d’informatique

Exemple

int[] tab = new int[ 5 ] ;

0x28572956tab

0x28572956+4

0x28572956

0x28572956+8

0x28572956+12

0x28572956+16

Cellule 1

Cellule 2

Cellule 3

Cellule 4

Cellule 5

La premiere cellule est au debut du bloc de memoire. La seconde

est 4 octets plus loin, la troisieme 8, etc..

5

Page 7: IFT 1010 - Programmation 1 Tableauxpift1015/cours/tableaux.pdf · 2007. 1. 15. · IFT 1010 - Programmation 1 Tableaux S¶ebastien Roy & Fran»cois Duranleau D¶epartement d’informatique

Initialisation

– En Java, la valeur initiale de chaque cellule est 0 pour les

nombres, le caractere 0 pour les caracteres, ou null pour

les objets (y compris les chaınes de caracteres).

Avertissement : ce n’est pas le cas de tous les langages ! !

Il faut etre vigilent.

– Il est possible d’instancier un tableau avec des valeurs

initiales comme ceci :

Type[] nom = { valeur 1, valeur 2, ..., valeur N } ;

ou valeur i (i = 1..N) est la valeur initiale de la ie

cellule. Le tableau resultant aura N cellules.

6

Page 8: IFT 1010 - Programmation 1 Tableauxpift1015/cours/tableaux.pdf · 2007. 1. 15. · IFT 1010 - Programmation 1 Tableaux S¶ebastien Roy & Fran»cois Duranleau D¶epartement d’informatique

Exemple

int[] tab = { -4, 50, 80, 0, 1 } ;

0x28572956tab

0x28572956+4

0x28572956

0x28572956+8

0x28572956+12

0x28572956+16

Cellule 2:

Cellule 3:

Cellule 4:

Cellule 5:

Cellule 1:

50

80

0

1

−4

7

Page 9: IFT 1010 - Programmation 1 Tableauxpift1015/cours/tableaux.pdf · 2007. 1. 15. · IFT 1010 - Programmation 1 Tableaux S¶ebastien Roy & Fran»cois Duranleau D¶epartement d’informatique

Indexation

– Un tableau peut etre considere comme un objet, mais sa

composition est uniforme et sa taille totale en memoire

n’est pas definie par une classe.

– L’attribut est a la classe ce que la cellule est au tableau (du

point de vue composition). Avec des classes, pour acceder

a un attribut, on fait quelque chose comme

instance.attribut

Comment acceder a une cellule d’un tableau ?

→ Par indexation.

8

Page 10: IFT 1010 - Programmation 1 Tableauxpift1015/cours/tableaux.pdf · 2007. 1. 15. · IFT 1010 - Programmation 1 Tableaux S¶ebastien Roy & Fran»cois Duranleau D¶epartement d’informatique

Indexation

En reprenant l’exemple du tableau de 5 entiers, on peut reecrire

l’adresse de chaque cellule ainsi :

0x28572956+4*3

0x28572956+4*4

0x28572956+4*1

0x28572956+4*2

0x28572956+4*0

=> index = 3

=> index = 4

=> index = 1

=> index = 2

=> index = 0

0x28572956tab

Cellule 1

Cellule 2

Cellule 3

Cellule 4

Cellule 5

Une indexation naturelle en decoule : 1re cellule ⇒ 0, 2e cellule

⇒ 1, etc..

9

Page 11: IFT 1010 - Programmation 1 Tableauxpift1015/cours/tableaux.pdf · 2007. 1. 15. · IFT 1010 - Programmation 1 Tableaux S¶ebastien Roy & Fran»cois Duranleau D¶epartement d’informatique

Indexation en Java

– Soit un tableau contenant N cellules. Pour acceder a la ie

cellule (i = 1..N), la syntaxe en Java est :

nomDuTableau[ i − 1 ]

De facon plus generale, on ecrit :

nomDuTableau[ index ]

ou index est une expression entiere dont l’evaluation donne

l’index qu’on desirer acceder. Cette valeur doit etre entre

0 et N − 1.

– On peut se servir de l’indexation pour acceder a une valeur

d’une cellule ou pour y en affecter une autre.

Remarque : Certains langages permettent des indexations plus

arbitraires (p.ex. Pascal, Modula).

10

Page 12: IFT 1010 - Programmation 1 Tableauxpift1015/cours/tableaux.pdf · 2007. 1. 15. · IFT 1010 - Programmation 1 Tableaux S¶ebastien Roy & Fran»cois Duranleau D¶epartement d’informatique

Exemple 1

Lecture de N notes au clavier

// Lecture du nombre de notes a lire

System.out.print( "Combien de notes? " );

int N = Keyboard.readInt();

// Instanciation du tableau de notes

double[] notes = new double[ N ];

// Lectures des notes

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

{

System.out.print( "Entrez la notes no. " +

(i + 1) + ": " );

notes[ i ] = Keyboard.readDouble();

}

11

Page 13: IFT 1010 - Programmation 1 Tableauxpift1015/cours/tableaux.pdf · 2007. 1. 15. · IFT 1010 - Programmation 1 Tableaux S¶ebastien Roy & Fran»cois Duranleau D¶epartement d’informatique

Exemple 2

Calculer la moyenne des N notes lus au clavier

// (fait suite a l’exemple 1)

double moy = 0.0; // la moyenne

// Effectuer d’abord la sommation des notes

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

moy += notes[ i ];

// Calcul final de la moyenne (somme / nombre total)

moy /= N;

12

Page 14: IFT 1010 - Programmation 1 Tableauxpift1015/cours/tableaux.pdf · 2007. 1. 15. · IFT 1010 - Programmation 1 Tableaux S¶ebastien Roy & Fran»cois Duranleau D¶epartement d’informatique

Particularite de Java

– Un tableau en Java est en realite bel et bien un objet, mais

il n’a pas de classe propre a lui.

– Les tableaux en Java ont un attribut : length. Soit tab

une reference sur un tableau quelconque, alors

tab.length

donne la longueur (i.e. le nombres de cellules) du tableau.

Note : Il est impossible de modifier la valeur de cet attribut.

Sa valeur est fixee lors de l’instanciation du tableau.

– Comme dans la grande majorite des langages, les tableaux

sont passes par references en parametre des fonctions.

13

Page 15: IFT 1010 - Programmation 1 Tableauxpift1015/cours/tableaux.pdf · 2007. 1. 15. · IFT 1010 - Programmation 1 Tableaux S¶ebastien Roy & Fran»cois Duranleau D¶epartement d’informatique

Exemple

Fonction qui initialise un tableau d’entiers avec une suite

contigue de valeurs commancant par une valeur donnee :

public static void iota( int[] tab, int init )

{

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

tab[ i ] = init + i;

}

Exemple d’appel :

int[] suite = new int[ 10 ];

// Ici, suite[ i ] == 0 pour tout i

iota( suite, 0 );

// Maintenant, suite[ i ] == i pour tout i

14

Page 16: IFT 1010 - Programmation 1 Tableauxpift1015/cours/tableaux.pdf · 2007. 1. 15. · IFT 1010 - Programmation 1 Tableaux S¶ebastien Roy & Fran»cois Duranleau D¶epartement d’informatique

Bornes des tableaux

– Soit un tableau t de longueur N , les index valides sont

entre 0 et N − 1 inclusivement (ou bien t.length - 1).

– Que se passe-t-il si on fait t[ i ], ou i est un nombre

negatif ou ≥ N ?

→ Le programme plante ! !

– En Java, il y aura un message d’erreur indiquant une

ArrayIndexOutOfBoundsException.

– Attention : dans quelques langages, notamment de

C/C++, il n’y a pas de verification de bornes, et le pro-

gramme ne plante pas necessairement, quoiqu’il se produira

certainement des bogues bizarres.

⇒ Meme si le langage effectue une verification de bornes, il

faut etre rigoureux !

15

Page 17: IFT 1010 - Programmation 1 Tableauxpift1015/cours/tableaux.pdf · 2007. 1. 15. · IFT 1010 - Programmation 1 Tableaux S¶ebastien Roy & Fran»cois Duranleau D¶epartement d’informatique

Limite des tableaux

– Une fois qu’un tableau a ete instancie, on ne peut plus

changer sa longueur.

⇒ Il faut connaıtre le nombre d’elements a manipuler.

16

Page 18: IFT 1010 - Programmation 1 Tableauxpift1015/cours/tableaux.pdf · 2007. 1. 15. · IFT 1010 - Programmation 1 Tableaux S¶ebastien Roy & Fran»cois Duranleau D¶epartement d’informatique

Tableaux d’objets

– Rappel : le type de chaque cellule d’un tableau peut etre

n’importe quoi.

⇒ peut aussi etre un objet.

– Cependant, en Java, un objet est toujours manipule avec

une reference.

⇒ un tableau d’objets est en fait un tableau de references

sur des objets.

– Rappel : dans un tel cas, lors de l’instanciation du tableau,

toutes les references sont initialisees a null.

⇒ Ne pas oublier de creer les objets pour chaque cellule !

17

Page 19: IFT 1010 - Programmation 1 Tableauxpift1015/cours/tableaux.pdf · 2007. 1. 15. · IFT 1010 - Programmation 1 Tableaux S¶ebastien Roy & Fran»cois Duranleau D¶epartement d’informatique

Exemple

Lecture de N colis postaux :

ColisPostal[] colis = new ColisPostal[ N ];

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

colis[ i ].lire();

⇒ Ca plante ! car colis[ i ] == null pour tout i.

18

Page 20: IFT 1010 - Programmation 1 Tableauxpift1015/cours/tableaux.pdf · 2007. 1. 15. · IFT 1010 - Programmation 1 Tableaux S¶ebastien Roy & Fran»cois Duranleau D¶epartement d’informatique

Exemple

Il faut plutot faire ceci :

// instanciation du tableau

ColisPostal[] colis = new ColisPostal[ N ];

// instanciation de chaque colis

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

colis[ i ] = new ColisPostal();

// Enfin, la lecture

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

colis[ i ].lire();

19

Page 21: IFT 1010 - Programmation 1 Tableauxpift1015/cours/tableaux.pdf · 2007. 1. 15. · IFT 1010 - Programmation 1 Tableaux S¶ebastien Roy & Fran»cois Duranleau D¶epartement d’informatique

Tableaux a deux dimensions

– Rappel : le type de chaque cellule d’un tableau peut etre

n’importe quoi.

⇒ peut aussi etre un tableau.

⇒ Pour declarer un tableau a deux dimensions :

Type[][] nom ;

i.e. on declare un tableau de tableaux.

– Cependant, l’instanciation est plus particuliere :

nom = Type[ N1 ][ N2 ] ;

ou N1 est la longueur de la premiere dimension (i.e.

combien de sous-tableaux) et N2 est la longueur de la

seconde dimension (i.e. de chaque sous-tableau).

20

Page 22: IFT 1010 - Programmation 1 Tableauxpift1015/cours/tableaux.pdf · 2007. 1. 15. · IFT 1010 - Programmation 1 Tableaux S¶ebastien Roy & Fran»cois Duranleau D¶epartement d’informatique

Tableaux a deux dimensions

Soit Type[][] tab = new Type[ N1 ][ N2 ] ;

– Alors tab[ i ] (i = 1..N1) permet d’acceder au sous-

tableau a l’index i.

⇒ Pour acceder a la cellule (i, j) (j = 1..N2), il suffit

d’ecrire :

tab[ i ][ j ]

– On peut aussi connaıtre la longueur d’un sous-tableau a

l’index i ainsi :

tab[ i ].length

Cependant, ils sont tous de meme longueurs.Remarque : Il est possible de creer un tableau a deux dimensions ou les

tableaux de la seconde dimension ont une longueur differente. Consultez un

livre de reference Java pour savoir comment.

21

Page 23: IFT 1010 - Programmation 1 Tableauxpift1015/cours/tableaux.pdf · 2007. 1. 15. · IFT 1010 - Programmation 1 Tableaux S¶ebastien Roy & Fran»cois Duranleau D¶epartement d’informatique

Exemple

Declaration et instanciation :

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

Cellule 0,1 Cellule 0,2Cellule 0,0

Cellule 1,1 Cellule 1,2Cellule 1,0

Cellule 2,1 Cellule 2,2Cellule 2,0

Cellule 3,1 Cellule 3,2Cellule 3,0

Cellule 4,1 Cellule 4,2Cellule 4,0

Cellule 0:

Cellule 1:

Cellule 2:

Cellule 3:

Cellule 4:

tab

22

Page 24: IFT 1010 - Programmation 1 Tableauxpift1015/cours/tableaux.pdf · 2007. 1. 15. · IFT 1010 - Programmation 1 Tableaux S¶ebastien Roy & Fran»cois Duranleau D¶epartement d’informatique

Exemple

Initialisation :

int i, j;

// premiere dimensions

for( i = 0; i < tab.length; ++i )

{

// seconde dimensions

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

{

// Attention a ne pas se tromper dans l’ordre des index!

tab[ i ][ j ] = (i + j) % 2; // une valeur quelconque

}

}

Exercice : Ecrivez un bout de code pour afficher ce tableau

dans un rectangle 5 × 3.

23

Page 25: IFT 1010 - Programmation 1 Tableauxpift1015/cours/tableaux.pdf · 2007. 1. 15. · IFT 1010 - Programmation 1 Tableaux S¶ebastien Roy & Fran»cois Duranleau D¶epartement d’informatique

Tableaux a N dimensions

On peut directement generaliser pour avoir un tableau a N

dimensions, i.e. des tableaux de tableaux de tableaux de tableaux

de... autant fois que N .

– Declaration : mettre autant de paire de crochets qu’il y a

de dimensions.

– Instanciation : ajouter un nombre entre crochets pour

chaque dimension.

– Indexation : ajouter un index entre crochets pour chaque

dimensions.

La 1re paire de crochets correspond a la 1re dimensions.

La 2e paire correspond a la 2e dimensions.

etc.

24

Page 26: IFT 1010 - Programmation 1 Tableauxpift1015/cours/tableaux.pdf · 2007. 1. 15. · IFT 1010 - Programmation 1 Tableaux S¶ebastien Roy & Fran»cois Duranleau D¶epartement d’informatique

En resume

Declaration

Type[] nom ;

ou Type est n’importe quoi (types de base, classes, tableaux).

Declaration initialisee

Type[] nom = { val 1, ..., val N} ;

ou N est la longueur du tableau, et val i est la valeur de la ie cellule.

Instanciation

nom = new Type[ combien ] ;

ou combien est le nombre de cellules.⇒ nom.length sera egal a combien.

Indexation

nom[ index ]

ou index est un entier entre 0 et nom.length.

25