École Supérieure de Technologie
et d’Informatique
A.U. 2011/2012
Cours programmation en langage C
Chapitre 5: Les tableaux (5 pages)
Informatique Appliquée 1ère année
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.
Les tableaux à une dimension
Définition :Un tableau (uni-dimensionnel) est une variable structurée formée d'un nombre
entier n de variables simples de même type, qui sont appelées les composantes du tableau.
1. Déclaration et mémorisation
<TypeSimple> <NomTableau>[<Dimension>];
Exemple
La déclaration
int tab[5];
définit un tableau nommé tab de 5 éléments. Ces éléments sont de type entier .
On peut accéder à la première composante du tableau par tab[0], à la deuxième composante
par tab[1], . . . , à la dernière composante par tab[4].
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.
#include<stdio.h>
void main()
{
int x=5;
printf(" la valeur de x est %d, son adresse est %p ", x, &x);
}
exécution
la valeur de x est 5, son adresse est 0012FF7C
#include<stdio.h>
void main()
{
int tab[5];
printf(" l'adresse de début est %p ", tab);
}
exécution
l'adresse de début est 0012FF6C
Exemple:
Mme Wiem Yaiche Elleuch les tableaux
Page 1
int tab[5]= {11, 12, 13,14,15} ;
tab[i] :
&tab[i] :
tab
11
Publicité
12
13
14
F800
F810
F820
F830
15
F840
indice i :
0 1 2 3 4
Dans cet exemple : tab[0] est 11 ; tab[1] est 12 ; etc
&tab[0] est F800 ; &tab[1] est F810 ; etc
- l'accès au premier élément du tableau se fait par tab[0]
- l'accès au dernier élément du tableau se fait par tab[N-1]
Si un tableau est formé de N composantes et si une composante a besoin de M octets en
mémoire, alors le tableau occupera de N*M octets.
Exemple
En supposant qu'une variable du type long occupe 4 octets (c.-à-d: sizeof(long)=4), pour le
tableau tab déclaré par: long tab[15]; => NM = 154 = 60 octets réservés en mémoire.
2. 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.
Exemples:
int tab[5] = {10, 20, 30, 40, 50};
char tab[5]={‘A’,’b’,’C’, ‘d’, ‘e’};
Il faut évidemment veiller à ce que le nombre de valeurs dans la liste corresponde à la
dimension du tableau. Si la liste ne contient pas assez de valeurs pour toutes les
composantes, les composantes restantes sont initialisées par zéro.
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
int tab[] = {10, 20, 30, 40, 50};
==> réservation de 5*sizeof(int) octets (dans notre cas: 10 octets)
int C[] = {1, 0, 0, 1, 1, 1, 0, 1, 0, 1};
==> réservation de 10*sizeof(int) octets (dans notre cas: 20 octets)
La structure for se prête particulièrement bien au travail avec les tableaux.
#include<stdio.h>
void main()
{
int tab[5]={11,12,13,14,15};
printf(" l'adresse de début est %p \n", tab);
for(int i=0; i<5; i++)
printf(" l'element est %d, son adresse est %p \n", tab[i], &tab[i]);
}
Exécution :
Mme Wiem Yaiche Elleuch les tableaux
Publicité
Page 2
l'adresse de dÚbut est 0012FF6C
l'element est 11, son adresse est 0012FF6C
l'element est 12, son adresse est 0012FF70
l'element est 13, son adresse est 0012FF74
l'element est 14, son adresse est 0012FF78
l'element est 15, son adresse est 0012FF7C
Press any key to continue
#include <stdio.h>
void main()
{
// réservation de l’espace mémoire pour 20 entiers
int tab[20];
int i,n;
printf(« saisir le nombre d’éléments ») ;
scanf(« %d »,&n) ;
// n est le nombre d’entiers qu’on va saisir
for (i=0; i<n; i++)
scanf("%d", &tab[i]);
for (i=0; i<n; i++)
printf("%d ", tab[i]);
}
Remarques
- Comme scanf a besoin des adresses des différentes composantes du tableau, il faut faire
précéder le terme tab[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)
- La deuxième condition dans la structure for n'est pas une condition d'arrêt, mais une
condition de répétition! Ainsi la commande d'affichage sera répétée aussi longtemps que i
est inférieur à n. La boucle sera donc bien exécutée pour les indices 0,1,2 .. n-1
- La commande printf doit être informée du type exact des données à afficher. (Ici: %d
ou %i pour des valeurs du type int)
- 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", tab[i]);
printf("%7d", tab[i]);
Exemple 1:
Ecrire un programme qui remplit et affiche un tableau d’entiers, ensuite calcule et affiche la
somme et la moyenne des éléments du tableau.
#include <stdio.h>
void main ( )
{
int tab[50];
int i,n,som=0;
float moyenne;
printf("saisir la taille du tableau ");
scanf("%d", &n);
//remplissage
Publicité
Mme Wiem Yaiche Elleuch les tableaux
Page 3
for (i=0; i<n; i++)
scanf("%d", &tab[i]);
//affichage
for (i=0; i<n; i++)
printf("l'element d'indice %d est %d \n",i, tab[i]);
for (i=0; i<n; i++)
som+=tab[i];
printf(" la somme est %d", som);
printf(" la moyenne est %5.2f", som/n);
}
Exemple 2 :
Ecrire un programme qui remplit et affiche un tableau d’entiers, ranger ensuite les éléments
du tableau dans l'ordre inverse sans utiliser de tableau d'aide. Afficher le tableau résultant.
#include <stdio.h>
void main ( )
{
int tab[50];
int i,j,aide,n;
printf("saisir la taille du tableau ");
scanf("%d", &n);
for (i=0; i<n; i++)
scanf("%d", &tab[i]);
for (i=0; i<n; i++)
printf(" %d \n", tab[i]);
for (i=0, j=n-1 ; i<j ; i++,j--)
{
aide = tab[i];
tab[i] = tab[j];
tab[j] = aide;
}
for (i=0; i<n; i++)
printf("%d \n", tab[i]);
}
Exemple 3 (extrait du DS de l’année 2009-2010):
Ecrire un programme qui remplit et affiche un tableau d’entiers. Copier ensuite toutes les
composantes positives ou nulles 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.
#include <stdio.h>
void main ( )
{
int tab[50], tpos[50], tneg[50], pos=0, neg=0;
int i,n;
Mme Wiem Yaiche Elleuch les tableaux
Page 4
printf("saisir la taille du tableau ");
scanf("%d", &n);
Publicité
for (i=0; i<n; i++)
scanf("%d", &tab[i]);
for (i=0; i<n; i++)
{
if (tab[i]>=0)
{
tpos[pos]=tab[i];
pos++;
tneg[neg]=tab[i];
neg++;
}
if (tab[i]<0)
{
}
}
printf(" Affichage du tableau positif \n");
for (i=0; i<pos; i++)
printf(" %d \n", tpos[i]);
printf(" Affichage du tableau négatif \n");
for (i=0; i<neg; i++)
printf(" %d \n", tneg[i]);
}
Exemple 4:
Ecrire un programme qui détermine la plus grande et la plus petite valeur dans un tableau
d'entiers tab. Afficher ensuite la valeur et la position du maximum et du minimum. Si le
tableau contient plusieurs maxima ou minima, le programme retiendra la position du
premier maximum ou minimum rencontré.
#include <stdio.h>
void main ( )
{
int tab[5];
int i,n, min=0, max=0;
printf("saisir la taille du tableau ");
scanf("%d", &n);
for (i=0; i<n; i++)
scanf("%d", &tab[i]);
for (i=0; i<n; i++)
{
if(tab[i]>tab[max]) max=i;
if(tab[i]<tab[min]) min=i;
}
printf (" le maximum est %d, son indice est %d \n le minimum est %d, son indice
est %d", tab[max], max, tab[min],min);
}
Mme Wiem Yaiche Elleuch les tableaux
Page 5