Les tableaux
Objectifs du chapitre
Développer des applications utilisant des tableaux.
Présenter la notion d’adresse mémoire, avant d’aborder les pointeurs dans le chapitre suivant.
Présentation des tableaux
Un tableau est un ensemble répétitif de variables de même type.
La déclaration int tab[3]; réserve trois entiers en mémoire :
int main()
{
int tab[3];
Chacun des entiers (on dit chaque poste) est accessible par un numéro (indice ou numéro de poste) entouré de crochets.
Attention, le premier poste porte le numéro 0.
Les trois instructions :
tab[0] = 5;
tab[1] = 15;
tab[2] = 10;
mettent des valeurs dans les trois variables :
Voici un programme permettant l’affichage de certains postes du tableau :
printf("tab[1] = %d\n\n", tab[1]);
printf("tab[0] = %d\n\n", tab[0]);
Attention ! Les instructions suivantes montrent que le C ne contrôle pas les débordements de tableaux. On peut afficher une valeur en dehors du tableau, et même la modifier ! Il faut être très vigilant.
printf("tab[-1] = %d\n", tab[-1]);
tab[-1] = 17;
printf("tab[-1] = %d\n\n", tab[-1]);
Enfin l’instruction suivante affiche deux fois la valeur de tab. C’est une valeur numérique affichée sous deux formes (%d pour un affichage décimal, %p pour un affichage hexadécimal). tab est l’adresse du tableau...
Exemples d’utilisations de tableaux
1. Tableau à une dimension
L’exemple suivant a pour objectif de calculer la moyenne de 10 notes saisies au clavier. Le programme affiche la moyenne et le nombre de notes supérieures à la moyenne.
t[10] : tableau de 10 entiers.
i : indice de parcours du tableau (numéro de poste).
somme : somme des notes du tableau.
moyenne : moyenne des 10 notes.
nombre : nombre de notes supérieures à la moyenne.
int main()
{
int i;
int somme;
float moyenne;
int nombre;
int t[10];
Saisie des 10 notes :
for (i = 0; i < 10; i++)
{
printf("Entrez la note numero %d : ", i+1);
scanf("%d", &t[i]);
}
&t[i] est l’adresse du poste t[i].
Calcul de la somme des notes puis de la moyenne :
somme = 0;
for (i = 0; i < 10; i++)
{
somme += t[i];
}
moyenne = (float) somme / 10;
printf("\n\nMoyenne des notes : %6.2f\n", moyenne);
Recherche du nombre...
Adresse d’un tableau et de ses postes (opérateurs * et &)
1. Tableau à une dimension
int main()
{
int tab[3] = {5, 15, 10};
Les instructions suivantes affichent le contenu des trois postes :
printf("tab[0] = %d\n", tab[0]);
printf("tab[1] = %d\n", tab[1]);
printf("tab[2] = %d\n\n", tab[2]);
Les instructions suivantes affichent l’adresse des trois postes :
tab est l’adresse du tableau, soit l’adresse du premier poste du tableau : tab[0].
tab + 1 est l’adresse de l’entier suivant.
On remarque que ces adresses augmentent de 4 en 4, car tab contient des entiers (4 octets).
printf("tab = %p\n", tab);
printf("tab + 1 = %p\n", tab + 1);
printf("tab + 2 = %p\n\n", tab + 2);
Affichage des valeurs contenues aux adresses indiquées.
*(tab + 1) signifie : la valeur contenue à l’adresse tab + 1. C’est l’équivalent de tab[1].
printf("*tab = %d\n", *tab);
printf("*(tab + 1) = %d\n", *(tab + 1));
printf("*(tab + 2) = %d\n\n", *(tab + 2));
Affichage des adresses des postes indiqués.
&tab[1] signifie : l’adresse...
Travail pratique : tableaux
1. Sujet
L’objectif de ces exercices est d’écrire des algorithmes de comptage et de recherche dans un tableau.
Exercice 1
Écrire un programme qui compte le nombre de fois qu’une valeur (saisie au clavier) est présente dans un tableau (initialisé dans le programme).
Exercice 2
Écrire un programme qui indique si une valeur (saisie au clavier) est présente dans un tableau (initialisé dans le programme).
Exercice 3
L’objectif est le même que l’exercice 2, mais avec recherche de la valeur dans un tableau trié en ordre croissant.
2. Tableaux : proposition de correction
a. Exercice 1
tableau : tableau d’entiers.
i : indice de parcours du tableau.
valeur : valeur à chercher dans le tableau.
nombre : nombre de fois ou valeur est dans tableau.
int main()
{
int tableau[10] = {1, 3, 8, 5, 14, 3, 3, 5, 12, 7};
int i;
int valeur;
int nombre;
printf("Entrez la valeur a compter : ");
scanf("%d", &valeur);
Le comptage nécessite le parcours complet du tableau, d’où l’utilisation de la boucle for.
nombre = 0;
for (i = 0; i < 10; i++)
{ ...
Travail pratique : tri de tableaux
1. Sujet
L’objectif de cet exercice est d’écrire des algorithmes de tri de tableaux.
Écrire un programme qui trie un tableau de huit postes contenant des entiers.
2. Tri de tableaux : proposition de correction
a. Tri par l’algorithme de sélection/échange
Variables utilisées |
|
|
tab |
tableau de huit postes. |
|
i |
indice pour l’examen de chaque poste du tableau. |
|
permut |
variable intermédiaire pour la permutation de deux postes. |
|
iter |
numéro d’itération. |
|
pp |
indice du plus petit poste de la table. |
|
Principe de la solution |
||
Itération numéro 1 : iter = 0 ; |
||
Rechercher le plus petit poste de la table. |
||
Soit pp l’indice de cet élément. |
Permuter ce poste (pp) avec le premier poste (iter). |
Après la permutation, tous les postes du tableau jusqu’au poste iter sont triés. Quand les 7 premiers postes sont triés, le 8ème l’est forcément. 7 itérations suffisent à trier le tableau.
Recommencer (iter = 1), rechercher le plus petit élément à partir de iter. Permuter.
Recommencer sept fois…
Approche structurée
-
On répète sept fois le parcours du tableau.
C’est la structure répétitive (début parcours - fin parcours).
-
Le parcours du tableau consiste à examiner chaque poste.
C’est une répétitive sur les postes (début poste - fin poste).
-
Pour chaque poste, on regarde s’il est plus petit (Traitement <) ou pas (traitement >=) que le plus petit déjà trouvé.
C’est une alternative.
D’où l’organigramme suivant :
Tri par sélection/échange : programme
int main()
{
int tab[8] = {5, 15, 10, 12, 3, 1, 6, 2};
int iter;
int pp;
int i;
int permut;
Affichage du tableau avant le tri :
printf("Tableau...
Travail pratique : triangle de Pascal
1. Objectif
Constituer un tableau contenant le triangle de Pascal.
Le triangle de Pascal est bien connu des mathématiciens. Chaque ligne du tableau contient 1 en première colonne et 1 sur pour les postes situés sur la diagonale (postes dont l’indice de ligne est égal à l’indice de colonne). Les autres postes d’une ligne sont calculés à partir de la ligne précédente. Le poste de la colonne col de la ligne lig est égal à la somme de la colonne col et de la colonne col - 1 de la ligne lig - 1.
2. Sujet
Afficher les n premières lignes du triangle de Pascal.
(n est un nombre inférieur ou égal à 16 saisi au clavier).
Principe
Dans le tableau tab, le poste col de la ligne lig est calculé à partir de la ligne lig - 1, de la façon suivante :
tab[lig][col] = tab[lig - 1][col] + tab[lig - 1][col - 1]
3. Triangle de Pascal : proposition de correction
Triangle de Pascal : solution utilisant un tableau à deux dimensions
tab : tableau à deux dimensions.
lig, col : indices de ligne et de colonne du tableau.
nbl : nombre de lignes à afficher.
int main()
{
int tab[16][16];
int lig,col;
int nbl;
printf("Entrez le nombre de ligne(s) du tableau : ");
scanf("%d"...