Você está na página 1de 8

Institut Paul Lambin Cours d'Algorithmique - 1re informatique Chapitre 11.

Les tableaux plusieurs dimensions

13/12/2011 p. 11.1

Chapitre 11. Les tableaux plusieurs dimensions


Dans de nombreux langages, en particulier en Java, une table plusieurs dimensions n'est pas un nouveau concept. En effet, elle n'est rien d'autre qu'une table une dimension, mais dont les lments sont eux-mmes des tables. 11.1. Reprsentations en mmoire. L'organisation dans la mmoire de l'ordinateur peut tre de deux espces : A. Dans un langage o les tableaux sont accessibles directement, sans l'intermdiaire de "pointeurs", on a une organisation en mmoire selon les schmas suivants : t : tableau de "n'importe quoi", indic de 0 4 :

t[0]

t[1]

t[2]

t[3]

t[4]

En particulier, on pourrait avoir la situation o le "n'importe quoi" est son tour un tableau : t : tableau indic de 0 4, dont chaque lment est un tableau d'entiers indic de 0 3 :
t[0][0] t[0][1] ... ... t[4][3]

t[0]

t[1]

t[2]

t[3]

t[4]

ou, plus exactement :


t[0][ 0] t[0][1] ... ... t4][3]

t[0]

t[1]

t[2]

t[3]

t[4]

B. Dans des langages comme le Java, o les tableaux sont accessibles via des "pointeurs", la situation est la suivante :
UneClasse [] t = new int[5];

t[0]

t[1]

t[2]

t[3]

t[4]

Institut Paul Lambin Cours d'Algorithmique - 1re informatique Chapitre 11. Les tableaux plusieurs dimensions int [][] t = new int [5][4];

13/12/2011 p. 11.2

t[0]
t[0][0] ... t[0][3]

t[4]

t[4][0]...

t[4][3]

Dans les deux cas, on pourra crire :


t[1][0] = 17 ; x = a - t[i+1][2] * 5 ; for (int i = 0; i < 4; i++) for (int j=0; j<3; j++) System.out.println ( t[i][j] );

Parfois, la notation condense t[i, j] peut remplacer t[i][j], ce qui donne l'illusion d'un rle similaire pour les deux indices. La reprsentation d'un tableau bidimensionnel sous forme de lignes et de colonnes n'est qu'une facilit de prsentation pour l'il humain. Souvent, on convient que le premier indice est le numro de la ligne et le second celui de la colonne, mais ce n'est qu'une pure convention, qui n'intervient en rien dans la dfinition du langage de programmation lui-mme. 0 0 1 2 3 4 t[4,3] ou t[4][3] t t[3] 11.2. Calcul de l'adresse. Dans le premier type d'implmentation en mmoire (celui sans "pointeurs"), le tableau est, physiquement, une simple succession linaire de "cases" en mmoire, et le calcul d'adresse pour chacune d'elle se fait au moyen d'additions et de multiplications incluant les valeurs des indices. Voyons cela en reprenant le tableau "t" ayant dj servi d'exemple prcdemment (tableau de 5 sous-tableaux contenant chacun 4 lments de type "int", de 4 octets chacun) : 1 2 3

Institut Paul Lambin Cours d'Algorithmique - 1re informatique Chapitre 11. Les tableaux plusieurs dimensions

13/12/2011 p. 11.3

t[0] t[0,0]
4 "cases" de 4 octets

t[1] t[0,3]

t[2]

t[3]

19

t[4]

t[3,0] t[3,1] t[3,2]


4 "cases" de 4 octets 4 "cases" de 4 octets 4 octets 4 octets

3 * 4 * 4 octets

2 * 4 octets

La case t[3,2] se situe 3*4*4 + 2*4 octets plus loin que le dbut du tableau : adresse( t[3,2] ) = adresse( t ) + (3 * 4 * 4) + (2 * 4) = adresse( t ) + 56 et, en gnral: adresse( t[i, j] ) = adresse( t ) + (i * 4 * 4) + (j * 4) = adresse( t ) + 56 o - le premier 4 provient de la deuxime dimension du tableau - les deux autres 4 sont la longueur d'un int. Une partie de ces calculs peut se faire ds la compilation (4*4=16), et il restera deux additions et deux multiplications pour le temps de l'excution. La formule peut toujours s'crire : adresse( t[i1, i2] ) = A + (B * i1) + (C * i2) o les constantes A, B et C peuvent dj tre values lors de la compilation (par contre, on ne connat en gnral la valeur des indices i1 et i2 qu'au moment de l'excution, et donc les oprations restantes ne pourront se faire qu' ce moment-l). Cela se gnralise sans difficult au cas d'un tableau n dimensions : adresse ( t[i1, i2, i3, . . . . . , in] ) = A + (B*i1) + (C*i2) + ... + (K*in)

