hlin202 p.giorgi m.montassier · 2020-01-21 · 1introduction 2basesdulangagec++...
TRANSCRIPT
Programmation Impérative
Programmation ImpérativeHLIN202
P. Giorgi M. Montassier
Université de Montpellier
Programmation ImpérativePrésentation du module
Volume horaire
Volume horaire :7 Cours11 TDs10 TPs
Le TD et le TP se font sur 3h en salle informatisée (sauf dernièreséance et cas exceptionnel).
Les TDs/TPs commencent la semaine prochaine.
Programmation ImpérativePrésentation du module
Évaluation du cours
1 note de contrôle continu (assiduité, participation, contrôle)1 examen terminal
La note finale sera :
max(Exam, 0.6× Exam + 0.4× CC)
Programmation ImpérativePrésentation du module
Objectifs
L’objectif n’est pas de faire de vous des spécialistes d’unlangage impératif en particulierObjectifs :
Apprendre les fondements de la programmation impérativeApprendre à les mettre en oeuvre en C/C++
Vous devez être capables de vous adapter à un autre langageimpératif : la syntaxe change, mais les principes restent lesmêmes.
Programmation ImpérativeIntroduction
Plan
1 Introduction
2 Bases du langage C++
3 Structures de contrôle
4 Fonctions
5 Pointeurs
6 Tableaux
7 Structures de données (Facultatif)
Programmation ImpérativeIntroduction
Langage de programmation
Plan
1 IntroductionLangage de programmationProgrammation impérativeLes langages C/C++Les erreurs
Programmation ImpérativeIntroduction
Langage de programmation
Langage de programmation
DefinitionUn langage de programmation est un système de notationpermettant de décrire de manière simple une suite d’actionsordonnée qu’un ordinateur pourra exécuter.
Différents niveaux de langage :langage machine :codage binaire propre à chaque processeurlangage assembleur :codage alphanumérique du langage machine↪→ traduit en langage machine par un assembleurlangage haut niveau :codage alphanumérique proche du langage naturel↪→ traduit en langage assembleur par un compilateur
Programmation ImpérativeIntroduction
Langage de programmation
Langage assembleur
Langage procédurale proche de l’architecture de la machine.Syntaxe différente d’un processeur à l’autre.
. s e c t i o n __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
. g l o b l _main
. a l i g n 4 , 0x90_main : ## @main
. c f i _ s t a r t p r o c## BB#0:
push rbpLtmp2 :
. c f i _ d e f _ c f a_ o f f s e t 16Ltmp3 :
. c f i _ o f f s e t rbp , −16mov rbp , r s p
Ltmp4 :. c f i _ d e f _ c f a_ r e g i s t e r rbpmov eax , 0mov dword p t r [ rbp − 4 ] , 0mov dword p t r [ rbp − 8 ] , 10pop rbpr e t. c f i_endp r o c
. s ub s e c t i on s_v i a_symbo l s
Programmation ImpérativeIntroduction
Langage de programmation
Langage assembleur
Il est propre à chaque famille de processeurs.Il est loin de la notion d’algorithme.Le code d’un même programme change d’un processeur àl’autre.
↪→ langage peu adapté à l’écriture simple de programmes.
RemarqueOn dit que du code en langage assembleur n’est pas portable car iln’est pas garanti de fonctionner sur n’importe quel ordinateur.
Programmation ImpérativeIntroduction
Langage de programmation
Langage haut niveau
Syntaxe indépendante des processeurs.Système d’écriture plus proche de la langue naturelleIl s’appuie sur des concepts facilitant la programmation.exemple : notion d’algorithme, notion d’objet, etc.
Le même code que précédemment mais écrit en C/C++.1 i n t main ( )2 {3 i n t a ;4 a=10;5 re tu rn 0 ;6 }
Programmation ImpérativeIntroduction
Langage de programmation
Langage haut niveau
Ce langage n’est pas exécutable directement par un ordinateur.Deux solutions possibles :
le traduire complètement en langage machine :↪→ notion de langage compilél’exécuter par un programme qui le traduit à la volée :↪→ notion de langage interprété
RemarqueCertains langages interprétés utilisent une compilation vers un lan-gage intermédiaire pour améliorer les performances, ex. JAVA.
Programmation ImpérativeIntroduction
Langage de programmation
Langage haut niveau
Il existe plusieurs types de langages haut niveau, chacun proposantdes notions (paradigmes) de programmation différentes.
langages fonctionnels : CAMLlangages impératifs : C, Pascal, Fortranlangages à objets : JAVAlangages logiques : Prologlangage multi-paradigme : C++, python, Scala
RemarqueUn paradigme peut être mieux adapté qu’un autre pour certaines tâches.Deux programmes peuvent produire les mêmes résultats tout en étant écritavec des langages différents.
Programmation ImpérativeIntroduction
Programmation impérative
Plan
1 IntroductionLangage de programmationProgrammation impérativeLes langages C/C++Les erreurs
Programmation ImpérativeIntroduction
Programmation impérative
Définition
La programmation impérative procédurale correspond à la notionde changement d’état d’un programme à partir :
d’instructions simples,d’appel d’algorithmes (i.e. procédure/fonction).
Changement d’état d’un programmeCela correspond à la modification d’une donnée utilisée par leprogramme (une variable).
RemarqueCe modèle de programmation est au plus proche des architecturesde nos ordinateurs actuels.
Programmation ImpérativeIntroduction
Programmation impérative
Modélisation d’un ordinateur actuel07/11/08 10:31Personal_computer,_exploded_5,_unlabeled.svg
Page 1 sur 1file:///Users/vincentboudet/Enseignement/2008/FLIN202/Personal_computer,_exploded_5,_unlabeled.svg
de la mémoiredes unités de calcul sur des nombres(entiers/réels)des unités de contrôle
Un langage impératif s’appuie essentiellement sur 3 notions :
mémoire, calcul, contrôle
Programmation ImpérativeIntroduction
Programmation impérative
Mémoire d’un ordinateur
Mémoire divisée en case↪→ une case est un bit (soit 0, soit 1)Case identifiée par un numéro (adresse)
!"#"$%"&'()%**%+'
!"#$%&'()#*+,-,.(/%(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
C*(6.6",1%($,$%(%5'($,/.%(?(0D*)#%(*11E'("#(1%/.6*11*9%(/%($"'1%("1/,&*'%#17
5"#"$%"60*7+%"6+'
F"&'1*,1%6%&'(?(+*(6.6",1%($,$%3(
+%5(/"&&.%5(5'"0>.%5(5#1(#&(
/,5)#%(/#1(5"&'(4%16*&%&'%5(%'(&%(
5"&'(4*5(%--*0.%5(?(+2*11E'(/%($"'1%(
"1/,&*'%#17(F2%5'(/"&0(5#1(#&(
/,5)#%(/#1()#%($"'1%(5A5'G6%(
/2%84+",'*',"&(<$08+93(4-):*("#(
;086(<*=3($"5(+"9,0,%+5(%'($"5(
/"0#6%&'5(5"&'(0"&5%1$.57(F2%5'(
/"&0(#&(%54*0%(/%(5'"0>*9%(
4%16*&%&'3("H($"#5(4"#$%:(0"4,%1(
%'(5#441,6%1(/%5(/"&&.%5(?(
$"+"&'.7
On peut donc voir la mémoire d’un ordinateur comme un tableaucontenant des 0 et des 1.
...
Programmation ImpérativeIntroduction
Programmation impérative
Contenu de la mémoire
Toutes les données dans un programme sont traduits en 0 et en 1des plus simples (booléens, entiers)aux plus complexes (une carte routière, un film)
On parle de codage binaire des données.
ExempleLa représentation en mémoire de 63576473 est
00000011110010100001100110011001celle de Π peut-être11001001000011111101101010100010001000010110100011000
Programmation ImpérativeIntroduction
Programmation impérative
Contenu de la mémoire
Les données étant de diverse nature (taille et contenu du codage),on utilisera la notion de type pour les différencier.
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érativeIntroduction
Programmation impérative
Écrire un programmation impératif
Le programmeur décrit de manière ordonnée chacune desinstructions composant son programme.
Instructions possibles :
de calcul : 3+5de contrôle : si ... alors ... sinon, pour, tant quede mémoire :
nommer une zone mémoire : variableaccéder directement à une case mémoire : pointeurmodifier une zone mémoire : affectation
Programmation ImpérativeIntroduction
Les langages C/C++
Plan
1 IntroductionLangage de programmationProgrammation impérativeLes langages C/C++Les erreurs
Programmation ImpérativeIntroduction
Les langages C/C++
Historique
Le langage C
est un langage purement impératifest créé en 1972 par D. Ritchie et K. Thompson pourdévelopper UNIXnormalisation ANSI (1989) et ISO (1990,1991,2011)
Le langage C++
est une évolution de C ajoutant le paradigme objetest inventé en 1983 par B. Stroustrupnormalisation ISO (1998,2003,2011)
Programmation ImpérativeIntroduction
Les langages C/C++
Caractéristiques importantes
Noyau de langage impératif procédural
faiblement typé (conversion implicite des types)langage compiléarithmétique sur les adresses mémoires et sur les bits
Remarquepermet de rester très proche de l’architecture des ordinateurs,utile pour avoir les meilleures performances possibles
Programmation ImpérativeIntroduction
Les langages C/C++
Le noyau impératif de C++ pouvant être considéré comme uneéquivalence du langage C, nous ne parlerons que C++ dans lasuite de ce cours.
Attentionles 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érativeIntroduction
Les langages C/C++
Concevoir un programme en C++
Trois étapes ordonnées :1 écrire dans un fichier texte le code du programme en C++2 compiler le programme3 exécuter le programme
Programmation ImpérativeIntroduction
Les langages C/C++
Écrire un programme C++
Il suffit d’écrire avec un éditeur de texte simple (sans formatage)quelques lignes de code.
exemple.cpp
1 #i nc l ude <ios t r eam >2
3 i n t main ( ){4 i n t a , b , c ;5 s t d : : c in >>a>>b ;6 c=a+b ;7 s t d : : cout<<a<<"+"<<b<<"="<<c<<std : : e n d l ;8
9 re tu rn 0 ;10 }
Programmation ImpérativeIntroduction
Les langages C/C++
Compilation d’un programme C++
ObjectifTraduire un programme décrit en C++ dans un programme décriten langage machine.
AttentionLes programmes écrits en C++ ne sont pas exécutables, seules leurstraductions en langage machine le sont.
L’outil permettant la traduction d’un texte écrit en C++ enlangage machine s’appelle un compilateur.
Programmation ImpérativeIntroduction
Les langages C/C++
Compilation d’un programme C++
Il existe plusieurs compilateurs C++ en fonction du systèmed’exploitation et de l’architecture.
Dans un environnement GNU/Linux,
la suite de compilation standard est appelé GCC (the GNUCompiler Collection).le compilateur C++ de GCC est : g++
Programmation ImpérativeIntroduction
Les langages C/C++
Un exemple de compilation
Pour compiler l’exemple (exemple.cpp), on tape dans un terminal :
g++ -Wall exemple.cpp -o Exemple
ce qui permet de créer un programme exécutable nommé Exemple.
Syntaxe généraleg++ -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érativeIntroduction
Les langages C/C++
Un exemple de compilation
Pour compiler l’exemple (exemple.cpp), on tape dans un terminal :
g++ -Wall exemple.cpp -o Exemple
ce qui permet de créer un programme exécutable nommé Exemple.
Syntaxe généraleg++ -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érativeIntroduction
Les langages C/C++
Notion de programme en C++
Un programme est constitué de plusieurs fonctions/procédures quipeuvent s’appeler les unes les autres.La première fonction appelée par un programme est :le point d’entrée du programme
Point d’entrée d’un programme C++Il correspond à une fonction appelée main qui est spécifique :
1 i n t main ( ){2 // début du programme3 . . .4 // f i n du programme5 re tu rn 0 ;6 }
Programmation ImpérativeIntroduction
Les langages C/C++
Principe d’un programme C++
fonction A!!!!!
fonction main!!
appel de B appel de C appel de B
fonction C!!
appel de A !!
fonction B!!!!!
Écriture du programme :1 On définit un ensemble de fonctions
A,B,C.2 On définit un programme avec main
Quand on lance le programme :il exécute main
qui exécute Bqui exécute C
qui lui même exécute Aqui exécute encore B
Attentionla fonction main n’est définie qu’une seule fois par programme.
Programmation ImpérativeIntroduction
Les erreurs
Plan
1 IntroductionLangage de programmationProgrammation impérativeLes langages C/C++Les erreurs
Programmation ImpérativeIntroduction
Les erreurs
Les erreurs
Trois types d’erreursErreur de syntaxeErreur de conceptionErreur d’exécution
Programmation ImpérativeIntroduction
Les erreurs
Erreurs de syntaxe
Les langages de programmation sont définis à partir de règlesstrictes. La violation d’une seule règle implique une erreur desyntaxe.
RemarqueLes langages de programmation ne peuvent être ambigus. Chaquemot clé du langage a un sens et il faut les utiliser correctement.
Correction des erreurs de syntaxeLe compilateur affiche les éventuelles erreurs de syntaxe endécrivant le type d’erreur et la ligne du programme incriminée.
Programmation ImpérativeIntroduction
Les erreurs
Erreurs de syntaxe
syntax-error.cpp
1 i n t main ( )2 {3 i n t a4 re tu rn 0 ;5 }
Compilationg++ -Wall syntax-error.cpp -o syntax-errorsyntax−e r r o r . cpp : I n f u n c t i o n ‘ i n t main ( ) ’ :syntax−e r r o r . cpp : 3 : 3 : e r r o r : e xpec t ed i n i t i a l i z e r b e f o r e ‘ r e t u r n ’
il y a une erreur ligne 3 avant le mot clé return ↪→ il manque un ;
Programmation ImpérativeIntroduction
Les erreurs
Erreurs de conception
Vous vous êtes trompé dans la conception du programme.
Exemple1 faire chauffer une poêle avec de l’huile.2 battre les oeufs.3 verser les oeufs battus dans la poêle.4 casser les oeufs.
bien que syntaxiquement correct ce programme ne fera pas unebonne omelette.
Programmation ImpérativeIntroduction
Les erreurs
Erreurs de conception
AttentionUn ordinateur exécute strictement les ordres qu’on lui donne ! ! !
AttentionLe compilateur ne peut pas détecter les erreurs de conception ! ! !
Programmation ImpérativeIntroduction
Les erreurs
Erreurs d’exécution
Souvent liées à des erreurs d’écriture (bug) ou à des erreurs deconception.
non détectées à la compilationdépendantes de l’état du programme et de son environnementd’exécution
RemarqueUn programme peut fonctionner correctement très longtemps et pro-duire soudainement une erreur.
un cas classique : une division par 0
Programmation ImpérativeIntroduction
Les erreurs
Erreurs d’exécution
execution-error.cpp
1 #i nc l ude <ios t r eam >2 i n t main ( )3 {4 i n t a , b , c ;5 s t d : : c in >>a>>b ;6 c=a/b ;7
8 re tu rn 0 ;9 }
La compilation ne détecte aucune erreur, mais si on exécute leprogramme en saisissant b = 0, on obtient le message suivant :
Floating point exception
Programmation ImpérativeBases du langage C++
Plan
1 Introduction
2 Bases du langage C++
3 Structures de contrôle
4 Fonctions
5 Pointeurs
6 Tableaux
7 Structures de données (Facultatif)
Programmation ImpérativeBases du langage C++
Rappel : programme minimal
Un programme C++ se compose d’une fonction main, dont laversion la plus simple est :
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 s3 i n s t r u c t i o n s du programme4 re tu rn 0 ;5 }
Programmation ImpérativeBases du langage C++
Rappel : programme minimal
Comme dans le langage algorithmique :les variables ont un type (ex : entier, flottant)les instructions sont :
des instructions simples (ex : affectation)des expressions (ex : a+b×c)des structures de contrôle (ex : tant que)
Programmation ImpérativeBases du langage C++
Les composants de base d’un programme C++
Un programme C++ est constitué des composants élémentairessuivants :
les types de données,les constantes,les variables,les opérateurs,les structures de contrôle,les appels de fonctions
Programmation ImpérativeBases du langage C++
Les type de données
Plan
2 Bases du langage C++Les type de donnéesLes constantesLes variablesOpérateursLes conversions de typeLes entrées-sortiesInstructions
Programmation ImpérativeBases du langage C++
Les type de données
Les types de données
des nombres : entiers, approximations flottantes des réelsdes lettres : caractèresdes booléens : vrai, faux
type type en C++ valeursentiers int [−231, 231 − 1]réels (simple précision) float ≈ 7 chiffres significatifsréels (double précision) double ≈ 15 chiffres significatifscaractère charbooléen bool { true, false}
Programmation ImpérativeBases du langage C++
Les type de données
Le codage binaire des entiers
Les entiers sont exprimés sous format binaire103 = 64 + 32 + 4 + 2 + 1 = 26 + 25 + 22 + 21 + 20
1 1 0 0 1 1 1
Le nombre de bit (case) fixe l’ensemble des entiers représentables.
Sur 7 bits on représente les entiers positifs dans [0, 127]
le plus grand : 127 = 27 − 11 1 1 1 1 1 1
le plus petit : 00 0 0 0 0 0 0
Programmation ImpérativeBases du langage C++
Les type de données
Le codage binaire des entiers
Les entiers négatifs sont également représentés par un codagebinaire : le codage en complément à deux
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
−103 = −256 + 128 + 16 + 8 + 1 = −28 + 27 + 24 + 23 + 20
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érativeBases du langage C++
Les type de données
Les types de données entiers
Plusieurs variantes (complément à deux) qui utilisent plus ou moinsd’octets et qui ont différentes plages de valeurs : norme C++11.
type entier type en C++ nbr octets valeurscourt short int ≥ 2 [−215, 215 − 1]standard int ≥ 2 [−216, 216 − 1]long long int ≥ 4 [−231, 231 − 1]très long long long int ≥ 8 [−263, 263 − 1]
Exempleshort int a= 103;
0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1︸ ︷︷ ︸a
Programmation ImpérativeBases du langage C++
Les type de données
Les types de données entiers
On peut étendre la valeur maximum des entiers en utilisant desentiers positifs (versions non signées = pas de complément à deux)
type en C++ nbr octets valeursunsigned short int ≥ 2 [0, 216 − 1]unsigned int ≥ 2 [0, 216 − 1]unsigned long int ≥ 4 [0, 232 − 1]unsigned long long int ≥ 8 [0, 264 − 1]
RemarqueSur une machine Unix 64-bits, on admet communément que
taille int = 4 octets ; taille long int = 8 octets ;
Programmation ImpérativeBases du langage C++
Les type de données
Les types de données réels
Les réels ne sont pas représentables en codage binaire. Onreprésente un réel x par une approximation rationnelle particulière :
x ≈ (−1)s × m2e
exemple : 0.75 = (−1)0 × 322
Le codage de x correspond au codage binaire de s,m et e.s m e0 0 0 1 1 0 1 0
Norme IEEE754 :
float (32 bits) : 1 bit pour s, 23 bits pour m, 8 bits pour edouble (64 bits) : 1 bit pour s, 52 bits pour m, 11 bits pour e
Programmation ImpérativeBases du langage C++
Les type de données
Les types de données réels
Les réels ne sont pas représentables en codage binaire. Onreprésente un réel x par une approximation rationnelle particulière :
x ≈ (−1)s × m2e
exemple : 0.75 = (−1)0 × 322
Le codage de x correspond au codage binaire de s,m et e.s m e0 0 0 1 1 0 1 0
Norme IEEE754 :
float (32 bits) : 1 bit pour s, 23 bits pour m, 8 bits pour edouble (64 bits) : 1 bit pour s, 52 bits pour m, 11 bits pour e
Programmation ImpérativeBases du langage C++
Les type de données
Le type de données caractèreLe mot clé char désigne un caractère codé sur un octet basé surune extension du code ASCII (les caractères accentués en plus) :
Programmation ImpérativeBases du langage C++
Les constantes
Plan
2 Bases du langage C++Les type de donnéesLes constantesLes variablesOpérateursLes conversions de typeLes entrées-sortiesInstructions
Programmation ImpérativeBases du langage C++
Les constantes
Les constantes
Chaque type de données possède des constantes pouvant êtreutilisées dans un programme pour :
affecter une valeur à une variable,effectuer un calcul,former une expression booléenne.
Exempleint a=10;1+2+3+4+5;1<2;
Programmation ImpérativeBases du langage C++
Les constantes
Les constantes entières
Elles sont définies en accord avec le type natif des entiers (int) etappartiennent donc à l’intervalle [−231, 231 − 1] (en général).
1 i n t a ;2 a= 2147483647; ( a f f e c t a t i o n v a l i d e −> a=2^31 −1)3 a= 2147483648; ( 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= 2147483648L ; ( a f f e c t a t i o n v a l i d e −> b= 2^31)
RemarqueLe compilateur provoquera une alerte si la constante est supérieureà la capacité du type affecté. short int a=2147483647;
Programmation ImpérativeBases du langage C++
Les constantes
Les constantes entières
On peut étendre leur plage en les suffixant parU (unsigned)L (long)LL (long long)
ex : 264 − 1⇒18446744073709551615ULL
Plusieurs écriture possibles :décimal (en base 10) - ex : 1234octal (en base 8) - ex : 0477hexadécimal (en base 16) - ex : 0xA123F
Programmation ImpérativeBases du langage C++
Les constantes
Les constantes réelles (flottantes)
Elles sont définies en accord avec le type double. On peut forcer lecodage en suffixant par F (float) et L (double).
Codage scientifique
représentation par mantisse et exposantl’exposant est introduit par la lettre eex : 2.34e4 représente 2.34× 104
Programmation ImpérativeBases du langage C++
Les constantes
Les constantes caractères
Elles sont formées par l’expression utilisant les guillemets simples :’...’ ou les ... sont remplacés par :
un caractère alphanumérique :abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
1234567890;,.?!@*()+-[]:;<> ETC.
un caractère spécial :\n → retour à la ligne\t → tabulation\b → backspace...
Programmation ImpérativeBases du langage C++
Les variables
Plan
2 Bases du langage C++Les type de donnéesLes constantesLes variablesOpérateursLes conversions de typeLes entrées-sortiesInstructions
Programmation ImpérativeBases 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
Comment savoir ou se trouvent les données en mémoire ?
lesvariables
0 1 1 0 1 0 0 1 1 1 1 0 1 0 1 1 1 1 1 0
↑ ↑début de la variable x fin de la variable x
On identifie une variable par :une adresse de début dans l’espace mémoireune taille indiquant l’espace mémoire occupé par la variable
Programmation ImpérativeBases 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
Comment savoir ou se trouvent les données en mémoire ? lesvariables0 1 1 0 1 0 0 1 1 1 1 0 1 0 1 1 1 1 1 0
↑ ↑début de la variable x fin de la variable x
On identifie une variable par :une adresse de début dans l’espace mémoireune taille indiquant l’espace mémoire occupé par la variable
Programmation ImpérativeBases 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
Comment savoir ou se trouvent les données en mémoire ? lesvariables0 1 1 0 1 0 0 1 1 1 1 0 1 0 1 1 1 1 1 0
↑ ↑début de la variable x fin de la variable x
On identifie une variable par :une adresse de début dans l’espace mémoireune taille indiquant l’espace mémoire occupé par la variable
Programmation ImpérativeBases du langage C++
Les variables
Les variables en C++
DefinitionOn appelle variable une zone mémoire de l’ordinateur à laquelle ona donné un nom, ainsi qu’un type de données.
le nom de la variable, appelé identificateur1, permet demanipuler facilement les données stockées en mémoire.le type de données permet au compilateur de réserver l’espacemémoire suffisant pour stocker les valeurs.
(1) on utilise un identificateur plutôt que l’adresse mémoire maisl’on peut facilement récupérer l’adresse d’une variable à partir deson identificateur.
Programmation ImpérativeBases du langage C++
Les variables
Les variables en C++
Exempleint a;
a est une variable de type entier :
le compilateur lui réservera 4 octets en mémoire pour stockerses valeurson utilisera le nom « a » pour travailler avec l’espace mémoireattribué à la variable a.
Programmation ImpérativeBases du langage C++
Les variables
Les variables en C++
Exempledouble f;
f est une variable de type réel :
le compilateur lui réservera 8 octets en mémoire pour stockerses valeurson utilisera le nom « f » pour travailler avec l’espace mémoireattribué à la variable f.
Programmation ImpérativeBases du langage C++
Opérateurs
Plan
2 Bases du langage C++Les type de donnéesLes constantesLes variablesOpérateursLes conversions de typeLes entrées-sortiesInstructions
Programmation ImpérativeBases du langage C++
Opérateurs
Les opérateurs arithmétiques
les opérateurs classiquesaddition : +soustraction : −division : /
multiplication : *opposé : −modulo : %
Attention : les opérateurs utilisent des opérandes du même type etrenvoie un résultat du même type que les opérandes
int + int = int ;float * float = float ;int + float = ???
Programmation ImpérativeBases du langage C++
Opérateurs
Priorité des opérateurs arithmétiques
Les règles de priorités mathématiques sont conservées :a + b × c sera interprété a + (b × c)(a + b)× c sera interprété correctement car les parenthèsesfixent l’ordre de priorité
nb : les opérations entre parenthèses sont prioritaires et seronttoujours évaluées en premier
Programmation ImpérativeBases du langage C++
Opérateurs
Opérateurs de comparaisons
les opérateurs classiques sur les types numériques :
égalité ==différent ! =supérieur >
inférieur <
supérieur ou égal >=inférieur ou égal 1 <=
Attention : le langage C++ dispose d’un type booléen en standard,le résultat d’une expression booléenne est un booléen :
false si l’expression est fausse (ex : 3 < 2)true si l’expression est vraie (ex : 3 > 2)
Programmation ImpérativeBases du langage C++
Opérateurs
Opérateurs logiques
les opérateurs logiques en C :et : &&ou : ||non : !
les opérandes sont de type booléen.
Exemple(2.5 > 3.5) && (1 < 3) est égale à falsetrue || (1 >= 3) est égale à true
Programmation ImpérativeBases du langage C++
Opérateurs
Opérateur d’affectation
Cette opérateur permet d’affecter la valeur d’une expression à unevariable. L’affectation se fait avec =
var = expexp : expression du même type que varvar : nom d’une variable déclaréela variable var prend la valeur de l’expression expex : a=2+3; a prend la valeur de l’expression 2+3 donc 5
comme en algorithmique, l’opérande de gauche ne peut êtrequ’une variable : l’affectation a+b=3; n’est pas correctesyntaxiquement.
Programmation ImpérativeBases du langage C++
Opérateurs
Autres opérateurs
incrémentation/décrémentation d’une variable entière a :a + + incrémente la valeur de a par 1a −− décrémente la valeur de a par 1
affectations élargies : +=, -=, *=, /=a+=3; correspond à l’expression a=a+3;
taille mémoire des variables : sizeofsizeof(a) renvoie la taille en octets de la variable a.
et beaucoup d’autres ...
Programmation ImpérativeBases du langage C++
Opérateurs
Opérateur d’adresse mémoire
Chaque variable est stockée en mémoire à une adresse précise.L’opérateur d’adresse & permet de récupérer l’adresse associée àune variable
si a est une variable définie :&a renvoie la valeur de l’adresse de a
Attentionl’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érativeBases du langage C++
Opérateurs
Priorités des opérateurs : récapitulatif
Opération associative (?) :à droite : a ? b ? c ⇒ a ? (b ? c)à gauche : a ? b ? c ⇒ (a ? b) ? c
Catégorie Opérateurs AssociativitéUnaire +, −, ++, −−, !, ∗, &, sizeof, cast DroiteBinaire ∗, /, % GaucheBinaire +, − GaucheComparaison <, <=, >, >= GaucheComparaison ==, ! = GaucheLogique && GaucheLogique || GaucheAffectation =, + =, − =, ∗ =, / =, % = Droite
Le tableau est classé par ordre de priorité décroissante.
Programmation ImpérativeBases du langage C++
Opérateurs
Priorités des opérateurs : exemples
Expression Expression parenthésée Valeur2+3*7 2+(3*7) 2315*3%7/2 ((15*3)%7)/2 1x=y=2 x=(y=2) x :2, y :21<4==7<5 !=9<4 ((1<4)==(7<5)) !=(9<4) false (ou 0)
Programmation ImpérativeBases du langage C++
Les conversions de type
Plan
2 Bases du langage C++Les type de donnéesLes constantesLes variablesOpérateursLes conversions de typeLes entrées-sortiesInstructions
Programmation ImpérativeBases du langage C++
Les conversions de type
Conversions de typesAttentionLe langage C++ est faiblement typé.⇒ écriture d’expressions avec des types différents
par exemple : 1+2.5+true
Résolution d’expression de types mixtesLe compilateur convertit implicitement les données pour satisfaireun typage unique dans les expressions. L’ordre des conversions estle suivant :
char -> int -> float -> doublebool -> int
signed -> unsigned
Programmation ImpérativeBases du langage C++
Les conversions de type
Conversions de types
lors de l’évaluation d’une expression :ex : 3.5+1 sera calculé comme 3.5+1.0↪→ pas de perte d’information
lors d’une affectation :int a = 3.5; sera effectué comme int a= 3;↪→ perte d’information possible
Programmation ImpérativeBases du langage C++
Les conversions de type
Conversions de types
Le cas des booléensLes booléens sont vus comme des nombres :
la valeurs numérique 0→ falsetoute valeur numérique 6= 0→ true
Exemple1 && true ⇒ true
1.5 && true ⇒ true
0 || false ⇒ false
int a=true; ⇒ a=1
Programmation ImpérativeBases du langage C++
Les conversions de type
Conversions de types explicite
On peut forcer le changement de type en effectuant un cast.
Conversion de type par cast
L’expression : (type1) exp;
permet de convertir l’évaluation de exp dans le type type1.
Exemple1 i n t a=3,b=4;2 double c= a/b ; // c =0.03 double d= ( double ) a /( double ) b // d=0.75
Programmation ImpérativeBases du langage C++
Les entrées-sorties
Plan
2 Bases du langage C++Les type de donnéesLes constantesLes variablesOpérateursLes conversions de typeLes entrées-sortiesInstructions
Programmation ImpérativeBases du langage C++
Les entrées-sorties
Les entrées-sorties
Comme pour tout langage de programmation il est souhaitable depouvoir interagir avec le programme :
saisir des valeurs au clavierafficher des valeurs à l’écran
En C++, les fonctionnalités d’entrée-sortie standards sont définiesdans le fichier iostream.
1 #i n c l u d e <ios t r eam >2 i n t main ( ) {3 . . .4 re tu rn 0 ;5 }
Programmation ImpérativeBases du langage C++
Les entrées-sorties
Instruction d’affichage
Definitionstd::cout << exp;
exp est une expression quelconquecout est le nom de la sortie standard (l’écran par défaut)l’opérateur d’écriture << indique ici d’envoyer la valeur del’expression exp sur le flux de sortie standard cout
1 #i n c l u d e <ios t r eam >2 i n t main ( ) {3 s t d : : cout << 1 ;4 re tu rn 0 ;5 }
Programmation ImpérativeBases du langage C++
Les entrées-sorties
Instruction d’affichage
Definitionstd::cout << exp;
exp peut être :expression arithmétiqueexpression booléenneune constante ou une variable de type standardstd::endl → instruction de retour à la ligne
On peut enchaîner les affichages :std::cout << exp1 << exp2 << exp3 << · · · << expn;
Programmation ImpérativeBases du langage C++
Les entrées-sorties
Instruction d’affichage : exemple
1 #i n c l u d e <ios t r eam >2 i n t main ( ) {3 i n t a = 18 ;4 f l o a t b = 2 . 3 ;5 s t d : : cout << " l ’ e n t i e r a = " << a << std : : e nd l ;6 s t d : : cout << " l e f l o t t a n t b = " << b << std : : e n d l ;7 re tu rn 0 ;8 }
ce programme affichera à l’écran :l’entier a = 18le flottant b = 2.3
Programmation ImpérativeBases du langage C++
Les entrées-sorties
Instruction de saisie clavier
Definitionstd::cin >> var;
var est un identificateur de variable validestd::cin est le nom de l’entrée standard (le clavier)l’opérateur de lecture >> indique ici d’affecter la valeur duflux d’entrée standard dans la variable var
1 #i n c l u d e <ios t r eam >2
3 i n t main ( ) {4 i n t a ;5 s t d : : c i n >> a ;6 re tu rn 0 ;7 }
Programmation ImpérativeBases du langage C++
Les entrées-sorties
Instruction de saisie clavier
Definitionstd::cin >> var;
Attentionvar 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’identificateurd’une variable (dualité mémoire/variable)
var doit être une variable existante dans la mémoire ! ! !
On peut enchaîner les saisies clavier :std::cin >> var1 >> var2 >> · · · >> varn;
Programmation ImpérativeBases du langage C++
Les entrées-sorties
Instruction de saisie clavier : exemple
1 #i n c l u d e <ios t r eam >2
3 i n t main ( ) {4 i n t a ;5 f l o a t b ;6 cout << " Ent 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 re tu rn 0 ;9 }
ce programme affichera à l’écran :Entrez un entier puis un flottant
et attendra la saisie au clavier d’un entier et d’un réel qu’ilaffectera respectivement à la variable a et b.
Programmation ImpérativeBases du langage C++
Les entrées-sorties
Instruction de saisie clavier : séparateurs
Si plusieurs valeurs sont saisies au clavier les affectations se fontdans l’ordre des saisies.
Pour séparer 2 valeurs à saisir, on peut utiliser :une tabulationun retour à la ligneun espace
Programmation ImpérativeBases du langage C++
Les entrées-sorties
Instruction d’affichage : gabarit
Un gabarit d’affichagepermet 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 ungabarit. Les manipulateurs disponibles dans <iomanip> sont :
std::left → aligne l’affichage à gauche du gabaritstd::right → aligne l’affichage à droite du gabaritstd::setw(i) → i est le nombre de caractères du gabarit↪→ actif uniquement sur l’affichage suivant.
Programmation ImpérativeBases du langage C++
Les entrées-sorties
Exemple : affichage avec gabarit
1 #i n c l u d e <ios t r eam>2 #i n c l u d e <iomanip>3 i n t main ( ){4 i n t a = 2 ;5 s t d : : cout<<" dé f : a= "<<a<<std : : e nd l ;6 s t d : : cout<<"gab 1 : a= "<<std : : setw(1)<<a<<std : : e nd l ;7 s t d : : cout<<"gab 2 : a= "<<std : : setw(2)<<a<<std : : e nd l ;8 s t d : : cout<<"gab 3 : a= "<<std : : setw(3)<<a<<std : : e nd l ;9 s t d : : cout<<"gab 4 : a= "<<std : : setw(3)<<std : : r i g h t <<a10 <<std : : e nd l ;11 r e t u r n 0 ;12 }
Ce code affiche à l’écran :déf : a = 2gab 1 : a = 2gab 2 : a = 2gab 3 : a = 2gab 4 : a = 2
Programmation ImpérativeBases du langage C++
Les entrées-sorties
Affichage : format des entiers
On peut contrôler le format d’affichage des entiers par unmanipulateur.Les manipulateurs disponibles sont :
std::hex → affichage en hexadécimalstd::dec → affichage en décimalstd::octal → affichage en octal
RemarquePar 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 unautre.
Programmation ImpérativeBases du langage C++
Les entrées-sorties
Exemple : affichage avec format des entiers
1 #i n c l u d e <ios t r eam>2 i n t main ( ){3 i n t a = 12 ; i n t b=8;4 s t d : : cout<< "a = "<<a<< " ( dé f au t ) "<<s td : : e nd l ;5 s t d : : cout<<s td : : oc t6 << "a = "<<a<< " ( o c t a l ) "<<s td : : e nd l ;7 s t d : : cout<< "b = "<<b<<std : : e nd l ;8 s t d : : cout<<s td : : hex9 << "a = "<<a<< " ( hexadéc ima l ) "<<s td : : e nd l ;10 r e t u r n 0 ;11 }
Ce code affiche à l’écran :a = 12 (défaut)a = 14 (octal)b = 10a = c (hexadécimal)
Programmation ImpérativeBases du langage C++
Les entrées-sorties
Affichage des booléens
On peut contrôler le format d’affichage des booléens par unmanipulateur : affichage true,false ou 1,0.
Les manipulateurs disponibles sont :std::boolalpha → affichage true ou falsestd::noboolalpha → affichage 1 ou 0
RemarquePar défaut c’est std::noboolalpha qui est actif.Ce manipulateur reste actif tant qu’on en active pas un autre.
Programmation ImpérativeBases du langage C++
Les entrées-sorties
Exemple : affichage des booléens
1 #i n c l u d e <ios t r eam>23 i n t main ( ){4 boo l a = t r ue ; boo l b=f a l s e ;5 s t d : : cout<< "a = "<<a<<" ( de f au t ) "<<s td : : e nd l ;6 s t d : : cout<<s td : : b oo l a l p ha7 <<"a = "<<a<<" ( boo l a l p ha ) "<<std : : e nd l ;8 s t d : : cout<<s td : : noboo l a l pha9 << "a = "<<a<<" ( noboo l a l pha ) "<<std : : e nd l ;10 s t d : : cout<< "b = "<<b<<std : : e nd l ;11 r e t u r n 0 ;12 }
Ce code affiche à l’écran :a = 1 (defaut)a = true (boolalpha)a = 1 (noboolalpha)b = 0
Programmation ImpérativeBases du langage C++
Les entrées-sorties
Affichage : format des réelsOn peut contrôler le format d’affichage des réels par desmanipulateurs.Manipulateurs de format
std::fixed → notation décimalestd::scientific → notation scientifique
Manipulateur de la précision
std::setprecision(i) où i est le nombre de chiffressignificatifs choisis.besoin de #include <iomanip>
std::setprecision n’agit que sur l’affichage et non sur la valeurstockée en mémoire.
Programmation ImpérativeBases du langage C++
Les entrées-sorties
Exemple : format des réels
1 #i n c l u d e <ios t r eam>23 i n t main ( ){4 f l o a t x = 89 .786543 ;56 s t d : : cout<<"x= "<<x<<" ( de f au t ) "<<s td : : e nd l ;7 s t d : : cout<<s td : : f i x e d8 <<"x= "<<x<<" ( f i x e d ) "<<s td : : e nd l ;9 s t d : : cout<<s td : : s c i e n t i f i c10 <<"x= "<<x<<" ( s c i e n t i f i c ) "<<s td : : e nd l ;11 r e t u r n 0 ;12 }
Ce code affiche à l’écran :x= 89.7865 (defaut)x= 89.786545 (fixed)x= 8.978654e+01 (scientific)
Programmation ImpérativeBases du langage C++
Les entrées-sorties
Exemple : précisions d’affichage des réels
1 #i n c l u d e <ios t r eam>2 #i n c l u d e <iomanip>3 i n t main ( ){4 f l o a t x = 89 .786543 ;56 s t d : : cout<<"x= "<<x<<" ( de f au t ) "<<s td : : e nd l ;7 s t d : : cout<<s td : : 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) "<<std : : e nd l ;9 s t d : : cout<<s td : : s e t p r e c i s i o n (12)10 <<"x= "<<x<<" ( p r e c i s i o n 12) "<<std : : e nd l ;11 r e t u r n 0 ;12 }
Ce code affiche à l’écran :x= 89.7865 (defaut)x= 90 (precision 2)x= 89.7865447998 (precision 12)
Programmation ImpérativeBases du langage C++
Instructions
Plan
2 Bases du langage C++Les type de donnéesLes constantesLes variablesOpérateursLes conversions de typeLes entrées-sortiesInstructions
Programmation ImpérativeBases du langage C++
Instructions
Instructions
Un programme impératif est constitué d’une successiond’instructions exécutées les unes après les autres.
DefinitionUne instruction correspond à une étape atomique dans leprogramme.↪→ toute instruction s’exécute complètement.
En C++, une instruction est terminée par un point-virgule.
Exempleint a=3,c ;c=a+10 ;
Programmation ImpérativeBases du langage C++
Instructions
Bloc d’instructions
DefinitionUn bloc d’instruction est constitué par un ensemble d’instructionsdélimitées par des accolades
{ instr1; instr2; ...; instrn;}
Les blocs d’instruction peuvent être :imbriqués : { instr1; { instr2; instr3;} }
disjoints : { instr1; instr2; } { instr3;instr4;} }
RemarqueLa fonction main en C++ correspond au bloc d’instructions définis-sant le programme.
Programmation ImpérativeStructures de contrôle
Plan
1 Introduction
2 Bases du langage C++
3 Structures de contrôle
4 Fonctions
5 Pointeurs
6 Tableaux
7 Structures de données (Facultatif)
Programmation ImpérativeStructures de contrôle
Intérêt des structures de contrôle
Contrôler l’exécution des instructions du programme :↪→ notion d’algorithmes
exécution conditionnelle (si alors sinon)exécuter plusieurs fois les mêmes instructions (boucle pour)exécuter des instructions tant que (boucle tant que)
Programmation ImpérativeStructures de contrôle
Conditionnelles
Plan
3 Structures de contrôleConditionnellesLa boucle ’Pour’La boucle ’Tant que’La boucle ’do while’Erreurs classiques
Programmation ImpérativeStructures de contrôle
Conditionnelles
if ... else
Definitionif (exp)
instr1else
instr2
exp est une expression booléenneinstr1 et instr2 sont :
une instructionun bloc d’instructions
Programmation ImpérativeStructures de contrôle
Conditionnelles
Exemple: if ... else
ExempleDéterminer si un entier est pair ou impair
1 #i n c l u d e <ios t r eam>23 i n t main ( ){4 i n t a ;5 a= 17 ;6 i f ( a%2 == 0)7 s t d : : cout << a << " e s t p a i r "<< s td : : e nd l ;8 e l s e9 s t d : : cout << a << " e s t impa i r "<< s td : : e nd l ;10 r e t u r n 0 ;11 }
Programmation ImpérativeStructures de contrôle
Conditionnelles
Exemple: if ... else
ExempleDéterminer le plus grand et le plus petit entre deux entiers
1 #i n c l u d e <ios t r eam>2 us ing namespace s t d ;34 i n t main ( ){5 i n t a=17,b=13,min , max ;6 i f ( a > b ){7 max=a ;8 min=b ;9 }10 e l s e {11 max=b ;12 min=a ;13 }14 s t d : : cout << " l e min e s t "<<min15 <<" l e max e s t " << max<<end l ;16 r e t u r n 0 ;17 }
Programmation ImpérativeStructures de contrôle
Conditionnelles
Conditionnelle à choix multiple : switch
Lorsqu’on a besoin de faire un choix parmi plus de 2 possibilités,on peut
imbriquer des conditionnelles if .. else
1 unsigned i n t a ;2 s t d : : c in >>a ;3 i f ( a==1)4 s t d : : cout<<" a=1"<<std : : e nd l ;5 e l s e i f ( a==2)6 s t d : : cout<<" a=2"<<std : : e nd l ;7 e l s e i f ( a==3)8 s t d : : cout<<" a=3"<<std : : e nd l ;9 e l s e10 s t d : : cout<<"a>3"<<std : : e nd l ;
faire une conditionnelle à choix multiple
Programmation ImpérativeStructures de contrôle
Conditionnelles
Conditionnelle à choix multiple : switch
Choix multiple switchswitch (exp) {case cst1:
instr1; break;. . .case cstn:
instrn; break;default:
instrdefault;}
exp est une expression à valeurentièrecst1, ..., cstn sont des constantesentièresinstr1, ..., instrn, instrdefaultsont des suites d’instructions
Les instructions sont exécutées enfonction de la valeur exp
Si la valeur de exp est une des constantes cst1,...,cstn on exécutela suite d’intructions correspondante sinon on exécute instrdefault.
Programmation ImpérativeStructures de contrôle
Conditionnelles
Exemple : switch
1 uns igned i n t a ;2 s t d : : c in>>a ;3 sw i tch ( a ){4 case 1 :5 s t d : : cout<<"a=1"<<std : : e nd l ; break ;6 case 2 :7 s t d : : cout<<"a=2"<<std : : e nd l ; break ;8 case 3 :9 s t d : : cout<<"a=3"<<std : : e nd l ; break ;10 d e f a u l t :11 s t d : : cout<<"a>3"<<std : : e nd l ;12 }
L’affichage seraa=1 si la valeur de a est 1a=2 si la valeur de a est 2a=3 si la valeur de a est 3a>3 si la valeur de a est différent de 1,2 ou 3
Programmation ImpérativeStructures de contrôle
La boucle ’Pour’
Plan
3 Structures de contrôleConditionnellesLa boucle ’Pour’La boucle ’Tant que’La boucle ’do while’Erreurs classiques
Programmation ImpérativeStructures de contrôle
La boucle ’Pour’
Répétition d’instructions : la boucle pour
Intérêt : répéter un nombre de fois donné une même suited’instructions.
Exemplecalculer 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érativeStructures de contrôle
La boucle ’Pour’
L’instruction for
Definitionfor (exp1; exp2; exp3)
instr
exp1 est une expression quelconque évaluée une seule fois audébut de la boucleexp2 est une expression booléenne qui permet d’arrêter laboucleexp3 est une expression quelconque évaluée à chaque tour deboucle (en dernier).
instr est une instruction ou un bloc d’instructions
Programmation ImpérativeStructures de contrôle
La boucle ’Pour’
L’instruction for
Definitionfor (exp1; exp2; exp3)
instr
exp1 est une expression quelconque évaluée une seule fois audébut de la boucle
On se sert de exp1 pour initialiser la variable de boucle.
Exempleexp1 est remplacée par int i=1 ou i=1 si i est déjà déclaré.
Programmation ImpérativeStructures de contrôle
La boucle ’Pour’
L’instruction for
Definitionfor (exp1; exp2; exp3)
instr
exp2 est une expression booléenneSi exp2 est :
vrai : la boucle for continue et on exécute instrfaux : on sort de la boucle for sans exécuter instr
Exempleexp2 est remplacée par i<11
Programmation ImpérativeStructures de contrôle
La boucle ’Pour’
L’instruction for
Definitionfor (exp1; exp2; exp3)
instr
exp3 est une expression quelconque évaluée à chaque tour deboucle (en dernier).
On sert de exp3 pour modifier la variable de boucle(incrémentation ou décrémentation) :
Exempleexp3 est remplacée par i=i+1 ou i++
Programmation ImpérativeStructures de contrôle
La boucle ’Pour’
L’instruction for : schéma d’exécution
Definitionfor (exp1; exp2; exp3)
instr
1 exp1...
2 exp2 → on continue car exp2=true3 instr4 exp3
...5 exp2 → sort de la boucle car exp2=false
Programmation ImpérativeStructures de contrôle
La boucle ’Pour’
L’instruction for : exemple 1Exemplecalculer la somme des entiers entre 1 et 10
1 #i nc l ude <ios t r eam >2 us ing namespace s t d ;3
4 i n t main ( ){5
6 i n t i , s ;7 s =0;8 f o r ( i =1; i <11; i ++) // i++ e s t é q u i v a l e n t à i=i +19 s=s+i ;10
11 s t d : : cout <<" l a somme e s t "<<s<<std : : e n d l ;12 re tu rn 0 ;13 }
ce programme affiche : la somme est 55
Programmation ImpérativeStructures de contrôle
La boucle ’Pour’
L’instruction for : exemple 2
Exempleafficher les entiers entre 1 et 10 qui sont multiples de 2 ou de 3
1 #i nc l ude <ios t r eam >2
3 i n t main ( ){4 i n t i ;5 f o r ( i =1; i <11; i ++){6 i f ( i%2==0 | | i %3==0)7 s t d : : cout << i << " " ;8 }9 s t d : : cout << s td : : e n d l ;10 re tu rn 0 ;11 }
ce programme affiche : 2 3 4 6 8 9 10
Programmation ImpérativeStructures de contrôle
La boucle ’Pour’
L’instruction for : ce qu’il ne faut pas faire
Attention aux boucles qui ne se terminent jamais ! ! !les boucles infinies ...
1 i n t i , s ;2 s =0;3 f o r ( i =1 ; i <11 ; s=s+i )4 . . .
→ la variable de boucle n’est pas incrémentée
1 i n t i , s ;2 f o r ( i =1 ; i !=10 ; i +=2)3 . . .
→ la condition d’arrêt de la boucle n’est jamais atteinte
Programmation ImpérativeStructures de contrôle
La boucle ’Tant que’
Plan
3 Structures de contrôleConditionnellesLa boucle ’Pour’La boucle ’Tant que’La boucle ’do while’Erreurs classiques
Programmation ImpérativeStructures de contrôle
La boucle ’Tant que’
Répétition d’instructions : la boucle tant que
Intérêt : répéter une instruction tant qu’une condition est vérifiée
Exemplecalculer 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 ;
En C++, les boucles tant que se font avec l’instruction while
Programmation ImpérativeStructures de contrôle
La boucle ’Tant que’
L’instruction while
Definitionwhile (exp)instr
exp est une expression booléenne permettant de contrôler laboucleinstr est une instruction ou un bloc d’instructions
Programmation ImpérativeStructures de contrôle
La boucle ’Tant que’
L’instruction while
Definitionwhile (exp)instr
exp est une expression booléenne permettant de contrôler laboucle
Si exp est :vrai : la boucle while continue et on exécute instrfaux : on sort de la boucle while sans exécuter instr
ex : exp est remplacée par i<11
Programmation ImpérativeStructures de contrôle
La boucle ’Tant que’
L’instruction while : schéma d’exécution
Definitionwhile (exp)
instr;
1 exp → on rentre dans la boucle car exp=true2 instr
...3 exp → on continue car exp=true4 instr
...5 exp → on sort de la boucle car exp=false
...
Programmation ImpérativeStructures de contrôle
La boucle ’Tant que’
L’instruction while : exemple 1
Exemplecalculer la somme des entiers entre 1 et 10
1 #i n c l u d e <ios t r eam>23 i n t main ( ){4 i n t i , s ;5 s=0;6 i =1;7 w h i l e ( i <11){8 s=s+i ;9 i ++; // on peut a u s s i é c r i r e i=i +110 }11 s t d : : cout << " l a somme e s t "<< s<< std : : e nd l ;12 r e t u r n 0 ;13 }
ce programme affiche : la somme est 55
Programmation ImpérativeStructures de contrôle
La boucle ’Tant que’
L’instruction while : exemple 2
Exempleafficher les entiers entre 1 et 10 qui sont multiples de 2 ou de 3
1 #i n c l u d e <ios t r eam>23 i n t main ( ){4 i n t 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 : : cout << i<< " " ;9 i ++;10 }11 s t d : : cout << s td : : e nd l ;12 r e t u r n 0 ;13 }
ce programme affiche : 2 3 4 6 8 9 10
Programmation ImpérativeStructures de contrôle
La boucle ’Tant que’
L’instruction while : exemple 3
Exemplecalcul de la plus petite puissance de 2 supérieure à un entier
1 #i n c l u d e <ios t r eam>23 i n t main ( ){4 i n t 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 : : cout << p << " e s t s u p é r i e u r à "<< a<<std : : e nd l ;11 r e t u r n 0 ;12 }
ce programme affiche : 32 est supérieur à 27
Programmation ImpérativeStructures de contrôle
La boucle ’do while’
Plan
3 Structures de contrôleConditionnellesLa boucle ’Pour’La boucle ’Tant que’La boucle ’do while’Erreurs classiques
Programmation ImpérativeStructures de contrôle
La boucle ’do while’
L’instruction do while
Parfois, il est souhaitable d’exécuter le corps de boucle avant lacondition de boucle (instr avant exp).Dans ce cas, on peut utiliser l’instruction do {} while;
Definitiondo {
instr;} while (exp);
instr et exp sont identiques à ceux utilisés dans la bouclewhile classique
Programmation ImpérativeStructures de contrôle
La boucle ’do while’
RAPPEL : schéma d’exécution du while
Definitionwhile (exp)
instr
1 exp → sort de la boucle si exp=false2 instr
...3 exp → sort de la boucle si exp=false4 instr
...5 exp → sort de la boucle si exp=false6 instr
...
Programmation ImpérativeStructures de contrôle
La boucle ’do while’
L’instruction do{} while : schéma d’exécution
Definitiondo {
instr;}while (exp);
1 instr...
2 exp → sort de la boucle si exp=false3 instr
...4 exp → sort de la boucle si exp=false5 instr
...
Programmation ImpérativeStructures de contrôle
La boucle ’do while’
L’instruction do{} while : exemple
calculer le plus grand entier tel que son carré est inférieur à unentier x.
1 #i n c l u d e <ios t r eam>23 i n t main ( ){4 i n t i , s , x ;5 x=1000;6 i =0;7 do {8 i ++;9 s=i ∗ i ;10 } w h i l e ( s <= x ) ;11 i=i −1;12 s t d : : cout << " l ’ e n t i e r e s t "<<i<<std : : e nd l ;13 r e t u r n 0 ;14 }
ce programme affiche : l’entier est 31
Programmation ImpérativeStructures de contrôle
Erreurs classiques
Plan
3 Structures de contrôleConditionnellesLa boucle ’Pour’La boucle ’Tant que’La boucle ’do while’Erreurs classiques
Programmation ImpérativeStructures de contrôle
Erreurs classiques
Structures de contrôle : erreur classique
L’erreur classique avec les structures de contrôle est l’oublid’accolade pour définir un bloc d’instructions :
1 . . .2 i f ( a > b ){3 max=a ;4 min=b ;5 }6 e l s e7 max=b ;8 min=a ; // ATTENTION: n ’ a p p a r t i e n t pas au e l s e910 s t d : : cout << " l e min e s t "<<min11 <<" l e max e s t " << max<<std : : e nd l ;12 . . .
Programmation ImpérativeStructures de contrôle
Erreurs classiques
Structures de contrôle : erreur classique
L’erreur classique avec les structures de contrôle est l’oublid’accolade pour définir un bloc d’instructions :
1 . . .2 i f ( a > b )3 max=a ;4 min=b ;5 e l s e {6 max=b ;7 min=a ; // g râce aux a c c o l a d e s a p p a r t i e n t au e l s e8 }9 s t d : : cout << " l e min e s t "<<min10 <<" l e max e s t " << max<<std : : e nd l ;11 . . .
L’oubli des accolades sur le bloc du if génère une erreur decompilation car le else se retrouve isolé.
Programmation ImpérativeStructures de contrôle
Erreurs classiques
Structures de contrôle : erreur classique
L’erreur classique avec les structures de contrôle est l’oublid’accolade pour définir un bloc d’instruction :
1 . . .2 i n t i , s ;3 s=0;4 i =1;5 w h i l e ( i <11)6 s=s+i ;7 i ++; // n ’ a p p a r t i e n t pas à l a bouc l e89 s t d : : cout << " l a somme e s t "<< s<<std : : e nd l ;10 . . .
Programmation ImpérativeStructures de contrôle
Erreurs classiques
Structures de contrôle : erreur classique
L’erreur classique avec les structures de contrôle est l’oublid’accolade pour définir un bloc d’instruction :
1 . . .2 i n t i , s ;3 s=0;4 i =1;5 w h i l e ( i <11){6 s=s+i ;7 i ++; // g râce aux a c c o l a d e s a p p a r t i e n t à l a bouc l e8 }9 s t d : : cout << " l a somme e s t "<< s<<std : : e nd l ;10 . . .
Programmation ImpérativeLes bases du C++
Récapitulatif
les variables ont un type (ex : int, float, bool)
on peut calculer grâce aux opérateurs (+,*,%,...)
on modifie un programme par des affectations (ex : a=6 )
faiblement typé → conversions de type implicite
on affiche les valeurs à l’écran avec std::cout«
on saisit les valeurs au clavier avec std::cin»
on peut écrire des algorithmes avec les structures de contrôleclassiques : if else, for, while, switch
Programmation ImpérativeFonctions
Plan
1 Introduction
2 Bases du langage C++
3 Structures de contrôle
4 Fonctions
5 Pointeurs
6 Tableaux
7 Structures de données (Facultatif)
Programmation ImpérativeFonctions
Introduction
Plan
4 FonctionsIntroductionDéfinitionAppel d’une fonctionPortée des variablesDéfinir des constantesOù placer les fonctionsRécursivité
Programmation ImpérativeFonctions
Introduction
A quoi sert une fonction
Les fonctions servent à partitionner les gros traitements entraitements plus petits.
Elle permettent de définir des briques de calcul qui sont :identifiables facilement,conçues pour faire un traitement précis,réutilisables.
RemarqueLes programmes sont plus lisibles et donc plus faciles à maintenir.
Programmation ImpérativeFonctions
Introduction
Fonction : une brique de calcul paramétréeOn veut écrire un programme qui affiche la décomposition enfacteurs premiers d’un nombre entier.
1 i n t main ( ){2 i n t x , y , i , k ;3 s t d : : cout<<" donnez une e n t i e r "<<s td : : e nd l ;4 s t d : : c in>>x ;5 y=x ; i =2;6 w h i l e ( x>=i ){7 i f ( i e s t p r em i e r && ( x%i ==0)){8 // c a l c u l p l u s grande pu i s s a n c e k de i d i v i s a n t x9 s t d : : cout<<i<<" pu i s s a n c e "<<k<<10 <<" d i v i s e "<<y<<std : : e nd l ;11 // on c a l c u l e d= i ^k12 x= x/d ;13 }14 i ++;15 }16 r e t u r n 0 ;17 }
Programmation ImpérativeFonctions
Introduction
Fonction : une brique de calcul paramétrée
Deux solutions :
7 on complète le code directement par les instructions de calculcorrespondantes.
3 on complète le code par l’appel à trois briques de calculparamétrées.
1 boo l p r em i e r ( uns igned i n t n ){2 i f ( n==0|| n==1) r e t u r n f a l s e ;3 e l s e i f ( n==2) r e t u r n t ru e ;4 e l s e {5 f o r ( uns igned i n t i =2; i ∗ i<=n ; i++)6 i f ( n%i==0) r e t u r n f a l s e ;7 }8 r e t u r n t r ue ;9 }
Programmation ImpérativeFonctions
Introduction
Fonction : une brique de calcul paramétrée
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 pu i s s a n c e ( i n t x , i n t n ){2 i n t j ; i n t p = 1 ;3 f o r ( j =1; j<=n ; j++)4 p∗=x ;5 r e t u r n p ;6 }
Programmation ImpérativeFonctions
Introduction
Fonction : une brique de calcul paramétrée
Le programme s’écrit donc :1 i n t main ( ){2 i n t x , y , i , k ;3 s t d : : cout<<" donnez une e n t i e r "<<s td : : e nd l ;4 s t d : : c in>>x ;5 y=x ; i =2;6 w h i l e ( x>=i ){7 i f ( p r em i e r ( i ) && ( x%i ==0)){8 k=p u i s s a n c e I n f ( i , x ) ;9 s t d : : cout<<i<<" pu i s s a n c e "<<k<<10 <<" d i v i s e "<<y<<std : : e nd l ;11 x= x/ pu i s s a n c e ( i , k ) ;12 }13 i ++;14 }15 r e t u r n 0 ;16 }
Programmation ImpérativeFonctions
Introduction
Qu’est-ce qu’une fonction
DefinitionUne fonction est une description formelle d’un calcul en fonctionde ses arguments
ExempleSi on vous donne deux variables entières a et b décrivez lesinstructions du langage nécessaires pour calculer ab.
→ cela rejoint la notion d’algorithme
Programmation ImpérativeFonctions
Introduction
Qu’est-ce qu’une fonction
Comme en algorithmique, une fonction comportera :un nom (l’identifiant de manière non-ambigu),des paramètres d’entrées,des paramètres de sortie,des variables locales,une description dans le langage de ce que fait la fonction.
Programmation ImpérativeFonctions
Définition
Plan
4 FonctionsIntroductionDéfinitionAppel d’une fonctionPortée des variablesDéfinir des constantesOù placer les fonctionsRécursivité
Programmation ImpérativeFonctions
Définition
Définition de fonctions
Definitiontype_retour nom(liste_param_formel){
corps}
nom correspond au nom donné à la fonction
type_retour est le type du résultat de la fonction
liste_param_formel est la liste des variables d’entrée de lafonction
corps correspondant aux instructions effectuées par lafonction en fonction des paramètres formels.
Programmation ImpérativeFonctions
Définition
Fonctions : nom
DefinitionLe nom d’une fonction correspond à un identifiant uniquepermettant d’effectuer l’appel sans aucune ambiguïté
AttentionUne fonction ne peut être assimilée à une variable et vice-versa. Onles différencie par la présence de parenthèse après l’identifiant d’unefonction.
1 i n t a ( ) ;2 a=3; // ERREUR ’ a ’ n ’ e s t pas une v a r i a b l e3 i n t b ;4 b ( ) ; // ERREUR ’ b ’ n ’ e s t pas une f o n c t i o n
Programmation ImpérativeFonctions
Définition
Fonctions : nom
AttentionUne variable et une fonction ne peuvent pas partager le même nomau 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 n3 i n t a ; // d é c l a r a t i o n v a r i a b l e4 }
Le compilateur générera l’erreur suivante :erreur : int a redeclared as different kind of symbol erreur :previous declaration of int a()
Programmation ImpérativeFonctions
Définition
Fonctions : type de retour
Les fonctions ne possèdent qu’un seul paramètre de sortie.Ce paramètre :
n’est pas identifié par une variable particulièreest spécifié uniquement par son type
1 i n t f ( ) ; // f r e n v o i e un r é s u l t a t e n t i e r2 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
Si la fonction ne renvoie rien, on utilise le type void.ex : void h();
Programmation ImpérativeFonctions
Définition
Fonctions : paramètres formels
La liste des paramètres formels d’une fonction est :vide si la fonction n’a aucun paramètrede la forme : type1 p1, ... , typen pn
La déclaration des variables formelles (typei pi) est de la forme :type p pour une variable p simple... (à voir plus loin dans le cours)
où type est un type de base et p est le nom de la variable formellemanipulable dans la fonction.
Programmation ImpérativeFonctions
Définition
Fonctions : paramètres formels
Les paramètres formels d’une fonction permettent :de définir le code de la fonction à partir de données inconnues.de transmettre (lors de l’appel) les données réelles surlesquelles doit agir la fonction.
Ils ne sont connus que dans le bloc associé à la fonction.1 i n t f ( i n t a , i n t b ) { . . . }2 vo id g ( double a ) { . . . }3 a=12; // e r r e u r a n ’ e s t pas d é c l a r é
Programmation ImpérativeFonctions
Définition
Fonctions : corps
DefinitionLe corps d’une fonction est le bloc défini juste après la déclarationde l’interface de la fonction :
type_retour nom(liste_param_formel){ corps }
Le corps d’une fonction est composé :de la déclaration des variables localesde la description du code qui sera exécuté par la fonction
1 i n t p l u s ( i n t x , i n t y ){2 i n t z ;3 z=x+y ;4 re tu rn z ;5 }
Programmation ImpérativeFonctions
Définition
Fonction : le mot clé return
DefinitionDans une fonction, le mot clé return exp permet :
d’arrêter l’exécution du corpsde renvoyer la valeur de l’expression exp au bloc appelant
AttentionLa valeur de exp doit être du même type que le type de retour de lafonction (sinon conversion implicite)
1 double i n v e r s e ( i n t x ){2 re tu rn 1/x ;3 }
Programmation ImpérativeFonctions
Définition
Fonction : le mot clé return
Le mot clé return peut apparaître plusieurs fois dans une mêmefonction. C’est le premier return rencontré qui stoppera le corpsde 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 re tu rn 0 ;4 e l s e5 re tu rn 1 ;6 }
Programmation ImpérativeFonctions
Définition
Fonction : le mot clé return
Le mot clé return n’est pas obligatoire lorsque le retour de lafonction est void. La fonction s’arrête dès qu’elle atteint la fin dubloc.
1 vo id bon jou r ( ){2 s t d : : cout<<" Bonjour "<<s td : : e n d l ;3 }
Programmation ImpérativeFonctions
Définition
Fonction : le mot clé return
On peut toutefois forcer l’arrêt en appelant return sansexpression.
1 vo id bon jou r ( i n t heure ){2 i f ( heure > 8 && heure < 20){3 s t d : : cout<<" Bonjour "<<s td : : e n d l ;4 re tu rn ;5 }6 s t d : : cout<<" Bonso i r "<<s td : : e nd l ;7 }
Programmation ImpérativeFonctions
Définition
Fonctions : pas d’amalgame
ATTENTIONLa 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 pourque les instructions du corps soient exécutées.
1 vo id bon jou r ( ){2 s t d : : cout<<" Bonjour "<<s td : : e n d l ;3 }
Ce code ne fait que déclarer une fonction, il n’affichera rien àl’écran.↪→ c’est l’instruction bonjour(); dans le programme quiexécutera ce code.
Programmation ImpérativeFonctions
Appel d’une fonction
Plan
4 FonctionsIntroductionDéfinitionAppel d’une fonctionPortée des variablesDéfinir des constantesOù placer les fonctionsRécursivité
Programmation ImpérativeFonctions
Appel d’une fonction
Appel de fonction
Definitionvar = nom(liste des paramètres effectifs);ounom(liste des paramètres effectifs);
la liste des paramètres effectifs correspond à l’ensemble desvariables et des constantes que l’on souhaite donner commeargument à la fonction. ex : max(2,3).
Attention : le passage des arguments se fait par copie.la valeur des paramètres effectifs est copiée dans les variablesformelles correspondantes.
Programmation ImpérativeFonctions
Appel d’une fonction
Appel de fonction : exemple
1 #i nc l ude <ios t r eam >2
3 i n t max( i n t a , i n t b ){4 i f ( a>b ) re tu rn a ;5 e l s e re tu rn b ;6 }7 i n t main ( ){8 i n t x , y ;9 x=3;10 y=5;11 s t d : : cout<<" l e max e s t : "<<max( x , y)<<s td : : e n d l ;12 re tu rn 0 ;13 }
Programmation ImpérativeFonctions
Appel d’une fonction
Fonction : passage de paramètres par valeur
Les paramètres d’une fonction sont toujours initialisés par unecopie des valeurs des paramètres réels.
Modifier la valeur des paramètres formels dans le corps de lafonction ne change en aucun cas la valeur des paramètres réels.
1 vo id ech ( i n t x , i n t y ){2 i n t r ;3 r=x ; x=y ; y=r ;4 }5 i n t main ( ){6 i n t a , b ;7 a=17;b=13;8 std<<cout<<"a = "<<a<<" b = "<<b<<std : : e nd l ;9 ech ( a , b ) ; // ne change pas l a v a l e u r de a e t de b10 std<<cout<<"a = "<<a<<" b = "<<b<<std : : e nd l ;11 }
Programmation ImpérativeFonctions
Appel d’une fonction
Fonction : passage de paramètres par valeur
17a
b 13
a = 17 b = 13
main() ech()
appel de la fonction ech(a,b)
17a
b 13
Programmation ImpérativeFonctions
Appel d’une fonction
Fonction : passage de paramètres par valeur
17a
b 13
a = 17 b = 13 x= 17 y= 13
main() ech()
17x
y 13
appel de la fonction ech(a,b)
Programmation ImpérativeFonctions
Appel d’une fonction
Fonction : passage de paramètres par valeur
17a
b 13
a = 17 b = 13 x= 13 y= 17
main() ech()
13x
y 17
appel de la fonction ech(a,b)
17a
b 13
exécution du code
Programmation ImpérativeFonctions
Appel d’une fonction
Fonction : passage de paramètres par valeur
17a
b 13
a = 17 b = 13
main() ech()
appel de la fonction ech(a,b)
17a
b 13
fin de la fonction et retour au bloc appelant
Programmation ImpérativeFonctions
Portée des variables
Plan
4 FonctionsIntroductionDéfinitionAppel d’une fonctionPortée des variablesDéfinir des constantesOù placer les fonctionsRécursivité
Programmation ImpérativeFonctions
Portée des variables
Où utiliser une variable ?
QuestionQuand on déclare une variable, où est-elle connue ?où peut-on l’utiliser ?
RéponseDans tout le bloc où elle a été déclarée et à partir de sa déclaration.
Programmation ImpérativeFonctions
Portée des variables
Portée d’une variable
DefinitionOn appelle Portée d’une variable, la portion du code où cettevariable est connue et utilisable.
Programmation ImpérativeFonctions
Portée des variables
Exemple 1
Quelles sont les portées de a et de x ?1 i n t main ( )2 {3 i n t a ;4 f l o a t x ;5 . . .6 . . .7 re tu rn 0 ;8 }
Programmation ImpérativeFonctions
Portée des variables
Exemple 1
Quelles sont les portées de a et de x ?1 i n t main ( )2 { <−− début du b l o c3 i n t a ; <−− début de l a p o r t é e de a4 f l o a t x ; <−− début de l a p o r t é e de x5 . . .6 . . . <−− u t i l i s a t i o n p o s s i b l e de a e t x7 re tu rn 0 ;8 } <−− f i n de b l o c e t de p o r t é e de a e t x
Programmation ImpérativeFonctions
Portée des variables
Exemple 2
Est-ce que l’utilisation de a et de x est conforme à leur portée ?1 i n t main ( )2 {3 i n t a=3;4 x =2./a ;5 f l o a t x ;6 s t d : : cout<<" a = "<<a<<" x = "<<x<<std : : e n d l ;7 re tu rn 0 ;8 }
Programmation ImpérativeFonctions
Portée des variables
Exemple 2
Est-ce que l’utilisation de a et de x est conforme à leur portée ?1 i n t main ( )2 {3 i n t a=3; <−− début p o r t é e de a4 x =2./a ; <−− on peut u t i l i s e r a mais pas x5 f l o a t x ; <−− début p o r t é e de x6 s t d : : cout<<" a = "<<a<<" x = "<<x<<std : : e n d l ;7 re tu rn 0 ;8 }
Programmation ImpérativeFonctions
Portée des variables
Exemple 2
1 #i nc l ude <ios t r eam >2 i n t main ( )3 {4 i n t a=3;5 x =2./a ;6 f l o a t x ;7 s t d : : cout<<" a = "<<a<<" x = "<<x<<std : : e n d l ;8 re tu rn 0 ;9 }
Le compilateur vous affiche alors le message suivant :exemple2.c :4 error : x was not declared in this scope )
Programmation ImpérativeFonctions
Portée des variables
Portée d’une variable
DefinitionOn appelle Portée d’une variable, la portion du code où cettevariable est connue et utilisable.
RemarqueDans le cas de blocs imbriqués, une variable est utilisable dans toutle bloc où elle a été déclarée, à partir de sa déclaration et égalementdans les blocs internes au bloc de la déclaration.
Programmation ImpérativeFonctions
Portée des variables
Exemple
1 i n t main ( ){2 i n t i ;3 f o r ( i =0; i <10; i ++){4 i n t S ;5 S=2∗ i ∗ i −1;6 s t d : : cout<<"S="<<S<<std : : e n d l ;7 }8 re tu rn 0 ;9 }
Programmation ImpérativeFonctions
Portée des variables
Exemple
1 i n t main ( ){2 i n t i ; <−− début p o r t é e de i3 f o r ( i =0; i <10; i ++){4 i n t S ; <−− début p o r t é e de S5 S=2∗ i ∗ i −1;6 s t d : : cout<<"S="<<S<<std : : e n d l ;7 } <−− f i n p o r t é e S8 re tu rn 0 ;9 } <−− f i n p o r t é e i
Programmation ImpérativeFonctions
Portée des variables
Exemple
1 i n t main ( ){2 i n t i ;3 f o r ( i =0; i <10; i ++){4 i n t S ;5 S=2∗ i ∗ i −1;6 s t d : : cout<<"S="<<S<<std : : e n d l ;7 }8 s t d : : cout<<"S="<<S<<std : : e n d l ; <−− i m p o s s i b l e9 re tu rn 0 ;10 }
Programmation ImpérativeFonctions
Portée des variables
Plusieurs variables ?
QuestionQue se passe-t-il si on a plusieurs variables de même nom?
Réponse7 Impossible si les variables sont définies dans le même bloc3 Possible si les variables sont définies dans des blocs différents
↪→ même si ils sont imbriqués
Programmation ImpérativeFonctions
Portée des variables
Exemple
Qu’affiche le code suivant ?1 i n t main ( ){2 i n t a=3;3 {4 i n t a=5;5 s t d : : cout<<" a="<<a<<std : : e n d l ;6 }7 re tu rn 0 ;8 }
Le programme affiche :a=5
Programmation ImpérativeFonctions
Portée des variables
Exemple
Qu’affiche le code suivant ?1 i n t main ( ){2 i n t a=3;3 {4 i n t a=5;5 s t d : : cout<<" a="<<a<<std : : e n d l ;6 }7 re tu rn 0 ;8 }
Le programme affiche :a=5
Programmation ImpérativeFonctions
Portée des variables
Plusieurs variables ?
QuestionQue se passe-t-il si on a plusieurs variables de même nom?
RéponseLa variable utilisée est celle du bloc englobant le plus proche (ausens de l’inclusion).
Programmation ImpérativeFonctions
Portée des variables
Plusieurs variables ?
QuestionEt 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 re tu rn c ;4 }5 i n t main ( ){6 f l o a t c ;7 c=cube ( 2 ) ;8 s t d : : cout<<" l e cube de 2 e s t "<<c<<std : : e nd l ;9 re tu rn 0 ;10 }
Programmation ImpérativeFonctions
Portée des variables
Plusieurs variables ?
QuestionEt dans le cas de fonctions ?
Il n’y a pas de problème : la portée d’une variable étant le bloc oùelle a été déclarée, la variable n’existe qu’à l’intérieur de la fonction.
RéponseTout ce qui a été dit précédemment s’applique pour les fonctions.
Programmation ImpérativeFonctions
Portée des variables
Plusieurs variables : continuons
QuestionComment fait-on si on veut tout de même utiliser la même variabledans plusieurs fonctions ?"
RéponseRien de plus facile, on passe la variable en paramètre ! ! !
Programmation ImpérativeFonctions
Portée des variables
Plusieurs variables : continuons
RemarqueIl peut être parfois embêtant de rajouter une variable à toutes lesfonctions, 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érativeFonctions
Portée des variables
Variables globales
DefinitionUne variable est globale si elle est définie en dehors de tout bloc(et donc de toute fonction).
QuestionLa portée d’une variable étant son bloc, quelle est la portée d’unevariable globale ?
Programmation ImpérativeFonctions
Portée des variables
Variables globales
Une variable globale est connue dans toute la partie du fichier quisuit sa déclaration.
1 vo id u n e a u t r e f o n c t i o n ( ){2 // ne peut pas u t i l i s e r a3 }4
5 i n t a ;6
7 vo id mafonct ion ( ){8 // peut u t i l i s e r l a v a r i a b l e a9 }10
11 i n t main ( ){12 // peut u t i l i s e r l a v a r i a b l e a13 re tu rn 0 ;14 }
Programmation ImpérativeFonctions
Portée des variables
Variables globales : c’est dangereux !
Qu’affiche le code suivant :1 i n t i ;2
3 vo id coucou ( ){4 f o r ( i =0; i <3; i ++)5 s t d : : cout<<" coucou "<<i <<" f o i s "<<s td : : e n d l ;6 }7
8 i n t main ( ){9 f o r ( i =0; i <3; i ++)10 coucou ( ) ;11 re tu rn 0 ;12 }
Programmation ImpérativeFonctions
Portée des variables
Variables globales : c’est dangereux !
On a 3 appels à la fonction coucou(). Chaque exécution de cettefonction devrait afficher 3 messages. On s’attend donc à 9messages. Au lieu de cela, nous obtenons :coucou 0 foiscoucou 1 foiscoucou 2 fois
Programmation ImpérativeFonctions
Portée des variables
Pourquoi c’est dangereux !
Voilà l’exécution du programme :main : i=0main : appel de coucou()
coucou : i=0coucou : affiche "coucou 0 fois"coucou : i=1coucou : affiche "coucou 1 fois"coucou : i=2coucou : affiche "coucou 2 fois"coucou : i=3coucou : i<3 ? faux, on sort de la fonction
main : retour dans le main, i est toujours égal à 3main : i<3 ? faux on quitte le programme
Programmation ImpérativeFonctions
Portée des variables
Pourquoi c’est dangereux !
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 desconstantes.
Programmation ImpérativeFonctions
Définir des constantes
Plan
4 FonctionsIntroductionDéfinitionAppel d’une fonctionPortée des variablesDéfinir des constantesOù placer les fonctionsRécursivité
Programmation ImpérativeFonctions
Définir des constantes
Définir une constante
Pour définir une constante, il est possible de définir une macro entête du programme.
Syntaxe#define NOM valeur
Exemple#define MAX 1000#define PI 3.1415
Remarque : par convention, les macros sont notées en majuscules.
Programmation ImpérativeFonctions
Définir des constantes
Exemple
1 #i nc l ude <ios t r eam >2 #i nc l ude <iomanip>3
4 #def ine MAX 105 vo id p r o d u i t ( i n t a ){6 i n t i ;7 f o r ( i =1; i<=MAX; i ++)8 s t d : : cout<<s td : : setw(4)<<a∗ i ;9 }10 i n t main ( ){11 i n t i ;12 f o r ( i =1; i<=MAX; i ++){13 p r o d u i t ( i ) ;14 s t d : : cout<<std : : e n d l ;15 }16 re tu rn 0 ;17 }
Programmation ImpérativeFonctions
Définir des constantes
Exemple
On obtient alors :
1 2 3 4 5 6 7 8 9 102 4 6 8 10 12 14 16 18 203 6 9 12 15 18 21 24 27 304 8 12 16 20 24 28 32 36 405 10 15 20 25 30 35 40 45 506 12 18 24 30 36 42 48 54 607 14 21 28 35 42 49 56 63 708 16 24 32 40 48 56 64 72 809 18 27 36 45 54 63 72 81 9010 20 30 40 50 60 70 80 90 100
Programmation ImpérativeFonctions
Définir des constantes
Définir une constante
Pour définir une constante, il est aussi possible de définir desvariables globales constantes.
Syntaxeconst type nom=valeur;
Exempleconst int max=10;const double pi=3.1415;
Programmation ImpérativeFonctions
Définir des constantes
Exemple
1 #i nc l ude <ios t r eam >2 const i n t max=10;3 vo id p r o d u i t ( i n t a ){4 i n t i ;5 f o r ( i =1; i<=max ; i ++)6 s t d : : cout<<s td : : setw(4)<<a∗ i ;7 }8 i n t main ( ){9 i n t i ;10 f o r ( i =1; i<=max ; i ++){11 p r o d u i t ( i ) ;12 s t d : : cout<<std : : e n d l ;13 }14 re tu rn 0 ;15 }
Programmation ImpérativeFonctions
Définir des constantes
Exemple
On obtient alors :
1 2 3 4 5 6 7 8 9 102 4 6 8 10 12 14 16 18 203 6 9 12 15 18 21 24 27 304 8 12 16 20 24 28 32 36 405 10 15 20 25 30 35 40 45 506 12 18 24 30 36 42 48 54 607 14 21 28 35 42 49 56 63 708 16 24 32 40 48 56 64 72 809 18 27 36 45 54 63 72 81 9010 20 30 40 50 60 70 80 90 100
Programmation ImpérativeFonctions
Définir des constantes
Peut-on modifier une constante ?
1 const i n t max=10;2 i n t main ( ){3 max=11;4 re tu rn 0 ;5 }
Le compilateur affiche l’erreur suivante :exemple.c :3 : error : assignment of read-only variable ’max’
Programmation ImpérativeFonctions
Définir des constantes
Différence entre MACRO et variables constantes
Variable constanteC’est une vraie variable, avec un espace mémoire réservé. Lecompilateur interdit juste de la modifier.
MacroCe n’est pas une variable. Il n’y a pas d’espace mémoire allouéepour. Au moment de la compilation, le compilateur commence parremplacer toutes les occurrences des macros par leurs valeurs, puiscompile le nouveau fichier obtenu.
Programmation ImpérativeFonctions
Où placer les fonctions
Plan
4 FonctionsIntroductionDéfinitionAppel d’une fonctionPortée des variablesDéfinir des constantesOù placer les fonctionsRécursivité
Programmation ImpérativeFonctions
Où placer les fonctions
Portée des fonctions
QuestionQuand on déclare une fonction, à quel endroit peut-on l’utiliser ?
RéponsePartout après sa déclaration !
Autrement dit, si une fonction f1 appelle une fonction f2, ladéclaration de f2 doit se situer avant la fonction f1.
Programmation ImpérativeFonctions
Où placer les fonctions
Exemple
1 vo id f 1 ( ){2 s t d : : cout<<" j e s u i s f 1 "<<std : : e nd l ;3 }4 vo id f 2 ( ){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 <<std : : e n d l ;7 f 1 ( ) ;8 }9 i n t main ( ){10 f 1 ( ) ; // j e peux me s e r v i r de f 111 f 2 ( ) ; // j e peux me s e r v i r de f 212 }
Il faut donc déclarer les fonctions par rapport à l’ordre dans lequelelles seront utilisées.
Programmation ImpérativeFonctions
Où placer les fonctions
Problème
On souhaite définir ces deux fonctions :
pair(n) ={
vrai si n = 0impair(n − 1) sinon
etimpair(n) =
{faux si n = 0pair(n − 1) sinon
Quelle est la fonction qui se place avant l’autre ?
Aucune, elles sont inter-dépendantes ! ! !
Programmation ImpérativeFonctions
Où placer les fonctions
Problème
On souhaite définir ces deux fonctions :
pair(n) ={
vrai si n = 0impair(n − 1) sinon
etimpair(n) =
{faux si n = 0pair(n − 1) sinon
Quelle est la fonction qui se place avant l’autre ?
Aucune, elles sont inter-dépendantes ! ! !
Programmation ImpérativeFonctions
Où placer les fonctions
Comment faire ?
SolutionOn peut séparer la déclaration de la définition d’une fonction.
Dans le corps de la définition d’une fonction, je peux utilisern’importe quelle fonction qui aura été déclarée précédemment(mais pas forcément définie).
RemarqueRappelez-vous, on avait dit qu’il était possible d’utiliser une fonctionn’importe où après sa déclaration...
Programmation ImpérativeFonctions
Où placer les fonctions
Comment faire ?
La déclaration de la fonction consiste à donner la signature de lafonction, c’est-à-dire son type de retour et le type de chacun de sesparamètres.
Syntaxetype nom(type,type,...,type);
Exemplebool pair(int);bool impair(int);
Programmation ImpérativeFonctions
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) re tu rn t rue ;6 e l s e re tu rn 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) re tu rn f a l s e ;11 e l s e re tu rn p a i r ( n −1);12 }
Programmation ImpérativeFonctions
Où placer les fonctions
Structure d’un fichier
1 /∗ Début d é c l a r a t i o n s des f o n c t i o n s ∗/2 boo l p a i r ( i n t ) ;3 . . .4 . . .5 /∗ Fin d é c l a r a t i o n s des f o n c t i o n s ∗/67 /∗ Début d é f i n i t i o n s des f o n c t i o n s ∗/8 boo l p a i r ( i n t n ){9 i f ( n==0) r e t u r n t r ue ;10 e l s e r e t u r n impa i r ( n−1);11 }12 . . .13 . . .14 /∗ Fin d é f i n i t i o n s des f o n c t i o n s ∗/1516 i n t main ( ){17 . . . .18 r e t u r n 0 ;19 }
Programmation ImpérativeFonctions
Où placer les fonctions
Programmation modulaire
RemarqueIl est possible de scinder son programme (toutes les fonctions qui lecomposent) en plusieurs fichiers. On parle alors de programmationmodulaire.
Dans les faits, il s’agit de mettre dans un fichier les signatures desfonctions et dans un autre les définitions. Tout programme quivoudra utiliser une des ces fonctions devra seulement inclure lefichier des signatures.
Programmation ImpérativeFonctions
Où placer les fonctions
Fichier d’en-tête
DefinitionUn fichier d’en-tête (ex : fonction.h) contient des déclarationsde fonctions.
Exemple1 /∗ Début d é c l a r a t i o n s des 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 /∗ Fin d é c l a r a t i o n s des f o n c t i o n s ∗/
Programmation ImpérativeFonctions
Où placer les fonctions
Fichier de définition
DefinitionUn fichier de définition (ex : fonction.cpp) contient lesdéfinitions des fonctions déclarées dans fonction.h.
RemarqueLes deux noms de fichiers doivent être les mêmes (toto.h ettoto.cpp).
Programmation ImpérativeFonctions
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 des f o n c t i o n s ∗/3 boo l p a i r ( i n t n ){4 i f ( n==0) r e t u r n t ru e ;5 e l s e r e t u r n impa i r ( n−1);6 }78 boo l impa 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 /∗ Fin d é f i n i t i o n s des f o n c t i o n s ∗/
Programmation ImpérativeFonctions
Où placer les fonctions
Problème d’inclusion multiple
Si le fichier d’en-tête est inclus plusieurs fois, cela va provoquerune erreur (redéclaration de fonction). Pour éviter cela, il existedes directives pour n’inclure dans un projet qu’une seule fois unensemble de déclarations.
1 #i f n d e f FONCTIONS_H2 #def ine FONCTIONS_H3
4 /∗ Début d é c l a r a t i o n s des 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 /∗ Fin d é c l a r a t i o n s des f o n c t i o n s ∗/9 #e n d i f
Programmation ImpérativeFonctions
Récursivité
Plan
4 FonctionsIntroductionDéfinitionAppel d’une fonctionPortée des variablesDéfinir des constantesOù placer les fonctionsRécursivité
Programmation ImpérativeFonctions
Récursivité
Fonction récursive
DefinitionUne fonction est récursive si elle s’appelle elle-même.
Mise en oeuvre impliciteRendu possible car une fonction est utilisable dès qu’on a spécifiésa signature, ce qui est le cas dans le blocs de définition d’unefonction.
Programmation ImpérativeFonctions
Récursivité
Étude d’un cas simple
Considérons le problème suivant :On veut calculer la somme des carrés des entiers compris dansun intervalle (entre m et n).Par exemple,SommeCarres(5,10)=52 + 62 + 72 + 82 + 92 + 102.
Programmation ImpérativeFonctions
Récursivité
Première solution
1 #i nc l ude <ios t r eam >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 re tu rn 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<<std : : e n d l ;12 re tu rn 0 ;13 }
Programmation ImpérativeFonctions
Récursivité
Vision récursive du problème
S’il y a plus d’un nombre dans [m..n], on ajoute le carré de mà la somme des carrés de [m+1..n]S’il n’y a qu’un nombre (m=n), le résultat est le carré de m
Mathématiquement,
SommeCarres(m, n) ={
m ∗m + SommeCarres(m + 1, n) si m 6= nm ∗m sinon
Programmation ImpérativeFonctions
Récursivité
Solution récursive
1 #i nc l ude <ios t r eam >2 i n t SommeCarres ( i n t m, i n t n ){3 i f (m==n )4 re tu rn m∗m;5 e l s e6 re tu rn (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 des c a r r e s e n t r e 5 e t 9 : "11 << sc<<std : : e n d l ;12 re tu rn 0 ;13 }
Programmation ImpérativeFonctions
Récursivité
Trace des appels
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érativeFonctions
Récursivité
Principe de construction
Des instructions résolvant les cas particuliers,Des instructions décomposant le problème en sous-problèmes,Des appels récursifs résolvant les sous-problèmes,Des instructions pour résoudre le problème à partir dessolutions des sous-problèmes.
Programmation ImpérativeFonctions
Récursivité
Un autre problème
La suite de Fibonacci :F (0) = 1F (1) = 1F (n + 2) = F (n + 1) + F (n)
Très facile à mettre en oeuvre !
Programmation ImpérativeFonctions
Récursivité
Solution récursive
La version récursive est très proche de l’écriture mathématique :
1 i n t Fibo ( i n t n ){2 i f ( n==0) l l ( n==1)3 re tu rn 1 ;4 e l s e5 re tu rn Fibo (n−1)+Fibo (n −2);6 }
Programmation ImpérativeFonctions
Récursivité
ExécutionCertains termes sont calculés plusieurs fois :
!
"#$%&'#$()*%+),'-.
!"# $!%&'!"# "()
!$'"*++*,*--*"*++*.(/0#1/"*.2
0340/0#1/"*'$!%&'"5.(*6*$!%&'"57((2
8
"/01 "/!1
"/21
"/!1 "/31 "/31 "/41
"/31 "/41 "/41 "/41"/51 "/51 "/51 "/61
"/41 "/51 "/51 "/51 "/51"/61 "/61 "/61
"/51 "/61
5 5
4 5
3
5 5
4
0
5 5
4 5
3
7
5 5
4
3
5 5 5
4
0
53
89*%+&'#$
"#$%&'#$('&*):&'-.!"# $!%&'!"# "()!"# 9:%:;2
;*+*9*+*%*+*.2
<=!30'">.()
;*+*9*6*%29*+*%2%*+*;2"*552
8/0#1/"*;2
8
89*%+&'#$"(( :((( ;( $5 5( 5( 24( 5( 4( 03( 4 3 !0 3 0 37 0 7 453 7 53 5
<&&.$&'#$(=(>:()*%+),'-'&*($?.,&(@:,(&#+A#+),
.BB'%:%.(CDC.(,'(.EE.(.,&(@E+,(B:%'E.(F(.9@)'C.)
Programmation ImpérativeFonctions
Récursivité
Solution itérative
La solution itérative est moins intuitive :
1 i n t Fibo ( i n t n ){2 i n t a , b , F ;3
4 F=a=b=1;5
6 whi le (n>1){7 F=a+b ;8 a=b ;9 b=F ;10 n−−;11 }12 re tu rn F ;13 }
F a b n1 1 1 6
2 1 2 53 2 3 45 3 5 38 5 8 213 8 13 1
Programmation ImpérativeFonctions
Récursivité
Solution itérative
La solution itérative est moins intuitive :
1 i n t Fibo ( i n t n ){2 i n t a , b , F ;3
4 F=a=b=1;5
6 whi le (n>1){7 F=a+b ;8 a=b ;9 b=F ;10 n−−;11 }12 re tu rn F ;13 }
F a b n1 1 1 62 1 2 5
3 2 3 45 3 5 38 5 8 213 8 13 1
Programmation ImpérativeFonctions
Récursivité
Solution itérative
La solution itérative est moins intuitive :
1 i n t Fibo ( i n t n ){2 i n t a , b , F ;3
4 F=a=b=1;5
6 whi le (n>1){7 F=a+b ;8 a=b ;9 b=F ;10 n−−;11 }12 re tu rn F ;13 }
F a b n1 1 1 62 1 2 53 2 3 4
5 3 5 38 5 8 213 8 13 1
Programmation ImpérativeFonctions
Récursivité
Solution itérative
La solution itérative est moins intuitive :
1 i n t Fibo ( i n t n ){2 i n t a , b , F ;3
4 F=a=b=1;5
6 whi le (n>1){7 F=a+b ;8 a=b ;9 b=F ;10 n−−;11 }12 re tu rn F ;13 }
F a b n1 1 1 62 1 2 53 2 3 45 3 5 3
8 5 8 213 8 13 1
Programmation ImpérativeFonctions
Récursivité
Solution itérative
La solution itérative est moins intuitive :
1 i n t Fibo ( i n t n ){2 i n t a , b , F ;3
4 F=a=b=1;5
6 whi le (n>1){7 F=a+b ;8 a=b ;9 b=F ;10 n−−;11 }12 re tu rn F ;13 }
F a b n1 1 1 62 1 2 53 2 3 45 3 5 38 5 8 2
13 8 13 1
Programmation ImpérativeFonctions
Récursivité
Solution itérative
La solution itérative est moins intuitive :
1 i n t Fibo ( i n t n ){2 i n t a , b , F ;3
4 F=a=b=1;5
6 whi le (n>1){7 F=a+b ;8 a=b ;9 b=F ;10 n−−;11 }12 re tu rn F ;13 }
F a b n1 1 1 62 1 2 53 2 3 45 3 5 38 5 8 213 8 13 1
Programmation ImpérativeFonctions
Récursivité
Récursivité ! ! !
AttentionLa récursivité n’est pas toujours efficace, même si elle est plus facileà exprimer.
Programmation ImpérativePointeurs
Plan
1 Introduction
2 Bases du langage C++
3 Structures de contrôle
4 Fonctions
5 Pointeurs
6 Tableaux
7 Structures de données (Facultatif)
Programmation ImpérativePointeurs
Introduction
Plan
5 PointeursIntroductionLes pointeurs en C++Fonction avec paramètre de type pointeur
Programmation ImpérativePointeurs
Introduction
Variables et fonctions : une entente peu cordiale
Exemplevoid echange(int a, int b){
int c;c=a;a=b;b=c;
}
l’appel à la fonction echange sur des variables x et y n’effectuepas l’effet attendu (échanger les valeurs).→ paramètres toujours passés par copie dans les fonctions ! ! !
Programmation ImpérativePointeurs
Introduction
Passage des paramètres par copie
12
3x
y 12
3a
b
Appel à ech
3
12a
b
Exécution de ech
int x,y;x=3;y=12;echange(x,y);
Programmation ImpérativePointeurs
Introduction
0xFF2246 0xFF2252
x = 3 y = 12
12
3x
y
Programmation ImpérativePointeurs
Introduction
0xFF2246 0xFF2252
x = 3 y = 12 a= 3 b= 12
12
3x
y 12
3a
b
Appel à ech
Programmation ImpérativePointeurs
Introduction
0xFF2246 0xFF2252
x = 3 y = 12 a= 12 b= 3
12
3x
y 12
3a
b
Appel à ech
3
12a
b
Exécution de ech
Programmation ImpérativePointeurs
Introduction
0xFF2246 0xFF2252
x = 3 y = 12
12
3x
y
Appel à ech Exécution de ech
Retour de ech
Programmation ImpérativePointeurs
Introduction
Limitations des variables : telles qu’on les connait
Les variables :ne peuvent pas être modifiées par les fonctionssont limitées au bloc dans lequel elles ont été définies
RemarqueCes limitations proviennent de la manipulation des variables par leuridentificateur.Solution : manipuler les variables par leur adresse (pointeur)↪→ dire où se trouve la donnée plutôt que de donnez sa valeur !
Programmation ImpérativePointeurs
Les pointeurs en C++
Plan
5 PointeursIntroductionLes pointeurs en C++Fonction avec paramètre de type pointeur
Programmation ImpérativePointeurs
Les pointeurs en C++
Les pointeurs
DefinitionUn pointeur est une variable qui contient l’adresse mémoire d’unedonnée (une autre variable).
Une variable dite pointeur est définie parun identificateur : le nom du pointeurun type de donnée : pour la donnée pointée
RemarqueLes pointeurs permettent de manipuler des données par leur adresseplutôt que par leur identificateur.
Programmation ImpérativePointeurs
Les pointeurs en C++
Les variables de type pointeur
Definitiontype *var;
var est l’identificateur (le nom) du pointeurtype est le type de donnée de la donnée pointéevar doit contenir une adresse mémoire valide (pas une valeur)
Exempleint *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érativePointeurs
Les pointeurs en C++
Les variables de type pointeur : Exemple
Déclaration de pointeurs :1 i n t ∗Aptr ;2 double ∗Bptr ;3 i n t ∗Cptr ;
Affectation de pointeurs :1 i n t a ; double b ;2
3 Aptr= &a ; // OK4 Bptr= &b ; // OK5 Aptr= &b ; // ERREUR6 Bptr= &a ; // ERREUR7
8 Aptr= Bptr ; // ERREUR9 Aptr= Cptr ; // OK
Programmation ImpérativePointeurs
Les pointeurs en C++
Les variables de type pointeur : Vue mémoire
int a = 8 float b = 3.2 int c =12
&a=0x22FF20 &b=0x22FF26 &c=0x22FF41
MÉMOIRE EN OCTETS
int* p = &a
a,b,c sont des variables normales (elles stockent des valeurs).p est une variable dite pointeur (elle stocke une adresse).p est de type int* et doit stocker l’adresse d’un entier (ici a).
Programmation ImpérativePointeurs
Les pointeurs en C++
Les variables de type pointeur : Affectation
On peut affecter une variable pointeur avec :l’adresse d’une variable existante compatible,avec la valeur d’une autre pointeur compatible,avec le pointeur vide (NULL ou nullptr en C++11),
Exempleint a, *p, *qp=&a;q=NULL;q=p;
NULL est défini dans <iostream> alors que nullptr nécessiteuniquement l’option de compilation -std=c++11
Programmation ImpérativePointeurs
Les pointeurs en C++
Les variables de type pointeur : Accès aux données
Pour accéder à la zone mémoire pointée par un pointeur, il faututiliser l’opérateur prefixe de déréférencement *.
DefinitionSoit var une variable de type pointeur, le déréférencement *varpermet d’accèder à la donnée qui est stockée à l’adresse mémoirecontenue dans var ↪→ on parle de donnée pointée.
1 i n t a ;2 i n t ∗ p t r ;3 p t r=&a ; // a f f e c t e p t r avec l ’ a d r e s s e de a4 ∗ p t r =3; // a f f e c t e l a zone mémoire d ’ a d r e s s e p t r5 // avec l a v a l e u r 3 ( i c i a=3)
Programmation ImpérativePointeurs
Les pointeurs en C++
Manipulation des données avec les pointeurs
Lorsqu’on déréférence une variable pointeur, on peut :utiliser la valeur stockée dans la donnée pointéemodifier la valeur stockée dans la donnée pointée
Exempleint a, *p;a=10;p=&a;a=*p+1;*p=13;
Programmation ImpérativePointeurs
Les pointeurs en C++
Les pointeurs : Exemple 1
1 #i n c l u d e <ios t r eam>2 i n t main ( ){3 i n t A, ∗Aptr ;4 A=150;5 Aptr=&A;6 s t d : : cout<<" v a l = "<<A7 <<" addr= "<<&A<<std : : e nd l ;8 s t d : : cout<<" v a l = "<<Aptr9 <<" addr= "<<&Aptr10 <<" va l p= "<<∗Aptr<<s td : : e nd l ;11 A=99;12 s t d : : cout<<" v a l = "<<Aptr13 <<" addr= "<<&Aptr14 <<" va l p= "<<∗Aptr<<s td : : e nd l ;15 ∗Aptr=45;16 s t d : : cout<<" v a l = "<<Aptr17 <<" addr= "<<&Aptr18 <<" va l p= "<<∗Aptr<<s td : : e nd l ;19 r e t u r n 0 ;20 }
Programmation ImpérativePointeurs
Les pointeurs en C++
Les pointeurs : Exemple 2
AttentionLes pointeurs sont dangereux et cause des erreurs ditesde segmentation dans l’exécution des programmes.
1 i n t main ( ){2
3 i n t A, ∗Aptr ;4 A=100;5 ∗Aptr =17; // c e t t e l i g n e comp i l e co r r e c t emen t6 // mais cause une e r r e u r a l ’ e x e c u t i o n7 re tu rn 0 ;8 }
Programmation ImpérativePointeurs
Fonction avec paramètre de type pointeur
Plan
5 PointeursIntroductionLes pointeurs en C++Fonction avec paramètre de type pointeur
Programmation ImpérativePointeurs
Fonction avec paramètre de type pointeur
Fonctions avec pointeurs
Definitiontype_retour mafonction(type_param * ptr){...}
Dans la fonction, c’est une copie du pointeur qui est manipulée etnon pas le pointeur.
A l’intérieur de la fonction :on peut récupérer la donnée pointée : *ptron peut modifier la valeur de la donnée pointée : *ptr=...
on ne peut pas modifier le pointeur : ptr=...
Programmation ImpérativePointeurs
Fonction avec paramètre de type pointeur
Fonctions avec pointeurs : Exemple 1
1 #i nc l ude <ios t r eam >2
3 vo id plusUn ( i n t ∗p ){4 ∗p= ∗p+1;5 }6
7 i n t main ( ){8 i n t a ; i n t ∗ p t r ;9 a=3; p t r=&a ;10
11 plusUn ( p t r ) ;12 s t d : : cout<<" a="<<a<<std : : e n d l ;13 plusUn(&a ) ;14 s t d : : cout<<" a="<<a<<std : : e n d l ;15
16 re tu rn 0 ;17 }
Programmation ImpérativePointeurs
Fonction avec paramètre de type pointeur
Fonctions avec pointeurs : Exemple 1
ptr
a = 3
Main( ) plusUn( )
Programmation ImpérativePointeurs
Fonction avec paramètre de type pointeur
Fonctions avec pointeurs : Exemple 1
ptr
a = 3
Appel à plusUn(ptr)
Main( ) plusUn( )
p
Programmation ImpérativePointeurs
Fonction avec paramètre de type pointeur
Fonctions avec pointeurs : Exemple 1
ptr
a = 4
Appel à plusUn(ptr) Exécution du code
Main( ) plusUn( )
p
Programmation ImpérativePointeurs
Fonction avec paramètre de type pointeur
Fonctions avec pointeurs : Exemple 1
ptr
a = 4
Main( ) plusUn( )
Retour de plusUn
Programmation ImpérativePointeurs
Fonction avec paramètre de type pointeur
Fonctions avec pointeurs : Exemple 2
1 #i nc l ude <ios t r eam >2
3 vo id ech ( i n t ∗a , i n t ∗b ){4 i n t r ;5 r=∗a ;6 ∗a=∗b ;7 ∗b=r ;8 }9 i n t main ( ){10 i n t x , y ;11 x=2;y=3;12 ech(&x ,&y ) ;13 s t d : : cout<<" x="<<x<<std : : e n d l ;14 s t d : : cout<<" y="<<y<<std : : e n d l ;15 re tu rn 0 ;16 }
Programmation ImpérativePointeurs
Fonction avec paramètre de type pointeur
Fonction avec pointeur : paramètres résultats
En utilisant les pointeurs, on peut donc interagir dans les deux sensavec une fonction :
donner des valeurs en entrée dans une fonctionrécupérer plusieurs valeurs en sortie d’une fonction
Exemplevoid minmax(int a, int b, int *min, int *max){
if (a>b){*min=b; *max=a;}
else{*min=a; *max=b;}
}
Programmation ImpérativePointeurs
Fonction avec paramètre de type pointeur
Fonction avec pointeur : Exemple 3
1 #i nc l ude <ios t r eam >2
3 vo id 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 e l s e7 { ∗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<<std : : e nd l15 <<"max="<<max<<std : : e n d l ;16 re tu rn 0 ;17 }
Programmation ImpérativePointeurs
Fonction avec paramètre de type pointeur
Fonctions avec pointeurs
L’utilisation classique des pointeurs dans une fonction ne permetpas de modifier la valeur des pointeurs.
Exemplevoid echPtr(int *p1, int *p2){
int *p;p=p1;p1=p2;p2=p;
}
Bien que syntaxiquement correcte, cette fonction n’échangera pasla valeur de p1 et de p2.
Programmation ImpérativePointeurs
Fonction avec paramètre de type pointeur
Passage de pointeur par copie
Le code suivant n’effectue aucun échange entre a et b car lepassage des paramètres se fait toujours par copie ! ! !
1 vo id echPt 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 i n t c , d ;8 c =1; d=3;9 a=&c ; b=&d ;10 echPt r ( a , b ) ; // pas d ’ echange e n t r e a e t b11 re tu rn 0 ;12 }
Programmation ImpérativePointeurs
Fonction avec paramètre de type pointeur
0xFF2246a
b 0xFF2252
0xFF2246 0xFF2252
c = 1 d = 3 a= 0xFF2246 b= 0xFF2252
main() echPtr()
Programmation ImpérativePointeurs
Fonction avec paramètre de type pointeur
0xFF2246a
b 0xFF2252
0xFF2246 0xFF2252
c = 1 d = 3 a= 0xFF2246 b= 0xFF2252
main() echPtr()
Appel à echPtr(...)
0xFF2246p1
0xFF2252p2
p1=0xFF2246 p2=0xFF2252
Programmation ImpérativePointeurs
Fonction avec paramètre de type pointeur
0xFF2246a
b 0xFF2252
0xFF2246 0xFF2252
c = 1 d = 3 a= 0xFF2246 b= 0xFF2252
main() echPtr()
Appel à echPtr(...)
0xFF2252p1
0xFF2246p2
p1=0xFF2252 p2=0xFF2246
Exécution du code
Programmation ImpérativePointeurs
Fonction avec paramètre de type pointeur
0xFF2246a
b 0xFF2252
0xFF2246 0xFF2252
c = 1 d = 3 a= 0xFF2246 b= 0xFF2252
main() echPtr()
Appel à echPtr(...) Exécution du code
Retour de echPtr(...)
Programmation ImpérativePointeurs
Fonction avec paramètre de type pointeur
Fonctions avec pointeurs modifiables
Un pointeur étant une variable comme une autre, on peutégalement utiliser un pointeur pour le manipuler par son adresse.
Definitiontype **ptr_ptr ;
La variable ptr_ptr est donc une variable qui stocke l’adressed’un pointeur sur un donnée de type type.↪→ on parle de pointeur de pointeur.
Exempleint *p;int **pp;pp=&p;
Programmation ImpérativePointeurs
Fonction avec paramètre de type pointeur
Fonctions avec pointeurs modifiables
Definitiontype_retour mafonction(type_param **ptr){...}
A l’intérieur de la fonction :on peut récupérer le pointeur : *ptron peut modifier le pointeur : *ptr=...
et bien évidemment récupérer/modifier la donnée pointée parle pointeur : *(*ptr)
Programmation ImpérativePointeurs
Fonction avec paramètre de type pointeur
Fonctions avec pointeurs modifiables
Il faut donc réécrire la fonction echPtr comme suit :
Exemplevoid echPtr(int **p1, int **p2){
int *p;p=*p1;*p1=*p2;*p2=p;
}
Programmation ImpérativePointeurs
Fonction avec paramètre de type pointeur
Fonctions avec pointeurs modifiables : Exemple 1
1 vo id echPt 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 i n t c , d ;8 c =1; d=3;9 a=&c ; b=&d ;10 echPt r (&a ,&b ) ;11 re tu rn 0 ;12 }
Programmation ImpérativePointeurs
Fonction avec paramètre de type pointeur
Pointeur de pointeur de ... de pointeur
De manière plus générale, l’imbrication de plusieurs niveaux depointeurs n’est pas limitée.
Definitionint *...*︸ ︷︷ ︸ a ;
n foisdéfinit la variable a comme n imbrications de pointeur sur un int.
On peut donc stocker dans a l’adresse d’une variable étant définiecomme imbrication de n-1 niveaux de pointeur sur un int.
Programmation ImpérativeTableaux
Plan
1 Introduction
2 Bases du langage C++
3 Structures de contrôle
4 Fonctions
5 Pointeurs
6 Tableaux
7 Structures de données (Facultatif)
Programmation ImpérativeTableaux
Tableaux statiques
Plan
6 TableauxTableaux statiquesFonction et tableaux statiquesTableaux et pointeursTableaux dynamiquesFonction et tableaux dynamiques
Programmation ImpérativeTableaux
Tableaux statiques
Manipulation des données
Une seule donnée à la fois (données scalaires) :une variable : int a;
un pointeur : int *p;
Comment faire pour regrouper des données et les manipuler demanière uniforme ?
utiliser une structure de tableau
Programmation ImpérativeTableaux
Tableaux statiques
Manipulation des données
Une seule donnée à la fois (données scalaires) :une variable : int a;
un pointeur : int *p;
Comment faire pour regrouper des données et les manipuler demanière uniforme ?
utiliser une structure de tableau
Programmation ImpérativeTableaux
Tableaux statiques
La structure de donnée tableau
DefinitionUn tableau est un ensemble de données de même type qui sontstockées de manière contiguë en mémoire
Un tableau à 6 éléments
1er élément
un tableau est identifiable par son 1er élément et sa tailleles éléments sont accessibles en parcourant la mémoire àpartir du 1er élément
Programmation ImpérativeTableaux
Tableaux statiques
Les tableaux en C++
DefinitionUn tableau permet de définir avec une seule variable un ensemblede variables de même type de donnée.
Un tableau en C++ est caractérisé par :son identificateur (son nom)sa taille (le nombre de données)
Programmation ImpérativeTableaux
Tableaux statiques
Les tableaux en C++
Déclarationtype T[n];
T est l’identificateur du tableautype est le type de donnée des éléments du tableaun est une constante entière représentant la taille du tableau
Exempleint T[3];
définit la variable T comme un tableau de trois entiers.
Programmation ImpérativeTableaux
Tableaux statiques
Les tableaux en C++ : vue mémoire
Mémoire en octet
Un tableau de 3 entiers (int)
1er Elt un entier
2ème Elt un entier
3ème Elt un entier
Un tableau de n éléments occupe n×sizeof(type) octets enmémoire où type est le type de donnée des éléments du tableau.Ici, un tableau de 3 int occupe 12 octets en mémoire.
Programmation ImpérativeTableaux
Tableaux statiques
Les tableaux en C++
Déclarationtype T[n];
Cette déclaration de tableaucrée une variable T de type tableau sur typealloue un espace contigu en mémoire de taille suffisant pourstocker n donnéesn’initialise pas les éléments du tableau
AttentionIl est préférable que la taille n du tableau soit une constante connueà la compilation.
Programmation ImpérativeTableaux
Tableaux statiques
Les tableaux en C++ : accès aux éléments
L’accès aux éléments d’un tableau se fait par un calcul d’adressemémoire à partir du 1er élément : l’opérateur [ ] facilite le calcul.
DefinitionSoit 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-1aucune vérification numérique est faite pour la valeur de iT[i] est un identificateur valide (une variable)↪→ accès en lecture/écriture
Programmation ImpérativeTableaux
Tableaux statiques
Les tableaux en C++ : vue mémoire
Mémoire en octet
Int T[3];
T[0] T[1] T[2]
T[3] validemais n'appartientpas au tableau
Erreur de segmentation
Programmation ImpérativeTableaux
Tableaux statiques
Les tableaux en C++ : initialisation des éléments
Deux possibilités :lors de la déclaration du tableaupar initialisation successive des éléments du tableau
Programmation ImpérativeTableaux
Tableaux statiques
Les tableaux en C++ : initialisation des éléments
Déclaration d’un tableau avec initialisation des éléments :
Déclarationtype T[n] = {v0,v1,...,vn−1};
Cette déclaration permet de déclarer un tableau T de n variables etd’initialiser les éléments du tableau tels que T [i ] = vi .
Exempleint T[3]={4,17,3};
Remarque : la taille n ou toutes les valeurs ne sont pas obligatoires.
Programmation ImpérativeTableaux
Tableaux statiques
Les tableaux en C++ : initialisation des éléments
Déclaration d’un tableau avec initialisation des éléments :
Déclarationtype T[n] = {v0,v1,...,vn−1};
Cette déclaration permet de déclarer un tableau T de n variables etd’initialiser les éléments du tableau tels que T [i ] = vi .
Exempleint T[3]={4,17,3};
Remarque : la taille n ou toutes les valeurs ne sont pas obligatoires.
Programmation ImpérativeTableaux
Tableaux statiques
Les tableaux en C++ : initialisation des éléments
Déclaration d’un tableau avec initialisation des éléments :
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érativeTableaux
Tableaux statiques
Les tableaux en C++ : initialisation des éléments
On peut initialiser les éléments d’un tableau dans une boucle paraffectation successive :
Déclarationint T[10], i;for(i=0;i<10;i++)
T[i]=...; ← affectation avec la valeur souhaitée
Remarque : on peut remplacer l’affectation par une saisiestd::cin»T[i];
Programmation ImpérativeTableaux
Tableaux statiques
Les tableaux en C++ : initialisation des éléments
On peut initialiser les éléments d’un tableau dans une boucle paraffectation successive :
Déclarationint T[10], i;for(i=0;i<10;i++)
T[i]=...; ← affectation avec la valeur souhaitée
Remarque : on peut remplacer l’affectation par une saisiestd::cin»T[i];
Programmation ImpérativeTableaux
Tableaux statiques
Les tableaux en C++ : parcours des données
Pour parcourir les données d’un tableau, il suffit d’accéder auxéléments de manière itérative.Exempleint T[10],i;...for (i=0;i<10;i++){
instructions avec T[i]}
Attention avec T[i]il faut toujours garantir que 0 ≤ i <taille du tableaule compilateur ne le fait pas pour vous ! ! !
Programmation ImpérativeTableaux
Tableaux statiques
Les tableaux en C++ : exemple 1
Affichage d’un tableau1 #i nc l ude <ios t r eam >2
3 i n t main ( ){4 i n t T[5 ]={4 , 3 , 1 , 8 , 6} ;5 i n t i ;6 f o r ( i =0; i <5; i ++){7 s t d : : cout<<T[ i ]<<" " ;8 }9 s t d : : cout<<std : : e n d l ;10 re tu rn 0 ;11 }
Programmation ImpérativeTableaux
Tableaux statiques
Les tableaux en C++ : exemple 2
Calcul du plus petit élément d’un tableau1 #i nc l ude <ios t r eam >2 i n t main ( ){3 i n t T[5 ]={4 , 3 , 1 , 8 , 6} ;4 i n t i , min ;5
6 min=T [ 0 ] ;7 f o r ( i =1; i <5; i ++){8 i f (T[ i ]<min )9 min=T[ i ] ;10 }11 s t d : : cout<<" l e min e s t : "<<min<<std : : e nd l ;12 re tu rn 0 ;13 }
Programmation ImpérativeTableaux
Tableaux statiques
Les tableaux en C++ : exemple 3Renverser l’ordre des éléments d’un tableau
1 #i n c l u d e <ios t r eam>2 #de f i n e TAILLE 534 i n t main ( ){5 i n t T[ TAILLE ]={4 ,3 ,1 ,8 , 6} ;6 i n t i , tmp , m i l i e u=TAILLE /2 ;78 f o r ( i =0; i<m i l i e u ; i ++){9 tmp=T[ i ] ;10 T[ i ]=T[ TAILLE−1− i ] ;11 T[ TAILLE−1− i ]=tmp ;12 }1314 f o r ( i =0; i<TAILLE ; i ++){15 s t d : : cout<<T[ i ]<<" " ;16 }17 s t d : : cout<<s td : : e nd l ;18 r e t u r n 0 ;19 }
Programmation ImpérativeTableaux
Tableaux statiques
Copie de tableau
Considérons le programme suivant :1 i n t main ( )2 {3 i n t t1 [ 5 ]={1 , 2 , 3 , 4 , 5} ;4 i n t t2 [ 5 ] ;5 t2=t1 ;6 re tu rn 0 ;7 }
A la compilation, nous avons le message suivant :error : invalid array assignment
Programmation ImpérativeTableaux
Tableaux statiques
Copie de tableau
Pour recopier un tableau dans un autre, il est obligatoire de passerpar des affectations successives :
1 i n t main ( )2 {3 i n t t1 [ 5 ]={1 , 2 , 3 , 4 , 5} ;4 i n t t2 [ 5 ] ;5 i n t i ;6 f o r ( i =0; i <5; i ++)7 t2 [ i ]= t1 [ i ] ;8 re tu rn 0 ;9 }
Programmation ImpérativeTableaux
Tableaux statiques
Les tableaux multidimensionnels en C++
Il est possible en C++ de déclarer des tableaux de tableaux. On lesappelle des tableaux multidimensionnels.
Exempleint T[3][2];
T est un tableau à 3 éléments où chaque élément est un tableau de2 entiers.
On peut voir T comme une matrice : T =
∗ ∗∗ ∗∗ ∗
Programmation ImpérativeTableaux
Tableaux statiques
Les tableaux multidimensionnels en C++
L’enchaînement des opérateurs [ ] permet de récupérer leséléments d’un tableau multidimensionnelsDéclarationSoit la déclaration int T[m][n];T[i][j] donne accès au j-ème élément du i-ème tableau de T
Dans une vue matricielle, cela donne :
int T[3][2] =
T[0][0] T[0][1]T[1][0] T[1][1]T[2][0] T[2][1]
Programmation ImpérativeTableaux
Tableaux statiques
Les tableaux multidimensionnels en C++
Comme pour les tableaux unidimensionnels, il est possibled’initialiser les éléments du tableau lors de la déclaration.
Déclarationint T[3][2] = {{1,2},{3,4},{5,6}} ;
Ce qui donne matriciellement :
int T =
1 23 45 6
RemarqueLa notion de tableau multidimensionnel s’étend à plus de dimensions.
Programmation ImpérativeTableaux
Tableaux statiques
Les tableaux multidimensionnels : Exemple
Calcul du déterminant de matrices 2× 21 #i nc l ude <ios t r eam >2
3 i n t main ( ){4 i n t A[ 2 ] [ 2 ] = { { 4 , 3 } , { 5 , 1 } } ;5 i n t det ;6
7 det = A [ 0 ] [ 0 ] ∗A[ 1 ] [ 1 ] −A [ 0 ] [ 1 ] ∗A [ 1 ] [ 0 ] ;8
9 s t d : : cout<<" l e dé t e rm inan t e s t : "<<det<<std : : e nd l ;10
11 re tu rn 0 ;12 }
Programmation ImpérativeTableaux
Fonction et tableaux statiques
Plan
6 TableauxTableaux statiquesFonction et tableaux statiquesTableaux et pointeursTableaux dynamiquesFonction et tableaux dynamiques
Programmation ImpérativeTableaux
Fonction et tableaux statiques
Tableau en paramètre d’entrée
Definitiontype_retour mafonction(type ident[taille])
type_retour peut-être void, int, float,...type est le type commun à tous les éléments du tableau,ident est le nom du tableau,taille est une constante entière précisant la taille du tableau.
Programmation ImpérativeTableaux
Fonction et tableaux statiques
Tableau en paramètre d’entrée
Definitiontype_retour mafonction(type ident[taille])
Exemplevoid AfficheTab(int tab[10])double Somme(double A[20])double Moyenne(int t[15])
Programmation ImpérativeTableaux
Fonction et tableaux statiques
Tableau en paramètre d’entrée
Afin d’écrire des fonctions pour des tableaux de taille quelconques,il faut
enlever la taille dans le type du tableau : type ident[]
ajouter un paramètre à la fonction : int taille
Definitiontype_retour mafonction(type ident[], int taille)
Attention : Il faut spécifier la taille du tableau car on ne peut pasla récupérer à partir de ident.
Programmation ImpérativeTableaux
Fonction et tableaux statiques
Tableau en paramètre d’entrée
Exemplevoid AfficheTab(int tab[], int taille)
double Somme(double A[], int taille)
double Moyenne(int t[], int taille)
Remarque : Le paramètre taille doit être inférieur ou égal à lataille réelle du tableau :
si égal : tout est normal,si inférieur : seul les taille premiers éléments sont traités,si supérieur : une erreur de segmentation se produira.
Programmation ImpérativeTableaux
Fonction et tableaux statiques
Tableau en paramètre d’entrée
Accès aux éléments du tableauOn utilise naturellement l’opérateur [ ].
L’accès en lecture du (i+1)-ème élément d’un tableau tab passéen paramètre s’écrit tab[i].
1 vo id Af f i cheTab ( i n t tab [ ] , i n t t a i l l e )2 {3 f o r ( i n t i =0; i < t a i l l e ; i ++){4 s t d : : cout<<tab [ i ]<<" " ;5 }6 s t d : : cout<<std : : e n d l ;7 }
Programmation ImpérativeTableaux
Fonction et tableaux statiques
Exemple : indice du plus petit élément
On cherche le minimum d’un tableau de 10 entiers, mais onrenvoie sa position et non sa valeur.
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 re tu rn m;8 }
Programmation ImpérativeTableaux
Fonction et tableaux statiques
Exemple : indice du plus petit élément
On cherche maintenant le plus petit élément d’un tableau de taillequelconque.
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 re tu rn m;8 }
Programmation ImpérativeTableaux
Fonction et tableaux statiques
Tableau en retour de fonction
AttentionLes 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 pourronsrenvoyer des tableaux.
Programmation ImpérativeTableaux
Fonction et tableaux statiques
Accès en écriture dans un paramètre tableau
Les paramètres tableaux sont modifiablesL’accès en écriture d’un tableau passé en paramètre d’une fonctionse fait avec l’opérateur [ ].↪→ cela marche comme l’accès en lecture.
1 vo id MaZ( i n t t [ 1 0 ] )2 {3 i n t i ;4 f o r ( i =0; i <10; i ++)5 t [ i ]=0;6 }
Programmation ImpérativeTableaux
Fonction et tableaux statiques
Que se passe-t-il ?
1 #i nc l ude <ios t r eam >2 i n t main ( )3 {4 i n t t [10]={3 ,5 ,7 ,2 , −5 , −7 ,4 , −2 ,2 ,1};5 Af f i cheTab ( t ) ;6 MaZ( t ) ;7 Af f i cheTab ( t ) ;8 }
Programmation ImpérativeTableaux
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 Af f i cheTab ( t ) ;5 MaZ( t ) ;6 Af f i cheTab ( t ) ;7 }
Le tableau t a été modifié. Pourquoi ?
Programmation ImpérativeTableaux
Tableaux et pointeurs
Plan
6 TableauxTableaux statiquesFonction et tableaux statiquesTableaux et pointeursTableaux dynamiquesFonction et tableaux dynamiques
Programmation ImpérativeTableaux
Tableaux et pointeurs
Tableau et pointeurs
Comment peut-on modifier un paramètre d’une fonction ?En utilisant un pointeur sur la variable qu’on veut modifier.
Fonctions et tableauxTout se passe donc comme si le paramètre de la fonction n’étaitpas le tableau, mais un pointeur sur le tableau.
Programmation ImpérativeTableaux
Tableaux et pointeurs
Tableau et pointeurs
Les tableaux et la mémoire :Quand on déclare un tableau de 10 entiers :
int tab[10];on alloue une zone contigue en mémoire de 10 entiers qui sontaccessibles via la variable tab par les instructions suivantes :
tab[0]; tab[1];...,tab[9];
Mais que contient la variable tab ?
Les tableaux sont des pointeurs :La variable tab est en fait un pointeur sur la première case dutableau.
Programmation ImpérativeTableaux
Tableaux et pointeurs
Tableau et pointeurs
Les tableaux et la mémoire :Quand on déclare un tableau de 10 entiers :
int tab[10];on alloue une zone contigue en mémoire de 10 entiers qui sontaccessibles via la variable tab par les instructions suivantes :
tab[0]; tab[1];...,tab[9];
Mais que contient la variable tab ?
Les tableaux sont des pointeurs :La variable tab est en fait un pointeur sur la première case dutableau.
Programmation ImpérativeTableaux
Tableaux et pointeurs
Structure d’un tableau
T T[0] T[2] T[1]
0x47FF30
=T
0x47FF38
=T+2
0x47FF34
=T+1
T contient l’adresse du premier élément du tableau (&T[0])les adresses des autres éléments du tableau se déduisent
Programmation ImpérativeTableaux
Tableaux et pointeurs
Arithmétique de pointeurs
Caractéristique des tableaux en mémoire
chaque case occupe la même taille,les cases sont contiguës.
À partir de l’adresse du premier élément on en déduit les suivantesen y ajoutant le bon nombre d’octets.
Soit la déclaration int tab[10]; on a :adresse(tab[i]) = adresse(tab[0])+i*sizeof(int)
Remarque : La manipulation de tableau n’existe pas, le compilateurse charge de tout convertir en pointeurs.
Programmation ImpérativeTableaux
Tableaux et pointeurs
Arithmétique de pointeurs
On peut manipuler explicitement les tableaux comme despointeurs.Si tab est l’adresse du premier élément, alors l’adresse du i-èmeélément est
tab+iet on peut accéder à un élément en faisant :
*(tab+i)
RemarqueQuand le compilateur rencontre tab[i], il le réécrit en *(tab+i)
Programmation ImpérativeTableaux
Tableaux et pointeurs
Arithmétique de pointeurs
1 vo id Af f i cheTab ( i n t tab [ 1 0 ] )2 {3 i n t i ;4 f o r ( i =0; i <10; i ++)5 s t d : : cout <<∗(tab+i )<<" "6 s t d : : cout<<std : : e n d l ;7 }
Ou encore, en n’utilisant que des pointeurs :1 vo id Af f i cheTab ( i n t tab [ 1 0 ] )2 {3 i n t ∗p ;4 f o r ( p=tab ; p<tab +10;p++)5 s t d : : cout <<∗p<<" "6 s t d : : cout<<std : : e n d l ;7 }
Programmation ImpérativeTableaux
Tableaux et pointeurs
Exemple complet : Tri d’un tableau généré aléatoirement
Une fonction qui modifie un tableau en le remplissant de valeursaléatoires comprises entre 0 et 20.
1 vo id I n i t T a b ( i n t tab [ 1 0 ] )2 {3 i n t i ;4 f o r ( i =0; i <10; i ++)5 tab [ i ]= rand ( ) % 21 ;6 }
Programmation ImpérativeTableaux
Tableaux et pointeurs
Exemple complet
Une fonction qui trie un tableau de taille quelconque.1 i n t Tr i ( i n t t [ ] , i n t t a i l l e )2 {3 i n t i , j ,m;4 f o r ( i =0; i <t a i l l e −1; i ++)5 {6 m=i ;7 f o r ( j=i ; j< t a i l l e ; j++)8 i f ( t [ j ]< t [m] )9 m=j ;10 echange ( t+i , t+m) ;11 }12 }
La fonction echange étant celle du cours précédent.
Programmation ImpérativeTableaux
Tableaux et pointeurs
Exemple completL’utilisation de tableau aléatoire permet de tester facilement sonalgorithme sur de nombreux cas différents.
1 #i nc l ude <ios t r eam >2 #i nc l ude <ctime>3 #i nc l ude <c s t d l i b >4
5 i n t main ( )6 {7 i n t t [ 1 0 ] ;8 s r and ( t ime (NULL ) ) ;9 I n i t T a b ( t ) ;10 Af f i cheTab ( t ) ;11 Tr i ( t , 5 ) ;12 Af f i cheTab ( t ) ;13 Tr i ( t , 1 0 ) ;14 Af f i cheTab ( t ) ;15 re tu rn 0 ;16 }
Programmation ImpérativeTableaux
Tableaux et pointeurs
Exemple complet
A la première exécution, on obtient (par exemple) :1 7 15 8 12 12 5 6 17 2 12 7 8 12 12 15 5 6 17 2 13 1 2 5 6 7 8 12 12 15 17
A la seconde, on a :1 7 5 4 20 14 11 17 1 7 72 4 5 7 14 20 11 17 1 7 73 1 4 5 7 7 7 11 14 17 20
Programmation ImpérativeTableaux
Tableaux dynamiques
Plan
6 TableauxTableaux statiquesFonction et tableaux statiquesTableaux et pointeursTableaux dynamiquesFonction et tableaux dynamiques
Programmation ImpérativeTableaux
Tableaux dynamiques
Modèle mémoire
Données statiques :On connaît à l’avance (lors de l’écriture du programme) lataille des données,La mémoire peut donc être réservée dès le début duprogramme.
Données dynamiques :On connaît la taille des données lors de l’exécution duprogrammeLa réservation de la mémoire doit donc se fairedynamiquement au cours de l’exécution.
Programmation ImpérativeTableaux
Tableaux dynamiques
Remarques
Sur les tableaux statiques :ils sont alloués dans un espace mémoire particulier (la pile)cette pile est très limitéeon ne peut pas allouer beaucoup de tableaux ou de grandstableaux
Sur les tableaux dynamiquesils sont alloués dans une autre zone mémoire (le tas)cet espace mémoire est très vasteon peut y allouer beaucoup de grands tableaux
Programmation ImpérativeTableaux
Tableaux dynamiques
Outils de gestion de mémoire en C++
En C++, la gestion de la mémoire liée aux donnéesstatiques est gérée automatiquement par le compilateur.dynamiques est déléguée à l’utilisateur.
Gestion de le mémoire dynamique :
réservation de l’espace mémoire en fonction d’une taille etd’un typelibération de l’espace mémoiremanipulation de la mémoire uniquement par pointeur
Programmation ImpérativeTableaux
Tableaux dynamiques
Réservation de la mémoire
On parle plus généralement d’allocation mémoire.
Allocation mémoire en C++On utilise l’instruction
type *p = new type[n]
new est l’opérateur de réservation de mémoiretype correspond au type de données qu’on va stocker[n] indique que l’on veut stocker n donnéesp correspond au pointeur permettant l’accès à la mémoire
Programmation ImpérativeTableaux
Tableaux dynamiques
Réservation de la mémoire
Allocation mémoire en C++Plus généralement, l’instruction new type[n] réclame au systèmede réserver un espace mémoire permettant de stocker n données detype type.
si l’allocation est possible, l’évaluation de cette instructionretournera l’adresse de la mémoire allouée,sinon, le programme s’arrêtera en levant une exception.
Exemplenew int[3] demande au système de réserver une espace mémoirepermettant de stocker 3 int.
Programmation ImpérativeTableaux
Tableaux dynamiques
Réservation de la mémoire
AttentionPour accéder à la mémoire réservée, il est obligatoire qu’unevariable pointeur contienne son adresse, ce sera le seul accèspossible.
int *T = new int[3];
Programmation ImpérativeTableaux
Tableaux dynamiques
Représentation en mémoire
L’opérateur new renvoie l’adresse de la 1ère case de lamémoire dynamique qui a été allouéeLe pointeur T permet d’accéder aux cases de la mémoire(comme un tableau).
int *T = new int[3];
T T[0] T[2] T[1]
0x47FF30
=T
0x47FF38
=T+2
0x47FF34
=T+1
Programmation ImpérativeTableaux
Tableaux dynamiques
Utilisation
Une fois qu’une zone mémoire est allouée dynamiquement, on peutla parcourir comme un tableau en utilisant l’opérateur [ ] ou avecl’arithmétique des pointeurs.
1 #i nc l ude <ios t r eam >2 i n t main ( )3 {4 f l o a t ∗ T;5 T = new f l o a t [ 4 0 ] ;6 f o r ( i n t i =0; i <40; i ++)7 { T[ i ]=1./(1+ i ) ; }8
9 f o r ( i n t i =0; i <40; i ++)10 { s td : : cout<<T[ i ]<<" " ; }11 re tu rn 0 ;12 }
Programmation ImpérativeTableaux
Tableaux dynamiques
Exemple
On veut qu’un utilisateur rentre des valeurs numériques dans untableau de taille N.
1 #i nc l ude <ios t r eam >2 i n t main ( )3 {4 i n t ∗adr ,N;5 s t d : : cout<<" Ent r e z l e nombre de v a l e u r s : " ;6 s t d : : c in >>N;7 adr= new i n t [N] ;8 f o r ( i n t i =0; i <N; i ++){9 s t d : : cout<<" Ent r e z l a v a l e u r "<<i <<" : " ) ;10 s t d : : c in >>adr [ i ] ;11 }12 re tu rn 0 ;13 }
Programmation ImpérativeTableaux
Tableaux dynamiques
Libération de la mémoire
Nous sommes capables de réserver de la mémoire. Comme celle-ciest limitée et partagée, il faut donc la libérer.
Libération de mémoire en C++delete[] p;
delete[] indique que l’on veut libérer de la mémoire.p est obligatoirement un pointeur contenant l’adresse de lamémoire à libérer.
AttentionOn ne peut libérer que de la mémoire qui a été allouée dynamique-ment par new.
Programmation ImpérativeTableaux
Tableaux dynamiques
Libération de la mémoire
Nous sommes capables de réserver de la mémoire. Comme celle-ciest limitée et partagée, il faut donc la libérer.
Libération de mémoire en C++delete[] p;
delete[] indique que l’on veut libérer de la mémoire.p est obligatoirement un pointeur contenant l’adresse de lamémoire à libérer.
AttentionOn ne peut libérer que de la mémoire qui a été allouée dynamique-ment par new.
Programmation ImpérativeTableaux
Tableaux dynamiques
Libération de la mémoire
Libération de mémoire en C++L’évaluation de l’instruction delete[] p; libére la mémoirecommencant à l’adresse mémoire stockée dans le pointeur p.
RemarqueLe pointeur p reste utilisable :
1 i n t ∗p ;2 p= new i n t [ 5 ] ;3 d e l e t e [ ] p ;4 p= new i n t [ 1 0 ] ;
Programmation ImpérativeTableaux
Tableaux dynamiques
Bonne utilisation de la mémoire dynamique
1 #i nc l ude <ios t r eam >2 i n t main ( )3 {4 i n t ∗ tab ;5 tab = new i n t [ 1 0 ] ; // a l l o c a t i o n dynamique6 . . .7 de le te [ ] tab ; // p l u s b e s o i n du contenu de tab8 . . . // s u i t e du programme sans l e contenu de tab9 re tu rn 0 ;10 }
Programmation ImpérativeTableaux
Tableaux dynamiques
Initialisation des tableaux dynamiques
On ne peut pas le faire en même temps que l’allocation à l’inversedes tableaux statiques. On le fait donc en deux étapes :
1 allocation du tableau2 affectation d’une valeur à chaque case
L’initialisation se fait après le new par des affectations successives.1 i n t ∗ tab , N;2 s t d : : c in >>N;3 tab = new i n t [N ] ; // a l l o c a t i o n4
5 f o r ( i n t i =0; i <N; i ++) // i n i t i a l i s a t i o n s6 tab [ i ]= i ;
Programmation ImpérativeTableaux
Tableaux dynamiques
Exemple : extraire les éléments pairs d’un tableauOn veut mettre dans un tableau tous les éléments pairs d’un autretableau.
1 i n t main ( ){2 i n t T [ 4 0 ] ;3 . . .4 i n t c=0,5 f o r ( i n t i =0; i <40; i ++){6 i f (T[ i ]%2==0) { c++; }7 }8 i n t ∗ tab = new i n t [ c ] ;9 i n t j =0;10 f o r ( i n t i =0; i <40; i ++){11 i f (T[ i ]%2==0){12 tab [ j ]=T[ i ] ;13 j ++;14 }15 . . .16 d e l e t e [ ] tab ;17 }
Programmation ImpérativeTableaux
Tableaux dynamiques
Comment copier des tableaux dynamiques
1 #i nc l ude <ios t r eam >2 i n t main ( )3 {4 i n t i , ∗ t1 , ∗ t2 ;5 t1=new i n t [ 2 0 ] ;6 t2=new i n t [ 2 0 ] ;7 f o r ( i =0; i <20; i ++)8 { t1 [ i ]= i ; }9 t2=t1 ;10 f o r ( i =0; i <20; i ++)11 { s td : : cout<<t2 [ i ]<<" " ; }12 re tu rn 0 ;13 }
A l’exécution, c’est bien les valeurs de 0 à 19 qui s’affichent maispourtant le tableau n’a pas été copié.
Programmation ImpérativeTableaux
Tableaux dynamiques
Copie de tableau
Copie virtuelleC’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 celuidans t2 l’est aussi.
Copie profondeOn 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érativeTableaux
Tableaux dynamiques
Copie de tableau
La bonne solution pour recopier t1 dans t2 est donc une copie enprofondeur.
1 #i nc l ude <ios t r eam >2 i n t main ( )3 {4 i n t i , ∗ t1 , ∗ t2 ;5 t1= new i n t [ 2 0 ] ;6 f o r ( i =0; i <20; i ++)7 t1 [ i ]= i ;8 t2= new i n t [ 2 0 ] ;9 f o r ( i =0; i <20; i ++)10 t2 [ i ]= t1 [ i ] ;11
12 de le te [ ] t1 ;13 de le te [ ] t2 ;14 }
Programmation ImpérativeTableaux
Tableaux dynamiques
Tableaux dynamiques bi-dimensionnels
On veut utiliser un tableau de taille N ×M entiers
N et M ne seront connus qu’à l’exécution.
Comment faire ?
Programmation ImpérativeTableaux
Tableaux dynamiques
Tableau dynamique 7× 8
Un pointeur sur un tableaude 7 casesChaque case contient unpointeurChacun de ses pointeursindiquent une zone de 8cases
Programmation ImpérativeTableaux
Tableaux dynamiques
Mise en oeuvre
1 i n t main{2 i n t ∗∗ t a b l e a u ;3 i n t 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 re tu rn 0 ;13 }
Programmation ImpérativeTableaux
Tableaux dynamiques
Libération de la mémoire
Pour libérer la mémoire, il faut libérer chacune des zonesprécédemment allouées :
1 f o r ( i =0; i <N; i ++)2 de le te [ ] t a b l e a u [ i ] ;3
4 de le te [ ] t a b l e a u ;
Programmation ImpérativeTableaux
Fonction et tableaux dynamiques
Plan
6 TableauxTableaux statiquesFonction et tableaux statiquesTableaux et pointeursTableaux dynamiquesFonction et tableaux dynamiques
Programmation ImpérativeTableaux
Fonction et tableaux dynamiques
Tableau en paramètre d’entrée
Pour passer un tableau dynamique en paramètre, on doit passer enargument :
le pointeur sur la zone mémoire correspondantela taille du tableau
Programmation ImpérativeTableaux
Fonction et tableaux dynamiques
Tableau en paramètre d’entrée
Definitiontype_retour mafonction(type *ident, int taille)
type_retour peut-être void, int, float,...type est le type commun à tous les éléments du tableau,ident est le nom du tableau,taille est un paramètre précisant la taille du tableau.
Tout exactement comme pour les tableaux statiques ! ! !
Programmation ImpérativeTableaux
Fonction et tableaux dynamiques
Tableau en paramètre d’entrée
L’accès en lecture/écriture du i-ème élément d’un tableaudynamique tab passé en paramètre se fait par l’opérateur [].
1 vo id Af f i cheTab ( 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<<tab [ i ]<<s td : : e n d l ;4 }5
6 vo id 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érativeTableaux
Fonction et tableaux dynamiques
Tableau en paramètre d’entrée
RemarqueOn peut également utiliser l’arithmétique des pointeurs.
1 vo id Af f i cheTab ( 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<< ∗( tab+i )<<s td : : e n d l ;4 }5
6 vo id 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érativeTableaux
Fonction et tableaux dynamiques
Tableau en paramètre de sortie
RemarqueLes tableaux étant essentiellement une abstraction de la mémoire, iln’existe pas de type tableau que l’on pourrait renvoyer.↪→ par contre, il est possible de renvoyer l’adresse de la premièrecase du tableau via un pointeur ! ! !
Fonction permettant de renvoyer un tableautype* mafonction(...) {
type *tab=new int[10];...return tab;
}
Programmation ImpérativeTableaux
Fonction et tableaux dynamiques
Tableau en paramètre de sortie
Fonction permettant de renvoyer un tableautype* mafonction(...) {
type *tab=new int[10];...return tab;
}
AttentionOn ne renvoie que l’adresse de la 1ère case du tableau, on ne renvoiepas 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érativeTableaux
Fonction et tableaux dynamiques
Tableau en paramètre de sortie
1 i n t ∗ c r e eTab l eau ( i n t n )2 {3 i n t i ;4 i n t ∗ t=new i n t [ n ] ;5 f o r ( i =0; i <n ; i ++)6 { t [ i ]=0; }7 r e t u r n t ;8 }9 i n t main ( )10 {11 i n t t a i l l e =20;12 i n t ∗ tab = creeTab l eau ( t a i l l e ) ;13 . . .14 de le te [ ] tab ; // ATTENTION, on l i b è r e l a mémoire15 re tu rn 0 ;16 }
Programmation ImpérativeTableaux
Fonction et tableaux dynamiques
Exemple : extraire les nombres premiers d’un tableau
Exercice
On suppose avoir la fonction premier?(int) qui renvoie truesi n est premier et false sinon.On souhaite écrire une fonction qui, à partir d’un tableau T,va renvoyer un tableau ne contenant que les éléments de Tqui sont des nombres premiers.
Programmation ImpérativeTableaux
Fonction et tableaux dynamiques
Exemple : extraire les nombres premiers d’un tableau
T : un tableau de dimension nnbprime : l’adresse d’un int pour la taille du tableau en sortie
1 i n t ∗ t abPremie r ( i n t ∗T, i n t n , i n t ∗nbpr ime ){2 ∗nbpr ime=0;3 i n t ∗ tabp=new i n t [ n ] ;4 f o r ( i n t i =0; i<n ; i ++){5 i f ( p r em i e r ?( t [ i ] ) ) {6 tabp [∗ nbpr ime ]= t [ i ] ;7 (∗ nbpr ime )++;8 }9 }10 i n t ∗ pr ime=new i n t [∗ nbpr ime ] ;11 f o r ( i n t i =0; i <∗nbpr ime ; i++)12 pr ime [ i ]= tabp [ i ] ;1314 d e l e t e [ ] tabp ;15 r e t u r n pr ime ;16 }
Programmation ImpérativeTableaux
Fonction et tableaux dynamiques
Cas de la dimension 2
On suppose avoir choisi comme représentation celle-ci :
Un pointeur sur un tableaude N casesChaque case contient unpointeurChacun de ses pointeursindiquent une zone de Mcases
Programmation ImpérativeTableaux
Fonction et tableaux dynamiques
Cas de la dimension 2
Pour passer un tableau bi-dimensionnel en paramètre d’unefonction, on utilise un pointeur de pointeur et deux dimensions.
fonction avec tableau bi-dimensionneltype_retour mafonction(type **T, int N, int M)
type_retour peut-être void, int, float *,...type est le type commun à tous les éléments du tableau,T est le nom du tableau dynamique,N est un entier représentant la première dimension.M est un entier représentant la seconde dimension.
Programmation ImpérativeTableaux
Fonction et tableaux dynamiques
Exemple : pluviométrie
ExerciceNous allons nous intéresser à l’écriture de différentes fonctions surdes relevés de précipitations.Ceux-ci seront stockés dans un tableau 2D (mois, jours) où lesdimensions pourront ne pas être identiques.
Pour commencer, nous allons commencer par créer un tableaumois qui contiendra le nombre de jours du mois correspondant :
int mois[12]={31,28,31,30,31,30,31,31,30,31,30,31};
Programmation ImpérativeTableaux
Fonction et tableaux dynamiques
Exemple : pluviométrie
Question :Comment créer un tableau 2D nommé pluie tel que la ligne icontienne mois[i ] cases ?
1 i n t ∗∗ p l u i e ;2 i n t mois [ 12 ]={31 ,28 ,31 ,30 ,31 ,30 ,31 ,31 ,30 ,31 ,30 ,31} ;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érativeTableaux
Fonction et tableaux dynamiques
Exemple : pluviométrie
Question :Comment créer un tableau 2D nommé pluie tel que la ligne icontienne mois[i ] cases ?
1 i n t ∗∗ p l u i e ;2 i n t mois [ 12 ]={31 ,28 ,31 ,30 ,31 ,30 ,31 ,31 ,30 ,31 ,30 ,31} ;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érativeTableaux
Fonction et tableaux dynamiques
Exemple : pluviométrie
Question :Calculer le total de précipitations par mois et renvoyer le résultatdans 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 re tu rn t ;11 }
Programmation ImpérativeTableaux
Fonction et tableaux dynamiques
Exemple : pluviométrie
Question :Calculer le total de précipitations par mois et renvoyer le résultatdans 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 re tu rn t ;11 }
Programmation ImpérativeTableaux
Fonction et tableaux dynamiques
Exemple : pluviométrie
QuestionAfficher le jour de l’année où il pleut le plus
1 vo id p lu ieMax ( 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<<std : : e nd l ;12 }
Programmation ImpérativeTableaux
Fonction et tableaux dynamiques
Exemple : pluviométrie
QuestionAfficher le jour de l’année où il pleut le plus
1 vo id p lu ieMax ( 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<<std : : e n d l ;12 }
Programmation ImpérativeTableaux
Fonction et tableaux dynamiques
Exemple : pluviométrie
QuestionCalculer 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 re tu rn s ;10 }
Programmation ImpérativeTableaux
Fonction et tableaux dynamiques
Exemple : pluviométrie
QuestionCalculer 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 re tu rn s ;10 }
Programmation ImpérativeStructures de données (Facultatif)
Plan
1 Introduction
2 Bases du langage C++
3 Structures de contrôle
4 Fonctions
5 Pointeurs
6 Tableaux
7 Structures de données (Facultatif)
Programmation ImpérativeStructures de données (Facultatif)
A quoi sert une structure de données
Les types scalaires :type de base : entier (int, double,...)type pointeur : type *
Les types composés :données homogènes (les tableaux) : type[]
données hétérogènes : les structures
Programmation ImpérativeStructures de données (Facultatif)
A quoi sert une structure de données
Les types scalaires :type de base : entier (int, double,...)type pointeur : type *
Les types composés :données homogènes (les tableaux) : type[]données hétérogènes : les structures
Programmation ImpérativeStructures de données (Facultatif)
Les structures de données
étendent les types du langage pour une problématiquedonnée :nombre complexe, matrices, compte bancaire, voiture, ...
regroupent des données dans une seule variable :(hétérogène) un compte bancaire= no banque,no compte, solde(homogène) un nbr complexe= partie imaginaire, partie réelle
RemarqueCela facilite la manipulation des données et la structuration desprogrammes
Programmation ImpérativeStructures de données (Facultatif)
Les structures de données
étendent les types du langage pour une problématiquedonnée :nombre complexe, matrices, compte bancaire, voiture, ...
regroupent des données dans une seule variable :(hétérogène) un compte bancaire= no banque,no compte, solde(homogène) un nbr complexe= partie imaginaire, partie réelle
RemarqueCela facilite la manipulation des données et la structuration desprogrammes
Programmation ImpérativeStructures de données (Facultatif)
Spécifications
Une structure de données est composée d’un nombre fixé dechamps :
nommés (banque, compte, solde)typés (int pour banque, compte et float pour solde
Une variable structurée peut être manipulée :champ par champ (lecture, mise à jour)globalement (initialisation, copie, paramètre fonction)
Programmation ImpérativeStructures de données (Facultatif)
Déclaration d’une structure en C++
Syntaxestruct NomStruct{
type1 champ1;type2 champ2;...typeN champN;
};
Cela déclare un nouveau type de donnéesde nom NomStruct
composé des champs champ1, ..., champN
ayant respectivement pour type type1,...,typeN
Programmation ImpérativeStructures de données (Facultatif)
Déclaration d’une structure en C++
Syntaxestruct NomStruct{
type1 champ1;type2 champ2;...typeN champN;
};
AttentionNomStruct est un identificateur pas encore utilisé (ex. 6= int)type1,...,typeN sont des types connus dont on connaît lataille mémoire (ex. 6= NomStruct)
Programmation ImpérativeStructures de données (Facultatif)
Déclaration d’une structure en C++ : Exemple
1 s t r u c t compteB {2 i n t banque ;3 i n t compte ;4 f l o a t s o l d e5 } ;
AttentionLe ; est obligatoire après la déclaration de la structure ! ! !
Programmation ImpérativeStructures de données (Facultatif)
Déclaration d’une variable structurée
SyntaxeNomStruct var;
var est une variable de type NomStruct.
ExemplecompteB CB;
Programmation ImpérativeStructures de données (Facultatif)
Une structure en mémoire ? ? ?
SyntaxeNomStruct var;
NomStruct var;
champ1 . . . champN
mémoire en octets
RemarqueChaque donnée dans la variable est identifiée par l’identificateur duchamp correspondant.
Programmation ImpérativeStructures de données (Facultatif)
Une structure en mémoire ? ? ?
ExemplecompteB CB;
compteB CB;
banque compte solde
mémoire en octets
RemarqueLes champs sont ordonnés en mémoire dans l’ordre de leur déclara-tion dans la structure.
Programmation ImpérativeStructures de données (Facultatif)
Une structure en mémoire ? ? ?
AttentionLes champs des structures sont alignés suivant l’alignement des typesde base en mémoire (32 ou 64 bits).
struct mystruct {int c1;short int c2;float c3;
}; mystruct var;
c1
mémoire en octets
c2 c3padding
on peut obtenir l’occupation mémoire en utilisation sizeofexemple : sizeof(mystruct) ou sizeof(var)
les règles de padding sont complexes (au delà de ce cours)
Programmation ImpérativeStructures de données (Facultatif)
Accès aux champs d’une donnée structurée
On utilise la notation pointée :
Syntaxevar.champ
Cela permet de récupérer la partie champ de la variable var.
RemarqueCela définit un identificateur sur la donnée concernée
possédant une adresse : &(var.champ)accessible en lecture/écriture : var.champ=...
Programmation ImpérativeStructures de données (Facultatif)
Accès aux champs d’une donnée structurée
On utilise la notation pointée :
Syntaxevar.champ
Cela permet de récupérer la partie champ de la variable var.
RemarqueCela définit un identificateur sur la donnée concernée
possédant une adresse : &(var.champ)accessible en lecture/écriture : var.champ=...
Programmation ImpérativeStructures de données (Facultatif)
Accès aux champs d’une donnée structurée
1 #i nc l ude <ios t r eam >2
3 s t r u c t compteB{4 i n t banque ;5 i n t compte ;6 f l o a t s o l d e ;7 } ;8
9 i n t main ( ){10 compteB c ;11 c . s o l d e = 900 ;12 s t d : : cout<< " s o l d e : "<<c . so l d e <<"\n" ;13 re tu rn 0 ;14 }
Programmation ImpérativeStructures de données (Facultatif)
Initialisation d’une structure
Initialisation lors de la déclaration (comme les tableaux statiques)
SyntaxeNomStruct var= {exp1,...,expN} ;
équivalent à :var.champ1=exp1;
...var.champN=expN;
Programmation ImpérativeStructures de données (Facultatif)
Initialisation d’une structure
Initialisation lors de la déclaration (comme les tableaux statiques)
SyntaxeNomStruct var= {exp1,...,expN} ;
Remarquel’ordre des expressions est identique à celui des champsles champs manquants sont initialisés à 0 ou NULL
on peut imbriquer les initialisations {..} (e.g. struct, tableau)
Programmation ImpérativeStructures de données (Facultatif)
Initialisation d’une structure : Exemple
1 #i nc l ude <ios t r eam >2
3 s t r u c t compteB{4 i n t banque ;5 i n t compte ;6 f l o a t s o l d e ;7 } ;8
9 i n t main ( ){10 compteB c = {123 , 456 , 900} ;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 pour s o l d e : "<<c . so l de <<"\n" ;14 re tu rn 0 ;15 }
Programmation ImpérativeStructures de données (Facultatif)
Copie des structures
A l’inverse des tableaux statiques la copie de structurefonctionne via l’opérateur =
Remarquela copie se fait champ par champ
ExemplecompteB cb1, cb2;cb1=cb2;
est équivalent àcb1.banque=cb2.banque;cb1.compte=cb2.compte;cb1.solde=cb2.solde
Programmation ImpérativeStructures de données (Facultatif)
Copie des structures
RemarqueL’initialisation par recopie fonctionne également
ExemplecompteB cb1;...compteB cb2=cb1;
Programmation ImpérativeStructures de données (Facultatif)
Variable structurée : généralités
Bien que comprenant plusieurs données, une variablestructurée est considérée comme une seule donnée au sens desvariables.
copie/initialisation possibleparamètre/retour de fonctions
A l’inverse des variables tableaux qui correspondent à uneadresse mémoire référençant les données.
Programmation ImpérativeStructures de données (Facultatif)
Variable structurée : généralités
Bien que comprenant plusieurs données, une variablestructurée est considérée comme une seule donnée au sens desvariables.
copie/initialisation possibleparamètre/retour de fonctions
A l’inverse des variables tableaux qui correspondent à uneadresse mémoire référençant les données.
Programmation ImpérativeStructures de données (Facultatif)
Structures et fonctions
Plan
7 Structures de données (Facultatif)Structures et fonctionsStructures et tableauxStructure et pointeurStructure et allocation dynamique
Programmation ImpérativeStructures de données (Facultatif)
Structures et fonctions
Passage des structures comme paramètre
Comme tous les paramètres de fonction, les variables structuréessont passées par copie/valeur.
Syntaxetype_r mafonction(nomStruct var,...) {...}
var est un paramètre de type nomStructlors de l’appel, une copie du paramètre structuré sera utilisée.
Programmation ImpérativeStructures de données (Facultatif)
Structures et fonctions
Passage des structures comme paramètreExemple :
1 #i nc l ude <ios t r eam >2 s t r u c t compteB{3 i n t banque ;4 i n t compte ;5 f l o a t s o l d e ;6 } ;7
8 vo id i n t e r e t ( compteB cb , f l o a t taux ){9 cb . s o l d e ∗= (1.0+ taux ) ;10 }11 i n t main ( ){12 compteB c = {123 , 456 , 900} ;13 s t d : : cout<<" a pour s o l d e : "<<c . so l de <<"\n" ;14 i n t e r e t ( c , 0 . 0 2 5 ) ; //NE MODIFIE PAS c15 s t d : : cout<<" a pour s o l d e : "<<c . so l de <<"\n" ;16 re tu rn 0 ;17 }
Attentionc’est une copie de CB qui est manipulée par la fonctioninteret(...)
Programmation ImpérativeStructures de données (Facultatif)
Structures et fonctions
Retour d’une structure
Comme toutes les variables scalaires, une structure peut êtreretournée par une fonction.
SyntaxenomStruct mafonction(...) {...return exp;}
exp doit être une variable ou une constante de typenomStruct
c’est une copie de exp qui est renvoyée
Programmation ImpérativeStructures de données (Facultatif)
Structures et fonctions
Retour d’une structure : exemple
1 compteB creat ionCompte ( i n t banque ){2 compteB c = {banque , rand ()%1000 ,0 .0} ;3 re tu rn c ;4 }
init. : compteB c = creationCompte(1234);
copie : cb = creationCompte(4321);
AttentionDans ce cas d’utilisation, le nombre de copies de la structure est dedeux → (coût mémoire potentiellement prohibitif)
Programmation ImpérativeStructures de données (Facultatif)
Structures et fonctions
Passage de structures par adresse
On utilise un pointeur sur la structure
Syntaxetype_r mafonction(nomStruct *var,...) {...}
var contient l’adresse mémoire d’une variable de typenomStruct
aucune copie mémoire lors de l’appel de la fonction
Programmation ImpérativeStructures de données (Facultatif)
Structures et fonctions
Passage de structures par adresse : Exemple
1 vo id i n t e r e t ( compteB ∗cb , f l o a t taux ){2 (∗ cb ) . s o l d e ∗=(1.0+ taux ) ;3 }4 i n t main ( ){5 compteB CB;6 i n t e r e t (&CB, 0 . 0 2 5 ) ; //MODIFIE BIEN CB7 re tu rn 0 ;8 }
AttentionLa priorité des opérateurs est très importante :*var.champ correspond à *(var.champ) et non à (*var).champ
Programmation ImpérativeStructures de données (Facultatif)
Structures et fonctions
Simplification d’accès aux champs via pointeur
Comme on a souvent besoin de la construction (*var).champ lelangage C++ propose un opérateur spécial : ->
SyntaxenomStruct *var= ...;var->champ=...;
strictement équivalent à (*var).champ=...;
les champs sont accessibles en lecture et en écriture (bien sûr)
Programmation ImpérativeStructures de données (Facultatif)
Structures et fonctions
Exemple
L’affichage d’une structure nécessite souvent une fonctionparticulière
1 vo id a f f i c h e ( compteB ∗CB){2 s t d : : cout<<" banque : "<<c−>banque3 <<" compte : "<<c−>compte4 << " s o l d e : "<<c−>so lde <<"\n" ;5 }6 i n t main ( ){7 compteB cb ={1234 ,0482671234 ,1270.50};8 a f f i c h e (&cb ) ; // pas sage par a d r e s s e −> e v i t e l a c o p i e9 re tu rn 0 ;10 }
Programmation ImpérativeStructures de données (Facultatif)
Structures et tableaux
Plan
7 Structures de données (Facultatif)Structures et fonctionsStructures et tableauxStructure et pointeurStructure et allocation dynamique
Programmation ImpérativeStructures de données (Facultatif)
Structures et tableaux
Champ de type tableau dans une structure
Les champs d’une structure peuvent être des tableaux statiques
Syntaxestruct nomStruct{
type1 champ1[10];type2 champ2;
};
champ1 contient un tableau de 10 type1
AttentionLa structure ne contient pas que l’adresse du 1er élément du tableaumais bien l’ensemble des éléments du tableau.
Programmation ImpérativeStructures de données (Facultatif)
Structures et tableaux
Exemple
1 s t r u c t Etud i an t {2 char nom [ 3 2 ] ;3 i n t numero ;4 i n t n a i s s a n c e [ 3 ] ;5 } ;
tous les éléments du tableau sont intégrés dans la structuretaille de la structure Etudiant : 48 octets = 32 char + 4 intils sont accessibles par l’accès au champ puis au tableau
Exemple : Etudiant etud; etud.naissance[2]=1984;
Programmation ImpérativeStructures de données (Facultatif)
Structures et tableaux
Exemple
On peut imbriquer les initialisations lors de la construction d’unedonnée structurée :
1 s t r u c t Etud i an t {2 char nom [ 3 2 ] ;3 i n t numero ;4 i n t n a i s s a n c e [ 3 ] ;5 } ;6 . . .7 Etud i an t e={" B e r i " ,2010003111 ,{12 ,4 ,1987}} ;8 . . .
Programmation ImpérativeStructures de données (Facultatif)
Structures et tableaux
Tableau dans les structures
RemarqueL’affectation, l’initialisation, le passage en argument et le retour defonction 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 structuredu passage en argument d’une fonctiondu retour de la structure par une fonction
Programmation ImpérativeStructures de données (Facultatif)
Structures et tableaux
Tableau dans les structures : Exemple
1 vo id a n n i v e r s a i r e ( E tud i an 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 Etud i an t e1 , e2={" B e r i " ,2010003111 ,{12 ,4 ,1987}} ;10 e1=e2 ; // c o p i e des t a b l e a u x11 a n n i v e r s a i r e ( e1 ) ; // c o p i e des t a b l e a u x12 re tu rn 0 ;13 }
Programmation ImpérativeStructures de données (Facultatif)
Structures et tableaux
Champs de type structure dans une structure
Les champs d’une structure peuvent être des structures
Syntaxestruct nomStruct{
otherStruct champ1;type2 champ2;
};
champ1 est un type structuré de type otherStructle comportement est similaire aux tableaux statiques (copie)
AttentionLa taille de la structure imbriquée doit être connue ...→ les structures récursives sont impossibles
Programmation ImpérativeStructures de données (Facultatif)
Structures et tableaux
Champs de type structure dans une structure
Les champs d’une structure peuvent être des structures
Syntaxestruct nomStruct{
otherStruct champ1;type2 champ2;
};
champ1 est un type structuré de type otherStructle comportement est similaire aux tableaux statiques (copie)
AttentionLa taille de la structure imbriquée doit être connue ...→ les structures récursives sont impossibles
Programmation ImpérativeStructures de données (Facultatif)
Structures et tableaux
Exemple
1 s t r u c t Date {2 i n t j j ,mm, aaaa ;3 } ;4 s t r u c t Etud i an t {5 char nom [ 3 2 ] ;6 i n t numero ;7 Date n a i s s a n c e ;8 } ;
tous les champs des structures sont intégréstaille de la structure Etudiant : 48 octets = 32 char + 4 intils sont accessibles par les appels imbriqués des champs
Exemple : Etudiant e; e.naissance.aaaa=1984;
Programmation ImpérativeStructures de données (Facultatif)
Structures et tableaux
Exemple
On peut imbriquer les initialisations lors de la construction d’unestructure imbriquée :
1 s t r u c t Date {2 i n t j j ,mm, aaaa ;3 } ;4
5 s t r u c t Etud i an t {6 char nom [ 3 2 ] ;7 i n t numero ;8 Date n a i s s a n c e ;9 } ;10 . . .11 Etud i an t e={" B e r i " ,2010003111 ,{12 ,4 ,1987}} ;
Programmation ImpérativeStructures de données (Facultatif)
Structures et tableaux
Structure dans les structures
RemarqueL’affectation, l’initialisation, le passage en argument et le retour defonction d’une structure copie récursivement chacun des champs ...
Comme avec les tableaux statiques, les structures imbriquéesseront donc copiées champ par champ lors
de l’affectation de la structuredu passage en argument d’une fonctiondu retour de la structure par une fonction
Programmation ImpérativeStructures de données (Facultatif)
Structures et tableaux
Structure dans les structures : Exemple
1 vo id a n n i v e r s a i r e ( E tud i an 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 Etud i an t e1 , e2={" B e r i " ,2010003111 ,{12 ,4 ,1987}} ;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 e11 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 e12 re tu rn 0 ;13 }
Programmation ImpérativeStructures de données (Facultatif)
Structures et tableaux
Tableau statique de structures
Les structures étant un type de données, on peut les mettre dansun tableauSyntaxenomStruct var[N];
var est un tableau contenant N données structuréesN doit être une constante connue
Attentionvar reste un tableau et contient l’adresse mémoire où se trouventles N données structurées.
Programmation ImpérativeStructures de données (Facultatif)
Structures et tableaux
Exemple
On peut imbriquer les initialisations lors de la construction d’untableau statique de structure :
1 s t r u c t Date {2 i n t j j ,mm, aaaa ;3 } ;4 . . .5 Date D[3 ]={{2 ,1 ,1923} ,{23 ,12 ,2004} ,{13 ,01 ,2011}} ;
on ne peut pas copier le tableau par l’opérateur d’affectation :Date T[3]=D; (INTERDIT)
lors de passage du tableau en paramètre d’une fonction, lesdonnées structurées ne sont pas copiées
Programmation ImpérativeStructures de données (Facultatif)
Structures et tableaux
Exemple
On peut imbriquer les initialisations lors de la construction d’untableau statique de structure :
1 s t r u c t Date {2 i n t j j ,mm, aaaa ;3 } ;4 . . .5 Date D[3 ]={{2 ,1 ,1923} ,{23 ,12 ,2004} ,{13 ,01 ,2011}} ;
on ne peut pas copier le tableau par l’opérateur d’affectation :Date T[3]=D; (INTERDIT)lors de passage du tableau en paramètre d’une fonction, lesdonnées structurées ne sont pas copiées
Programmation ImpérativeStructures de données (Facultatif)
Structures et tableaux
Tableaux de structures
1 s t r u c t Date {2 i n t j j ,mm, aaaa ;3 } ;4 . . .5 Date D[3 ]={{2 ,1 ,1923} ,{23 ,12 ,2004} ,{13 ,01 ,2011}} ;
comment accéder au mois de la 2ème date ?
D[1].mm
D[2] est-il passé par copie d’adresse ou par copie de données ?D est-il passé par copie d’adresse ou par copie de données ?
Programmation ImpérativeStructures de données (Facultatif)
Structures et tableaux
Tableaux de structures
1 s t r u c t Date {2 i n t j j ,mm, aaaa ;3 } ;4 . . .5 Date D[3 ]={{2 ,1 ,1923} ,{23 ,12 ,2004} ,{13 ,01 ,2011}} ;
comment accéder au mois de la 2ème date ? D[1].mm
D[2] est-il passé par copie d’adresse ou par copie de données ?D est-il passé par copie d’adresse ou par copie de données ?
Programmation ImpérativeStructures de données (Facultatif)
Structure et pointeur
Plan
7 Structures de données (Facultatif)Structures et fonctionsStructures et tableauxStructure et pointeurStructure et allocation dynamique
Programmation ImpérativeStructures de données (Facultatif)
Structure et pointeur
Champs pointeur dans une structure
Les champs pointeurs dans une structure permettent de stockerl’adresse de n’importe quelle donnée (scalaire, tableau, structure)
Syntaxestruct nomStruct {
type1 *champ1;type2 champ2;
};
champ1 contient l’adresse d’une donnée de type type1type1 est n’importe quel type connu (nomStruct compris)
Programmation ImpérativeStructures de données (Facultatif)
Structure et pointeur
Exemple
1 s t r u c t Etud i an t {2 char ∗nom ;3 Date a n n i v e r s a i r e ;4 Etud i an t ∗binome ;5 } ;6 . . .7 Etud i an t e1={" b e r i o " , {1 . 3 . 1987}}8 Etud i an t e2={" l e f o r t " , {12 ,1 ,1988}} ;9 e1 . binome=&e2 ;10 e2 . binome=&e1 ;
Programmation ImpérativeStructures de données (Facultatif)
Structure et allocation dynamique
Plan
7 Structures de données (Facultatif)Structures et fonctionsStructures et tableauxStructure et pointeurStructure et allocation dynamique
Programmation ImpérativeStructures de données (Facultatif)
Structure et allocation dynamique
Allocation dynamique de structure
Comme pour les types de base (int, double, ...) il est possible defaire de l’allocation dynamique de données structurées.
RemarqueIl suffit d’utiliser l’allocation avec new et la libération avec delete.
Exemplestruct Date {int jj,mm,aaaa;};Date *T= new Date[3];...delete [] T;
Programmation ImpérativeStructures de données (Facultatif)
Structure et allocation dynamique
Allocation dynamique de structure
Comme pour les types de base (int, double, ...) il est possible defaire de l’allocation dynamique de données structurées.
RemarqueIl suffit d’utiliser l’allocation avec new et la libération avec delete.
Exemplestruct Date {int jj,mm,aaaa;};Date *T= new Date[3];...delete [] T;
Programmation ImpérativeStructures de données (Facultatif)
Structure et allocation dynamique
Un exemple plus complexe
En cuisine, un plat a un nom. Il est composé d’un nombrequelconque d’ingrédients. On fixera le nombre maximumd’ingrédients à 100. Chaque ingrédient a un nom et un prix. Ondéfinit les structures plat et ingrédient.
1 s t r u c t i n g r e d i e n t {2 char nom [ 3 2 ] ;3 f l o a t p r i x ;4 } ;5 s t r u c t p l a t {6 char nom [ 3 2 ] ;7 i n t nb ; // l e nombre d ’ i n g r é d i e n t s connus du p l a t8 i n g r e d i e n t l i s t e [ 1 0 0 ] ; // l e t a b l e a u des i n g r é d i e n t s9
10 } ;
Programmation ImpérativeStructures de données (Facultatif)
Structure et allocation dynamique
Un exemple plus complexeOn définit les fonctions suivantes pour les ingrédients :creerIngredient pour permettre à l’utilisateur de saisir lescaractéristiques d’un ingrédient afficheIngredient pour afficher àl’écran les caractéristiques d’un ingrédient
1 vo id c r e e r I n g r e d i e n t ( i n g r e d i e n t ∗ i n g ){2 s t d : : cout<<" donnez l e nom de l ’ i n g r e d i e n t \n" ;3 s t d : : c in >> (∗ i n g ) . nom ;4 s t d : : cout<<" donnez l e p r i x de l ’ i n g r e d i e n t \n" ;5 s t d : : c in >>(∗ i n g ) . p r i x ;6 }7
8 vo id a f f i c h e I n g r e d i e n t ( i n g r e d i e n t ∗ i n g ){9 s t d : : cout<<"nom de l ’ i n g r e d i e n t : " ;10 s t d : : cout<< ing−>nom<<"\n" ;11 s t d : : cout<<" p r i x de l ’ i n g r e d i e n t : " ;12 s t d : : cout<<ing−>p r i x <<"\n" ;13 }
Programmation ImpérativeStructures de données (Facultatif)
Structure et allocation dynamique
Un exemple plus complexe
On définit les fonctions suivantes pour les plats : creerPlat pourpermettre à l’utilisateur de saisir les caractéristiques d’un plataffichePlat pour afficher à l’écran les caractéristiques d’un plat
1 vo id c r e e r P l a t ( p l a t ∗ p ){2 s t d : : cout<<" donnez l e nom du p l a t \n" ;3 s t d : : c in >> (∗p ) . nom ;4 (∗p ) . nb = 0 ;5 }6 vo id a f f i c h e P l a t ( p l a t ∗p ){7 s t d : : cout<<"nom du p l a t : " ;8 s t d : : cout<< p−>nom<<"\n" ;9 i n t n =p−>nb ; i n t i ;10 s t d : : cout<<"nb d ’ i n g r é d i e n t s : "<<n<<"\n" ;11 f o r ( i =0; i <n ; i ++)12 a f f i c h e I n g r e d i e n t (&(p−>l i s t e ) [ i ] ) ;13 }
Programmation ImpérativeStructures de données (Facultatif)
Structure et allocation dynamique
Un exemple plus complexe
ajouteIngredient pour ajouter un ingrédient à un plat1 vo id a j o u t e I n g r e d i e n t ( i n g r e d i e n t ∗ ing , p l a t ∗ p ){2 i f (p−> nb < 100){3 (p−>nb)++;4 // on a j o u t e i ng5 (p−>l i s t e ) [ p−>nb −1]=∗ i n g ;6 }7 }
Programmation ImpérativeStructures de données (Facultatif)
Structure et allocation dynamique
Un exemple plus complexe
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 " , 34} , i 2= {" o e u f s " , 5} ;3 p l a t 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 (& i1 ,&p ) ;6 a j o u t e I n g r e d i e n t (& i2 ,&p ) ;7 a f f i c h e P l a t (&p ) ;8 re tu rn 0 ;9 }