Module: Programmation I
Filière: SMA-S3
Tableaux
Pr. Issam QAFFOU
Laboratoire Ingénierie des Systèmes d’Information
Département d’Informatique
FSSM-UCA
Version 2015/2016
(Automne)
Tableaux
• C’est une structure de données qui permet de regrouper un
ensemble d’éléments de même type.
• Ces éléments sont ordonnées et accessibles par leurs
indices.
• Ces éléments sont contigus dans la mémoire.
• Ils occupent la même taille.
• Les tableaux sont des structures statiques, donc ne peut ni y
ajouter ni en supprimer.
• Ils peuvent être monodimensionnels (1D) ou
multidimensionnels (nD).
• La compréhension de l’adressage mémoire est une chose
importante pour manipuler correctement les tableaux.
19/10/2015 Programmation I 2
Adressage mémoire
• Dans la mémoire d‘un ordinateur, chaque emplacement où une
de données peut être stockée est identifié par une adresse de
mémoire. C’est pareil aux numéros de chambres d’un hôtel.
• Les numéros d'adresse mémoire sont généralement de grands
nombres avec beaucoup de chiffres parce que la mémoire de
l’ordinateur a probablement des milliards de lieux où les
données peuvent être stockées.
• Lorsque vous déclarez une variable, elle est stockée à une
adresse mémoire spécifique fixe (c’est une constante) qui ne
peut être modifié.
• Vous ne pouvez pas choisir l’adresse mémoire réelle d'une
variable, mais vous pouvez la consulter en utilisant l’opérateur
adresse &.
• L’adresse d’une variable est retournée en hexadécimal (base 16).
19/10/2015 Programmation I 3
Tableaux 1D
• Syntaxe de déclaration
<TypeSimple> <NomTableau>[<Dimension>];
• Exemple:
• Int Id[5]: un tableau Id qui stock 5 entiers.
• Les éléments d'un tableau sont numérotés de zéro à la
taille du tableau moins un .
Id[0] Id[1] Id[2] Id[3] Id[4]
• Un nom de tableau représente en fait une adresse
mémoire. Lorsque vous déclarez un tableau, vous dites au
compilateur d'utiliser le nom du tableau pour indiquer
l'adresse de début d'une série d'éléments.
19/10/2015 Programmation I 4
Tableaux 1D
• Les adresses des composantes d’un tableaux sont calculées
(automatiquement) relativement à cette adresse.
Adresses: 3000 3004 3008 3012 3016
Id[0] Id[1] Id[2] Id[3] Id[4]
• Quand vous déclarez un tableau de 5 éléments entiers et si par
exemple un entier demande 4 bits alors le compilateur réserve 20
bits contigus pour la taille de ce tableau.
• Vous ne pouvez pas dire au compilateur où stoker ce tableau
dans la mémoire.
• Ce principe de mémoire sera discuté en détail dans le chapitre
sur les pointeurs
19/10/2015 Programmation I 5
Tableaux 1D
• Insérer des éléments
• Comme pour toute variable, vous pouvez le faire par initialisation
ou à l’aide des fonctions printf() et scanf().
• Par initialisation
• On spécifie la liste des éléments à insérer entre deux accolades (il
faut respecter l’ordre).
double Notes[4]={12, 13.5,15.25,10};
• Fonctions entrée/sortie (Affectation)
• On utilise une boucle pour parcourir tous les emplacements afin
de les remplir: for(i=0;i<4;i++)
Adresses: 1E06 1E08 1E0A 1E0C
{
12 13.5 15.25 10
printf("Saisir les éléments: ");
Indices : Notes[0] Notes[1] Notes[2] Notes[3] scanf("%d",&Notes[i]);
}
19/10/2015 Programmation I 6
Tableau 1D
• Quand on déclare un tableau sans déterminer sa taille, mais
on l’initialise, alors le compilateur réserve l’emplacement
suffisant en multipliant le nombre d’éléments dans
l’initialisation par la taille spécifique au type du tableau.
• Exemple:
float B[] = {-1.05, 3.33, 87e-5, -12.3e4};
==> réservation de 4*sizeof(float) octets (dans notre cas: 16
octets)
• Si on ne saisit pas tous les éléments du tableau, alors le
compilateur remplit automatiquement le reste par des
zéros.
• Dans le cas contraire, un message d’erreur sera affiché.
19/10/2015 Programmation I 7
Tableaux 1D
• Accès aux éléments d’un tableau
• L’accès à un tableaux Tab de taille N se fait par des indices allant
de 0 jusqu’à N-1.
– 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]
• Exemple
• int Num[6]={1,23,4,5,91,55}
• On accède aux éléments par Num[0], Num[1], …, Num[5].
• Pour afficher les éléments d’un tableau, on utilise la fonction
printf() au sein d’une boucle.
for(i=0;i<4;i++)
printf("%d", Notes[i]);
19/10/2015 Programmation I 8
Tableaux 1D
• Exercice 1:
• Ecrire un programme qui déclare le tableau
d’entiers (par initialisation) suivant et l’affiche.
12 435 22 23 4 345 99 1022
• Exercice 2:
• Ecrire un programme qui remplit un tableau
de 10 valeurs doubles, l’affiche et calcule la
somme de ces valeurs.
19/10/2015 Programmation I 9
Tableaux 1D
• Solution Exo1
19/10/2015 Programmation I 10
Tableaux 1D
• Solution Exo2
19/10/2015 Programmation I 11
Tableaux 2D
• Un tableaux 2D est un tableaux 1D dont les éléments sont des tableaux 1D
aussi.
• Les éléments d'un tableau à 2Dsont stockées ligne par ligne dans la
mémoire
• Donc, c’est une matrice ayant des lignes L et des colonnes C. Sa dimension
est LxC.
• Si L=C, on dit que c’est un tableau carré.
• Le nombre d’éléments d’un tableau 2D égal à LxC.
j
Lignes
i
colonnes
19/10/2015 Programmation I 12
Tableaux 2D
• Syntaxe
• <TypeSimple> <NomTableau>[nbr_ligne][nbre_colone];
• Exemple:
• Int Tab[4][5];// Tab stocke 20 entiers.
• Les éléments d’un tableau sont accessibles par deux
indices: un pour les lignes et l’autre pour les colonnes.
Tab: Tab[0][0]
Tab[1][2]
Tab[3][4]
19/10/2015 Programmation I 13
Tableaux 2D
• On peut voir un tableau 2D comme un tableau 1D dont les
éléments sont des tableaux 1D de même dimension.
• Par exemple Tab[2][3], est un tableau 1D de taille 3 (en
rouge dans la figure), où chaque élément contient un
vecteur de 2 éléments (en bleu dans la figure).
• Ainsi, on procède de la même manière que pour les
tableaux 1D pour remplir un tableau 2D.
• Insertion par initialisation:
1 3 5
Int tab[2][3]={{1,2},{3,4},{5,6}} 2 4 6
1er élément 1er élément 1er élément
19/10/2015 Programmation I 14
Tableaux 2D
• Insertion par affectation
• On utilise deux boucles imbriquées. Une pour remplir les
lignes et l’autre pour insérer ces lignes dans des colonnes.
• Pour un tel tableau: double tab[n][m]; on écrit:
• for(i=0;i<n;i++) // compteur pour parcourir les lignes
• for(j=0;j<m;j++) // compteur pour les colonnes
• scanf("%lf",&tab[i][j]);
• Exemple: double t[3][4];
• for(i=0;i<3;i++)
• for(j=0;j<4;j++)
• scanf("%lf",&tab[i][j]);
19/10/2015 Programmation I 15
Tableaux 2D
• Accès aux éléments d’un tableau 2D
• On accède aux éléments d’un tableau 2D par deux
indices: un pour les lignes et l’autre pour les colonnes.
• Si on a n lignes et m colonnes alors le 1er élément est
t[0][0] et le dernier élément t[n-1][m-1].
• Pour traiter un élément dans un tableau, il faut
spécifier son indice ligne i et son indice colonne j.
Tab: 0 1 2 3
0 Tab[1][2]
1
2
19/10/2015 Programmation I 16
Tableaux 2D
• Affichage des éléments d’un tableaux 2D
• On utilise pour ceci des boucles imbriquées. Une pour parcourir les lignes et
l’autre pour les colonnes.
• Pour un tel tableau: double tab[n][m]; on écrit:
for(i=0;i<n;i++) {
for(j=0;j<m;j++)
printf("%.lf ",tab[i][j]);
printf("\n");
}
• Exemple: double t[3][4];
for(i=0;i<3;i++) {
for(j=0;j<m;j++)
printf("%.lf ",tab[i][j]);
printf("\n");
}
19/10/2015 Programmation I 17
Tableaux 2D
• Exercice 1:
• Ecrire un programme qui déclare le tableau
d’entiers (par initialisation) suivant et l’affiche.
2 1 10
4 3 12
6 5 14
8 7 16
19/10/2015 Programmation I 18
Tableaux 2D
• Solution
19/10/2015 Programmation I 19