Apprendre C++ cours
Table des mati?res
1 Introduction 11
1.1 Choix du syst?me d’exploitation . . .. . .. . . . 12
1.1.1 Installer Xubuntu et l’environnement de programmation c++ sur
son ordinateur . . .. . .. . . . . . . . . . 12
1.2 Environnement de programmation . . .. . .. . . 13
1.2.1 Utilisation de commandes dans un terminal . . .. . . 13
1.2.1.1 Les rØpertoires . . .. . .. . . . 14
1.2.1.2 Exercices sur les rØpertoires . . .. . . . . . . 14
1.2.1.3 Les chiers (en exercice) . . .. . . . . . . . . 15
1.2.1.4 La documentation sur les commandes unix . . . . . . . . . 15
1.2.2 Programmer avec l’Øditeur emacs et une fenŒtre de commandes . . . 15
1.2.2.1 ParamØtrage de emacs . . .. . . . . . . . . . 17
I Bases du langage C++ 18
2 Le tout dØbut. Lire le clavier et a cher l’Øcran 19
2.1 A chage dans un terminal . . .. . .. . . . . . . 19
2.2 Lire le clavier . . .. . .. . .. . . . 21
3 DØclaration et a ectation des objets 22
3.1 Objets de base . . .. . .. . .. . . 22
3.1.1 Les dØclarations d’objets de base . . .. . . . . . . . . 22
3.1.2 Initialisation d’un objet de base . . .. . . . . . . . . . 22
3.1.2.1 Remarques . . .. . .. . . . . . 23
3.1.3 A chage des nombres avec une prØcision donnØe . . .. 24
3.1.4 Attention la division Euclidienne . . .. . . . . . . . 24
3.1.5 Pour gØnØrer un nombre entier p alØatoire . . .. . . . 25
3.2 Objets plus ØlaborØs de la classe standard . . .. . . . . . . . 26
3.2.1 Chaines de caract?res (string) . . .. . .. 26
3.2.1.1 Conversion de chi res en chaine de caract?re et inverse-
ment. Solution simple. . .. . .. 26
3.2.2 Nombres complexes . . .. . .. . . . . . . 27
2
3.2.3 Liste d’objets (ou tableau de dimension 1) : vector . . . . . . . . . . 28
3.3 Vecteurs et matrices pour l’alg?bre linØaire avec la librairie Armadillo . . . 30
3.3.1 Quelques fonctions utiles sur les vecteurs et matrices . . . . . . . . 31
3.4 Objets graphiques avec la librairie Root . . .. . . . . . . . . . 32
3.4.1 Commande de compilation . . .. . .. . . 33
3.4.2 Exemple de dØpart qui dessine un cercle . . .. . . . . 33
3.4.3 Quelques objets graphiques . . .. . .. . 36
3.5 SupplØments . . .. . .. . .. . . . . 37
3.5.1 Continuer une ligne de c++ la ligne suivante avec \ . . . . . . . . 37
3.5.2 Sur les types . . .. . .. . .. 38
3.5.2.1 Renommage . . .. . .. . . . . . 38
3.5.2.2 Connaitre le type . . .. . .. . . 38
3.5.3 Quelques opØrations ØlØmentaires . . .. . . . . . . . . 39
3.5.4 Sur les chaines de caract?res . . .. . .. . 39
3.5.4.1 Manipulations. Recherche dans une chaine, extraction . 39
3.5.4.2 Conversion de chi res en chaine de caract?re et inverse-
ment. Solution sophistiquØe (permet des mØlanges de type) 40
3.5.4.3 Conversion nombre chaine de caractere qui reprØsente
le nombre en base 2 . . .. . .. 41
3.5.4.4 Conversion de string vers char* . . .. . . . . 42
3.5.5 Quelques opØrations en base 2 (binaire, les bits) et en base 16 (hexa-
decimale) . . .. . .. . .. . 42
3.5.6 tuple : ensemble d’objets divers . . .. . . . . . . . . . 43
3.5.7 Vecteurs et matrices avec la librairie armadillo . . .. . 44
3.5.7.1 Diagonalisation d’une matrice symØtrique rØelle . . . . . . 44
3.5.7.2 Diagonalisation d’une matrice hermitienne complexe . . . 45
3.5.7.3 Diagonalisation d’une matrice complexe quelconque . . . . 46
4 Les instructions de base 48
4.1 La boucle "for" . . .. . .. . .. . . 48
4.2 Ecrire une condition . . .. . .. . . . . . . . . . 50
4.2.1 Les opØrateurs de comparaison : . . .. . . . . . . . . 50
4.2.2 Les opØrateurs logiques . . .. . .. . . . 51
4.2.3 Remarque . . .. . .. . .. . 51
4.3 La boucle do {..} while (..); . . .. . .. . . . . 51
4.4 La boucle while (..) {..}; . . .. . .. . . . . . . 52
4.5 L’instruction if . . .. . .. . .. . 52
4.6 break : pour sortir de la boucle. continue : pour sauter l’instruction. . . . . 54
5 Les fonctions 55
5.1 Exemple de fonction qui renvoit un objet . . .. . . . . . . . . 55
5.2 Exemple de fonction qui ne renvoit rien . . .. . . . . . . . . . 56
5.3 Param?tres des fonctions par rØfØrence . . .. . . . . . . . . . 57
5.4 La surcharge des fonctions. . . .. . .. . . . . . 58
5.4.1 Exemple : . . .. . .. . .. . 58
6 Les pointeurs 60
6.1 DØclaration et a ectation d’un pointeur . . .. . . . . . . . . . 60
6.1.1 Param?tres de la fonction main() . . .. . . . . . . . . 61
6.2 Allocation dynamique de la mØmoire . . .. . .. 62
6.2.0.1 Remarques . . .. . .. . . . . . 64
6.3 Utilisation des pointeurs avec la librairie graphique ROOT . . . . . . . . . 65
6.3.1 Utiliser une liste d’ellipses . . .. . .. . . 65
6.3.1.1 Remarques : . . .. . .. . . . . 66
6.3.2 Utiliser un pointeur sur l’ellipse . . .. . . . . . . . . . 66
6.3.2.1 Remarques : . . .. . .. . . . . . 67
7 CrØation d’une classe 69
7.1 Exemple (Øtape1) . . .. . .. . .. . 69
7.1.1 Commentaires . . .. . .. . . . . . . . . . 70
7.2 Exemple (Øtape2) . . .. . .. . .. . 70
7.2.1 Commentaires . . .. . .. . . . . . . . . . 71
7.3 Utilisation de pointeurs sur objets . . .. . .. . . 73
8 Les chiers 74
8.1 Ecriture de donnØes dans un chier . . .. . .. . 74
8.1.0.1 Remarque : . . .. . .. . . . . . 74
8.1.0.2 Exercice . . .. . .. . . . . . . . 75
8.2 Lecture de donnØes depuis un chier . . .. . .. 75
8.2.0.1 Remarques : . . .. . .. . . . . 76
8.3 SupplØments sur les chiers . . .. . .. . . . . . 76
9 Micro-projets 1 78
9.1 Que faire avant de programmer? . . .. . .. . . 78
9.1.1 Quelques notions de qualitØ en informatique . . .. . . 79
9.2 Suite de Syracuse . . .. . .. . .. . 79
9.3 Pendule simple . . .. . .. . .. . . 81
9.4 La fractale du dragon . . .. . .. . . . . . . . . . 82
9.5 Images subliminales . . .. . .. . .. 84
9.6 Equation de la chaleur . . .. . .. . . . . . . . . 84
9.7 Le jeu puissance 4 . . .. . .. . .. . 85
9.8 Le jeu de la vie . . .. . .. . .. . . 85
9.9 Algorithme de Monte-Carlo pour le mod?le d’Ising . . .. . . . 85
9.9.1 Algorithme de Monte-Carlo . . .. . .. . 86
9.10 Zeros d’un polynome alØatoire . . .. . .. . . . . 87
II ComplØments sur le langage C++ 89
10 Autres environnements 90
10.1 Programmer avec l’environnement codeblocks . . .. . . . . . 90
11 Ecrire et lire des donnØes en binaires sur un chier (ou un ux) 92
11.1 Bits, octets, bytes, taille d’un objet . . .. . .. . 92
11.2 Fichiers en format texte . . .. . .. . . . . . . . 93
11.3 Fichiers en format binaire . . .. . .. . . . . . . 94
11.3.0.1 Exemple . . .. . .. . . . . . . 94
11.3.0.2 Remarques . . .. . .. . . . . . 95
12 Quelques commandes utiles 96
12.0.1 La commande system . . .. . .. . . . . . 96
13 Classes (suite) 97
13.1 SurdØ nitions d’opØrateurs . . .. . .. . . . . . . 97
13.1.1 Exemple d’opØrateur binaire . . .. . .. . 97
13.1.2 Commentaire . . .. . .. . . . . . . . . . 98
13.1.3 Exemple d’un opØrateur unaire . . .. . . . . . . . . . 98
13.1.4 Commentaires . . .. . .. . . . . . . . . . 99
13.2 Fonctions amies . . .. . .. . .. . . 99
13.2.1 Exemple . . .. . .. . .. . . 99
13.2.2 Commentaire . . .. . .. . . . . . . . . . 100
13.2.3 Exemple de cout << . . .. . .. . . . . . 100
13.3 Vecteurs de taille variable . . .. . .. . . . . . . 101
13.3.1 Constructeur par recopie . . .. . .. . . . 101
13.3.2 OpØrateur d’a ectation = . . .. . .. . . 102
14 Gestion de projets avec chiers .h, Make le, Git et Doxygen 104
14.1 Projet avec plusieurs chiers, chier .h . . .. . . . . . . . . . 104
14.1.0.1 RØsultat du programme : . . .. . . . . . . . 104
14.1.0.2 Code c++ . . .. . .. . . . . . . 104
14.1.0.3 Commandes de compilation . . .. . . . . . . 106
14.2 Un programme Make le pour gØrer la compilation . . .. . . . 107
14.2.1 Un programme Make le plus pratique . . .. . . . . . . 108
14.2.2 Generation automatique du chier make le? . . .. . . 109
14.3 Gestion de versions d’un projet avec Git . . .. . . . . . . . . 109
14.3.0.1 Utilisation de Git sur son ordinateur . . .. . 109
14.4 Collaboration et partage de projets sur internet avec GitHub . . . . . . . . 109
14.5 Commenter et documenter un projet avec Doxygen . . .. . . 110
14.5.1 CrØation et consultation de la documentation . . .. . 110
14.5.1.1 CrØation de la documentation html . . .. . . 110
14.5.1.2 consultation de la documentation . . .. . . . 110
14.5.2 conventions pour Øcrire les commentaires . . .. . . . . 110
14.5.2.1 Page principale : . . .. . .. . . 110
14.5.2.2 Le rØsultat suivant : . . .. . .. 112
14.5.3 Fichier de commentaires avec la syntaxe markdown . . . . . . . . . 114
14.6 Compte rendu de projet en pdf et html avec Lyx . . .. . . . . 115
15 Interface interactive pour le C++ 116
III ComplØments sur les librairies du langage C++ 117
16 Librairie Root : graphisme et autre.. (complØments) 119
16.1 Graphisme de base 2Dim . . .. . .. . . . . . . . 119
16.1.1 Objets graphiques . . .. . .. . . . . . . . 119
16.1.2 Dessiner dans plusieurs fenŒtres . . .. . . . . . . . . . 121
16.1.3 Un cadre avec des axes graduØs : DrawFrame . . .. . . 121
16.1.4 Un seul axe graduØ : TGaxis . . .. . .. . 123
16.1.5 Couleurs . . .. . .. . .. . . 123
16.2 Graphisme 1D . . .. . .. . .. . . . 124
16.2.1 Courbe a partir de l’expression d’une formule y = f (x) : TF1 . . . 125
16.2.1.1 Exemple partir d’une formule littØrale : . . . . . . . . . 125
16.2.1.2 MŒme rØsultat partir d’une fonction C++ . . . . . . . . 125
16.2.2 Histograme 1Dim ou Courbe y (x) partir de tableau de valeurs
y (i) : TH1D . . .. . .. . .. 126
16.2.2.1 ReprØsentation en diagramme Camembert (Pie Chart) . 127
16.2.3 ReprØsentation d’un tableau de valeurs y (i) sous forme de camem-
bert ou Pie . . .. . .. . . . . . . . . . 127
16.2.4 Courbe paramØtrØe (x(i),y (i)) avec axes partir de tableaux de
valeurs x(i),y (i) : TGraph . . .. . .. . 128
16.2.5 Courbe paramØtrØe (r (i),? (i)) reprØsentØe en coordonnØes polaire
partir de points r (i),? (i) . . .. . .. . . 129
16.2.6 CrØe histogramme ou fonction 1D y = f (x) par tirage alØatoire et
ajustement par une formule : TF1 . . .. . . . . . . . . 131
16.2.7 Superposition d’histogrammes : THStack . . .. . . . . 132
16.3 Graphisme 2D . . .. . .. . .. . . . 133
16.3.1 Surface 2Dim : z = f (x,y) partir d’un tableau de valeurs z (i,j) :
TH2D . . .. . .. . .. . . . 133
16.3.2 Surface 2D a partir de l’expression d’une formule z = f (x,y) : TF2 134
16.3.3 Surface 2D z (x,y) partir d’un ensemble arbitraire de points x(i),y (i),z (i) :
TGraph2D . . .. . .. . .. . 135
16.3.4 Champ de vecteur en dimension 2 . . .. . . . . . . . . 136
16.4 Graphisme 3D . . .. . .. . .. . . . 137
16.4.1 Des points dans R3 : TPolyMarker3D . . .. . . . . . . 137
16.4.2 Surface dØterminØe par f (x,y,z) = 0 : TF3 . . .. . . 138
16.4.3 Fonction f (x,y,z) ? R : TH3 . . .. . .. 139
16.4.3.1 Dessin d’une surface de niveau souhaitØe . . . . . . . . . . 140
16.4.3.2 Dessin d’une courbe sur une surface . . .. . 142
16.5 Utilisation de la souris . . .. . .. . . . . . . . . 143
16.5.1 Pour qu’un objet graphique capture les evenements souris . . . . . 145
16.5.2 Pour gØrer la souris lorsque le programme calcule . . . . . . . . . . 146
16.6 Comment crØer un chier gif animØ . . .. . .. . 146
16.7 Boutons de commandes (Widgets et GUI) . . .. . . . . . . . 147
16.7.1 Exemple simple avec quelques widgets . . .. . . . . . 147
16.7.2 Exemple simple avec un menu, des zones, des tabs et une fenetre
secondaire . . .. . .. . .. . 156
16.7.3 Construire une interface de widgets la souris avec GuiBuilder . . . 162
16.8 Autres trucs . . .. . .. . .. . . . . 162
16.8.0.1 Nombre alØatoire avec Root . . .. . . . . . . 162
16.8.0.2 Quelques Options gØnØrales de Root . . .. . 162
17 Mesure du temps 163
17.1 Mesure de la date et du temps ØcoulØ . . .. . .. 163
17.1.0.1 Mesure tr?s prØcise du temps : . . .. . . . . 163
17.1.0.2 A chage de la date . . .. . .. 164
17.2 Attendre . . .. . .. . .. . . . . . . 164
17.2.1 Attendre une certaine durØe . . .. . .. . 164
17.2.2 Attendre jusqu’ une certaine date . . .. . . . . . . . 164
18 IntØgrer des Øquations di Ørentielles ordinaires (EDO) avec la librairie
ODEINT 166
19 Lecture et Øcriture d’un chier son (audio) de format WAV 171
19.0.0.1 Introduction . . .. . .. . . . . 171
19.0.0.2 Travail prØalable pour le projet C++ . . .. . 171
19.0.1 Programme pour Øcrire un chier WAV : . . .. . . . . 171
19.0.2 Programme pour lire un chier WAV : . . .. . . . . . 174
20 Gestion de la carte son (audio temps rØel) avec la librairie sndio 176
20.1 Installation ( faire la premi?re fois) . . .. . .. . 176
20.1.0.1 Travail prØalable pour le projet C++ . . .. . 177
20.2 Utilisation du micro (entrØe) et du haut-parleur (sortie) . . .. 178
20.2.1 Le micro . . .. . .. . .. . . 178
20.2.1.1 Exemple : dØtection de note de musique en temps rØel . . 179
20.2.2 Le haut-parleur . . .. . .. . . . . . . . . 182
21 Plusieurs programmes en parall?le qui communiquent, avec thread 183
21.1 Lancement de threads ou processus . . .. . .. . 184
21.1.0.1 Commande de compilation : . . .. . . . . . . 184
21.1.0.2 Commentaires . . .. . .. . . . 185
21.1.0.3 Lancer un thread d’une fonction membre de classe . . . . 185
21.1.0.4 Lancer une liste de thread (tableau) . . .. . 186
21.1.0.5 Lancer une liste de thread (vector) . . .. . . 186
21.2 Mutex pour annoncer occupØ/libre . . .. . .. . 187
21.2.0.1 Introduction . . .. . .. . . . . 187
21.2.0.2 Remarques . . .. . .. . . . . . 187
21.2.0.3 Exemple . . .. . .. . . . . . . . 188
21.2.0.4 RØsultat : . . .. . .. . . . . . . 188
21.3 Communications : variables conditionnelles pour rØveiller un programme en
attente . . .. . .. . .. . . . . . . . 189
21.3.0.1 Exemple de base oø un thread endormi est reveillØ par un
autre. . . .. . .. . . . . . . . . 189
21.3.0.2 Remarques . . .. . .. . . . . . 190
22 Messages MIDI Musical temps rØel avec la librairie sndio 196
22.1 Installation ( faire la premi?re fois) . . .. . .. . 196
22.2 Exemple ØlØmentaire sur l’envoi et reception de messages MIDI . . . . . . . 196
22.3 Exemple d’envoie de message MIDI un synthØtiseur . . .. . 200
22.4 Reception de notes midi depuis un piano Ølectrique . . .. . . 204
23 Messages MIDI (Musique) sur chier 207
23.1 Structure d’un chier SMF . . .. . .. . . . . . . 207
23.1.1 Premier bloc (header chunk) . . .. . .. . 207
23.1.2 Bloc de piste (Track chunk) . . .. . .. . 208
23.1.3 Message Midi standard M . . .. . .. . . 209
23.1.4 Message mØta Øv?nement M (pour les signaux midi sur chier et non
pas temps rØel) . . .. . .. . . . . . . . . 209
23.1.5 Message du syst?me (System Exclusive Message (SysEx)) M . . . . 209
23.1.6 Message temps rØel M (pour les signaux midi temps rØel et non sur
chier) . . .. . .. . .. . . . 210
23.1.7 Control Change pour les message x1 = xBc . . .. . . 210
23.1.8 type pour les Meta-Evenement . . .. . .. 211
23.1.9 Systeme exclusif Messages (Sysex) . . .. . . . . . . . . 212
24 Autres librairies conseillØes (?) 213
24.1 alg?bre linØaire . . .. . .. . .. . . 213
24.2 Images, vidØos, graphisme et boites de dialogues . . .. . . . . 213
25 Le traitement d’images et de vidØos avec la librairie OpenCV 214
25.1 Commande de compilation . . .. . .. . . . . . . 214
25.2 Lecture et ecriture de chiers images . . .. . .. 214
25.2.0.1 Fonctions utiles sur les images . . .. . . . . 215
25.3 Utilisation de la souris . . .. . .. . . . . . . . . 216
25.4 Lecture et Øcriture d’un chier video ou de la webcam . . .. . 219
25.5 DØtection d’objet par leur couleur . . .. . .. . . 220
25.6 DØtection et suivit d’objet de couleur avec l’algorithme CamShift . . . . . 222
26 Conversion d’un programme C++ en programme Java Script avec em-
scripten 230
26.1 Installation . . .. . .. . .. . . . . 230
26.2 Conversion C++ -> Javascript . . .. . .. . . . 231
26.2.1 Autres exemples . . .. . .. . . . . . . . . 231
26.3 Pour connecter un code C++ et une interface html . . .. . . 231
26.3.1 Exemple de base . . .. . .. . . . . . . . 231
26.3.2 Exemple avec des Øchanges plus complexes . . .. . . . 234
26.3.2.1 Exemple . . .. . .. . . . . . . . 234
26.4 Exemples de forms en html . . .. . .. . . . . . 237
26.5 Appeler des fonctions js depuis c++ et des fonctions c++ depuis js . . . . 241
26.6 Autres remarques . . .. . .. . .. . 242
26.7 Graphisme . . .. . .. . .. . . . . . 243
26.8 Notes musicales en html5 . . .. . .. . . . . . . . 243
26.9 Utilisation des capteurs d’un smartphone . . .. . . . . . . . . 243
26.10Utilisation de chiers . . .. . .. . . . . . . . . . 243
27 CrØation automatique de Make le et d’interface graphique utilisateur
(GUI) 245
27.1 Mode d’emploi . . .. . .. . .. . . 245
27.1.0.1 Fonctionnement nal des commandes . . .. . 245
27.1.0.2 sortie du programme makef . . .. . . . . . . 246
27.1.1 Instructions pour placer les widgets . . .. . . . . . . . 246
28 A propos des licences 248
DØroulement des sØances en Licence L3 de physique, 20172018
Suivre le didacticiel Partie I Bases du langage C++ I, en binome ou seul.
Lire l’introduction 1, puis passer la partie I, I.
Faire tous les exercices demandØs. Pour les exercices marquØs par (*). Par exemple tabulation (*), Øcrire un programme et le montrer l’enseignant (ou montrer plusieurs exercices la fois).
On peut seulement lire rapidement les parties appelØes supplØments .
Ce didacticiel se termine par la rØalisation d’un microprojet en Section 9. Choisir parmi la liste proposØe. RØdiger un compte rendu de 2 ou 3 pages avec lyx, avec des images et des formules. Exporter en pdf et en xhtml et le montrer l’enseignant, avec un oral de 5mn-10mn.
Optionellement, suivre le didacticiel Partie II ComplØments du langage
C++ II.
Choisir un projet d’expØrimentation numØrique. Voir la page projets. A la derni?re sØance, chaque Øtudiant (ou binome) prØsente son projet sur vidØo projecteur, pendant 15 20 mn, l’ensemble de la classe.
Cette prØsentation devra Œtre prØparØe avec (qui permet de crØer des documents scienti ques) et exportØe en html (avec LyxHtml) ou en pdf.
Pour apprendre Lyx, voici un document en pdf qui sert d’exemple et d’exercice. Voici le mŒme document en html, qui vous servira Øventuellement pour copier/coller.
Chapitre 1 Introduction
Ce didacticiel vous permettra d’apprØhender le langage de programmation C++ (version C++11) et ses avantages. Dans ce didacticiel, les exercices marquØs par (*) seront vØri Øs par l’enseignant pendant les sØances. Il y a de nombreux liens html qui renvoie vers plus d’informations.
Le grand avantage du langage C++ par rapport au langage C est la tion objet. On peut utiliser des objets appartenant des classes dØj existantes ou des classes que l’on a fabriquØ soi-mŒme. Par exemple, il existe la classe des nombres complexes. Les objets appartenant cette classe sont des nombres complexes. Il nous su ra de dØclarer trois objets a, b et c comme appartenant la classe des nombres complexes, et l’on pourra directement Øcrire a=b+c ou n’importe quelle autre expression mathØmatique. Comme autre exemple, il y a la classe de matrice complexe : on peut dØclarer trois objets A, B et C appartenant cette classe et Øcrire A=B+C ou n’importe quelle autre expression mathØmatique matricielle.
Pourquoi enseigner le C++ l’universitØ, dans la li?re physique ? d’une part c’est un langage qui est tr?s bien adaptØ pour la simulation ou l’analyse de probl?mes physiques et de fa on plus gØnØrale pour le travail scienti que. Dans les laboratoires il a remplacØ peu peu le langage fortran. Le langage python est un autre langage qui utilise aussi des classes et est aussi tr?s utilisØ dans le domaine scienti que. Un programme en python est peut Œtre plus simple mettre en oeuvre qu’un programme en C++, c’est une histoire de goßt et d’habitude, mais il est aussi beaucoup plus lent l’exØcution. Un avantage du langage python est qu’il est interprØtØ : on peut exØcuter un programme ligne apr?s ligne alors que le langage C++ est compilØ : un programme appelØ compilateur le transforme en langage machine ( chier exØcutable) avant qu’il ne soit exØcutØ et cela le rend rapide. La derni?re version C++11 fait du C++ un langage aussi conviviale et simple d’utilisation que le langage python (et plus rapide!).
Nouvelles version du C++:les rØcentes versions puis C++14, C++17, C++20 ont pour vocation de rendre le C++ plus facile apprendre et toujours performant. RØfØrences :
Sur le web :
11
voici un site tr?s utile : Il contient un de tr?s bonne qualitØ, oø les exemples peuvent Œtre essayØ en ligne (avec la petite ic ne edit & rundroite de example, essayez par exemple sur setprecision)!. Il contient aussi une compl?te au langage C++.
Un autre site en fran ais ou en anglais : . Une fa on pratique de se documenter sur une fonction prØcise est d’utiliser le moteur de recherche de google. Par exemple pour a cher un nombre avec une certaine prØcision numØrique, si vous ne savez pas comment faire, tapez quelques mots clef comme a chage precision c++ dans la fenŒtre de recherche de google, qui vous am?nera sur une page de forum avec un exemple. Vous y verrez que la fonction utiliser est setprecision. Ensuite pour avoir une bonne documentation sur cette fonction et des exemples que l’on peut copier/coller, tapez toujours dans google cplusplus setprecision ce qui vous am?ne une page de documentation.
Signalons le cours en ligne en francais sur le C++ de Coursera sur : ce sont des courtes, ou Cours de C++ de OpenClassRoom en fran ais. La page web de auteur du langage C++, et en particulier la FAQ sur le C++11
Un MOOC sur Linux. Un MOOC sur le C++. Un autre MOOC sur le C++.
Livre pour le langage C++ :
Programmer en C++ de Claude Delannoy, Øditions Eyrolles
The C++ programming langage de Bjarne Stroustroup, 4eme Ødition.
Livre pour le langage C : Le langage C de B.W. Kernighan et D.M. Ritchie edition Masson.
1.1 Choix du syst?me d’exploitation
Ce didacticiel est indØpendant du syst?me d’exploitation. Cependant en sØance de TP on travaille avec linux et plus particuli?rement avec la distribution ou Ubuntu. On conseille cette distribution gratuite qui peut Œtre installØe sur votre ordinateur personnel en suivant ce lien :
Il y a cependant possibilitØ d’utiliser d’autres syst?mes comme windows, mac-os, etc
Dans ce didacticiel, nous utiliserons les logiciels et librairies suivantes qui sont en gØnØral tØlØchargeables depuis votre distribution :
1.1.1 Installer Xubuntu et l’environnement de programmation c++
sur son ordinateur
Si votre ordinateur marche avec windows, vous pouvez installer rajouter ubuntu (linux) soit avec une machine virtuelle virtualbox ou installer Ubuntu en double boot (Suivre les instructions sur ) ou installer directement ubuntu sous windows et doc sur WSL.
Si ubuntu (linux) est dØj installØ sur votre ordinateur, il faut installer les librairies requises pour ce didacticiel. Pour cela, ouvrir un terminal et Øcrire, l’une apr?s l’autre les lignes suivantes :
sudo apt-get install -y root-system # librairie Root du Cern
sudo apt-get install -y emacs emacs-goodies-el global clang auto-complete-el
cscope-el # logiciel pour recherche de fonctions etc sudo apt-get install -y libarmadillo-dev # C++ linear algebra
library sudo apt-get install -y libboost-dev sudo apt-get install -y libboost-all-dev
Autre info:.
1.2 Environnement de programmation
Avec un petit exemple nous allons voir comment :
1. Øcrire le code d’un programme en C++
2. le compiler, c’est dire que l’ordinateur traduit le programme C++ en un programme exØcutable (en langage machine) qu’il pourra exØcuter ensuite.
3. exØcuter le programme
4. Øventuellement de le dØbugger (cela signi e recherche d’erreurs) : si le programme ne fonctionne pas comme on le dØsire, on l’exØcute instruction apr?s instruction a n de suivre ce qu’il fait pas pas, dans le but de trouver un bug (= une erreur ).
Dans la Section suivante nous e ectuons ces taches avec l’Øditeur et une fenŒtre de commandes (terminal).
1.2.1 Utilisation de commandes dans un terminal
Si vous avez une question sur l’utilisation de ubuntu, par exemple comment ouvrir et utiliser un terminal, Øcrire dans google : ubuntu terminal .
Dans ubuntu, ouvrir une fenŒtre de commandes (ou terminal). Dans cette fenŒtre de commandes, vous pouvez Øcrire des commandes l’ordinateur. Ces commandes sont dans le langage UNIX, syst?me avec lequel fonctionne l’ordinateur. Cette section vous explique les principales commandes de UNIX qu’il faut conna tre : les commandes qui permettent de gØrer l’emplacement et le nom de vos chiers (qui seront par exemples vos programmes en C++).
Il est important de savoir que les chiers sont classØs dans l’ordinateur (sur le disque magnØtique) selon une structure arborescente. Chaque noeud de l’arborescence s’appelle un rØpertoire ou dossier ou directory (en anglais). Dans ces rØpertoires se trouvent des chiers (ou le en anglais).
Par exemple signi e que le chier se trouve dans le rØpertoire aaal qui se trouve lui mŒme dans le rØpertoire phyliphrec, qui se trouve lui mŒme dans
1.2.1.1 Les rØpertoires
Pour conna tre le rØpertoire de votre fenŒtre de commande (le rØpertoire courant) : pwd sur la gure suivante par exemple, le rØpertoire courant est /home/faure
Pour a cher la liste des chiers et des sous rØpertoires du rØpertoire courant :
ls ou ls -als (pour avoir plus de dØtails) Pour changer de rØpertoire : pour aller dans le sous rØpertoire appelØ rep : cd rep pour aller dans le rØpertoire parent : cd ..
pour revenir votre rØpertoire d’origine : cd ou cd ~ Pour crØer un sous rØpertoire appelØ rep : mkdir rep
Pour dØtruire un sous rØpertoire appelØ rep : rm -r rep
1.2.1.2 Exercices sur les rØpertoires
A l’aide des commandes expliquØes ci-dessus :
1. Placez vous dans votre rØpertoire d’origine : cd
2. VØri ez que vous y Œtes bien : pwd
3. Regardez la liste des chiers par : ls , puis avec : ls -als
4. CrØer un rØpertoire du nom : essai VØri er son existence (avec ls).
5. Aller dans ce rØpertoire : cd essai VØri er que vous y Œtes (avec pwd).
6. Revenir dans le rØpertoire d’origine par cd .. VØri ez que vous y etes. DØtruire le rØpertoire essai
1.2.1.3 Les chiers (en exercice)
CrØer un nouveau chier avec l’Øditeur emacs : emacs & Øcrire le texte : salut
Menu : File/Save
Menu : File/Quit
On vØri e le contenu du chier dans la fenŒtre de commandes : more Pour changer le nom du en : mv Pour dØplacer le dans le sous rØpertoire rep :
mkdir rep
mv
Pour copier le dans le rØpertoire parent :
cd rep
cp Pour dØtruire le(s) chiers :
rm cd ..
rm rm -r rep
1.2.1.4 La documentation sur les commandes unix
Pour avoir la documentation sur la commande ls par exemple, taper dans une fenetre de commande : man ls
Voici une documentation sur les commandes possibles bash pour la fenŒtre terminal.
1.2.2 Programmer avec l’Øditeur emacs et une fenŒtre de com-
mandes
1. Dans ubuntu, ouvrir une fenŒtre de commandes (ou terminal). Se placer dans le bon rØpertoire de travail. Pour cela comme expliquØ dans la section prØcØdente, utiliser les commandes pwd (qui dit dans quel dossier on est situØ), ls (qui liste les chiers et dossiers) , cd dossier ( : qui passe au dossier indiquØ), cd .. (qui passe au dossier parent), cd . (qui reste dans le mŒme dossier, c’est inutile), cd (qui revient au dossier de dØpart),
2. Ecrire la commande emacs & qui lance l’Øditeur. Le signe & signi e que le terminal reste utilisable. Dans emacs, une fois pour toutes, cocher dans le menu Options/UseCUAKeys et Options/SaveOptions qui vous permettra d’utiliser les raccourcis clavier C-c C-v pour copier/coller .
3. Dans emacs, ouvrir un nouveau chier qui sera vide la premi?re fois (pour faire cela : Menu/File/Visit New File et ecrire , Valider). Le su xe .cc signi e qu’il contiendra du code C++ (ou peut aussi choisir le su xe .cpp). Dans ce chier, Copier/coller le code suivant :
#include using namespace std; int main() {
cout << "Bonjour!" << endl;
}
et sauvegarder ce chier qui contient le code C++ de votre programme. (Observer les raccourcis clavier proposØs par emacs dans ses menus pour toutes ces commandes : par exemple Save : C-x C-s signi e que les touches Ctrl avec x puis Ctrl avec s. Shell Command M-! signi e les touches Alt avec!).
4. Dans emacs ouvrir un nouveau chier Makefile qui sera vide la premi?re fois. Dans ce chierCopier/coller le code de compilation suivant :
all: g++ -o projet1 -std=c++11 -O3 -Wall -lm
(1.1)
et sauvegarder ce chier qui contient les instructions pour compiler votre programme. Attention : au dØbut de la deuxi?me ligne rajouter un espace de tabulation avant g++. Remarque : on peut basculer d’un chier l’autre dans emacs par le menu Bu ers ou par le clavier avec C-x C-?.
5. Compiler le programme par la commande du menu : Tools/Compile.. qui fait apparaitre en bas de page : make -k que l’on remplace par make all (puis faire entrØe). Si tout se passe bien le dernier message est compilation nished .
6. Remarques : cela a pour e et d’exØcuter la commande de compilation qui se trouve dans le chier Make le : elle dit qu’il faut utiliser le compilateur g++ et qu’ partir du chier il faut crØer en sortie (-o = output ) un chier exØcutable appelØ projet1. On a rajoutØ en option (inutiles dans cet exemple) -std=c++11 qui signi e que on utilise la syntaxe du c++11 et -lm qui signi e que on l’on souhaite utiliser la librairie mathØmatique. L’option -Wall signi e que le compilateur montrera all the Warnings , c’est dire toutes les imperfections dans la syntaxe.
7. Dans le terminal, placez vous dans le rØpertoire qui contient votre projet, vØri ez avec la commande ls qu’il contient le chier exØcutable projet1 , et exØcutez ce chier en Øcrivant : ./projet1
(remarque : ./ signi e le rØpertoire prØsent)
Exercice 1.2.1.
1. Dans le programme ajoutez une erreur, par exemple en enlevant un signe; en n de ligne. Recompiler le programme et observer que le compilateur dØtecte l’erreur et en cliquant sur le message d’erreur, emacs vous place la ligne oø est l’erreur corriger.
2. Dans les instructions ci-dessus nous vous avons proposØ d’utiliser un chier Make le qui sera surtout utile pour les projets de programmation en C++. Vous pouvez plus directement compiler votre programme en Øcrivant dans un terminal la commande de compilation :
g++ -o projet1 -std=c++11 -O3 -Wall -lm
le dØsavantage est que pour corriger l’erreur il faut soit mŒme se placer sur la ligne indiquØe.
Une autre possibilitØ pour compiler est d’Øcrire la commande make all dans le terminal qui a pour e et d’exØcuter le chier Makefile.
3. emacs peut mettre votre programme en forme : pour cela sØlectionnez tout le texte et appuyez sur la touche tabulation. Il appara t des dØcalages de lignes convenables, mais non obligatoires.
4. Remarque : pour Øcrire le programme, la place de emacs vous pouvez utiliser tout autre Øditeur de texte.
1.2.2.1 ParamØtrage de emacs
Voici quelques paramØtrages utiles pour la suite :
En haut du chier .cc rajouter la ligne suivante : // -*- mode:C++; compile-command: "make all" -*-
Cela a pour e et de prØciser la commande de compilation lorsque l’on fait Menu/Tools/Compile
On peut aussi remplacer "make all" par "make all; projet1;" ce qui a pour e et de compiler et de lancer l’exØcutable projet1 Dans le chier ~/.emacs rajouter la ligne : (global-set-key (kbd "") ’compile)
Ainsi il su ra dans emacs d’utiliser la touche f9 pour lancer la commande de compilation.
Autres options, voir developper en c++ sous emacs.
Premi?re partie
Bases du langage C++
18
Chapitre 2
Le tout dØbut. Lire le clavier et a cher l’Øcran
2.1 A chage dans un terminal
Voici un petit programme en C++ qui additionne deux nombres entiers a et b , a ecte le rØsultat dans c et a che le rØsultat l’Øcran.
#include using namespace std;
/* ==============
Programme principal ===================*/ int main()
{ int a,b; // dØclaration des objets a et b de la classe int a=1; // affectation: a prend la valeur 1 b=a+1; // affectation b prend la valeur 2 int c; // dØclaration de l objet c de classe int
c=a+b; // affectation: c prend la valeur a+b c’est dire 3
// affichage l’Øcran:
cout << "la somme de " << a << " et " << b << " vaut "
<< c <<endl;
}
Exercice 2.1.1. Recopiez ce programme dans un chier , modi er la commande de compilation de Makefile pour le compiler et exØcutez le.
19
CHAPITRE 2. LE TOUT D BUT. LIRE LE CLAVIER ET AFFICHER L’ CRAN20
RØsultat du programme : la somme de 1 et 2 vaut 3
Remarque 2.1.2. sur la syntaxe du programme :
1. La classe int permet justement de stocker des nombres entiers. (Cela vient de integer en anglais).
2. Le point virgule sØpare les instructions.
3. Les commentaires doivent dØbuter par //. Le reste de la ligne est alors considØrØ comme un commentaire. Un commentaire n’a aucune in uence sur le programme, il sert en gØnØral expliquer ce que fait le programme pour le rendre comprØhensible au lecteur. Une autre possibilitØ est de commencer le commentaire par /* et de nir quelques lignes apr?s par */.
4. Le dØbut et la n d’un bloc d’instructions sont respectivement { et }
5. "main " veut dire "principal " en anglais. C’est le dØbut du programme principal ou de la fonction principale. Les parenth?ses () signi ent que le programme principal n’utilise aucun param?tre dans cet exemple. Lorsque vous lancez votre programme, son exØcution commence toujours par la premi?re ligne de cette fonction principale qui s’appelle toujours main.
Remarque 2.1.3. sur l’a chage :
1. Pour l’a chage de texte dans un terminal, on utilise l’objet cout. Cet objet cout reprØsente le terminal. Les signes << sont Øvocateurs : on envoit ce qui suit vers l’Øcran. On peut enchainer les objets que l’on envoit l’Øcran en Øcrivant sous la forme : cout << A<<B<<C<<D; . Le symbole endl signi e que l’on va la ligne (end of line = n de ligne).
2. Les caract?res entre guillements " " sont considØrØs comme une cha ne de caract?res et Øcrits tels quels l’Øcran . Par contre les caract?res a, b,c ne sont pas entre . Cela signi e que ce sont des noms d’objets, et qu’il faut a cher le contenu de ces objets (et non pas leur nom).
3. Ce symbole cout appartient la biblioth?que iostream qui est chargØe gr ce la premi?re ligne #include . iostream est un chier dØj prØsent sur l’ordinateur. Ce chier contient des informations sur des commandes C++ d’a chage l’Øcran et de saisie de touches appuyØes au clavier. Iostream vient de l’anglais : Input (=entrØe) , Output (=sortie) , Stream (= ux d’information). En principe pour l’a chage il faudrait Øcrire std::cout car le symbole cout appartient l’espace de nom appelØ std comme standard ; mais la deuxi?me ligne using namespace std; signi e que l’on pourra Øcrire plus simplement cout. (Il peut Œtre utile de ne pas faire cette simpli cation si le mŒme symb le cout est utilisØ pour autre chose par une autre biblioth?que dans un autre espace de nom comme std2 . On pourra alors les distinguer en Øcrivant : std::cout et std2::cout).