Les tableaux


sommaire du chapitre :

Introduction

1. Les tableaux à une dimension
1a. Déclaration et mémorisation
1b. Initialisation et réservation automatique
1c. Accès aux composantes
1d. Affichage et affectation

2. Les tableaux à deux dimensions
2a. Déclaration et mémorisation
2b. Initialisation et réservation automatique
2c. Accès aux composantes
2d. Affichage et affectation


Introduction

Les tableaux sont certainement les variables structurées les plus populaires.
Ils sont disponibles dans tous les langages de programmation et servent à résoudre une multitude de problèmes.
Dans une première approche, le traitement des tableaux en C ne diffère pas de celui des autres langages de programmation.
Nous allons cependant voir plus loin (voir Les Pointeurs), que le langage C permet un accès encore plus direct et plus rapide aux données d'un tableau.

Les chaînes de caractères sont déclarées en C comme tableaux de caractères et permettent l'utilisation d'un certain nombre de notations et de fonctions spéciales.
Les particularités des tableaux de caractères seront traitées séparément au chapitre suivant.

retour au sommaire


1. Les tableaux à une dimension

Un tableau (uni-dimensionnel) est une variable structurée formée d'un nombre entier N de variables simples du même type, qui sont appelées les composantes du tableau. Le nombre de composantes N est alors la dimension du tableau.
En faisant le rapprochement avec les mathématiques, on dit encore que "A est un vecteur de dimension N".

Exemple :
int NumEnregistres[5] = {10,20,30,40,50}
...défini un tableaux d'entier de dimension 5, dont les composantes sont 10, 20...

retour au sommaire

1a. Déclaration et mémorisation

Déclaration

Déclaration d'un tableau en langage algorithmique

<TypeSimple> tableau <NomTableau>[<Dimension>]

Déclaration d'un tableau en C

<TypeSimple> <NomTableau>[<Dimension>] ;

Exemples :

Les déclarations suivantes en langage algorithmique...
entier tableau A[25]
réel tableau B[100]
booléen tableau C[10]
caractère tableau D[30]

... se laissent traduire en C par:
int A[25]; ou bien long A[25]; ...
float B[100]; ou bien double B[100]; ...
int C[10];
char D[30];

Mémorisation

En C, le nom d'un tableau est le représentant de l'adresse du premier élément du tableau.
Les adresses des autres composantes sont calculées (automatiquement) relativement à cette adresse.

retour au sommaire

1b. Initialisation et réservation automatique

Initialisation

Lors de la déclaration d'un tableau, on peut initialiser les composantes du tableau, en indiquant la liste des valeurs respectives entre accolades.

Exemple : int A[5] = {10, 20, 30, 40, 50};

Réservation automatique

Si la dimension n'est pas indiquée explicitement lors de l'initialisation, alors l'ordinateur réserve automatiquement le nombre d'octets nécessaires.

Exemple :
int A[] = {10, 20, 30, 40, 50};
réservation de 5*sizeof(int) octets (dans notre cas: 10 octets)

retour au sommaire

1c. Accès aux composantes

En déclarant un tableau par:
int A[5];
nous avons défini un tableau A avec cinq composantes, auxquelles on peut accéder par:
A[0], A[1], ... , A[4]

ATTENTION ! :
Considérons un tableau T de dimension N.
En C :
-l'accès au premier élément du tableau se fait par T[0]
-l'accès au dernier élément du tableau se fait par T[N-1]
En langage algorithmique :
-l'accès au premier élément du tableau se fait par T[1]
-l'accès au dernier élément du tableau se fait par T[N]

retour au sommaire

1d. Affichage et affectation

La structure for se prête particulièrement bien au travail avec les tableaux.
La plupart des applications se laissent implémenter par simple modification des exemples-types de l'affichage et de l'affectation.

Affichage du contenu d'un tableau

Traduisons le programme AFFICHER du langage algorithmique en C :
Programme AFFICHER :
Entier tableau A[5]
Entier I (* Compteur *)
Pour I variant de 1 à 5
Faire Ecrire A[I]
FinPour
FinProgramme

main()
{
int A[5];
int I; /* Compteur */
for (I = 0 ; I < 5 ; I ++)
{printf("%d ", A[I]); return 0; printf("\n"); }
}

Remarque :
Par opposition à la commande simplifiée écrire A[I] du langage algorithmique, la commande printf doit être informée du type exact des données à afficher (ici: %d ou %i pour des valeurs du type int).

Affectation

Traduisons le programme REMPLIR du langage algorithmique en C :
Programme REMPLIR
Entier tableau A[5]
Entier I (* Compteur *)
Pour I variant de 1 à 5
F aire Lire A[I]
FinPour
FinProgramme

main()
{
int A[5];
int I; /* Compteur */
for (I = 0 ; I < 5 ; I ++)
{ scanf("%d", &A[I]); return 0; }
}