Institut Paul Lambin Cours d'Algorithmique - 1re informatique Chapitre 11. Les tableaux plusieurs dimensions

13/12/2011 p. 11.4

Tout cela n'est plus correct dans le cas de tableaux accessibles via des "pointeurs". Par contre, cette deuxime faon d'implmenter les tableaux permet plus de souplesse dans l'allocation du tableau et de chacun des sous-tableaux. Ces derniers peuvent mme tre de tailles diffrentes!

11.3 En Java. Soit la dclaration suivante :

int[][] matrice; // tableau de tableaux d'entiers

La variable matrice est un tableau une dimension d'lments qui sont du type int[] c'est--dire eux-mmes des tableaux une dimension de nombres entiers. Supposons que cette variable soit construite par l'instruction
matrice = new int[5][];

On a ainsi construit un tableau de 5 "cases", qui contiennent en fait 5 "pointeurs" vers des objets non encore allous, qui seront des tableaux d'entiers. On peut alors allouer chacun de ces 5 tableaux. Il y a deux cas : 1) Ces 5 tableaux d'entiers ont la mme taille :
for (int i=0; i<5; i++){ matrice[i] = new int[7]; }

On a ainsi cr au total un tableau de 5 lments qui sont eux-mmes des tableaux de 7 entiers. On peut voir cela comme un tableau deux dimensions, ou encore une "matrice" 5x7. (N.B. Il s'agit ici d'une "matrice 5 lignes et 7 colonnes", selon la convention la plus frquente; mais ce n'est qu'une convention de considrer que le premier indice est l'indice de ligne et le second l'indice de colonne: l'inverse est tout aussi admissible!) La construction du tableau complet peut aussi se faire en un coup :
matrice = new int[5][7]; matrice[ligne][colonne];

Les lments de la matrice seront dsigns dans les instructions par : o ligne et colonne peuvent tre remplaces par des expressions quelconques fournissant des nombres entiers, par exemple :
matrice[1][6]; matrice[ligne][colonneMax-1];

Institut Paul Lambin Cours d'Algorithmique - 1re informatique Chapitre 11. Les tableaux plusieurs dimensions

13/12/2011 p. 11.5

2) Ces 5 tableaux ont des tailles diffrentes. On ne parlera alors plus de "matrice" ou de "tableau plusieurs dimensions" mais simplement de "tableau de tableaux". Exemple:
int[][] tabTab = new int[5][]; tabTab[0] = new int[7]; tabTab[1] = new int[9]; tabTab[2] = new int[2]; tabTab[3] = new int[15]; tabTab[4] = new int[7];

On pourra ainsi utiliser les variables entires tabTab[0][4] et tabTab[3][14] mais pas tabTab[0][14]. Tout ceci peut tre tendu des dimensions plus leves. Voici quelques exemples :
float[][][] tableauTridimensionnel = new float[5][10][5]; for (int i=0; i<5; i++) for (int j=0; j<10; j++) for (int k=0; k<5; k++) tableauTridimensionnel[i][j][k] = 0.0;

char[][][][] tab = new char[10][10][][]; //on a cr 100 pointeurs vers des tableaux de tableaux de char // voici la cration du premier des 100 : tab[0][0] = new char[5][]; for (int i=0; i<5; i++) tab[0][0][i] = new char[i*2]; ... tab[0][0][3][5] = 'A'; ...

11.4. Considrations de style. Il faut toujours mettre dans un tableau des lments de mme nature - non seulement de mme type syntaxique (ce qui est une contrainte du langage) - mais surtout : jouant un mme rle dans le problme trait et destins un traitement semblable (tous parcourus par les mmes for, etc.).

Institut Paul Lambin Cours d'Algorithmique - 1re informatique Chapitre 11. Les tableaux plusieurs dimensions

13/12/2011 p. 11.6

Exemple : cotes d'tudiants par branche, et totaux par tudiant, par branche et gnral :

branche tud. 1 2 3 4 5 6 tot. / br.

1 14 10 20 10 0 16 70

2 6 10 20 5 0 14 55

3 10 10 20 15 0 5 60

4 12 10 20 10 2 18 72

5 15 10 18 10 0 2 55

