INF155 – Introduction à la programmation
Tableaux
Amal Ben Abdellah
Ing., PhD., Chargée de cours
Département d'informatique,
Université de Sherbrooke
Introduction
Exercice 1
Ecrire un programme permettant de saisir les 8 notes des examens d'un
étudiant puis les afficher avec sa moyenne.
Introduction
Exercice 1
Ecrire un programme permettant de saisir les 10 notes des examens d'un
étudiant puis les afficher avec sa moyenne.
Solution
v o i d m a i n ()
{
i n t n o t e = 0 , s o m m e = 0 , m o y e n n e = 0 , i =0;
for (i = 0 ; i <10 ; i++)
{ p r i n t f (" d o n n e z la note n u m e r o %d : " , i +1) ;
scanf ("% d", ¬e ) ;
s o m m e += n o te ;
}
m o y e n n e = s o m m e /10;
p r i n t f ( " L a m o y e n n e e s t : % d " , m o y e n n e );
}
Introduction
Exercice 2
Ecrire un programme qui permet de saisir les moyennes de tous les 500
étudiants inscrit puis calculer la moyenne générale.
Introduction
Exercice 2
Ecrire un programme qui permet de saisir les moyennes de tous les 500
tudiants inscrit en MI puis calculer la moyenne g n rale.
Solution :
v o i d m a i n ()
{
i n t M = 0 , s o m m e = 0 , m o y e n n e = 0 , i =0;
f o r ( i = 0 ; i < 5 0 0 ; i ++)
{ p r i n t f (" d o n n e z la m o y enne n u m e r o %d : " , i + 1 ) ;
scanf ("% d", M) ;
s o m m e +=M;
}
moyenne = somme /500;
p r i n t f ( " L a m o y e n n e e s t : % d " , m o y e n n e );
}
Introduction
Exercice 3
Ecrire un programme qui permet de saisir les moyennes de tous les 500
étudiants inscrit en MI puis de d terminer combien d'entre elles sont
supérieures à la moyenne de la classe.
Introduction
Exercice 3
Ecrire un programme qui permet de saisir les moyennes de tous les 500
étudiants inscrit puis de déterminer combien d'entre elles sont
supérieures à la moyenne de la classe.
Solution :
v o i d m a i n ()
{
i n t M1 , M2 , M3 , M4 , M5 , M6 , M7 , M8 , M9 , M 1 0 , M 1 1 , M 1 2 , M 1 3 , . . . . .
...
M o y enne G e n er al e = ( M1 + M 2 + M 3 + M 4 + M 5 + M 6 + M 7 + M 8 + M 9 + M10 + M11 + M 1 2 + M13
+...) /500 ;
p r i n t f ( " L a m o y e n n e e s t : % d " , M o y e n n e );
Euuuuuuuuuuuuuhhhhh !!!!
...
}
N'y a t-il pas un moyen plus simple et plus élégant pour écrire ca ?
Notion de tableaux
Définition
• Un ensemble de valeurs portant le même nom de variable et repérées
par un nombre, s'appelle un tableau, ou encore une variable indice
• Le nombre qui, au sein d'un tableau, sert à repérer chaque valeur
s'appelle l'indice
• Chaque élément du tableau est désigné par le nom du tableau,
suivi de l'indice de l' élément, entre crochets
Tableau en mémoire
• Un schéma d'illustration d'un tableau de
4 cases en m moire qui commence
l'adresse 1600.
• Lorsqu'un tableau est créé, il prend un
espace contigu en mémoire : les cases
sont les unes à la suite des autres.
• Toutes les cases d'un tableau sont du
m me type. Ainsi, un tableau de int
contiendra uniquement des int, et pas
autre chose.
Déclaration d'un tableau et l'accès à ses éléments
Exemple
int notes [10];
...
n o t e s [ 0 ] = 14;
n o t e s [ 1 ] = 8;
n o t e s [ 2 ] = 12;
n o t e s [ 3 ] = 17;
...
1. Il suffit donc de rajouter entre crochets le nombre de cases que
vous voulez mettre dans votre tableau. pas de limite.
2. Pour accéder àchaque élément du tableau, il faut écrire le nom du
tableau suivi de l'indice de l' élément concern entre crochets.
Attention
Un tableau commence à l'indice numéro 0 ! Notre tableau notes de 10 int
a donc les indices 0, 1, 2,... et 9. Il n'y a pas d'indice 10 dans un tableau
de 10 cases ! C'est une source d'erreurs très courantes pour les débutants.
Initialiser un tableau
• Il faut savoir qu'il existe une autre façon d'initialiser un tableau
un peu plus automatisée en C.
• Elle consiste à placer les valeurs une une entre accolades,
séparées par des virgules.
Exemple :
v o i d m a i n ()
{
i n t t a b l e a u [ 4 ] = { 0 , 0 , 0 , 0};
d o u b l e A [ 3 ] = { 1 . 6 , 3 . 7 8 , 1 4 .8 9 2 } ;
}
Initialiser un tableau
• on peut également définir les valeurs des premières cases du
tableau, toutes celles que vous n'aurez pas renseignées seront
automatiquement mises à 0.
Exemple :
v o i d m a i n ()
{
int t a b 1 [4] = { 0 , 0 , 0 , 0}; // 0, 0, 0, 0
int t a b 2 [6] = {10 , 23}; // 10 , 23 , 0, 0, 0, 0
int t a b 3 [4] = {0}; // 0, 0, 0, 0
int t a b 4 [5] = {1}; // 1, 0, 0, 0, 0, 0 ,
}
Attention
Dans le tableau tab4, on n'initialise pas toutes les cases 1 : seule la
premi re case sera 1, toutes les autres seront à 0.
Parcourir un tableau
• Supposons qu'on veuille maintenant afficher les valeurs de
chaque case du tableau.
• On aurait pu faire autant de printf qu'il y a de cases. Mais ce
serait répétitif et lourd, et imaginez un peu la taille de notre code
si on devait afficher le contenu de chaque case du tableau une
une !
• Le mieux est de se servir d'une boucle qui est très pratique
pour parcourir un tableau :
Exemple
# i n c l u d e < s t d i o .h>
int main (void )
{
d o u b l e n o t e s [ 8 ] = { 1 4 , 2, 15.5 , 13 , 4, 19 , 17.5 , 16};
for (int i = 0 ; i < 8 ; i++)
p r i n t f ( " % f\ n " , n o t e s [i]);
}
Parcourir un tableau
# i n c l u d e < s t d i o .h>
int main (void )
{
d o u b l e n o t e s [ 8 ] = { 1 4 , 2, 15.5 , 13 , 4, 19 , 17.5 , 16};
for (int i = 0 ; i < 8 ; i++)
p r i n t f ( " % f\ n " , n o t e s [i]);
}
• La boucle parcourt le tableau à l'aide d'une variable appelée i
(c'est le nom le plus souvent utilisé pour parcourir un tableau !).
• Notez qu'on peut mettre une variable entre crochets pour
parcourir le tableau, c'est- -dire accéder ses valeurs.
• Attention à ne pas tenter d’afficher la valeur de notes[10]
!Sinon vous aurez soit n'importe quoi, soit une belle erreur, l'OS
interrompra votre programme car il aura tent d'accéder à une
adresse ne lui appartenant pas.
Et si on revenait à notre exercice de départ ?
Solution
# i n c lude < s t d i o .h>
int main (void )
{
int i , som , nbm ;
double moy ;
int t[450] ;
f o r ( i = 0 ; i < 4 5 0 ; i ++)
{ p r i n t f (" d o n n e z la note de l ' e t u diant n u m e r o %d : " , i + 1 ) ;
s c a n f ( " % d " , &t[ i ] ) ;
}
for (i = 0 , som =0 ; i <450 ; i ++) som += t[ i] ;
moy = som / 450 ;
p r i n t f ( " \ n\ n m o y enne de la p r o m o : %f\ n " , moy ) ;
for (i = 0 , nbm =0 ; i <450 ; i + + )
if (t[ i] > m o y ) nbm ++ ;
printf ("% d etudiants ont plus que cette moyenne ", nbm ) ;
}
Passage de tableaux à une fonction
Exemple :
void saisir (int tab [], int taille Tab )
{
i n t i;
f o r ( i = 0 ; i < t a i l l e T a b ; i ++)
s c a n f ( " % d " , & tab [i]);
}
void afficher (int tab [], int taille Tab )
{
i n t i;
f o r ( i = 0 ; i < t a i l l e T a b ; i ++)
printf ("% d\ n", tab [i]);
}
v o i d m a i n ()
{
int t a b l e a u [4] = {0};
s a i s i r ( t a b l e a u , 4);
a f f icher ( t a b l e a u , 4);
}
Le nom d'un tableau est un pointeur
int notes [10];
p r i n t f ( " % d " , n o t e s );
printf ("% d", notes [0]) ;
p r i n t f ( " % d " , * n o t e s );
• Au début, on affiche l'adresse où se trouve le tableau notes :
1600
• En revanche, si on indique l'indice d'une case du tableau notes entre
crochets, on obtient sa valeur : par exemple notes[0] = 14. De meme
pour les autres indices.
• Le nom du tableau notes est un pointeur vers la première case du
tableau notes, on peut donc utiliser le symbole * pour conna tre la
valeur de la premi re case : *notes = 14
• Il est aussi possible d'obtenir la valeur de la seconde case avec
*(notes + 1) (adresse de tableau + 1). notes[1] et *(notes + 1)
sont donc quivalents.
• De manière générale, notes[0] est la valeur qui se trouve à
l'adresse notes + 0 (1600). notes[1] est la valeur se trouvant
l'adresse notes + 1 (1601), et ainsi de suite.
Passage de tableaux à une fonction : pointeur
Exemple :
# i n c l u d e < s t d i o .h>
void saisir (int *tableau , int taille Tableau )
{
i n t i;
f o r ( i = 0 ; i < t a i l l e T a b l e a u ; i ++)
scanf ("% d", tableau +i);
}
void afficher (int *tableau , int taille Tableau )
{
i n t i;
f o r ( i = 0 ; i < t a i l l e T a b l e a u ; i ++)
p r i n t f ( " % d\ n " , *( t a b leau + i ) ) ;
}
v o i d m a i n ()
{
int tab [4] = {0};
s a i s i r ( tab , 4);
a f f icher (tab , 4);
}
Tableaux à deux dimension
• Un tableau à deux dimensions est interpréter comme un
tableau de dimension N dont chaque élément est un tableau de
dimension M.
On appelle N le nombre de lignes et M le nombre de colonnes du
tableau Tab. N et M sont alors les deux dimensions du tableau.
• Un tableau deux dimensions contient donc N*M é léments
Tableaux à deux dimension
• Un tableau à deux dimensions est à interpréter comme un
tableau de dimension N dont chaque élément est un tableau de
dimension M.
On appelle N le nombre de lignes et M le nombre de colonnes du
tableau Tab. N et M sont alors les deux dimensions du tableau.
• Un tableau deux dimensions contient donc N*M é léments.
Déclaration et mémorisation des tableaux à deux
dimensions
• 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).
int A [3 ] [ 2] = {{1 , 2 },
{10 , 2 0 },
{100 , 200}};
• Les éléments d'un tableau deux dimensions sont stock es ligne par
ligne dans la mémoire.
Initialisation des tableaux à deux dimensions
• Lors de la d claration d'un tableau, on peut initialiser les éléments du
tableau, en indiquant la liste des valeurs respectives entre accolades.
• à l'intérieur de la liste, les éléments de chaque ligne du tableau sont
encore une fois comprises entre accolades.
• Pour améliorer la lisibilité des programmes, on peut indiquer
les composantes dans plusieurs lignes.
i n t A [3 ] [ 1 0 ] = { { 0 , 1 0 , 2 0 , 3 0 , 4 0 , 5 0 , 6 0 , 7 0 , 8 0 , 9 0 } ,
{10 ,11 ,12 ,13 ,14 ,15 ,16 ,17 ,18 ,19} ,
{ 1 ,12 ,23 ,34 ,45 ,56 ,67 ,78 ,89 ,90}};
d o u b l e B [3 ] [ 2] = {{ - 1.05 , - 1.10 },
{86 e -5 , 8 7 e - 5 },
{ - 1 2 . 5 E4 , - 1 2 . 3 E 4 }};
• Lors de l'initialisation, les valeurs sont affectées ligne par ligne
en passant de gauche à droite.
• Nous ne devons pas nécessairement indiquer toutes les valeurs :
Les valeurs manquantes seront initialisées par zéro.
Accès aux éléments d'un tableau à deux dimensions
Consid rons un tableau A de dimensions N et M.
int A [ ] [ 1 0 ] = {{ 0 ,10 ,20 ,30 ,40 ,50 ,60 ,70 ,80 ,90} ,
{10 ,11 ,12 ,13 ,14 ,15 ,16 ,17 ,18 ,19} ,
{ 1 ,12}};
• Les indices du tableau varient de 0 à N-1, respectivement de 0 à M-1.
• L' élément de la ii m e ligne et ji m e colonne est noté :
A[i-1][j-1]
• A[0][0] : 0, A[1][0] : 10, A[1][2] :12, A[2][9] :0.
Parcours d'un tableaux à deux dimensions
# i n c lude < s t dio .h>
# i n c lude < s t dlib .h>
v o id a f f i c h er T a bleau ( int t a b leau [2 ] [ 2]) ;
int main (void )
{
i n t t a b l e a u [2 ] [ 2 ] = { { 1 0 , 2 0 } , { 1 5 , 3 5 } } ;
a f f i c h e r T a b l e a u ( t a b l e a u );
r e t u r n 0;
}
v o i d a f f i c h e r T a b l e a u ( i n t t a b l e a u [ 2 ] [ 2])
{
i n t i = 0;
i n t j = 0;
for (i = 0; i < 2; i ++) {
for (j = 0; j < 2; j ++) {
p r i n t f (" T a b leau [% d ][% d] = %d\ n " , i , j , t a b leau [i ] [ j]);
}
}
}
Exercice 1
▪ Soit un tableau de 100 éléments. Un collègue vous affirme que la
case ayant pour indice 100 n’existe pas. A-t-il raison et pourquoi?
▪ Complétez le programme suivant afin d’afficher à l’écran le
nombre total de bonnes notes. Une note est bonne si elle est
supérieure à 80.
int main(void)
{
int notes[8]= {70, 89, 72, 65, 92, 77, 81, 78};
...
...
}
Exercice 2
▪ Écrire un programme qui déclare un tableau de taille 100, qui y
stocke les 100 premiers termes de la suite de Fibonacci puis
qui les affiche.
Définition: la suite de Fibonacci se définit récursivement
▪ Fib(0) = 0
▪ Fib(1) = 1
▪ Pour n>1, Fib(n) = Fib(n-2)+Fib(n-1)