Remarques :
-Comme scanf a besoin des adresses des différentes composantes du tableau, il faut faire précéder le terme A[I] par l'opérateur adresse &.
- La commande de lecture scanf doit être informée du type exact des données à lire (ici: %d ou %i pour lire des valeurs du type int).

retour au sommaire


2. Tableau à deux dimensions

En C, un tableau à deux dimensions A est à interpréter comme un tableau (uni-dimensionnel) de dimension L dont chaque composante est un tableau (uni-dimensionnel) de dimension C.
On appelle L le nombre de lignes du tableau et C le nombre de colonnes du tableau.
L et C sont alors les deux dimensions du tableau.
Un tableau à deux dimensions contient donc L*C composantes.

En faisant le rapprochement avec les mathématiques, on peut dire que "A est un vecteur de L vecteurs de dimension C", ou : "A est une matrice de dimensions L et C".

retour au sommaire

2a. Déclaration et mémorisation

Déclaration

Déclaration de tableaux à deux dimensions en langage algorithmique

<TypeSimple> tableau <NomTableau> [<DimLigne>,<DimColonne>]

Déclaration de tableaux à deux dimensions en C

<TypeSimple> <NomTableau> [<DimLigne>] [<DimColonne>] ;

Exemple : int A[10][10] ;

Mémorisation

Comme pour les tableaux à une dimension, le nom d'un tableau est le représentant de l'adresse du premier élément du tableau (l'adresse de la première ligne du tableau).
Les composantes d'un tableau à deux dimensions sont stockées ligne par ligne dans la mémoire.

retour au sommaire

2b. Initialisation et réservation automatique

Initialisation

Lors de la déclaration d'un tableau, on peut initialiser les composantes du tableau, en indiquant la liste des valeurs respectives entre accolades.
A l'intérieur de la liste, les composantes de chaque ligne du tableau sont encore une fois comprises entre accolades.
Pour améliorer la lisibilité des programmes, on peut indiquer les composantes dans plusieurs lignes.

Exemple :
int A[3][10] =
{
{ 0,10,20,30,40,50,60,70,80,90},
{10,11,12,13,14,15,16,17,18,19},
{ 1,12,23,34,45,56,67,78,89,90}
};

Réservation automatique

Si le nombre de lignes L n'est pas indiqué explicitement lors de l'initialisation, l'ordinateur réserve automatiquement le nombre d'octets nécessaires.

Exemple :
int A[][10] =
{
{ 0,10,20,30,40,50,60,70,80,90},
{10,11,12,13,14,15,16,17,18,19},
{ 1,12,23,34,45,56,67,78,89,90}
};
Réservation de 3*10*sizeof(int) = 60 octets

retour au sommaire

2c. Accès aux composantes

Accès à un tableau à deux dimensions en langage algorithmique

<NomTableau>[<NumLigne>,<NumColonne>]

Accès à un tableau à deux dimensions en C

<NomTableau>[<NumLigne>][<NumColonne>]

ATTENTION ! :
Considérons un tableau T de dimension L,C.
En C :
-l'accès au premier élément du tableau se fait par T[0][0]
-l'accès au dernier élément du tableau se fait par T[L-1][C-1]
En langage algorithmique :
-l'accès au premier élément du tableau se fait par T[1,1]
-l'accès au dernier élément du tableau se fait par T[L,C]

retour au sommaire

2d. Affichage et affectation

- Affichage du contenu d'un tableau à deux dimensions

Traduisons le programme AFFICHER du langage algorithmique en C :
Programme AFFICHER
entier tableau A[5,10]
entier I,J
(* Pour chaque ligne ... *)
Pour I variant de 1 à 5 Faire
(* ... considérer chaque composante *)
Pour J variant de 1 à 10 Faire Ecrire A[I,J] FinPour
(* Retour à la ligne *) Ecrire
FinPour
FinProgramme

main()
{
int A[5][10];
int I,J;
/* Pour chaque ligne ... */
for
(I = 0; I < 5; I ++)
{
/* ... considérer chaque composante */
for
(J = 0; J < 10; J ++) { printf("%7d", A[I][J]); }
/* Retour à la ligne */ printf("\n");
}
return 0;
}

Affectation avec des valeurs provenant de l'extérieur

Traduisons le programme REMPLIR du langage algorithmique en C :
Programme REMPLIR
entier tableau A[5,10]
entier I,J
(* Pour chaque ligne ... *)
Pour I variant de 1 à 5 faire
(* ... considérer chaque composante *)
Pour J variant de 1 à 10 Faire Lire A[I,J] FinPour
FinPour
FinProgramme

main()
{

int A[5][10];
int I,J;
/* Pour chaque ligne ... */
for (I=0; I<5; I++)
/* ... considérer chaque composante */
for (J=0; J<10; J++) { scanf("%d", &A[I][J]); }
return 0;
}

retour au sommaire
chapitre suivant