hlin202 p.giorgi m.montassier · 2020-01-21 · 1introduction 2basesdulangagec++...

431
Programmation Impérative Programmation Impérative HLIN202 P. Giorgi M. Montassier Université de Montpellier

Upload: others

Post on 12-Aug-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

Programmation Impérative

Programmation ImpérativeHLIN202

P. Giorgi M. Montassier

Université de Montpellier

Page 2: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 3: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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)

Page 4: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 5: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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)

Page 6: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

Programmation ImpérativeIntroduction

Langage de programmation

Plan

1 IntroductionLangage de programmationProgrammation impérativeLes langages C/C++Les erreurs

Page 7: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 8: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 9: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 10: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 11: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 12: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 13: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

Programmation ImpérativeIntroduction

Programmation impérative

Plan

1 IntroductionLangage de programmationProgrammation impérativeLes langages C/C++Les erreurs

Page 14: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 15: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 16: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

...

Page 17: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 18: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 19: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 20: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

Programmation ImpérativeIntroduction

Les langages C/C++

Plan

1 IntroductionLangage de programmationProgrammation impérativeLes langages C/C++Les erreurs

Page 21: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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)

Page 22: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 23: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 24: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 25: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 26: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 27: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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++

Page 28: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 29: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 30: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 31: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 32: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

Programmation ImpérativeIntroduction

Les erreurs

Plan

1 IntroductionLangage de programmationProgrammation impérativeLes langages C/C++Les erreurs

Page 33: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

Programmation ImpérativeIntroduction

Les erreurs

Les erreurs

Trois types d’erreursErreur de syntaxeErreur de conceptionErreur d’exécution

Page 34: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 35: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 ;

Page 36: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 37: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 ! ! !

Page 38: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 39: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 40: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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)

Page 41: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 42: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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)

Page 43: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 44: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 45: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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}

Page 46: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 47: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 48: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 49: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 ;

Page 50: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 51: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 52: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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) :

Page 53: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 54: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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;

Page 55: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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;

Page 56: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 57: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 58: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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...

Page 59: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 60: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 61: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 62: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 63: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 64: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 65: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 66: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 67: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 = ???

Page 68: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 69: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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)

Page 70: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 71: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 72: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 ...

Page 73: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 74: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 75: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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)

Page 76: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 77: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 78: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 79: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 80: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 81: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 82: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 83: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 84: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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;

Page 85: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 86: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 87: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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;

Page 88: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 89: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 90: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 91: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 92: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 93: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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)

Page 94: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 95: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 96: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 97: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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)

Page 98: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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)

Page 99: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 100: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 ;

Page 101: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 102: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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)

Page 103: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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)

Page 104: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 105: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 106: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 107: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 108: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 109: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 110: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 111: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 112: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 113: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 114: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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é.

Page 115: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 116: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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++

Page 117: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 118: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 119: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 120: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 121: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 122: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 123: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 124: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 125: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

...

Page 126: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 127: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 128: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 129: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 130: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 131: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

...

Page 132: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

...

Page 133: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 134: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 135: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 . . .

Page 136: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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é.

Page 137: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 . . .

Page 138: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 . . .

Page 139: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 140: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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)

Page 141: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

Programmation ImpérativeFonctions

Introduction

Plan

4 FonctionsIntroductionDéfinitionAppel d’une fonctionPortée des variablesDéfinir des constantesOù placer les fonctionsRécursivité

Page 142: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 143: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 144: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 145: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 146: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 147: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 148: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 149: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

Programmation ImpérativeFonctions

Définition

Plan

4 FonctionsIntroductionDéfinitionAppel d’une fonctionPortée des variablesDéfinir des constantesOù placer les fonctionsRécursivité

Page 150: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 151: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 152: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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()

Page 153: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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();

Page 154: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 155: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 é

Page 156: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 157: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 158: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 159: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 160: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 161: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 162: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

Programmation ImpérativeFonctions

Appel d’une fonction

Plan

4 FonctionsIntroductionDéfinitionAppel d’une fonctionPortée des variablesDéfinir des constantesOù placer les fonctionsRécursivité

Page 163: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 164: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 165: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 166: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 167: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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)

