Cours
Cours
Cours
Programmation Impérative
HLIN202
Université de Montpellier
Volume horaire
Volume horaire :
9 Cours
12 TDs
12 TPs
Le TD et le TP se font sur 3h en salle informatisée.
Évaluation du cours
Objectifs
Plan
1 Introduction
3 Structures de contrôle
4 Fonctions
5 Pointeurs
6 Tableaux
7 Structures de données
Programmation Impérative
Introduction
Langage de programmation
Plan
1 Introduction
Langage de programmation
Programmation impérative
Les langages C/C++
Les erreurs
Programmation Impérative
Introduction
Langage de programmation
Langage de programmation
Definition
Un langage de programmation est un système de notation
permettant de décrire de manière simple une suite d’actions
ordonnée qu’un ordinateur pourra exécuter.
Langage assembleur
Langage procédurale proche de l’architecture de la machine.
Syntaxe différente d’un processeur à l’autre.
. section __TEXT, __text , r e g u l a r , p u r e _ i n s t r u c t i o n s
. globl _main
. align 4 , 0 x90
_main : ## @main
. cfi_startproc
## BB#0:
push rbp
Ltmp2 :
. c f i _ d e f _ c f a _ o f f s e t 16
Ltmp3 :
. c f i _ o f f s e t rbp , −16
mov rbp , r s p
Ltmp4 :
. c f i _ d e f _ c f a _ r e g i s t e r rbp
mov eax , 0
mov dword p t r [ r b p − 4 ] , 0
mov dword p t r [ r b p − 8 ] , 10
pop rbp
ret
. cfi_endproc
. subsections_via_symbols
Programmation Impérative
Introduction
Langage de programmation
Langage assembleur
Remarque
On dit que du code en langage assembleur n’est pas portable car il
n’est pas garanti de fonctionner sur n’importe quel ordinateur.
Programmation Impérative
Introduction
Langage de programmation
Remarque
Certains langages interprétés utilisent une compilation vers un lan-
gage intermédiaire pour améliorer les performances, ex. JAVA.
Programmation Impérative
Introduction
Langage de programmation
Remarque
Un paradigme peut être mieux adapté qu’un autre pour certaines tâches.
Deux programmes peuvent produire les mêmes résultats tout en étant écrit
avec des langages différents.
Programmation Impérative
Introduction
Programmation impérative
Plan
1 Introduction
Langage de programmation
Programmation impérative
Les langages C/C++
Les erreurs
Programmation Impérative
Introduction
Programmation impérative
Définition
Remarque
Ce modèle de programmation est au plus proche des architectures
de nos ordinateurs actuels.
Programmation Impérative
Introduction
Programmation impérative
de la mémoire
des unités de calcul sur des nombres
(entiers/réels)
des unités de contrôle
!"#"$%"&'()%**%+'
Mémoire d’un ordinateur !"#$%&'()#*+,-,.(/%(0%1$%*#(/%(+2"1/,&*'%#13(+%(41"0%55%#1(4%16%'(/%(6*&,4#+%1(
%'(/%('1*,'%1(+%5(/"&&.%5()#,(+#,(5"&'(-"#1&,%57(!*(4#,55*&0%(*(#&%(,&-+#%&0%(5#1(+*(
$,'%55%(/2%8.0#',"&(/%($"5(+"9,0,%+5(%'(/%5("4.1*',"&5()#%($"#5(%--%0'#%:7
,"#"$-"./.(0'%"101%
;*1'%&*,1%(/%('1*$*,+(/#(
41"0%55%#13(+*(6.6",1%($,$%(
<*44%+.%(*#55,(234=(5'"0>%(
'%64"1*,1%6%&'(+%5(/"&&.%5(?(
'1*,'%1(4*1(+%(41"0%55%#17(@,&5,3(
4+#5(,+(A(*(/%(6.6",1%(/%(
/,54"&,B+%3(4+#5(,+(%5'(4"55,B+%(
/2A(0"&5%1$%1(/%5(/"&&.%5(
'%64"1*,1%6%&'(<0%()#,(.$,'%(
/2*00./%1(*#(/,5)#%(/#1()#,(%5'(
4+#5(+%&'=7
Contenu de la mémoire
Exemple
La représentation en mémoire de 63576473 est
00000011110010100001100110011001
celle de Π peut-être
11001001000011111101101010100010001000010110100011000
Programmation Impérative
Introduction
Programmation impérative
Contenu de la mémoire
On aura :
des types de base fournis par le langage, e.g. float, int.
un mécanisme d’extension des types, e.g. codage d’une image.
Programmation Impérative
Introduction
Programmation impérative
Instructions possibles :
de calcul : 3+5
de contrôle : si ... alors ... sinon, pour, tant que
de mémoire :
nommer une zone mémoire : variable
accéder directement à une case mémoire : pointeur
modifier une zone mémoire : affectation
Programmation Impérative
Introduction
Les langages C/C++
Plan
1 Introduction
Langage de programmation
Programmation impérative
Les langages C/C++
Les erreurs
Programmation Impérative
Introduction
Les langages C/C++
Historique
Le langage C
Le langage C++
Caractéristiques importantes
Remarque
permet de rester très proche de l’architecture des ordinateurs,
utile pour avoir les meilleures performances possibles
Programmation Impérative
Introduction
Les langages C/C++
Attention
les concepts généraux présentés en C++ restent valables en C,
la mise en oeuvre et la syntaxe restent parfois différentes.
Programmation Impérative
Introduction
Les langages C/C++
exemple.cpp
1 #i n c l u d e <i o s t r e a m >
2
3 i n t main ( ) {
4 int a ,b , c ;
5 s t d : : c i n >>a>>b ;
6 c=a+b ;
7 s t d : : cout <<a<<"+"<<b<<"="<<c<<s t d : : e n d l ;
8
9 return 0;
10 }
Programmation Impérative
Introduction
Les langages C/C++
Objectif
Traduire un programme décrit en C++ dans un programme décrit
en langage machine.
Attention
Les programmes écrits en C++ ne sont pas exécutables, seules leurs
traductions en langage machine le sont.
Un exemple de compilation
Syntaxe générale
g++ -Wall source.cpp -o execu
source.cpp est le fichier du programme en C++.
execu est le programme traduit exécutable sur la machine.
-o ... indique que ... est le nom du programme.
Programmation Impérative
Introduction
Les langages C/C++
Un exemple de compilation
Syntaxe générale
g++ -Wall source.cpp -o execu
source.cpp est le fichier du programme en C++.
execu est le programme traduit exécutable sur la machine.
-o ... indique que ... est le nom du programme.
Programmation Impérative
Introduction
Les langages C/C++
Attention
la fonction main n’est définie qu’une seule fois par programme.
Programmation Impérative
Introduction
Les erreurs
Plan
1 Introduction
Langage de programmation
Programmation impérative
Les langages C/C++
Les erreurs
Programmation Impérative
Introduction
Les erreurs
Les erreurs
Erreurs de syntaxe
Remarque
Les langages de programmation ne peuvent être ambigus. Chaque
mot clé du langage a un sens et il faut les utiliser correctement.
Erreurs de syntaxe
syntax-error.cpp
1 i n t main ( )
2 {
3 int a
4 return 0;
5 }
Compilation
g++ -Wall syntax-error.cpp -o syntax-error
s y n t a x−e r r o r . cpp : I n f u n c t i o n ‘ i n t main ( ) ’ :
s y n t a x−e r r o r . cpp : 3 : 3 : e r r o r : e x p e c t e d i n i t i a l i z e r before ‘ return ’
Erreurs de conception
Exemple
1 faire chauffer une poêle avec de l’huile.
Erreurs de conception
Attention
Un ordinateur exécute strictement les ordres qu’on lui donne ! ! !
Attention
Le compilateur ne peut pas détecter les erreurs de conception ! ! !
Programmation Impérative
Introduction
Les erreurs
Erreurs d’exécution
Remarque
Un programme peut fonctionner correctement très longtemps et pro-
duire soudainement une erreur.
Erreurs d’exécution
execution-error.cpp
1 #i n c l u d e <i o s t r e a m >
2 i n t main ( )
3 {
4 int a ,b , c ;
5 s t d : : c i n >>a>>b ;
6 c=a /b ;
7
8 return 0;
9 }
Plan
1 Introduction
3 Structures de contrôle
4 Fonctions
5 Pointeurs
6 Tableaux
7 Structures de données
Programmation Impérative
Bases du langage C++
1 i n t main ( ) {
2 d é c l a r a t i o n de v a r i a b l e s
3 i n s t r u c t i o n s du programme
4 return 0;
5 }
Programmation Impérative
Bases du langage C++
Plan
1 1 0 0 1 1 1
Complément à deux
−103 = −128 + 25 = −128 + 16 + 8 + 1 = −27 + 24 + 23 + 20
1 0 0 1 1 0 0 1 sur 8 bits
1 1 0 0 1 1 0 0 1 sur 9 bits
On dit que le bit de poids fort (le plus à gauche) est le bit de signe.
,→ il a un poids négatif si non nul.
Programmation Impérative
Bases du langage C++
Les type de données
Exemple
short int a= 103;
0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1
| {z }
a
Programmation Impérative
Bases du langage C++
Les type de données
Remarque
Sur une machine Unix 64-bits, on admet communément que
taille int = 4 octets ; taille long int = 8 octets ;
Programmation Impérative
Bases du langage C++
Les type de données
Norme IEEE754 :
Plan
Les constantes
Exemple
int a=10;
1+2+3+4+5;
1<2;
Programmation Impérative
Bases du langage C++
Les constantes
Elles sont définies en accord avec le type natif des entiers (int) et
appartiennent donc à l’intervalle [−231 , 231 − 1] (en général).
1 int a ;
2 a= 2 1 4 7 4 8 3 6 4 7 ; ( affectation valide −> a=2^31 −1)
3 a= 2 1 4 7 4 8 3 6 4 8 ; ( c o n s t a n t e e r r o n é e −> a= −2^31)
4 long i n t b ;
5 b= 2147483648 L ; ( a f f e c t a t i o n v a l i d e −> b= 2^31)
Remarque
Le compilateur provoquera une alerte si la constante est supérieure
à la capacité du type affecté. short int a=2147483647;
Programmation Impérative
Bases du langage C++
Les constantes
Codage scientifique
Plan
Manipulation de la mémoire
Rappel :
la mémoire est binaire (un grand tableau de 0 et de 1)
un langage impératif manipule directement la mémoire
0 1 1 0 1 0 0 1 1 1 1 0 1 0 1 1 1 1 1 0
Programmation Impérative
Bases du langage C++
Les variables
Manipulation de la mémoire
Rappel :
la mémoire est binaire (un grand tableau de 0 et de 1)
un langage impératif manipule directement la mémoire
Manipulation de la mémoire
Rappel :
la mémoire est binaire (un grand tableau de 0 et de 1)
un langage impératif manipule directement la mémoire
Definition
On appelle variable une zone mémoire de l’ordinateur à laquelle on
a donné un nom, ainsi qu’un type de données.
Exemple
int a;
Exemple
double f;
Plan
Opérateurs de comparaisons
égalité ==
différent !=
supérieur >
inférieur <
supérieur ou égal >=
inférieur ou égal 1 <=
Opérateurs logiques
Exemple
(2.5 > 3.5) && (1 < 3) est égale à false
true || (1 >= 3) est égale à true
Programmation Impérative
Bases du langage C++
Opérateurs
Opérateur d’affectation
var = exp
exp : expression du même type que var
var : nom d’une variable déclarée
la variable var prend la valeur de l’expression exp
ex : a=2+3; a prend la valeur de l’expression 2+3 donc 5
Autres opérateurs
Attention
l’adresse des variables n’est pas choisie par le programmeur :
&a=... est interdit ! ! !
l’adresse des variables peut être stockée dans une variable :
b=&a si b a le bon type
Programmation Impérative
Bases du langage C++
Opérateurs
Plan
Conversions de types
Attention
Le langage C++ est faiblement typé.
⇒ écriture d’expressions avec des types différents
Conversions de types
Conversions de types
Exemple
1 && true ⇒ true
1.5 && true ⇒ true
0 || false ⇒ false
int a=true; ⇒ a=1
Programmation Impérative
Bases du langage C++
Les conversions de type
Exemple
1 i n t a =3 ,b =4;
2 dou bl e c= a /b ; // c =0.0
3 dou bl e d= ( d o u b l e ) a / ( double ) b // d =0.75
Programmation Impérative
Bases du langage C++
Les entrées-sorties
Plan
Les entrées-sorties
Instruction d’affichage
Definition
std::cout << exp;
1 #i n c l u d e <i o s t r e a m >
2 i n t main ( ) {
3 s t d : : c o u t << 1 ;
4 return 0;
5 }
Programmation Impérative
Bases du langage C++
Les entrées-sorties
Instruction d’affichage
Definition
std::cout << exp;
1 #i n c l u d e <i o s t r e a m >
2 i n t main ( ) {
3 int a = 18;
4 float b = 2.3;
5 s t d : : c o u t << " l ’ e n t i e r a = " << a << s t d : : e n d l ;
6 s t d : : c o u t << " l e f l o t t a n t b = " << b << s t d : : e n d l ;
7 return 0;
8 }
Definition
std::cin >> var;
Definition
std::cin >> var;
Attention
var est un identificateur de variable valide
Une saisie clavier est l’action d’écriture d’une donnée en mémoire.
Pour savoir où écrire en mémoire, on le spécifie par l’identificateur
d’une variable (dualité mémoire/variable)
1 #i n c l u d e <i o s t r e a m >
2
3 i n t main ( ) {
4 int a ;
5 float b;
6 c o u t << " E n t r e z un e n t i e r p u i s un f l o t t a n t : " ;
7 s t d : : c i n >> a >> b ;
8 return 0;
9 }
Un gabarit d’affichage
permet de spécifier un nombre minimum de caractère à afficher.
,→ des espaces sont ajoutés implicitement si nécessaire
En C++
On utilise des manipulateurs pour formatter l’affichage avec un
gabarit. Les manipulateurs disponibles dans <iomanip> sont :
Remarque
Par défaut c’est le manipulateur std::dec (décimal) qui est actif.
Un manipulateur de format reste actif tant qu’on en active pas un
autre.
Programmation Impérative
Bases du langage C++
Les entrées-sorties
1 #i n c l u d e <i o s t r e a m >
2 i n t main ( ) {
3 i n t a = 1 2 ; i n t b =8;
4 s t d : : c o u t << " a = "<<a<< " ( d é f a u t ) "<<s t d : : e n d l ;
5 s t d : : c o u t <<s t d : : o c t
6 << " a = "<<a<< " ( o c t a l ) "<<s t d : : e n d l ;
7 s t d : : c o u t << " b = "<<b<<s t d : : e n d l ;
8 s t d : : c o u t <<s t d : : h e x
9 << " a = "<<a<< " ( h e x a d é c i m a l ) "<<s t d : : e n d l ;
10 return 0;
11 }
Remarque
Par défaut c’est std::noboolalpha qui est actif.
Ce manipulateur reste actif tant qu’on en active pas un autre.
Programmation Impérative
Bases du langage C++
Les entrées-sorties
1 #i n c l u d e <i o s t r e a m >
2
3 i n t main ( ) {
4 b o o l a = t r u e ; b o o l b=f a l s e ;
5 s t d : : c o u t << " a = "<<a<<" ( d e f a u t ) "<<s t d : : e n d l ;
6 s t d : : c o u t <<s t d : : b o o l a l p h a
7 <<" a = "<<a<<" ( b o o l a l p h a ) "<<s t d : : e n d l ;
8 s t d : : c o u t <<s t d : : n o b o o l a l p h a
9 << " a = "<<a<<" ( n o b o o l a l p h a ) "<<s t d : : e n d l ;
10 s t d : : c o u t << " b = "<<b<<s t d : : e n d l ;
11 return 0;
12 }
Manipulateur de la précision
1 #i n c l u d e <i o s t r e a m >
2
3 i n t main ( ) {
4 f l o a t x = 89.786543;
5
6 s t d : : c o u t <<" x= "<<x<<" ( d e f a u t ) "<<s t d : : e n d l ;
7 s t d : : c o u t <<s t d : : f i x e d
8 <<" x= "<<x<<" ( f i x e d ) "<<s t d : : e n d l ;
9 s t d : : c o u t <<s t d : : s c i e n t i f i c
10 <<" x= "<<x<<" ( s c i e n t i f i c ) "<<s t d : : e n d l ;
11 return 0;
12 }
1 #i n c l u d e <i o s t r e a m >
2 #i n c l u d e <i o m a n i p >
3 i n t main ( ) {
4 f l o a t x = 89.786543;
5
6 s t d : : c o u t <<" x= "<<x<<" ( d e f a u t ) "<<s t d : : e n d l ;
7 s t d : : c o u t <<s t d : : s e t p r e c i s i o n ( 2 )
8 <<" x= "<<x<<" ( p r e c i s i o n 2 ) "<<s t d : : e n d l ;
9 s t d : : c o u t <<s t d : : s e t p r e c i s i o n ( 1 2 )
10 <<" x= "<<x<<" ( p r e c i s i o n 1 2 ) "<<s t d : : e n d l ;
11 return 0;
12 }
Plan
Instructions
Definition
Une instruction correspond à une étape atomique dans le
programme.
,→ toute instruction s’exécute complètement.
Exemple
int a=3,c ;
c=a+10 ;
Programmation Impérative
Bases du langage C++
Instructions
Bloc d’instructions
Definition
Un bloc d’instruction est constitué par un ensemble d’instructions
délimitées par des accolades
{ instr1; instr2; ...; instrn;}
Remarque
La fonction main en C++ correspond au bloc d’instructions définis-
sant le programme.
Programmation Impérative
Structures de contrôle
Plan
1 Introduction
3 Structures de contrôle
4 Fonctions
5 Pointeurs
6 Tableaux
7 Structures de données
Programmation Impérative
Structures de contrôle
Plan
3 Structures de contrôle
Conditionnelles
La boucle ’Pour’
La boucle ’Tant que’
La boucle ’do while’
Erreurs classiques
Programmation Impérative
Structures de contrôle
Conditionnelles
if ... else
Definition
if (exp)
instr1
else
instr2
Exemple
Déterminer si un entier est pair ou impair
1 #i n c l u d e <i o s t r e a m >
2
3 i n t main ( ) {
4 int a ;
5 a= 1 7 ;
6 i f ( a%2 == 0 )
7 s t d : : c o u t << a << " e s t p a i r "<< s t d : : e n d l ;
8 else
9 s t d : : c o u t << a << " e s t i m p a i r "<< s t d : : e n d l ;
10 return 0;
11 }
Programmation Impérative
Structures de contrôle
Conditionnelles
1 unsigned i n t a ;
2 s t d : : c i n >>a ;
3 i f ( a==1)
4 s t d : : cout <<" a=1"<<s t d : : endl ;
5 e l s e i f ( a==2)
6 s t d : : cout <<" a=2"<<s t d : : endl ;
7 e l s e i f ( a==3)
8 s t d : : cout <<" a=3"<<s t d : : endl ;
9 else
10 s t d : : cout <<" a>3"<<s t d : : endl ;
Exemple : switch
1 unsigned i n t a ;
2 s t d : : c i n >>a ;
3 switch ( a ){
4 case 1:
5 s t d : : c o u t <<" a=1"<<s t d : : endl ; break ;
6 case 2:
7 s t d : : c o u t <<" a=2"<<s t d : : endl ; break ;
8 case 3:
9 s t d : : c o u t <<" a=3"<<s t d : : endl ; break ;
10 default :
11 s t d : : c o u t <<" a>3"<<s t d : : endl ;
12 }
L’affichage sera
a=1 si la valeur de a est 1
a=2 si la valeur de a est 2
a=3 si la valeur de a est 3
a>3 si la valeur de a est différent de 1,2 ou 3
Programmation Impérative
Structures de contrôle
La boucle ’Pour’
Plan
3 Structures de contrôle
Conditionnelles
La boucle ’Pour’
La boucle ’Tant que’
La boucle ’do while’
Erreurs classiques
Programmation Impérative
Structures de contrôle
La boucle ’Pour’
Exemple
calculer la somme des entiers entre 1 et 10
s :=0 ;
pour i de 1 à 10 faire
s :=s+i ;
fin pour ;
En C++, les boucles pour sont effectuées avec l’instruction for
Programmation Impérative
Structures de contrôle
La boucle ’Pour’
L’instruction for
Definition
for (exp1; exp2; exp3)
instr
L’instruction for
Definition
for (exp1; exp2; exp3)
instr
Exemple
exp1 est remplacée par int i=1 ou i=1 si i est déjà déclaré.
Programmation Impérative
Structures de contrôle
La boucle ’Pour’
L’instruction for
Definition
for (exp1; exp2; exp3)
instr
L’instruction for
Definition
for (exp1; exp2; exp3)
instr
Exemple
exp3 est remplacée par i=i+1 ou i++
Programmation Impérative
Structures de contrôle
La boucle ’Pour’
Definition
for (exp1; exp2; exp3)
instr
1 exp1
...
2 exp2 → on continue car exp2=true
3 instr
4 exp3
...
5 exp2 → sort de la boucle car exp2=false
Programmation Impérative
Structures de contrôle
La boucle ’Pour’
Exemple
afficher les entiers entre 1 et 10 qui sont multiples de 2 ou de 3
1 #i n c l u d e <i o s t r e a m >
2
3 i n t main ( ) {
4 int i ;
5 f o r ( i =1; i <11; i ++){
6 i f ( i %2==0 | | i %3==0)
7 s t d : : c o u t << i << " " ;
8 }
9 s t d : : c o u t << s t d : : e n d l ;
10 return 0;
11 }
ce programme affiche : 2 3 4 6 8 9 10
Programmation Impérative
Structures de contrôle
La boucle ’Pour’
1 int i , s ;
2 s =0;
3 f o r ( i =1 ; i <11 ; s=s+i )
4 ...
1 int i , s ;
2 f o r ( i =1 ; i !=10 ; i +=2)
3 ...
Plan
3 Structures de contrôle
Conditionnelles
La boucle ’Pour’
La boucle ’Tant que’
La boucle ’do while’
Erreurs classiques
Programmation Impérative
Structures de contrôle
La boucle ’Tant que’
Exemple
calculer la somme des entiers entre 1 et 10
s :=0 ;
i :=1 ;
tant que i<11 faire
s :=s+i ;
i :=i+1 ;
fin tant que ;
L’instruction while
Definition
while (exp)
instr
L’instruction while
Definition
while (exp)
instr
Si exp est :
vrai : la boucle while continue et on exécute instr
faux : on sort de la boucle while sans exécuter instr
Definition
while (exp)
instr;
1 #i n c l u d e <i o s t r e a m >
2
3 i n t main ( ) {
4 int i ;
5 i =1;
6 w h i l e ( i <11){
7 i f ( i %2==0 | | i %3==0)
8 s t d : : c o u t << i << " " ;
9 i ++;
10 }
11 s t d : : c o u t << s t d : : e n d l ;
12 return 0;
13 }
ce programme affiche : 2 3 4 6 8 9 10
Programmation Impérative
Structures de contrôle
La boucle ’Tant que’
Exemple
calcul de la plus petite puissance de 2 supérieure à un entier
1 #i n c l u d e <i o s t r e a m >
2
3 i n t main ( ) {
4 int a ,p;
5 a =27;
6 p =1;
7 w h i l e ( p<a ) {
8 p=2∗p ;
9 }
10 s t d : : c o u t << p << " e s t s u p é r i e u r à "<< a<<s t d : : e n d l ;
11 return 0;
12 }
Plan
3 Structures de contrôle
Conditionnelles
La boucle ’Pour’
La boucle ’Tant que’
La boucle ’do while’
Erreurs classiques
Programmation Impérative
Structures de contrôle
La boucle ’do while’
L’instruction do while
Definition
while (exp)
instr
1 instr
...
2 exp → sort de la boucle si exp=false
3 instr
...
4 exp → sort de la boucle si exp=false
5 instr
...
Programmation Impérative
Structures de contrôle
La boucle ’do while’
Plan
3 Structures de contrôle
Conditionnelles
La boucle ’Pour’
La boucle ’Tant que’
La boucle ’do while’
Erreurs classiques
Programmation Impérative
Structures de contrôle
Erreurs classiques
Récapitulatif
Plan
1 Introduction
3 Structures de contrôle
4 Fonctions
5 Pointeurs
6 Tableaux
7 Structures de données
Programmation Impérative
Fonctions
Introduction
Plan
4 Fonctions
Introduction
Définition
Appel d’une fonction
Portée des variables
Définir des constantes
Où placer les fonctions
Récursivité
Programmation Impérative
Fonctions
Introduction
Remarque
Les programmes sont plus lisibles et donc plus faciles à maintenir.
Programmation Impérative
Fonctions
Introduction
Deux solutions :
1 i n t p u i s s a n c e I n f ( i n t i , i n t x ){
2 i n t j =1; i n t p=i ;
3 w h i l e ( p<=x && ( x%p==0)){
4 j ++;
5 p∗= i ;
6 }
7 r e t u r n j −1;
8 }
1 i n t p u i s s a n c e ( i n t x , i n t n ){
2 int j ; int p = 1;
3 f o r ( j =1; j <=n ; j ++)
4 p∗=x ;
5 return p ;
6 }
Programmation Impérative
Fonctions
Introduction
Definition
Une fonction est une description formelle d’un calcul en fonction
de ses arguments
Exemple
Si on vous donne deux variables entières a et b décrivez les
instructions du langage nécessaire pour calculer ab .
Plan
4 Fonctions
Introduction
Définition
Appel d’une fonction
Portée des variables
Définir des constantes
Où placer les fonctions
Récursivité
Programmation Impérative
Fonctions
Définition
Définition de fonctions
Definition
type_retour nom(liste_param_formel){
corps
}
Fonctions : nom
Definition
Le nom d’une fonction correspond à un identifiant unique
permettant d’effectuer l’appel sans aucune ambiguïté
Attention
Une fonction ne peut être assimilée à une variable et vice-versa. On
les différencie par la présence de parenthèse après l’identifiant d’une
fonction.
1 int a ();
2 a =3; // ERREUR ’ a ’ n ’ e s t p a s une v a r i a b l e
3 int b;
4 b ( ) ; // ERREUR ’ b ’ n ’ e s t p a s une f o n c t i o n
Programmation Impérative
Fonctions
Définition
Fonctions : nom
Attention
Une variable et une fonction ne peuvent pas partager le même nom
au sein d’un même bloc.
1 {
2 i n t a ( ) ; // d é c l a r a t i o n f o n c t i o n
3 i n t a ; // d é c l a r a t i o n v a r i a b l e
4 }
1 int f (); // f r e n v o i e un r é s u l t a t e n t i e r
2 double g ( ) ; // g r e n v o i e un r é s u l t a t f l o t t a n t
Fonctions : corps
Definition
Le corps d’une fonction est le bloc défini juste après la déclaration
de l’interface de la fonction :
type_retour nom(liste_param_formel)
{ corps }
Definition
Dans une fonction, le mot clé return exp permet :
d’arrêter l’exécution du corps
de renvoyer la valeur de l’expression exp au bloc appelant
Attention
La valeur de exp doit être du même type que le type de retour de la
fonction (sinon conversion implicite)
1 dou bl e i n v e r s e ( i n t x ) {
2 r e t u r n 1/ x ;
3 }
Programmation Impérative
Fonctions
Définition
Le mot clé return peut apparaître plusieurs fois dans une même
fonction. C’est le premier return rencontré qui stoppera le corps
de la fonction (ex : conditionnelle).
1 i n t i m p a i r ( i n t x ){
2 i f ( x%2 == 0 )
3 return 0;
4 else
5 return 1;
6 }
Programmation Impérative
Fonctions
Définition
ATTENTION
La déclaration d’une fonction est une description formelle d’un cal-
cul, elle n’exécute rien toute seule : il faut appeler la fonction pour
que les instructions du corps soient exécutées.
Plan
4 Fonctions
Introduction
Définition
Appel d’une fonction
Portée des variables
Définir des constantes
Où placer les fonctions
Récursivité
Programmation Impérative
Fonctions
Appel d’une fonction
Appel de fonction
Definition
var = nom(liste des paramètres effectifs);
ou
nom(liste des paramètres effectifs);
1 #i n c l u d e <i o s t r e a m >
2
3 i n t max ( i n t a , i n t b ) {
4 i f ( a>b ) r e t u r n a ;
5 else return b ;
6 }
7 i n t main ( ) {
8 int x , y ;
9 x =3;
10 y =5;
11 s t d : : cout <<" l e max e s t : "<<max ( x , y)<< s t d : : e n d l ;
12 return 0;
13 }
Programmation Impérative
Fonctions
Appel d’une fonction
1 v oi d ech ( i n t x , i n t y ){
2 int r ;
3 r=x ; x=y ; y=r ;
4 }
5 i n t main ( ) {
6 int a ,b;
7 a =17; b =13;
8 s t d <<c o u t <<" a = "<<a<<" b = "<<b<<s t d : : e n d l ;
9 e c h ( a , b ) ; // ne c h a n g e p a s l a v a l e u r de a e t de b
10 s t d <<c o u t <<" a = "<<a<<" b = "<<b<<s t d : : e n d l ;
11 }
Programmation Impérative
Fonctions
Appel d’une fonction
a 17
b 13
a = 17 b = 13
Programmation Impérative
Fonctions
Appel d’une fonction
a 17 x 17
b 13 y 13
a = 17 b = 13 x= 17 y= 13
Programmation Impérative
Fonctions
Appel d’une fonction
a 17 x 13
b 13 y 17
a = 17 b = 13 x= 13 y= 17
Programmation Impérative
Fonctions
Appel d’une fonction
a 17
b 13
a = 17 b = 13
Programmation Impérative
Fonctions
Portée des variables
Plan
4 Fonctions
Introduction
Définition
Appel d’une fonction
Portée des variables
Définir des constantes
Où placer les fonctions
Récursivité
Programmation Impérative
Fonctions
Portée des variables
Question
Quand on déclare une variable, où est-elle connue ?
où peut-on l’utiliser ?
Réponse
Dans tout le bloc où elle a été déclarée et à partir de sa déclaration.
Programmation Impérative
Fonctions
Portée des variables
Definition
On appelle Portée d’une variable, la portion du code où cette
variable est connue et utilisable.
Programmation Impérative
Fonctions
Portée des variables
Exemple 1
Exemple 1
Exemple 2
Exemple 2
Exemple 2
1 #i n c l u d e <i o s t r e a m >
2 i n t main ( )
3 {
4 i n t a =3;
5 x =2./ a ;
6 float x ;
7 s t d : : cout <<" a = "<<a<<" x = "<<x<<s t d : : e n d l ;
8 return 0;
9 }
Definition
On appelle Portée d’une variable, la portion du code où cette
variable est connue et utilisable.
Remarque
Dans le cas de blocs imbriqués, une variable est utilisable dans tout
le bloc où elle a été déclarée, à partir de sa déclaration et également
dans les blocs internes au bloc de la déclaration.
Programmation Impérative
Fonctions
Portée des variables
Exemple
1 i n t main ( ) {
2 int i ;
3 f o r ( i =0; i <10; i ++){
4 int S;
5 S=2∗ i ∗ i −1;
6 s t d : : cout <<" S="<<S<<s t d : : e n d l ;
7 }
8 return 0;
9 }
Programmation Impérative
Fonctions
Portée des variables
Exemple
1 i n t main ( ) {
2 int i ; <−− d é b u t p o r t é e de i
3 f o r ( i =0; i <10; i ++){
4 int S; <−− d é b u t p o r t é e de S
5 S=2∗ i ∗ i −1;
6 s t d : : cout <<" S="<<S<<s t d : : e n d l ;
7 } <−− f i n p o r t é e S
8 return 0;
9 } <−− f i n p o r t é e i
Programmation Impérative
Fonctions
Portée des variables
Exemple
1 i n t main ( ) {
2 int i ;
3 f o r ( i =0; i <10; i ++){
4 int S;
5 S=2∗ i ∗ i −1;
6 s t d : : cout <<" S="<<S<<s t d : : e n d l ;
7 }
8 s t d : : cout <<" S="<<S<<s t d : : e n d l ; <−− i m p o s s i b l e
9 return 0;
10 }
Programmation Impérative
Fonctions
Portée des variables
Plusieurs variables ?
Question
Que se passe-t-il si on a plusieurs variables de même nom ?
Réponse
7 Impossible si les variables sont définies dans le même bloc
3 Possible si les variables sont définies dans des blocs différents
,→ même si ils sont imbriqués
Programmation Impérative
Fonctions
Portée des variables
Exemple
Exemple
Le programme affiche :
a=5
Programmation Impérative
Fonctions
Portée des variables
Plusieurs variables ?
Question
Que se passe-t-il si on a plusieurs variables de même nom ?
Réponse
La variable utilisée est celle du bloc englobant le plus proche (au
sens de l’inclusion).
Programmation Impérative
Fonctions
Portée des variables
Plusieurs variables ?
Question
Et dans le cas de fonctions ?
1 f l o a t cube ( f l o a t x ) {
2 f l o a t c=x ∗ x ∗ x ;
3 return c ;
4 }
5 i n t main ( ) {
6 float c ;
7 c=cube ( 2 ) ;
8 s t d : : cout <<" l e cube de 2 e s t "<<c<<s t d : : e n d l ;
9 return 0;
10 }
Programmation Impérative
Fonctions
Portée des variables
Plusieurs variables ?
Question
Et dans le cas de fonctions ?
Réponse
Tout ce qui a été dit précédemment s’applique pour les fonctions.
Programmation Impérative
Fonctions
Portée des variables
Question
Comment fait-on si on veut tout de même utiliser la même variable
dans plusieurs fonctions ?"
Réponse
Rien de plus facile, on passe la variable en paramètre ! ! !
Programmation Impérative
Fonctions
Portée des variables
Remarque
Il peut être parfois embêtant de rajouter une variable à toutes les
fonctions, si celles-ci doivent partager une variable commune.
Une solution :
Il est possible de définir des variables communes à tout le monde :
les variables globales.
Programmation Impérative
Fonctions
Portée des variables
Variables globales
Definition
Une variable est globale si elle est définie en dehors de tout bloc
(et donc de toute fonction).
Question
La portée d’une variable étant son bloc, quelle est la portée d’une
variable globale ?
Programmation Impérative
Fonctions
Portée des variables
Variables globales
Une variable globale est connue dans toute la partie du fichier qui
suit sa déclaration.
1 void u n e a u t r e f o n c t i o n (){
2 // ne p e u t p a s u t i l i s e r a
3 }
4
5 int a ;
6
7 void mafonction (){
8 // p e u t u t i l i s e r l a v a r i a b l e a
9 }
10
11 i n t main ( ) {
12 // p e u t u t i l i s e r la variable a
13 return 0;
14 }
Programmation Impérative
Fonctions
Portée des variables
Conclusion :
C’est une très mauvaise idée de modifier une variable globale.
Mais alors quoi ? les variables globales restent constantes ?
Pire que ça ! On oublie les variables globales et on définit des
constantes.
Programmation Impérative
Fonctions
Définir des constantes
Plan
4 Fonctions
Introduction
Définition
Appel d’une fonction
Portée des variables
Définir des constantes
Où placer les fonctions
Récursivité
Programmation Impérative
Fonctions
Définir des constantes
Syntaxe
#define NOM valeur
Exemple
#define MAX 1000
#define PI 3.1415
Remarque : par convention, les macros sont notées en majuscules.
Programmation Impérative
Fonctions
Définir des constantes
Exemple
1 #i n c l u d e <i o s t r e a m >
2 #i n c l u d e <i o m a n i p >
3
4 #d e f i n e MAX 10
5 void p r o d u i t ( i n t a ){
6 int i ;
7 f o r ( i =1; i <=MAX; i ++)
8 s t d : : cout <<s t d : : s e t w (4)<<a ∗ i ;
9 }
10 i n t main ( ) {
11 int i ;
12 f o r ( i =1; i <=MAX; i ++){
13 produit ( i );
14 s t d : : cout <<s t d : : e n d l ;
15 }
16 return 0;
17 }
Programmation Impérative
Fonctions
Définir des constantes
Exemple
On obtient alors :
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100
Programmation Impérative
Fonctions
Définir des constantes
Syntaxe
const type nom=valeur;
Exemple
const int max=10;
const double pi=3.1415;
Programmation Impérative
Fonctions
Définir des constantes
Exemple
1 #i n c l u d e <i o s t r e a m >
2 c o n s t i n t max=10;
3 void p r o d u i t ( i n t a ){
4 int i ;
5 f o r ( i =1; i <=max ; i ++)
6 s t d : : cout <<s t d : : s e t w (4)<<a ∗ i ;
7 }
8 i n t main ( ) {
9 int i ;
10 f o r ( i =1; i <=max ; i ++){
11 produit ( i );
12 s t d : : cout <<s t d : : e n d l ;
13 }
14 return 0;
15 }
Programmation Impérative
Fonctions
Définir des constantes
Exemple
On obtient alors :
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100
Programmation Impérative
Fonctions
Définir des constantes
1 c o n s t i n t max=10;
2 i n t main ( ) {
3 max=11;
4 return 0;
5 }
Variable constante
C’est une vraie variable, avec un espace mémoire réservé. Le
compilateur interdit juste de la modifier.
Macro
Ce n’est pas une variable. Il n’y a pas d’espace mémoire allouée
pour. Au moment de la compilation, le compilateur commence par
remplacer toutes les occurrences des macros par leurs valeurs, puis
compile le nouveau fichier obtenu.
Programmation Impérative
Fonctions
Où placer les fonctions
Plan
4 Fonctions
Introduction
Définition
Appel d’une fonction
Portée des variables
Définir des constantes
Où placer les fonctions
Récursivité
Programmation Impérative
Fonctions
Où placer les fonctions
Question
Quand on déclare une fonction, à quel endroit peut-on l’utiliser ?
Réponse
Partout après sa déclaration !
Exemple
1 void f1 (){
2 s t d : : cout <<" j e s u i s f 1 "<<s t d : : e n d l ;
3 }
4 void f2 (){
5 s t d : : cout <<" j e s u i s f 2 e t j e peux me s e r v i r de f 1 "
6 <<s t d : : e n d l ;
7 f1 ( ) ;
8 }
9 i n t main ( ) {
10 f 1 ( ) ; // j e peux me s e r v i r de f 1
11 f 2 ( ) ; // j e peux me s e r v i r de f 2
12 }
Il faut donc déclarer les fonctions par rapport à l’ordre dans lequel
elles seront utilisées.
Programmation Impérative
Fonctions
Où placer les fonctions
Problème
si n = 0
(
vrai
pair (n) =
impair (n − 1) sinon
et
si n = 0
(
faux
impair (n) =
pair (n − 1) sinon
Quelle est la fonction qui se place avant l’autre ?
Programmation Impérative
Fonctions
Où placer les fonctions
Problème
si n = 0
(
vrai
pair (n) =
impair (n − 1) sinon
et
si n = 0
(
faux
impair (n) =
pair (n − 1) sinon
Quelle est la fonction qui se place avant l’autre ?
Comment faire ?
Solution
On peut séparer la déclaration de la définition d’une fonction.
Remarque
Rappelez-vous, on avait dit qu’il était possible d’utiliser une fonction
n’importe où après sa déclaration...
Programmation Impérative
Fonctions
Où placer les fonctions
Comment faire ?
Syntaxe
type nom(type,type,...,type);
Exemple
bool pair(int);
bool impair(int);
Programmation Impérative
Fonctions
Où placer les fonctions
Exemple
1 bool p a i r ( i n t ) ;
2 bool i m p a i r ( i n t ) ;
3
4 bool p a i r ( i n t n ){
5 i f ( n==0) r e t u r n t r u e ;
6 else r e t u r n i m p a i r ( n −1);
7 }
8
9 bool i m p a i r ( i n t n ){
10 i f ( n==0) r e t u r n f a l s e ;
11 else r e t u r n p a i r ( n −1);
12 }
Programmation Impérative
Fonctions
Où placer les fonctions
1 /∗ Début d é c l a r a t i o n s d e s f o n c t i o n s ∗/
2 bool p a i r ( i n t ) ;
3 ...
4 ...
5 /∗ F i n d é c l a r a t i o n s d e s f o n c t i o n s ∗/
6
7 /∗ Début d é f i n i t i o n s d e s f o n c t i o n s ∗/
8 bool p a i r ( i n t n ){
9 i f ( n==0) r e t u r n t r u e ;
10 e l s e r e t u r n i m p a i r ( n −1);
11 }
12 ...
13 ...
14 /∗ F i n d é f i n i t i o n s d e s f o n c t i o n s ∗/
15
16 i n t main ( ) {
17 ....
18 return 0;
19 }
Programmation Impérative
Fonctions
Où placer les fonctions
Programmation modulaire
Remarque
Il est possible de scinder son programme (toutes les fonctions qui le
composent) en plusieurs fichiers. On parle alors de programmation
modulaire.
Dans les faits, il s’agit de mettre dans un fichier les signatures des
fonctions et dans un autre les définitions. Tout programme qui
voudra utiliser une des ces fonctions devra seulement inclure le
fichier des signatures.
Programmation Impérative
Fonctions
Où placer les fonctions
Fichier d’en-tête
Definition
Un fichier d’en-tête (ex : fonction.h) contient des déclarations
de fonctions.
Exemple
1 /∗ Début d é c l a r a t i o n s d e s f o n c t i o n s ∗/
2 bool p a i r ( i n t ) ;
3 bool i m p a i r ( i n t ) ;
4 ...
5 /∗ F i n d é c l a r a t i o n s d e s f o n c t i o n s ∗/
Programmation Impérative
Fonctions
Où placer les fonctions
Fichier de définition
Definition
Un fichier de définition (ex : fonction.cpp) contient les
définitions des fonctions déclarées dans fonction.h.
Remarque
Les deux noms de fichiers doivent être les mêmes (toto.h et
toto.cpp).
Programmation Impérative
Fonctions
Où placer les fonctions
Mise en oeuvre
Dans le fichier de définition, il faut inclure le fichier de déclarations.
Syntaxe
#include "fonction.h"
1 #i n c l u d e " f o n c t i o n . h "
2 /∗ Début d é f i n i t i o n s d e s f o n c t i o n s ∗/
3 bool p a i r ( i n t n ){
4 i f ( n==0) r e t u r n t r u e ;
5 e l s e r e t u r n i m p a i r ( n −1);
6 }
7
8 bool i m p a i r ( i n t n ){
9 i f ( n==0) r e t u r n f a l s e ;
10 e l s e r e t u r n p a i r ( n −1);
11 }
12 ...
13 /∗ F i n d é f i n i t i o n s d e s f o n c t i o n s ∗/
Programmation Impérative
Fonctions
Où placer les fonctions
1 #i f n d e f FONCTIONS_H
2 #d e f i n e FONCTIONS_H
3
4 /∗ Début d é c l a r a t i o n s d e s f o n c t i o n s ∗/
5 bool p a i r ( i n t ) ;
6 bool i m p a i r ( i n t ) ;
7 ...
8 /∗ F i n d é c l a r a t i o n s d e s f o n c t i o n s ∗/
9 #e n d i f
Programmation Impérative
Fonctions
Récursivité
Plan
4 Fonctions
Introduction
Définition
Appel d’une fonction
Portée des variables
Définir des constantes
Où placer les fonctions
Récursivité
Programmation Impérative
Fonctions
Récursivité
Fonction récursive
Definition
Une fonction est récursive si elle s’appelle elle-même.
Première solution
1 #i n c l u d e <i o s t r e a m >
2 i n t SommeCarres ( i n t m, i n t n ) {
3 i n t i , som=0;
4 f o r ( i=m; i <=n ; i ++)
5 som=som+i ∗ i ;
6 r e t u r n som ;
7 }
8 i n t main ( ) {
9 i n t m=5 , n =10;
10 i n t s c=SommeCarres ( 5 , 1 0 ) ;
11 s t d : : cout <<" C a r r e s e n t r e 5 e t 10 : "<< sc<<s t d : : e n d l ;
12 return 0;
13 }
Programmation Impérative
Fonctions
Récursivité
m ∗ m + SommeCarres(m + 1, n) si m 6= n
(
SommeCarres(m, n) =
m∗m sinon
Programmation Impérative
Fonctions
Récursivité
Solution récursive
1 #i n c l u d e <i o s t r e a m >
2 i n t SommeCarres ( i n t m, i n t n ) {
3 i f (m==n )
4 r e t u r n m∗m;
5 else
6 r e t u r n (m∗m+SommeCarres (m+1,n ) ) ;
7 }
8 i n t main ( ) {
9 i n t s c=SommeCarres ( 5 , 9 ) ;
10 s t d : : cout <<"somme d e s c a r r e s e n t r e 5 e t 9 : "
11 << sc <<s t d : : e n d l ;
12 return 0;
13 }
Programmation Impérative
Fonctions
Récursivité
SommeCarres(5, 9) = 25 + SommeCarres(6, 9)
= 25 + (36 + SommeCarres(7, 9))
= 25 + (36 + (49 + SommeCarres(8, 9)))
= 25 + (36 + (49 + (64 + SommeCarres(9, 9))))
= 25 + (36 + (49 + (64 + 81)))
= 25 + (36 + (49 + 145))
= 25 + (36 + 194)
= 255
Programmation Impérative
Fonctions
Récursivité
Principe de construction
Un autre problème
La suite de Fibonacci :
F (0) = 1
F (1) = 1
F (n + 2) = F (n + 1) + F (n)
Solution récursive
1 i n t Fibo ( i n t n ){
2 i f ( n==0) l l ( n==1)
3 return 1;
4 else
5 r e t u r n F i b o ( n−1)+ F i b o ( n −2);
6 }
Programmation Impérative
Fonctions
Récursivité
Exécution
89*%+&'#$
Certains termes sont calculés plusieurs fois :
"/21
53
"/01 "/!1
7 0
"/51 "/61
5 5
Programmation Impérative
Fonctions
Récursivité
Solution itérative
1 i n t Fibo ( i n t n ){
2 int a ,b ,F;
F a b n
3
4 F=a=b =1;
5 1 1 1 6
6 w h i l e ( n >1){
7 F=a+b ;
8 a=b ;
9 b=F ;
10 n−−;
11 }
12 return F ;
13 }
Programmation Impérative
Fonctions
Récursivité
Solution itérative
1 i n t Fibo ( i n t n ){
2 int a ,b ,F;
F a b n
3
4 F=a=b =1;
5 1 1 1 6
6 w h i l e ( n >1){ 2 1 2 5
7 F=a+b ;
8 a=b ;
9 b=F ;
10 n−−;
11 }
12 return F ;
13 }
Programmation Impérative
Fonctions
Récursivité
Solution itérative
1 i n t Fibo ( i n t n ){
2 int a ,b ,F;
F a b n
3
4 F=a=b =1;
5 1 1 1 6
6 w h i l e ( n >1){ 2 1 2 5
7 F=a+b ; 3 2 3 4
8 a=b ;
9 b=F ;
10 n−−;
11 }
12 return F ;
13 }
Programmation Impérative
Fonctions
Récursivité
Solution itérative
1 i n t Fibo ( i n t n ){
2 int a ,b ,F;
F a b n
3
4 F=a=b =1;
5 1 1 1 6
6 w h i l e ( n >1){ 2 1 2 5
7 F=a+b ; 3 2 3 4
a=b ;
5 3 5 3
8
9 b=F ;
10 n−−;
11 }
12 return F ;
13 }
Programmation Impérative
Fonctions
Récursivité
Solution itérative
1 i n t Fibo ( i n t n ){
2 int a ,b ,F;
F a b n
3
4 F=a=b =1;
5 1 1 1 6
6 w h i l e ( n >1){ 2 1 2 5
7 F=a+b ; 3 2 3 4
a=b ;
5 3 5 3
8
9 b=F ;
10 n−−; 8 5 8 2
11 }
12 return F ;
13 }
Programmation Impérative
Fonctions
Récursivité
Solution itérative
1 i n t Fibo ( i n t n ){
2 int a ,b ,F;
F a b n
3
4 F=a=b =1;
5 1 1 1 6
6 w h i l e ( n >1){ 2 1 2 5
7 F=a+b ; 3 2 3 4
a=b ;
5 3 5 3
8
9 b=F ;
10 n−−; 8 5 8 2
11 } 13 8 13 1
12 return F ;
13 }
Programmation Impérative
Fonctions
Récursivité
Récursivité ! ! !
Attention
La récursivité n’est pas toujours efficace, même si elle est plus facile
à exprimer.
Programmation Impérative
Pointeurs
Plan
1 Introduction
3 Structures de contrôle
4 Fonctions
5 Pointeurs
6 Tableaux
7 Structures de données
Programmation Impérative
Pointeurs
Introduction
Plan
5 Pointeurs
Introduction
Les pointeurs en C++
Fonction avec paramètre de type pointeur
Programmation Impérative
Pointeurs
Introduction
Exemple
void echange(int a, int b){
int c;
c=a;
a=b;
b=c;
}
x 3 a 3 a 12
y 12 b 12 b 3
int x,y;
x=3;y=12;
echange(x,y);
Programmation Impérative
Pointeurs
Introduction
x 3
y 12
x=3 y = 12
0xFF2246 0xFF2252
Programmation Impérative
Pointeurs
Introduction
x 3 a 3
y 12 b 12
Appel à ech
x=3 y = 12 a= 3 b= 12
0xFF2246 0xFF2252
Programmation Impérative
Pointeurs
Introduction
x 3 a 3 a 12
y 12 b 12 b 3
x=3 y = 12 a= 12 b= 3
0xFF2246 0xFF2252
Programmation Impérative
Pointeurs
Introduction
x 3
y 12
Retour de ech
x=3 y = 12
0xFF2246 0xFF2252
Programmation Impérative
Pointeurs
Introduction
Les variables :
ne peuvent pas être modifiées par les fonctions
sont limitées au bloc dans lequel elles ont été définies
Remarque
Ces limitations proviennent de la manipulation des variables par leur
identificateur.
Solution : manipuler les variables par leur adresse (pointeur)
,→ dire où se trouve la donnée plutôt que de donnez sa valeur !
Programmation Impérative
Pointeurs
Les pointeurs en C++
Plan
5 Pointeurs
Introduction
Les pointeurs en C++
Fonction avec paramètre de type pointeur
Programmation Impérative
Pointeurs
Les pointeurs en C++
Les pointeurs
Definition
Un pointeur est une variable qui contient l’adresse mémoire d’une
donnée (une autre variable).
Remarque
Les pointeurs permettent de manipuler des données par leur adresse
plutôt que par leur identificateur.
Programmation Impérative
Pointeurs
Les pointeurs en C++
Definition
type *var;
Exemple
int *ptr;
définit la variable ptr comme une pointeur sur un entier.
→ ptr devra donc contenir l’adresse d’une donnée de type int.
Programmation Impérative
Pointeurs
Les pointeurs en C++
Affectation de pointeurs :
1 i n t a ; double b ;
2
3 A p t r= &a ; // OK
4 B p t r= &b ; // OK
5 A p t r= &b ; // ERREUR
6 B p t r= &a ; // ERREUR
7
8 A p t r= B p t r ; // ERREUR
9 A p t r= C p t r ; // OK
Programmation Impérative
Pointeurs
Les pointeurs en C++
MÉMOIRE EN OCTETS
Exemple
int a, *p, *q
p=&a;
q=NULL;
q=p;
Definition
Soit var une variable de type pointeur, le déréférencement *var
permet d’accèder à la donnée qui est stockée à l’adresse mémoire
contenue dans var ,→ on parle de donnée pointée.
1 int a ;
2 int ∗ ptr ;
3 p t r=&a ; // a f f e c t e p t r a v e c l ’ a d r e s s e de a
4 ∗ p t r =3; // a f f e c t e l a z o n e mémoire d ’ a d r e s s e p t r
5 // a v e c l a v a l e u r 3 ( i c i a=3)
Programmation Impérative
Pointeurs
Les pointeurs en C++
Exemple
int a, *p;
a=10;p=&a;
a=*p+1;
*p=13;
Programmation Impérative
Pointeurs
Les pointeurs en C++
Attention
Les pointeurs sont dangereux et cause des erreurs dites
de segmentation dans l’exécution des programmes.
1 i n t main ( ) {
2
3 i n t A, ∗ Aptr ;
4 A=100;
5 ∗ A p t r =17; // c e t t e l i g n e c o m p i l e c o r r e c t e m e n t
6 // m a i s c a u s e une e r r e u r a l ’ e x e c u t i o n
7 return 0;
8 }
Programmation Impérative
Pointeurs
Fonction avec paramètre de type pointeur
Plan
5 Pointeurs
Introduction
Les pointeurs en C++
Fonction avec paramètre de type pointeur
Programmation Impérative
Pointeurs
Fonction avec paramètre de type pointeur
Definition
type_retour mafonction(type_param * ptr){...}
A l’intérieur de la fonction :
on peut récupérer la donnée pointée : *ptr
on peut modifier la valeur de la donnée pointée : *ptr=...
1 #i n c l u d e <i o s t r e a m >
2
3 v o i d p l u s U n ( i n t ∗p ) {
4 ∗p= ∗p +1;
5 }
6
7 i n t main ( ) {
8 int a ; int ∗ ptr ;
9 a =3; p t r=&a ;
10
11 plusUn ( p t r ) ;
12 s t d : : cout <<" a="<<a<<s t d : : e n d l ;
13 p l u s U n (&a ) ;
14 s t d : : cout <<" a="<<a<<s t d : : e n d l ;
15
16 return 0;
17 }
Programmation Impérative
Pointeurs
Fonction avec paramètre de type pointeur
a=3
ptr
Main( ) plusUn( )
Programmation Impérative
Pointeurs
Fonction avec paramètre de type pointeur
a=3
ptr p
Appel à plusUn(ptr)
Main( ) plusUn( )
Programmation Impérative
Pointeurs
Fonction avec paramètre de type pointeur
a=4
ptr p
Main( ) plusUn( )
Programmation Impérative
Pointeurs
Fonction avec paramètre de type pointeur
a=4
ptr
Main( ) plusUn( )
Programmation Impérative
Pointeurs
Fonction avec paramètre de type pointeur
1 #i n c l u d e <i o s t r e a m >
2
3 v o i d e c h ( i n t ∗a , i n t ∗b ) {
4 int r ;
5 r =∗a ;
6 ∗ a=∗b ;
7 ∗b=r ;
8 }
9 i n t main ( ) {
10 int x , y ;
11 x =2; y =3;
12 e c h (&x ,& y ) ;
13 s t d : : cout <<" x="<<x<<s t d : : e n d l ;
14 s t d : : cout <<" y="<<y<<s t d : : e n d l ;
15 return 0;
16 }
Programmation Impérative
Pointeurs
Fonction avec paramètre de type pointeur
En utilisant les pointeurs, on peut donc interagir dans les deux sens
avec une fonction :
donner des valeurs en entrée dans une fonction
récupérer plusieurs valeurs en sortie d’une fonction
Exemple
void minmax(int a, int b, int *min, int *max){
if (a>b)
{*min=b; *max=a;}
else
{*min=a; *max=b;}
}
Programmation Impérative
Pointeurs
Fonction avec paramètre de type pointeur
1 #i n c l u d e <i o s t r e a m >
2
3 v o i d minmax ( i n t a , i n t b , i n t ∗ min , i n t ∗max ) {
4 i f ( a>b )
5 { ∗ min=b ; ∗max=a ; }
6 else
7 { ∗ min=a ; ∗max=b ; }
8 }
9
10 i n t main ( ) {
11 i n t a , b , min , max ;
12 a =10; b =15;
13 minmax ( a , b ,& min ,&max ) ;
14 s t d : : cout <<" min="<<min<<s t d : : e n d l
15 <<"max="<<max<<s t d : : e n d l ;
16 return 0;
17 }
Programmation Impérative
Pointeurs
Fonction avec paramètre de type pointeur
Exemple
void echPtr(int *p1, int *p2){
int *p;
p=p1;
p1=p2;
p2=p;
}
1 v o i d e c h P t r ( i n t ∗p1 , i n t ∗ p2 ) {
2 i n t ∗p ;
3 p=p1 ; p1=p2 ; p2=p ;
4 }
5 i n t main ( ) {
6 i n t ∗a , ∗ b ;
7 int c , d ;
8 c =1; d =3;
9 a=&c ; b=&d ;
10 e c h P t r ( a , b ) ; // p a s d ’ e c h a n g e e n t r e a e t b
11 return 0;
12 }
Programmation Impérative
Pointeurs
Fonction avec paramètre de type pointeur
main() echPtr()
a 0xFF2246
b 0xFF2252
0xFF2246 0xFF2252
Programmation Impérative
Pointeurs
Fonction avec paramètre de type pointeur
main() echPtr()
a 0xFF2246 p1 0xFF2246
b 0xFF2252 p2 0xFF2252
Appel à echPtr(...)
0xFF2246 0xFF2252
Programmation Impérative
Pointeurs
Fonction avec paramètre de type pointeur
main() echPtr()
a 0xFF2246 p1 0xFF2252
b 0xFF2252 p2 0xFF2246
0xFF2246 0xFF2252
Programmation Impérative
Pointeurs
Fonction avec paramètre de type pointeur
main() echPtr()
a 0xFF2246
b 0xFF2252
Retour de echPtr(...)
0xFF2246 0xFF2252
Programmation Impérative
Pointeurs
Fonction avec paramètre de type pointeur
Definition
type **ptr_ptr ;
Definition
type_retour mafonction(type_param **ptr){...}
A l’intérieur de la fonction :
on peut récupérer le pointeur : *ptr
on peut modifier le pointeur : *ptr=...
Exemple
void echPtr(int **p1, int **p2){
int *p;
p=*p1;
*p1=*p2;
*p2=p;
}
Programmation Impérative
Pointeurs
Fonction avec paramètre de type pointeur
1 v o i d e c h P t r ( i n t ∗∗ p1 , i n t ∗∗ p2 ) {
2 i n t ∗p ;
3 p=∗p1 ; ∗ p1=∗p2 ; ∗ p2=p ;
4 }
5 i n t main ( ) {
6 i n t ∗a , ∗ b ;
7 int c , d ;
8 c =1; d =3;
9 a=&c ; b=&d ;
10 e c h P t r (&a ,&b ) ;
11 return 0;
12 }
Programmation Impérative
Pointeurs
Fonction avec paramètre de type pointeur
Definition
int |*...*{z } a;
n fois
définit la variable a comme n imbrications de pointeur sur un int.
Plan
1 Introduction
3 Structures de contrôle
4 Fonctions
5 Pointeurs
6 Tableaux
7 Structures de données
Programmation Impérative
Tableaux
Tableaux statiques
Plan
6 Tableaux
Tableaux statiques
Fonction et tableaux statiques
Tableaux et pointeurs
Tableaux dynamiques
Fonction et tableaux dynamiques
Programmation Impérative
Tableaux
Tableaux statiques
1er
élément
Un tableau à 6 éléments
Definition
Un tableau permet de définir avec une seule variable un ensemble
de variables de même type de donnée.
Déclaration
type T[n];
Exemple
int T[3];
définit la variable T comme un tableau de trois entiers.
Programmation Impérative
Tableaux
Tableaux statiques
Mémoire en octet
Déclaration
type T[n];
Attention
Il est préférable que la taille n du tableau soit une constante connue
à la compilation.
Programmation Impérative
Tableaux
Tableaux statiques
Definition
Soit la déclaration : type T[n];
L’instruction T[i] accède à la i+1-ème case du tableau T
Attention :
les indices du tableau T commence à 0 et se termine à n-1
aucune vérification numérique est faite pour la valeur de i
T[i] est un identificateur valide (une variable)
,→ accès en lecture/écriture
Programmation Impérative
Tableaux
Tableaux statiques
Mémoire en octet
Int T[3];
T[3] valide
mais n'appartient
pas au tableau
Erreur de
segmentation
Programmation Impérative
Tableaux
Tableaux statiques
Deux possibilités :
lors de la déclaration du tableau
par initialisation successive des éléments du tableau
Programmation Impérative
Tableaux
Tableaux statiques
Déclaration
type T[n] = {v0 ,v1 ,...,vn−1 };
Exemple
int T[3]={4,17,3};
Programmation Impérative
Tableaux
Tableaux statiques
Déclaration
type T[n] = {v0 ,v1 ,...,vn−1 };
Exemple
int T[3]={4,17,3};
Plusieurs possibilités :
int T[]={1,2,3,4,5};
,→ tableau de 5 éléments initialisé avec les valeurs données
int T[5]={12,13};
,→ tableau de 5 éléments initialisé avec les valeurs données,
le reste est initialisé à 0
Programmation Impérative
Tableaux
Tableaux statiques
On peut initialiser les éléments d’un tableau dans une boucle par
affectation successive :
Déclaration
int T[10], i;
for(i=0;i<10;i++)
T[i]=...; ← affectation avec la valeur souhaitée
Programmation Impérative
Tableaux
Tableaux statiques
On peut initialiser les éléments d’un tableau dans une boucle par
affectation successive :
Déclaration
int T[10], i;
for(i=0;i<10;i++)
T[i]=...; ← affectation avec la valeur souhaitée
Copie de tableau
Copie de tableau
∗ ∗
On peut voir T comme une matrice : T = ∗ ∗
∗ ∗
Programmation Impérative
Tableaux
Tableaux statiques
Déclaration
int T[3][2] = {{1,2},{3,4},{5,6}} ;
1 2
int T = 3 4
5 6
Remarque
La notion de tableau multidimensionnel s’étend à plus de dimensions.
Programmation Impérative
Tableaux
Tableaux statiques
Plan
6 Tableaux
Tableaux statiques
Fonction et tableaux statiques
Tableaux et pointeurs
Tableaux dynamiques
Fonction et tableaux dynamiques
Programmation Impérative
Tableaux
Fonction et tableaux statiques
Definition
type_retour mafonction(type ident[taille])
Definition
type_retour mafonction(type ident[taille])
Exemple
void AfficheTab(int tab[10])
double Somme(double A[20])
double Moyenne(int t[15])
Programmation Impérative
Tableaux
Fonction et tableaux statiques
Definition
type_retour mafonction(type ident[], int taille)
Exemple
void AfficheTab(int tab[], int taille)
double Somme(double A[], int taille)
double Moyenne(int t[], int taille)
1 i n t MinTab ( i n t t [ 1 0 ] )
2 {
3 i n t i , m=0;
4 f o r ( i =1; i <10; i ++)
5 i f ( t [ i ]< t [m] )
6 m=i ;
7 r e t u r n m;
8 }
Programmation Impérative
Tableaux
Fonction et tableaux statiques
1 i n t MinTab ( i n t t [ ] , i n t t a i l l e )
2 {
3 i n t i , m=0;
4 f o r ( i =1; i < t a i l l e ; i ++)
5 i f ( t [ i ]< t [m] )
6 m=i ;
7 r e t u r n m;
8 }
Programmation Impérative
Tableaux
Fonction et tableaux statiques
Attention
Les fonctions ne peuvent retourner qu’une seule donnée (entiers,
réels, pointeurs...), il est donc impossible de retourner comme résul-
tat un tableau statique.
Nous verrons dans la suite que par les pointeurs nous pourrons
renvoyer des tableaux.
Programmation Impérative
Tableaux
Fonction et tableaux statiques
1 v o i d MaZ( i n t t [ 1 0 ] )
2 {
3 int i ;
4 f o r ( i =0; i <10; i ++)
5 t [ i ]=0;
6 }
Programmation Impérative
Tableaux
Fonction et tableaux statiques
Que se passe-t-il ?
1 #i n c l u d e <i o s t r e a m >
2 i n t main ( )
3 {
4 i n t t [10]={3 ,5 ,7 ,2 , −5 , −7 ,4 , −2 ,2 ,1};
5 AfficheTab ( t ) ;
6 MaZ( t ) ;
7 AfficheTab ( t ) ;
8 }
Programmation Impérative
Tableaux
Fonction et tableaux statiques
Ques se passe-t-il ?
1 i n t main ( )
2 {
3 i n t t [10]={3 ,5 ,7 ,2 , −5 , −7 ,4 , −2 ,2 ,1};
4 AfficheTab ( t ) ;
5 MaZ( t ) ;
6 AfficheTab ( t ) ;
7 }
Plan
6 Tableaux
Tableaux statiques
Fonction et tableaux statiques
Tableaux et pointeurs
Tableaux dynamiques
Fonction et tableaux dynamiques
Programmation Impérative
Tableaux
Tableaux et pointeurs
Tableau et pointeurs
Fonctions et tableaux
Tout se passe donc comme si le paramètre de la fonction n’était
pas le tableau, mais un pointeur sur le tableau.
Programmation Impérative
Tableaux
Tableaux et pointeurs
Tableau et pointeurs
Tableau et pointeurs
Arithmétique de pointeurs
Arithmétique de pointeurs
Remarque
Quand le compilateur rencontre tab[i], il le réécrit en *(tab+i)
Programmation Impérative
Tableaux
Tableaux et pointeurs
Arithmétique de pointeurs
Exemple complet
Exemple complet
L’utilisation de tableau aléatoire permet de tester facilement son
algorithme sur de nombreux cas différents.
1 #i n c l u d e <i o s t r e a m >
2 #i n c l u d e <c t i m e >
3 #i n c l u d e < c s t d l i b >
4
5 i n t main ( )
6 {
7 int t [10];
8 s r a n d ( t i m e (NULL ) ) ;
9 InitTab ( t );
10 AfficheTab ( t ) ;
11 Tri ( t , 5 ) ;
12 AfficheTab ( t ) ;
13 Tri ( t , 1 0 ) ;
14 AfficheTab ( t ) ;
15 return 0;
16 }
Programmation Impérative
Tableaux
Tableaux et pointeurs
Exemple complet
A la seconde, on a :
1 7 5 4 20 14 11 17 1 7 7
2 4 5 7 14 20 11 17 1 7 7
3 1 4 5 7 7 7 11 14 17 20
Programmation Impérative
Tableaux
Tableaux dynamiques
Plan
6 Tableaux
Tableaux statiques
Fonction et tableaux statiques
Tableaux et pointeurs
Tableaux dynamiques
Fonction et tableaux dynamiques
Programmation Impérative
Tableaux
Tableaux dynamiques
Modèle mémoire
Données statiques :
On connaît à l’avance (lors de l’écriture du programme) la
taille des données,
La mémoire peut donc être réservée dès le début du
programme.
Données dynamiques :
On connaît la taille des données lors de l’exécution du
programme
La réservation de la mémoire doit donc se faire
dynamiquement au cours de l’exécution.
Programmation Impérative
Tableaux
Tableaux dynamiques
Remarques
Réservation de la mémoire
Réservation de la mémoire
Exemple
new int[3] demande au système de réserver une espace mémoire
permettant de stocker 3 int.
Programmation Impérative
Tableaux
Tableaux dynamiques
Réservation de la mémoire
Attention
Pour accéder à la mémoire réservée, il est obligatoire qu’une
variable pointeur contienne son adresse, ce sera le seul accès
possible.
int *T = new int[3];
Programmation Impérative
Tableaux
Tableaux dynamiques
Représentation en mémoire
L’opérateur new renvoie l’adresse de la 1ère case de la
mémoire dynamique qui a été allouée
Le pointeur T permet d’accéder aux cases de la mémoire
(comme un tableau).
int *T = new int[3];
Utilisation
Exemple
Libération de la mémoire
Libération de la mémoire
Attention
On ne peut libérer que de la mémoire qui a été allouée dynamique-
ment par new.
Programmation Impérative
Tableaux
Tableaux dynamiques
Libération de la mémoire
Remarque
Le pointeur p reste utilisable :
1 i n t ∗p ;
2 p= new i n t [ 5 ] ;
3 delete [ ] p ;
4 p= new i n t [ 1 0 ] ;
Programmation Impérative
Tableaux
Tableaux dynamiques
1 #i n c l u d e <i o s t r e a m >
2 i n t main ( )
3 {
4 i n t ∗ tab ;
5 t a b = new i n t [ 1 0 ] ; // a l l o c a t i o n dynamique
6 ...
7 d e l e t e [ ] t a b ; // p l u s b e s o i n du c o n t e n u de t a b
8 ... // s u i t e du programme s a n s l e c o n t e n u de t a b
9 return 0;
10 }
Programmation Impérative
Tableaux
Tableaux dynamiques
1 #i n c l u d e <i o s t r e a m >
2 i n t main ( )
3 {
4 i n t i , ∗ t1 , ∗ t 2 ;
5 t 1=new i n t [ 2 0 ] ;
6 t 2=new i n t [ 2 0 ] ;
7 f o r ( i =0; i <20; i ++)
8 { t 1 [ i ]= i ; }
9 t 2=t 1 ;
10 f o r ( i =0; i <20; i ++)
11 { s t d : : cout <<t 2 [ i ]<<" " ; }
12 return 0;
13 }
Copie de tableau
Copie virtuelle
C’est quand deux tableaux partagent la même zone mémoire
,→ t2=t1 comme dans notre cas.
Attention : la modification d’un élément de t1 implique que celui
dans t2 l’est aussi.
Copie profonde
On souhaite que les tableaux aient leur propre zone mémoire pour
éviter les effets de bords.
,→ il faut allouer une nouvelle zone mémoire et copier les données.
Programmation Impérative
Tableaux
Tableaux dynamiques
Copie de tableau
La bonne solution pour recopier t1 dans t2 est donc une copie en
profondeur.
1 #i n c l u d e <i o s t r e a m >
2 i n t main ( )
3 {
4 i n t i , ∗ t1 , ∗ t 2 ;
5 t 1= new i n t [ 2 0 ] ;
6 f o r ( i =0; i <20; i ++)
7 t 1 [ i ]= i ;
8 t 2= new i n t [ 2 0 ] ;
9 f o r ( i =0; i <20; i ++)
10 t 2 [ i ]= t 1 [ i ] ;
11
12 delete [ ] t1 ;
13 delete [ ] t2 ;
14 }
Programmation Impérative
Tableaux
Tableaux dynamiques
Comment faire ?
Programmation Impérative
Tableaux
Tableaux dynamiques
Tableau dynamique 7 × 8
Mise en oeuvre
1 i n t main {
2 i n t ∗∗ t a b l e a u ;
3 int i , j ;
4
5 t a b l e a u= new i n t ∗ [N ] ;
6 f o r ( i =0; i <N ; i ++)
7 { t a b l e a u [ i ]=new i n t [M] ; }
8
9 f o r ( i =0; i <N ; i ++)
10 f o r ( j =0; j <M; j ++)
11 { t a b l e a u [ i ] [ j ]=0; }
12 return 0;
13 }
Programmation Impérative
Tableaux
Tableaux dynamiques
Libération de la mémoire
Plan
6 Tableaux
Tableaux statiques
Fonction et tableaux statiques
Tableaux et pointeurs
Tableaux dynamiques
Fonction et tableaux dynamiques
Programmation Impérative
Tableaux
Fonction et tableaux dynamiques
Definition
type_retour mafonction(type *ident, int taille)
1 v o i d A f f i c h e T a b ( i n t ∗ tab , i n t n ) {
2 f o r ( i n t i =0; i <n ; i ++)
3 s t d : : cout <<t a b [ i ]<<s t d : : e n d l ;
4 }
5
6 v o i d MaZ( i n t ∗ tab , i n t n ) {
7 f o r ( i n t i =0; i <n ; i ++)
8 tab [ i ]=0;
9 }
Programmation Impérative
Tableaux
Fonction et tableaux dynamiques
Remarque
On peut également utiliser l’arithmétique des pointeurs.
1 v o i d A f f i c h e T a b ( i n t ∗ tab , i n t n ) {
2 f o r ( i n t i =0; i <n ; i ++)
3 s t d : : cout << ∗ ( t a b+i )<<s t d : : e n d l ;
4 }
5
6 v o i d MaZ( i n t ∗ tab , i n t n ) {
7 f o r ( i n t i =0; i <n ; i ++)
8 ∗ ( t a b+i )=0;
9 }
Programmation Impérative
Tableaux
Fonction et tableaux dynamiques
Remarque
Les tableaux étant essentiellement une abstraction de la mémoire, il
n’existe pas de type tableau que l’on pourrait renvoyer.
,→ par contre, il est possible de renvoyer l’adresse de la première
case du tableau via un pointeur ! ! !
Attention
On ne renvoie que l’adresse de la 1ère case du tableau, on ne renvoie
pas sa taille.
,→ on doit s’assurer de connaître la taille du tableau, ou de la récu-
pérer par un paramètre.
Programmation Impérative
Tableaux
Fonction et tableaux dynamiques
Exercice
Cas de la dimension 2
Cas de la dimension 2
Exemple : pluviométrie
Exercice
Nous allons nous intéresser à l’écriture de différentes fonctions sur
des relevés de précipitations.
Ceux-ci seront stockés dans un tableau 2D (mois, jours) où les
dimensions pourront ne pas être identiques.
int mois[12]={31,28,31,30,31,30,31,31,30,31,30,31};
Programmation Impérative
Tableaux
Fonction et tableaux dynamiques
Exemple : pluviométrie
Question :
Comment créer un tableau 2D nommé pluie tel que la ligne i
contienne mois[i] cases ?
Programmation Impérative
Tableaux
Fonction et tableaux dynamiques
Exemple : pluviométrie
Question :
Comment créer un tableau 2D nommé pluie tel que la ligne i
contienne mois[i] cases ?
1 i n t ∗∗ p l u i e ;
2 i n t mo is [ 1 2 ] = { 3 1 , 2 8 , 3 1 , 3 0 , 3 1 , 3 0 , 3 1 , 3 1 , 3 0 , 3 1 , 3 0 , 3 1 } ;
3 p l u i e=new i n t ∗ [ 1 2 ] ;
4 f o r ( i n t i =0; i <12; i ++)
5 p l u i e [ i ]=new i n t [ mois [ i ] ] ;
Programmation Impérative
Tableaux
Fonction et tableaux dynamiques
Exemple : pluviométrie
Question :
Calculer le total de précipitations par mois et renvoyer le résultat
dans un tableau
Programmation Impérative
Tableaux
Fonction et tableaux dynamiques
Exemple : pluviométrie
Question :
Calculer le total de précipitations par mois et renvoyer le résultat
dans un tableau
1 i n t ∗ p l u i e M o i s ( i n t ∗∗ p l u i e , i n t mois [ 1 2 ] )
2 {
3 i n t ∗ t=new i n t [ 1 2 ] ;
4 f o r ( i n t i =0; i <12; i ++){
5 t [ i ]=0;
6 f o r ( i n t j =0; j <mois [ i ] ; j ++){
7 t [ i ]+= p l u i e [ i ] [ j ] ;
8 }
9 }
10 return t ;
11 }
Programmation Impérative
Tableaux
Fonction et tableaux dynamiques
Exemple : pluviométrie
Question
Afficher le jour de l’année où il pleut le plus
Programmation Impérative
Tableaux
Fonction et tableaux dynamiques
Exemple : pluviométrie
Question
Afficher le jour de l’année où il pleut le plus
1 v o i d p l u i e M a x ( i n t ∗∗ p l u i e , i n t mois [ 1 2 ] ) {
2 i n t mi =0 ,mj =0;
3 f o r ( i n t i =0; i <12; i ++)
4 f o r ( i n t j =0; j <mois [ i ] ; j ++){
5 i f ( p l u i e [ i ] [ j ]> p l u i e [ mi ] [ mj ] ) {
6 mi=i ;
7 mj=j ;
8 }
9 }
10 s t d : : cout <<" i l p l e u t l e p l u s l e : "
11 <<mj+1<<" / "<<mi+1<<s t d : : e n d l ;
12 }
Programmation Impérative
Tableaux
Fonction et tableaux dynamiques
Exemple : pluviométrie
Question
Calculer le cumulé de la pluviométrie sur l’année
Programmation Impérative
Tableaux
Fonction et tableaux dynamiques
Exemple : pluviométrie
Question
Calculer le cumulé de la pluviométrie sur l’année
1 i n t p l u i e A n n u e l l e ( i n t ∗∗ p l u i e , i n t mois [ 1 2 ] )
2 {
3 i n t s =0;
4 i n t ∗ t=p l u i e M o i s ( p l u i e , mois ) ;
5 f o r ( i n t i =0; i <12; i ++)
6 {
7 s=s+t [ i ] ;
8 }
9 return s ;
10 }
Programmation Impérative
Structures de données
Plan
1 Introduction
3 Structures de contrôle
4 Fonctions
5 Pointeurs
6 Tableaux
7 Structures de données
Programmation Impérative
Structures de données
Remarque
Cela facilite la manipulation des données et la structuration des
programmes
Programmation Impérative
Structures de données
Spécifications
Syntaxe
struct NomStruct{
type1 champ1;
type2 champ2;
...
typeN champN;
};
Syntaxe
struct NomStruct{
type1 champ1;
type2 champ2;
...
typeN champN;
};
Attention
NomStruct est un identificateur pas encore utilisé (ex. 6= int)
type1,...,typeN sont des types connus dont on connaît la
taille mémoire (ex. 6= NomStruct)
Programmation Impérative
Structures de données
1 s t r u c t compteB {
2 int banque ;
3 int compte ;
4 float solde
5 };
Attention
Le ; est obligatoire après la déclaration de la structure ! ! !
Programmation Impérative
Structures de données
Syntaxe
NomStruct var;
Exemple
compteB CB;
Programmation Impérative
Structures de données
Syntaxe
NomStruct var;
NomStruct var;
Remarque
Chaque donnée dans la variable est identifiée par l’identificateur du
champ correspondant.
Programmation Impérative
Structures de données
Exemple
compteB CB;
compteB CB;
Remarque
Les champs sont ordonnés en mémoire dans l’ordre de leur déclara-
tion dans la structure.
Programmation Impérative
Structures de données
Attention
Les champs des structures sont alignés suivant l’alignement des types
de base en mémoire (32 ou 64 bits).
struct mystruct { c1 c2 c3
padding
int c1; mémoire en octets
short int c2;
float c3;
}; mystruct var;
Remarque
Cela définit un identificateur sur la donnée concernée
possédant une adresse : &(var.champ)
accessible en lecture/écriture : var.champ=...
Programmation Impérative
Structures de données
1 #i n c l u d e <i o s t r e a m >
2
3 s t r u c t compteB {
4 i n t banque ;
5 i n t compte ;
6 float solde ;
7 };
8
9 i n t main ( ) {
10 compteB c ;
11 c . solde = 900;
12 s t d : : cout << " s o l d e : "<<c . s o l d e <<" \n " ;
13 return 0;
14 }
Programmation Impérative
Structures de données
équivalent à :
var.champ1=exp1;
...
var.champN=expN;
Programmation Impérative
Structures de données
Remarque
l’ordre des expressions est identique à celui des champs
les champs manquants sont initialisés à 0 ou NULL
on peut imbriquer les initialisations {..} (e.g. struct, tableau)
Programmation Impérative
Structures de données
1 #i n c l u d e <i o s t r e a m >
2
3 s t r u c t compteB {
4 i n t banque ;
5 i n t compte ;
6 float solde ;
7 };
8
9 i n t main ( ) {
10 compteB c = { 1 2 3 , 4 5 6 , 9 0 0 } ;
11 s t d : : cout <<" l e compte : "<<c . compte ;
12 s t d : : cout <<" de l a banque : "<< c . banque ;
13 s t d : : cout <<" a p o u r s o l d e : "<<c . s o l d e <<" \n " ;
14 return 0;
15 }
Programmation Impérative
Structures de données
Exemple
compteB cb1, cb2;
cb1=cb2;
est équivalent à
cb1.banque=cb2.banque;
cb1.compte=cb2.compte;
cb1.solde=cb2.solde
Programmation Impérative
Structures de données
Remarque
L’initialisation par recopie fonctionne également
Exemple
compteB cb1;
...
compteB cb2=cb1;
Programmation Impérative
Structures de données
Plan
7 Structures de données
Structures et fonctions
Structures et tableaux
Structure et pointeur
Structure et allocation dynamique
Programmation Impérative
Structures de données
Structures et fonctions
Syntaxe
type_r mafonction(nomStruct var,...) {...}
Syntaxe
nomStruct mafonction(...) {
...
return exp;
}
1 compteB c r e a t i o n C o m p t e ( i n t banque ) {
2 compteB c = { banque , r a n d ( ) % 1 0 0 0 , 0 . 0 } ;
3 return c ;
4 }
1 v o i d i n t e r e t ( compteB ∗ cb , f l o a t t a u x ) {
2 ( ∗ cb ) . s o l d e ∗=(1.0+ t a u x ) ;
3 }
4 i n t main ( ) {
5 compteB CB ;
6 i n t e r e t (&CB , 0 . 0 2 5 ) ; //MODIFIE BIEN CB
7 return 0;
8 }
Attention
La priorité des opérateurs est très importante :
*var.champ correspond à *(var.champ) et non à (*var).champ
Programmation Impérative
Structures de données
Structures et fonctions
Syntaxe
nomStruct *var= ...;
var->champ=...;
Exemple
1 v o i d a f f i c h e ( compteB ∗CB) {
2 s t d : : cout <<" banque : "<<c−>banque
3 <<" compte : "<<c−>compte
4 << " s o l d e : "<<c−>s o l d e <<" \n " ;
5 }
6 i n t main ( ) {
7 compteB cb = { 1 2 3 4 , 0 4 8 2 6 7 1 2 3 4 , 1 2 7 0 . 5 0 } ;
8 a f f i c h e (& cb ) ; // p a s s a g e p a r a d r e s s e −> e v i t e l a c o p i e
9 return 0;
10 }
Programmation Impérative
Structures de données
Structures et tableaux
Plan
7 Structures de données
Structures et fonctions
Structures et tableaux
Structure et pointeur
Structure et allocation dynamique
Programmation Impérative
Structures de données
Structures et tableaux
Attention
La structure ne contient pas que l’adresse du 1er élément du tableau
mais bien l’ensemble des éléments du tableau.
Programmation Impérative
Structures de données
Structures et tableaux
Exemple
1 struct Etudiant {
2 c h a r nom [ 3 2 ] ;
3 i n t numero ;
4 int naissance [ 3 ] ;
5 };
Exemple
1 struct Etudiant {
2 c h a r nom [ 3 2 ] ;
3 i n t numero ;
4 int naissance [ 3 ] ;
5 };
6 ...
7 E t u d i a n t e={" B e r i " , 2 0 1 0 0 0 3 1 1 1 , { 1 2 , 4 , 1 9 8 7 } } ;
8 ...
Programmation Impérative
Structures de données
Structures et tableaux
Remarque
L’affectation, l’initialisation, le passage en argument et le retour de
fonction d’une structure copie récursivement chacun des champs ...
Tous les tableaux statiques dans les structures seront donc copié
élément par élément lors
de l’affectation de la structure
du passage en argument d’une fonction
du retour de la structure par une fonction
Programmation Impérative
Structures de données
Structures et tableaux
1 void a n n i v e r s a i r e ( Et u d i a n t e ){
2 s t d : : cout <<e . nom<<" e s t né l e "
3 << e . n a i s s a n c e [0]<< " / "
4 << e . n a i s s a n c e [1]<< " / "
5 << e . n a i s s a n c e [2]<< " \n " ;
6 }
7
8 i n t main ( ) {
9 E t u d i a n t e1 , e2={" B e r i " , 2 0 1 0 0 0 3 1 1 1 , { 1 2 , 4 , 1 9 8 7 } } ;
10 e1=e2 ; // c o p i e d e s t a b l e a u x
11 a n n i v e r s a i r e ( e1 ) ; // c o p i e d e s t a b l e a u x
12 return 0;
13 }
Programmation Impérative
Structures de données
Structures et tableaux
Attention
La taille de la structure imbriquée doit être connue ...
→ les structures récursives sont impossibles
Programmation Impérative
Structures de données
Structures et tableaux
Exemple
1 struct Date {
2 int j j ,mm, aaaa ;
3 };
4 struct Etudiant {
5 char nom [ 3 2 ] ;
6 int numero ;
7 Date naissance ;
8 };
Exemple
1 s t r u c t Date {
2 int j j ,mm, aaaa ;
3 };
4
5 struct Etudiant {
6 c h a r nom [ 3 2 ] ;
7 i n t numero ;
8 Date n a i s s a n c e ;
9 };
10 ...
11 E t u d i a n t e={" B e r i " , 2 0 1 0 0 0 3 1 1 1 , { 1 2 , 4 , 1 9 8 7 } } ;
Programmation Impérative
Structures de données
Structures et tableaux
Remarque
L’affectation, l’initialisation, le passage en argument et le retour de
fonction d’une structure copie récursivement chacun des champs ...
1 void a n n i v e r s a i r e ( Et u d i a n t e ){
2 s t d : : cout <<e . nom<<" e s t né l e "
3 << e . n a i s s a n c e . j j <<" / "
4 << e . n a i s s a n c e .mm<<" / "
5 << e . n a i s s a n c e . aa<<" \n " ;
6 }
7
8 i n t main ( ) {
9 E t u d i a n t e1 , e2={" B e r i " , 2 0 1 0 0 0 3 1 1 1 , { 1 2 , 4 , 1 9 8 7 } } ;
10 e1=e2 ; // c o p i e t a b l e a u e t s t r u c t u r e
11 a n n i v e r s a i r e ( e2 ) ; // c o p i e t a b l e a u e t s t r u c t u r e
12 return 0;
13 }
Programmation Impérative
Structures de données
Structures et tableaux
Attention
var reste un tableau et contient l’adresse mémoire où se trouvent
les N données structurées.
Programmation Impérative
Structures de données
Structures et tableaux
Exemple
1 s t r u c t Date {
2 int j j ,mm, aaaa ;
3 };
4 ...
5 Date D[ 3 ] = { { 2 , 1 , 1 9 2 3 } , { 2 3 , 1 2 , 2 0 0 4 } , { 1 3 , 0 1 , 2 0 1 1 } } ;
Exemple
1 s t r u c t Date {
2 int j j ,mm, aaaa ;
3 };
4 ...
5 Date D[ 3 ] = { { 2 , 1 , 1 9 2 3 } , { 2 3 , 1 2 , 2 0 0 4 } , { 1 3 , 0 1 , 2 0 1 1 } } ;
Tableaux de structures
1 s t r u c t Date {
2 int j j ,mm, aaaa ;
3 };
4 ...
5 Date D[ 3 ] = { { 2 , 1 , 1 9 2 3 } , { 2 3 , 1 2 , 2 0 0 4 } , { 1 3 , 0 1 , 2 0 1 1 } } ;
Tableaux de structures
1 s t r u c t Date {
2 int j j ,mm, aaaa ;
3 };
4 ...
5 Date D[ 3 ] = { { 2 , 1 , 1 9 2 3 } , { 2 3 , 1 2 , 2 0 0 4 } , { 1 3 , 0 1 , 2 0 1 1 } } ;
Plan
7 Structures de données
Structures et fonctions
Structures et tableaux
Structure et pointeur
Structure et allocation dynamique
Programmation Impérative
Structures de données
Structure et pointeur
Exemple
1 struct Etudiant {
2 c h a r ∗nom ;
3 Date a n n i v e r s a i r e ;
4 E t u d i a n t ∗ binome ;
5 };
6 ...
7 E t u d i a n t e1={" b e r i o " , { 1 . 3 . 1 9 8 7 } }
8 E t u d i a n t e2={" l e f o r t " , { 1 2 , 1 , 1 9 8 8 } } ;
9 e1 . binome=&e2 ;
10 e2 . binome=&e1 ;
Programmation Impérative
Structures de données
Structure et allocation dynamique
Plan
7 Structures de données
Structures et fonctions
Structures et tableaux
Structure et pointeur
Structure et allocation dynamique
Programmation Impérative
Structures de données
Structure et allocation dynamique
Comme pour les types de base (int, double, ...) il est possible de
faire de l’allocation dynamique de données structurées.
Remarque
Il suffit d’utiliser l’allocation avec new et la libération avec delete.
Programmation Impérative
Structures de données
Structure et allocation dynamique
Comme pour les types de base (int, double, ...) il est possible de
faire de l’allocation dynamique de données structurées.
Remarque
Il suffit d’utiliser l’allocation avec new et la libération avec delete.
Exemple
struct Date {int jj,mm,aaaa;};
Date *T= new Date[3];
...
delete [] T;
Programmation Impérative
Structures de données
Structure et allocation dynamique
et enfin le programme :
1 i n t main ( ) {
2 i n g r e d i e n t i 1 ={ " f a r i n e " , 3 4 } , i 2= { " o e u f s " , 5 } ;
3 plat p;
4 c r e e r P l a t (&p ) ;
5 a j o u t e I n g r e d i e n t (& i 1 ,&p ) ;
6 a j o u t e I n g r e d i e n t (& i 2 ,&p ) ;
7 a f f i c h e P l a t (&p ) ;
8 return 0;
9 }