tot./tud. 57 50 98 50 2 55 312

On aurait envie d'en faire un1


int [][] t = new int [7][6];

O la dernire case reprsente le total. Le nom du tableau ne peut dans ce cas que, ou bien tre vague, ou bien ne pas convenir toutes les cases; voire, pis encore, un
String [][] t = new String[8][7];

mais la rgle de style nonce ci-dessus devrait vous faire plutt choisir d'utiliser les 4 variables suivantes:
int int int int [][] cote = new int [6][5] ; // Cote tudiant i est la case i-1 [] totEtud = new int [6]; [] totBranche = new int [5]; totGeneral;

Avec le premier choix, le calcul du total de l'tudiant n etud se ferait de la faon suivante :
t [etud][6] = 0; for (int branche=1; branche <= 5; branche++) t [etud][6] = t [etud][6] + t [etud][branche];

alors qu'avec le dernier choix, on aurait :


totEtud [etud-1] = 0; for (int branche=0; branche < 5; branche++) totEtud [etud-1] = totEtud [etud-1] + cote [etud-1][branche];

ce qui est tout de mme plus explicite.

1 Ici remplira le tableau partir de 0 et donc la cote de l'tudiant i se trouvera en i-1. Idem pour les branches. On aurait pu choisir de perdre les cases 0 pour commencer 1.

Institut Paul Lambin Cours d'Algorithmique - 1re informatique Chapitre 11. Les tableaux plusieurs dimensions

13/12/2011 p. 11.7

La tentation de faire de toutes ces donnes un tableau unique provient d'une part de la faon dont on le reprsente sur une feuille de papier ou sur un cran, et d'autre part du principe des tableurs (o l'on ne dispose souvent que d'une seule structure de donnes, qui est un immense tableau deux dimensions dans lequel on doit tout "fourrer"!). Remarquons enfin que la structure
String[][] t = new String[7][6];

que nous avions condamne il y a un moment, pourrait cependant convenir dans une mthode consacre strictement l'affichage des donnes. 11.5. Tableaux plus de deux dimensions. Tant conceptuellement que techniquement, tout ce qui a t dit propos des tableaux deux dimensions (ou "matrices") peut s'tendre un nombre arbitraire de dimensions. Seule la reprsentation graphique en est plus malaise: cela est uniquement d au caractre bidimensionnel des crans et feuilles de papier (ainsi que de notre rtine!). Voici un exemple : L'horaire de cours de l'Institut Paul Lambin, pour lequel on va supposer pour simplifier que tous les cours dbutent une heure "ronde" (8h, 9h, 10h, ...), peut tre reprsent comme : un tableau de deux lments correspondant aux deux semestres, constitus chacun de: un tableau de 5 lments correspondant aux 5 sections, chacun tant constitu de : un tableau de 3 lments, correspondant aux 3 annes, chacun tant constitu de : un tableau de X lments correspondant aux X sries de cette section et de cette anne, chacun tant constitu de : un tableau de 5 lments, correspondant aux 5 jours de la semaine, chacun tant constitu de : un tableau de 11 lments, correspondant aux 11 heures de la journe (de 8h 19h), chacun tant constitu de : un nom de cours, un numro de local, un professeur. Nous pouvons donc utiliser ici un tableau 6 dimensions, ou plutt un "tableau de tableaux de tableaux de tableaux de tableaux de tableaux". Par exemple :
int [][][][][][] horaire = new int[0] [4] [0] [7] [2] [10];

dsignera l'activit, durant le premier semestre (0), des tudiants de la srie 7 de 1re (0) informatique (4) le mercredi (jour n2) 17h (heure n 10).

Institut Paul Lambin Cours d'Algorithmique - 1re informatique Chapitre 11. Les tableaux plusieurs dimensions

13/12/2011 p. 11.8

Et, pour imprimer tout l'horaire de cette srie en 5 colonnes correspondant aux 5 jours et en 11 lignes correspondant aux 11 heures, le tout sur deux pages correspondant aux deux semestres, on peut crire :
for (int semestre=0; semestre<2; semestre++) { saut de page; imprimer ("semestre numro " + (semestre+1) ); for (int jour=0; jour<5; jour++) imprimer (nomDuJour[jour]); passer la ligne; // titre colonnes

for (int heure=0; heure<11; heure++) { imprimer (heure + 8); // titre lignes for (int jour=0; jour<5; jour++) { imprimer (horaire [semestre][4][0][7][jour][heure]); passer la ligne; } }

Você também pode gostar