Les tableaux
Thèmes abordés
• Les tableaux, pour quoi faire ?
• Les principes
– Déclaration, initialisation.
– Utilisation : lecture, modification.
– Recommandations.
• Les tableaux de taille variable.
• Les tableaux à plusieurs dimensions.
1
Les tableaux
Pour quoi faire ?
• Exemple : un programme permettant de saisir 10 entiers
#include <stdio.h>
#include <stdlib.h>
int main()
{
int entier1, entier2, entier3, entier4, entier5, entier6,
entier7, entier8, entier9, entier10;
printf("Saisie de l'entier 1:");
scanf("%d", &entier1);
printf("Saisie de l'entier 2:");
scanf("%d", &entier2);
. . .
system("PAUSE");
return 0;
}
• Comment gérer le cas de 1000 entiers ?
Les tableaux
Pour quoi faire ?
• Solution avec une boucle
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
int entier1, entier2, entier3, entier4, entier5, entier6,
entier7, entier8, entier9, entier10;
for (i = 1; i <= 10; i++)
{
printf("Saisie de l'entier %d:", i);
scanf("%d", &entier i);
}
system("PAUSE");
Syntaxe incorrecte !
return 0;
}
• Comment désigner la variable n° i ?
Analyse et programmation 1 - Les tableaux 3
2
Principes
Déclaration de tableaux
• Définition
– Un tableau est une variable.
– Contenant une collection de valeurs de même type.
– Comme toutes les variables, le tableau a un nom.
– Chaque élément du tableau est désigné par ce nom et par sa position.
• Exemple
int entiers[10];
index 0 1 2 3 4 5 6 7 8 9
valeur 10 45 21 37 98 -5 12 45 -20 37
Principes
Déclaration de tableaux - observations
• Forme générale
type nom[taille];
– type : n’importe quel type valide.
– nom : identificateur valide.
– taille : doit être une expression constante (pas une constante)
• La taille d’un tableau est fixée à sa déclaration.
• Taille en mémoire d’un tableau de N éléments de taille T :
N x sizeof(T)
– Exemples :
int entiers[10]; // taille : 10 x 4 = 40
double reels[20]; // taille : 20 x 8 = 160
• Les indices d’un tableau de taille n vont de 0 à n-1.
Analyse et programmation 1 - Les tableaux 5
3
Principes
Initialisation de tableaux
Utilisation
Accéder aux éléments du tableau
• Exemples
int entiers[10];
entiers[0] = 10;
entiers[1] = 45;
entiers[2] = entiers[0] + 11;
4
Utilisation
Accéder aux éléments du tableau - exemple
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
int entiers[10];
// Saisie des valeurs
for (i = 1; i <= 10; i++)
{
printf("Saisie de l'entier %d:", i);
scanf("%d", &entiers[i - 1]);
}
// Affichage des valeurs du tableau
for (i = 1; i <= 10; i++)
printf("Entier %d: % d\n", i, entiers[i - 1]);
system("PAUSE");
return 0;
}
Recommandation
Attention aux limites d’indice
• Exemple
int entiers[10];
• Que se passe t il si on accède à l’élément n° 10, ou 11 ?
index 0 1 2 3 4 5 6 7 8 9 10 11 12 1
valeur 10 45 21 37 98 -5 12 45 -20 37
5
Recommandation
Attention aux limites d’indice – illustration des effets
• Qu’affiche ce programme ?
int main()
{
int i;
int entiers[10];
i = 0;
entiers[12] = 12345;
printf("%d\n", i);
system("PAUSE");
return 0;
}
• Testé sous Visual Studio 2005 :
– Ce programme affiche 12345
Utilisation
Accéder aux éléments du tableau – exemple modifié
• Recommandation
– Préférer des variables de boucle allant de 0 à n – 1.
. . .
int main()
{
int i;
int entiers[10];
// Saisie des valeurs
for (i = 0; i < 10; i++)
{
printf("Saisie de l'entier %d:", i + 1);
scanf("%d", &entiers[i]);
}
// Affichage des valeurs du tableau
for (i = 1; i <= 10; i++)
printf("Entier %d: % d\n", i + 1, entiers[i]);
system("PAUSE");
return 0;
}
Analyse et programmation 1 - Les tableaux 11
6
Utilisation
Accéder à la taille du tableau
• Problème : répétition de la taille du tableau.
. . .
int main()
{
int i;
int entiers[10];
// Saisie des valeurs
for (i = 0; i < 10; i++)
. . .
• Que se passe-t-il si on modifie la taille après coup ?
– Nécessité de modifier toutes les boucles du programme.
– Risque d’oubli avec des conséquences fatales.
– Il n’existe pas de fonction en C pour lire la taille d’un tableau.
– Solutions possibles en utilisant l’opérateur sizeof.
Utilisation
Accéder à la taille du tableau
#define TAILLE_ENTIERS 10
int main()
{
int i;
int entiers[TAILLE_ENTIERS];
for (i = 0; i < TAILLE_ENTIERS; i++)
{
7
Utilisation
Passage de tableau en paramètre de fonction
• Déclaration
void initialiser_tableau(double tableau[10], double valeur);
• Particularités
– Il serait peu efficace de passer tous les éléments sur la pile.
– Ce ne sont pas les valeurs du tableau qui sont transmises.
– C’est son adresse.
– Conséquence
• La fonction peut modifier le contenu du tableau passé en paramètre.
• Autre forme
void initialiser_tableau(double tableau[], double valeur);
– La taille n’étant pas contrôlée, il n’est pas nécessaire de l’indiquer
dans la déclaration.
– On peut passer en paramètre le nombre d’éléments à utiliser.
Utilisation
Passage de tableau en paramètre de fonction – autres formes
• Particularités du C
– Le nom d’un tableau désigne son adresse.
– Un pointeur peut être indicé comme un tableau !
8
Utilisation
Passage de tableau en paramètre de fonction – taille variable
• Exemple
void initialiser_tableau(double tableau[],
int nombre_elements, double valeur)
{
int i;
for (i = 0; i < nombre_elements; i++)
tableau[i] = valeur;
}
Utilisation
Quelques opérations avec les tableaux
• Opérateurs
– Seuls sont supportés : l’accès avec [], la taille avec sizeof.
– L’affectation = n’est pas supportée sur les tableaux.
• Quelques opérations courantes avec les tableaux :
– Initialiser.
– Saisir les valeurs.
– Afficher les valeurs.
– Copier un tableau dans un autre.
– Rechercher la position d’une valeur.
– Calculer la valeur minimale ou maximale.
– Trier les valeurs.
9
Utilisation
Exemple : rechercher la position d’une valeur
int position(int tableau[], int taille, int valeur)
{
int i;
for (i = 0; i < taille; i++)
if (tableau[i] == valeur)
return i;
return -1; // signaler que la valeur n'a pas été trouvée
}
Utilisation
Exemple : trier les valeurs d’un tableau (tri à bulle)
void trier_tableau(int tableau[], int taille)
{
int i, j, tmp;
for (i = 0; i < taille - 1; i++)
for (j = i + 1; j < taille; j++)
if (tableau[i] > tableau[j])
{
// échanger les valeurs d'indice i et j
tmp = tableau[i];
tableau[i] = tableau[j];
tableau[j] = tmp;
}
}
10
Utilisation
Exemple : trier les valeurs d’un tableau - illustration des permutations
i = 0 9 3 14 8 1
j = 1 3 9 14 8 1
j = 4 1 9 14 8 3
i = 1 1 9 14 8 3
j = 3 1 8 14 9 3
j = 4 1 3 14 9 8
i = 2 1 3 14 9 8
j = 3 1 3 9 14 8
j = 4 1 3 8 14 9
i = 3 1 3 8 14 9
j = 4 1 3 8 9 14
1 3 8 9 14
Analyse et programmation 1 - Les tableaux 20
Mesure
Capteur de température
1 2 3 4 5 6 7 8 9 10 11 12 13
1 7.5 12 13.5 15 12 9 7 10 12 12 13.5 14 3
2 12 9 7 10 12 13.5 14 9 16 8.5 9 4 6
4 15 12 9 12 9 7 15 12 9 17 13 12 16
7 12 12 13.5 14 17 15 12 9 12 9 7 10 9
8 14 13 12 9 7 10 14 8 11 13 14 8 9
11
Les tableaux à 2 dimensions
Application : algèbre linéaire – calcul matriciel
• Matrice
– Nombres organisés en lignes et en colonnes
– Applications :
• traitement d’image, infographie, robotique, filtrage, etc…
• Déclaration
#define NOMBRE_CAPTEURS 8
#define NOMBRE_MESURES 13
double temperature[NOMBRE_CAPTEURS][NOMBRE_MESURES];
• Initialisation
double matrice[3][4] =
{ { 1.4, 2.3, 3.3, 5.4 },
{ 3.4, 1.2, 8.6, 5.7 },
{ 7.2, 8.1, 4.3, 3.9 } };
Absolument équivalent à :
double matrice[3][4] =
{ 1.4, 2.3, 3.3, 5.4,
3.4, 1.2, 8.6, 5.7,
7.2, 8.1, 4.3, 3.9 };
12
Les tableaux à 2 dimensions
Utilisation
int i, j;
double matrice[3][4] =
{ { 1.4, 2.3, 3.3, 5.4 },
{ 3.4, 1.2, 8.6, 5.7 },
{ 7.2, 8.1, 4.3, 3.9 } };
13
Les tableaux à 2 dimensions
Passage en paramètre à une fonction
– Correct :
void initialiser_matrice(double matrice[3][4]);
void initialiser_matrice(double matrice[][4]);
– Refusé par le compilateur:
void initialiser_matrice(double matrice[][]);
double matrices[10][3][4];
14
Qu’avons-nous appris ?
• Déclaration et utilisation de tableaux simples.
• Problèmes liés au débordement d’indice.
• Passage de tableau en paramètres.
• Algorithmes habituels avec les tableaux
– En particulier le tri
• Les tableaux à plusieurs dimensions.
Vos questions
15
Exercices
Les tableaux
16