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 affectation2. 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
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.
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...
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.
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)
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]
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).
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".
2a. Déclaration et mémorisation
Déclaration
Déclaration de tableaux à deux dimensions en langage algorithmique
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.
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
Accès à un tableau à deux dimensions en langage algorithmique
<NomTableau>[
Accès à un tableau à deux dimensions en C
<NomTableau>[
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]
- 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;
}