0% ont trouvé ce document utile (0 vote)
2 vues26 pages

Cours5 Tableaux

Le document présente des exercices de programmation en C sur l'utilisation des tableaux, incluant la saisie et l'affichage de notes d'étudiants, ainsi que le calcul de moyennes. Il explique également les concepts de déclaration, d'initialisation et de parcours de tableaux, ainsi que les tableaux à deux dimensions. Enfin, il aborde le passage de tableaux à des fonctions et les pointeurs associés.

Transféré par

Farouk Saad
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
2 vues26 pages

Cours5 Tableaux

Le document présente des exercices de programmation en C sur l'utilisation des tableaux, incluant la saisie et l'affichage de notes d'étudiants, ainsi que le calcul de moyennes. Il explique également les concepts de déclaration, d'initialisation et de parcours de tableaux, ainsi que les tableaux à deux dimensions. Enfin, il aborde le passage de tableaux à des fonctions et les pointeurs associés.

Transféré par

Farouk Saad
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

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", &note ) ;
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)

Vous aimerez peut-être aussi