Page 168: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 169: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 170: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

Programmation ImpérativeFonctions

Portée des variables

Plan

4 FonctionsIntroductionDéfinitionAppel d’une fonctionPortée des variablesDéfinir des constantesOù placer les fonctionsRécursivité

Page 171: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 172: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 173: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 174: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 175: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 176: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 177: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 )

Page 178: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 179: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 180: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 181: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 182: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 183: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 184: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 185: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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).

Page 186: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 187: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 188: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 ! ! !

Page 189: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 190: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 ?

Page 191: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 192: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 193: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 194: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 195: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 196: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

Programmation ImpérativeFonctions

Définir des constantes

Plan

4 FonctionsIntroductionDéfinitionAppel d’une fonctionPortée des variablesDéfinir des constantesOù placer les fonctionsRécursivité

Page 197: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 198: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 199: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 200: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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;

Page 201: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 202: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 203: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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’

Page 204: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 205: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

Programmation ImpérativeFonctions

Où placer les fonctions

Plan

4 FonctionsIntroductionDéfinitionAppel d’une fonctionPortée des variablesDéfinir des constantesOù placer les fonctionsRécursivité

Page 206: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 207: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 208: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 ! ! !

Page 209: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 ! ! !

Page 210: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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...

Page 211: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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);

Page 212: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 213: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 214: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 215: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 ∗/

Page 216: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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).

Page 217: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 ∗/

Page 218: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 219: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

Programmation ImpérativeFonctions

Récursivité

Plan

4 FonctionsIntroductionDéfinitionAppel d’une fonctionPortée des variablesDéfinir des constantesOù placer les fonctionsRécursivité

Page 220: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 221: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 222: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 223: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 224: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 225: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 226: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 227: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 !

Page 228: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 229: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.)

Page 230: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 231: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 232: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 233: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 234: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 235: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 236: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

Programmation ImpérativeFonctions

Récursivité

Récursivité ! ! !

AttentionLa récursivité n’est pas toujours efficace, même si elle est plus facileà exprimer.

Page 237: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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)

Page 238: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

Programmation ImpérativePointeurs

Introduction

Plan

5 PointeursIntroductionLes pointeurs en C++Fonction avec paramètre de type pointeur

Page 239: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 ! ! !

Page 240: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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);

Page 241: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

Programmation ImpérativePointeurs

Introduction

0xFF2246 0xFF2252

x = 3 y = 12

12

3x

y

Page 242: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

Programmation ImpérativePointeurs

Introduction

0xFF2246 0xFF2252

x = 3 y = 12 a= 3 b= 12

12

3x

y 12

3a

b

Appel à ech

Page 243: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 244: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

Programmation ImpérativePointeurs

Introduction

0xFF2246 0xFF2252

x = 3 y = 12

12

3x

y

Appel à ech Exécution de ech

Retour de ech

Page 245: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 !

Page 246: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

Programmation ImpérativePointeurs

Les pointeurs en C++

Plan

5 PointeursIntroductionLes pointeurs en C++Fonction avec paramètre de type pointeur

Page 247: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 248: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 249: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 250: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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).

Page 251: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 252: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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)

Page 253: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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;

Page 254: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 255: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 256: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

Programmation ImpérativePointeurs

Fonction avec paramètre de type pointeur

Plan

5 PointeursIntroductionLes pointeurs en C++Fonction avec paramètre de type pointeur

Page 257: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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=...

Page 258: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 259: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

Programmation ImpérativePointeurs

Fonction avec paramètre de type pointeur

Fonctions avec pointeurs : Exemple 1

ptr

a = 3

Main( ) plusUn( )

Page 260: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

Programmation ImpérativePointeurs

Fonction avec paramètre de type pointeur

Fonctions avec pointeurs : Exemple 1

ptr

a = 3

Appel à plusUn(ptr)

Main( ) plusUn( )

p

Page 261: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 262: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

Programmation ImpérativePointeurs

Fonction avec paramètre de type pointeur

Fonctions avec pointeurs : Exemple 1

ptr

a = 4

Main( ) plusUn( )

Retour de plusUn

Page 263: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 264: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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;}

}

