Langage C (Chapitre 4) - Les Tableaux
Langage C (Chapitre 4) - Les Tableaux
Langage C (Chapitre 4) - Les Tableaux
I. 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, cependant le langage C permet un accès encore
plus direct et plus rapide aux données d'un tableau (à travers les pointeurs).
II.1 Définition :
Un tableau (uni-dimensionnel) A 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 :
La déclaration :
int JOURS[12]={31,28,31,30,31,30,31,31,30,31,30,31};
définit un tableau du type int de dimension 12. Les 12 composantes sont initialisées par les
valeurs respectives 31, 28, 31, ... , 31. On peut accéder à la première composante du tableau
par JOURS[0], à la deuxième composante par JOURS[1], ... , à la dernière composante par
JOURS[11].
a. Déclaration :
<TypeSimple> <NomTableau>[<Dimension>];
Les noms des tableaux sont des identificateurs qui doivent correspondre aux
restrictions définies dans les autres chapitres
Exemples :
b. Mémorisation :
Exemple :
Exemple :
En supposant qu'une variable du type long occupe 4 octets (c.-à-d: sizeof(long)=4),
pour le tableau T déclaré par: long T[15]; C réservera N*M = 15*4 = 60 octets en mémoire.
a. Initialisation :
Exemples
b. 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.
Exemples
Exemples
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]
Exemple :
En Langage C,
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.
Remarques:
- Avant de pouvoir afficher les composantes d'un tableau, il faut évidemment leur
affecter des valeurs.
- Pour être sûr que les valeurs sont bien séparées lors de l'affichage, il faut inclure
au moins un espace dans la chaîne de format. Autres possibilités :
printf("%d\t", A[I]); /* tabulateur */
printf("%7d", A[I]); /* format d'affichage */
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)
#include<stdio.h>
#define dim 100
void main()
{
int t[dim],n, i;
do
{
printf("\n Donner la dimension du tableau: ");
scanf("%d",&n);
}
while((n<1)||(n>100));
printf("\n ****** remplissage du tableau ******\n");
for(i=0;i<n;i++)
{
printf("t[%d]= ",i);
scanf("%d",&t[i]);
}
Exercices d'applications :
Exercice 1 :
Ecrire un programme qui lit la dimension N d'un tableau T du type int (dimension
maximale : 50 composantes), remplit le tableau par des valeurs entrées au clavier et affiche le
tableau. Calculer et afficher ensuite la somme des éléments du tableau.
Exercice 2 :
Ecrire un programme qui lit la dimension N d'un tableau T du type int (dimension
maximale : 50 composantes), remplit le tableau par des valeurs entrées au clavier et affiche le
tableau. Effacer ensuite toutes les occurrences de la valeur 0 dans le tableau T et tasser les
éléments restants. Afficher le tableau résultant.
Exercice 3 :
Ecrire un programme qui lit la dimension N d'un tableau T du type int (dimension
maximale : 50 composantes), remplit le tableau par des valeurs entrées au clavier et affiche le
tableau. Ranger ensuite les éléments du tableau T dans l'ordre inverse sans utiliser de tableau
d'aide. Afficher le tableau résultant.
Idée : Echanger les éléments du tableau à l'aide de deux indices qui parcourent le tableau en
commençant respectivement au début et à la fin du tableau et qui se rencontrent en son milieu.
Exercice 4 :
Ecrire un programme qui lit la dimension N d'un tableau T du type int (dimension
maximale : 50 composantes), remplit le tableau par des valeurs entrées au clavier et affiche le
tableau. Copiez ensuite toutes les composantes strictement positives dans un deuxième tableau
TPOS et toutes les valeurs strictement négatives dans un troisième tableau TNEG. Afficher les
tableaux TPOS et TNEG.
Exemple :
Considérons un tableau NOTE à deux dimensions pour mémoriser les notes des élèves dans
les 10 devoirs d'un trimestre.
Dans une ligne nous retrouvons les notes de tous les élèves dans un devoir. Dans une
colonne, nous retrouvons toutes les notes d'un élève.
<TypeSimple> <NomTabl>[<DimLigne>][<DimCol>];
Exemples :
b) 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 (c.-à-d. 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.
En supposant qu'une variable du type double occupe 8 octets (c-à-d : sizeof(double)=8), pour
le tableau T déclaré par: double T[10][15]; C réservera L*C*M = 10*15*8 = 1200 octets en
mémoire.
a) Initialisation :
Exemples
Exemples
b) 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
/ \
| A[0][0] A[0][1] A[0][2] . . . A[0][C-1] |
| A[1][0] A[1][1] A[1][2] . . . A[1][C-1] |
| A[2][0] A[2][1] A[2][2] . . . A[2][C-1] |
| . . . . . . . . . . . . . . . |
| A[L-1][0] A[L-1][1] A[L-1][2] . . . A[L-1][C-1] |
\ /
Attention ! :
En C,
Lors du travail avec les tableaux à deux dimensions, nous utiliserons deux indices (p.ex:
I et J), et la structure for, souvent imbriquée, pour parcourir les lignes et les colonnes des
tableaux.
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");
}
}
Remarques :
- Avant de pouvoir afficher les composantes d'un tableau, il faut leur affecter des
valeurs.
- Pour obtenir des colonnes bien alignées lors de l'affichage, il est pratique d'indiquer la
largeur minimale de l'affichage dans la chaîne de format. Pour afficher des matrices du
type int (valeur la plus 'longue': -32768), nous pouvons utiliser la chaîne de
format "%7d" : printf("%7d", A[I][J]);
b) remplissage de la matrice :
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;
}
#include<stdio.h>
#include<stdlib.h>
#define nb_lig 50
#define nb_col 50
void main()
{ int M[nb_lig][nb_col],l,c,i,j;
do
{
printf("\n Donner le nombre de lignes et de colonnes de la matrice ");
printf("\n ********* Maximum (50 lignes et 50 colonnes) ******** : ");
scanf("%d%d",&l,&c);
}
while(l<1 || l>nb_lig || c<1 || c>nb_col);
Exercices d'applications :
Exercice 5 :
Ecrire un programme qui lit les dimensions L et C d'un tableau T à deux dimensions du
type int (dimensions maximales : 50 lignes et 50 colonnes). Remplir le tableau par des valeurs
entrées au clavier et afficher le tableau ainsi que la somme de tous ses éléments.
Exercice 6 :
Ecrire un programme qui lit les dimensions L et C d'un tableau T à deux dimensions du
type int (dimensions maximales : 50 lignes et 50 colonnes). Remplir le tableau par des valeurs
entrées au clavier et afficher le tableau ainsi que la somme de chaque ligne et de chaque colonne
en n'utilisant qu'une variable d'aide pour la somme.
Exercice 7 :
Ecrire un programme qui transfère un tableau M à deux dimensions L et C (dimensions
maximales : 10 lignes et 10 colonnes) dans un tableau V à une dimension L*C.
Exemple:
/ \
| a b c d | / \
| e f g h | ==> | a b c d e f g h i j k l |
| i j k l | \ /
\ /