Page 265: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 266: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 267: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 268: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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()

Page 269: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 270: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 271: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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(...)

Page 272: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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;

Page 273: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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)

Page 274: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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;

}

Page 275: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 276: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 277: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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)

Page 278: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

Programmation ImpérativeTableaux

Tableaux statiques

Plan

6 TableauxTableaux statiquesFonction et tableaux statiquesTableaux et pointeursTableaux dynamiquesFonction et tableaux dynamiques

Page 279: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 280: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 281: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 282: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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)

Page 283: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 284: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 285: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 286: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 287: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 288: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 289: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 290: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 291: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 292: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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];

Page 293: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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];

Page 294: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 ! ! !

Page 295: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 296: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 297: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 298: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 299: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 300: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 =

∗ ∗∗ ∗∗ ∗

Page 301: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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]

Page 302: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 303: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 304: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

Programmation ImpérativeTableaux

Fonction et tableaux statiques

Plan

6 TableauxTableaux statiquesFonction et tableaux statiquesTableaux et pointeursTableaux dynamiquesFonction et tableaux dynamiques

Page 305: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 306: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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])

Page 307: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 308: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 309: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 310: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 311: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 312: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 313: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 314: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 315: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 ?

Page 316: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

Programmation ImpérativeTableaux

Tableaux et pointeurs

Plan

6 TableauxTableaux statiquesFonction et tableaux statiquesTableaux et pointeursTableaux dynamiquesFonction et tableaux dynamiques

Page 317: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 318: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 319: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 320: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 321: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 322: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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)

Page 323: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 324: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 325: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 326: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 327: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 328: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

Programmation ImpérativeTableaux

Tableaux dynamiques

Plan

6 TableauxTableaux statiquesFonction et tableaux statiquesTableaux et pointeursTableaux dynamiquesFonction et tableaux dynamiques

Page 329: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 330: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 331: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 332: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 333: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 334: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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];

Page 335: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 336: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 337: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 338: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 339: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 340: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 ] ;

Page 341: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 342: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 ;

Page 343: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 344: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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é.

Page 345: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 346: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 347: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 ?

Page 348: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 349: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 350: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 ;

Page 351: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

Programmation ImpérativeTableaux

Fonction et tableaux dynamiques

Plan

6 TableauxTableaux statiquesFonction et tableaux statiquesTableaux et pointeursTableaux dynamiquesFonction et tableaux dynamiques

Page 352: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 353: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 ! ! !

Page 354: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 355: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 356: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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;

}

Page 357: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 358: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 359: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 360: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 361: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 362: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 363: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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};

Page 364: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 ] ] ;

Page 365: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 ] ] ;

Page 366: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 367: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 368: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 369: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 370: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 371: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 372: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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)

Page 373: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 374: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 375: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 376: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 377: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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)

Page 378: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 379: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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)

Page 380: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 ! ! !

Page 381: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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;

Page 382: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 383: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 384: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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)

Page 385: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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=...

Page 386: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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=...

Page 387: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 388: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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;

Page 389: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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)

Page 390: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 391: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 392: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

Programmation ImpérativeStructures de données (Facultatif)

Copie des structures

RemarqueL’initialisation par recopie fonctionne également

ExemplecompteB cb1;...compteB cb2=cb1;

Page 393: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 394: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 395: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 396: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 397: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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(...)

Page 398: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 399: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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)

Page 400: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 401: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 402: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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)

Page 403: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 404: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 405: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 406: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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;

Page 407: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 . . .

Page 408: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 409: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 410: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 411: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 412: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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;

Page 413: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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}} ;

Page 414: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 415: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 416: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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.

Page 417: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 418: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 419: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 ?

Page 420: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 ?

Page 421: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 422: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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)

Page 423: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 ;

Page 424: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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

Page 425: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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;

Page 426: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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;

Page 427: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 } ;

Page 428: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 429: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 430: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }

Page 431: HLIN202 P.Giorgi M.Montassier · 2020-01-21 · 1Introduction 2BasesdulangageC++ 3Structuresdecontrôle 4Fonctions 5Pointeurs 6Tableaux 7Structuresdedonnées(Facultatif) ProgrammationImpérative

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 }