programmer c++

Upload: nassim-hmidi

Post on 10-Jul-2015

317 views

Category:

Documents


19 download

TRANSCRIPT

LA PROGRAMMATION POUR... les lves ingnieurs. . . ou les collgiens

dbutants. . . ou conrms

Cours de lcole des Ponts ParisTech - 2008/2009 Renaud Keriven CERTIS - ENPC [email protected] lectronique et programmes : http://certis.enpc.fr/~keriven/Info/

"Ne traitez pas vos ordinateurs comme des tres vivants... Ils naiment pas a !"

"Cet ordinateur ne fait pas du tout ce que je veux !" "Exact... Il fait ce que tu lui demandes de faire !"

TABLE DES MATIRES

TABLE DES MATIRES

Table des matires1 Prambule 1.1 Pourquoi savoir programmer ? . . 1.2 Comment apprendre ? . . . . . . 1.2.1 Choix du langage . . . . . 1.2.2 Choix de lenvironnement 1.2.3 Principes et conseils . . . 7 9 10 10 10 11 13 15 15 17 18 20 21 22 22 23 23 25 25 25 29 31 32 34 37 38 39 42 43 44 44 45

. . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2 Bonjour, Monde ! 2.1 Lordinateur . . . . . . . . . . . . . 2.1.1 Le micro-processeur . . . . . 2.1.2 La mmoire . . . . . . . . . 2.1.3 Autres Composants . . . . . 2.2 Systme dexploitation . . . . . . . 2.3 La Compilation . . . . . . . . . . . 2.4 Lenvironnement de programmation 2.4.1 Noms de chiers . . . . . . . 2.4.2 Debuggeur . . . . . . . . . . 2.4.3 TP . . . . . . . . . . . . . .

3 Premiers programmes 3.1 Tout dans le main() ! . . . . . . . . . 3.1.1 Variables . . . . . . . . . . . . 3.1.2 Tests . . . . . . . . . . . . . . 3.1.3 Boucles . . . . . . . . . . . . 3.1.4 Rcrations . . . . . . . . . . 3.2 Fonctions . . . . . . . . . . . . . . . 3.2.1 Retour . . . . . . . . . . . . . 3.2.2 Paramtres . . . . . . . . . . 3.2.3 Passage par rfrence . . . . . 3.2.4 Porte, Dclaration, Dnition 3.2.5 Variables locales et globales . 3.2.6 Surcharge . . . . . . . . . . . 3.3 TP . . . . . . . . . . . . . . . . . . . 3.4 Fiche de rfrence . . . . . . . . . . . 4 Les 4.1 4.2 4.3

tableaux 47 Premiers tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 Initialisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 Spcicits des tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

TABLE DES MATIRES

TABLE DES MATIRES

4.4

4.5 4.6

4.3.1 Tableaux et fonctions 4.3.2 Aectation . . . . . Rcrations . . . . . . . . . 4.4.1 Multi-balles . . . . . 4.4.2 Avec des chocs ! . . . 4.4.3 Mlanger les lettres . TP . . . . . . . . . . . . . . Fiche de rfrence . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

50 52 53 53 55 57 59 59 63 63 63 63 64 65 65 66 67 68 71 72 72 73 74 74 76 77 77 78 79 79 83 83 83 85 87 87 87 88 88 89 90 91 91 92 93 93

5 Les structures 5.1 Rvisions . . . . . . . . 5.1.1 Erreurs classiques 5.1.2 Erreurs originales 5.1.3 Conseils . . . . . 5.2 Les structures . . . . . . 5.2.1 Dnition . . . . 5.2.2 Utilisation . . . . 5.3 Rcration : TP . . . . . 5.4 Fiche de rfrence . . . .

6 Plusieurs chiers ! 6.1 Fichiers spars . . . . . . . . . 6.1.1 Principe . . . . . . . . . 6.1.2 Avantages . . . . . . . . 6.1.3 Utilisation dans un autre 6.1.4 Fichiers den-ttes . . . . 6.1.5 A ne pas faire... . . . . . 6.1.6 Implmentation . . . . . 6.1.7 Inclusions mutuelles . . 6.2 Oprateurs . . . . . . . . . . . . 6.3 Rcration : TP suite et n . . 6.4 Fiche de rfrence . . . . . . . .

. . . . . . . . . . . . projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

7 La mmoire 7.1 Lappel dune fonction . . . . . . . 7.1.1 Exemple . . . . . . . . . . . 7.1.2 Pile des appels et dbuggeur 7.2 Variables Locales . . . . . . . . . . 7.2.1 Paramtres . . . . . . . . . 7.2.2 La pile . . . . . . . . . . . . 7.3 Fonctions rcursives . . . . . . . . . 7.3.1 Pourquoi a marche ? . . . . 7.3.2 Ecacit . . . . . . . . . . . 7.4 Le tas . . . . . . . . . . . . . . . . 7.4.1 Limites . . . . . . . . . . . . 7.4.2 Tableaux de taille variable . 7.4.3 Essai dexplication . . . . . 7.5 Loptimiseur . . . . . . . . . . . . . 7.6 TP . . . . . . . . . . . . . . . . . . 2

TABLE DES MATIRES

TABLE DES MATIRES

7.7 7.8

Fiche de rfrence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 Examens sur machine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 97 97 97 98 99 100 101 101 103 105 106 106

8 Allocation dynamique 8.1 Tableaux bidimensionnels . . . . . 8.1.1 Principe . . . . . . . . . . . 8.1.2 Limitations . . . . . . . . . 8.1.3 Solution . . . . . . . . . . . 8.2 Allocation dynamique . . . . . . . 8.2.1 Pourquoi a marche ? . . . . 8.2.2 Erreurs classiques . . . . . . 8.2.3 Consquences . . . . . . . . 8.3 Structures et allocation dynamique 8.4 Boucles et continue . . . . . . . . 8.5 TP . . . . . . . . . . . . . . . . . . 8.6 Fiche de rfrence . . . . . . . . . . 9 Premiers objets 9.1 Philosophie . . . . . . . . . 9.2 Exemple simple . . . . . . . 9.3 Visibilit . . . . . . . . . . . 9.4 Exemple des matrices . . . . 9.5 Cas des oprateurs . . . . . 9.6 Interface . . . . . . . . . . . 9.7 Protection . . . . . . . . . . 9.7.1 Principe . . . . . . . 9.7.2 Structures vs Classes 9.7.3 Accesseurs . . . . . . 9.8 TP . . . . . . . . . . . . . . 9.9 Fiche de rfrence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

109 . 109 . 110 . 112 . 112 . 114 . 116 . 117 . 117 . 119 . 119 . 120 . 120 . . . . . . . . . . . . . . . . . 125 125 126 126 126 128 129 130 131 131 131 133 134 136 136 137 138 138

10 Constructeurs et Destructeurs 10.1 Le problme . . . . . . . . . . . . . 10.2 La solution . . . . . . . . . . . . . 10.3 Cas gnral . . . . . . . . . . . . . 10.3.1 Constructeur vide . . . . . . 10.3.2 Plusieurs constructeurs . . . 10.3.3 Tableaux dobjets . . . . . . 10.4 Objets temporaires . . . . . . . . . 10.5 TP . . . . . . . . . . . . . . . . . . 10.6 Rfrences Constantes . . . . . . . 10.6.1 Principe . . . . . . . . . . . 10.6.2 Mthodes constantes . . . . 10.7 Destructeur . . . . . . . . . . . . . 10.8 Destructeurs et tableaux . . . . . . 10.9 Constructeur de copie . . . . . . . 10.10Aectation . . . . . . . . . . . . . . 10.11Objets avec allocation dynamique . 10.11.1 Construction et destruction 3

TABLE DES MATIRES

TABLE DES MATIRES

10.11.2 Problmes ! 10.11.3 Solution ! . 10.12Fiche de rfrence . 10.13Devoir crit . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

139 140 142 145 147 147 149 149 150 150 151 151 152 152 152 153 153 154 154 155 157 157 158

11 En vrac... 11.1 Chanes de caratres . . . . . . . . . . 11.2 Fichiers . . . . . . . . . . . . . . . . . 11.2.1 Principe . . . . . . . . . . . . . 11.2.2 Chanes et chiers . . . . . . . 11.2.3 Objets et chiers . . . . . . . . 11.3 Valeurs par dfaut . . . . . . . . . . . 11.3.1 Principe . . . . . . . . . . . . . 11.3.2 Utilit . . . . . . . . . . . . . . 11.3.3 Erreurs frquentes . . . . . . . 11.4 Accesseurs . . . . . . . . . . . . . . . . 11.4.1 Rfrence comme type de retour 11.4.2 Utilisation . . . . . . . . . . . . 11.4.3 operator() . . . . . . . . . . . 11.4.4 Surcharge et mthode constante 11.4.5 "inline" . . . . . . . . . . . . . 11.5 Assertions . . . . . . . . . . . . . . . . 11.6 Types numrs . . . . . . . . . . . . . 11.7 Fiche de rfrence . . . . . . . . . . . . 12 En vrac (suite) ... 12.1 Oprateur binaires . . . . . 12.2 Valeur conditionnelle . . . . 12.3 Boucles et break . . . . . . 12.4 Variables statiques . . . . . 12.5 const et tableaux . . . . . . 12.6 template . . . . . . . . . . 12.6.1 Principe . . . . . . . 12.6.2 template et chiers . 12.6.3 Classes . . . . . . . . 12.6.4 STL . . . . . . . . . 12.7 Fiche de rfrence . . . . . . 12.8 Devoir nal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

163 . 163 . 164 . 165 . 166 . 167 . 167 . 167 . 169 . 169 . 172 . 174 . 179 181 . 181 . 181 . 183 . 185 . 186 . 186 . 186 . 187 . 187

A Travaux Pratiques A.1 Lenvironnement de programmation . . . . A.1.1 Bonjour, Monde ! . . . . . . . . . . A.1.2 Premires erreurs . . . . . . . . . . A.1.3 Debugger . . . . . . . . . . . . . . A.1.4 Deuxime programme . . . . . . . A.1.5 Sil reste du temps . . . . . . . . . A.1.6 Installer Visual Studio chez soi . . A.2 Variables, boucles, conditions, fonctions . . A.2.1 Premier programme avec fonctions 4

TABLE DES MATIRES

TABLE DES MATIRES

A.3

A.4

A.5

A.6

A.7

A.8

A.9

A.2.2 Premier programme graphique avec la CLGraphics A.2.3 Jeu de Tennis . . . . . . . . . . . . . . . . . . . . . Tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.3.1 Mastermind Texte . . . . . . . . . . . . . . . . . . A.3.2 Mastermind Graphique . . . . . . . . . . . . . . . . Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . A.4.1 Etapes . . . . . . . . . . . . . . . . . . . . . . . . . A.4.2 Aide . . . . . . . . . . . . . . . . . . . . . . . . . . A.4.3 Thorie physique . . . . . . . . . . . . . . . . . . . Fichiers spars . . . . . . . . . . . . . . . . . . . . . . . . A.5.1 Fonctions outils . . . . . . . . . . . . . . . . . . . . A.5.2 Vecteurs . . . . . . . . . . . . . . . . . . . . . . . . A.5.3 Balle part . . . . . . . . . . . . . . . . . . . . . . A.5.4 Retour la physique . . . . . . . . . . . . . . . . . Les tris . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.6.1 Mlanger un tableau . . . . . . . . . . . . . . . . . A.6.2 Tris quadratiques . . . . . . . . . . . . . . . . . . . A.6.3 Quicksort . . . . . . . . . . . . . . . . . . . . . . . A.6.4 Gros tableaux . . . . . . . . . . . . . . . . . . . . . Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.7.1 Allocation . . . . . . . . . . . . . . . . . . . . . . . A.7.2 Tableaux statiques . . . . . . . . . . . . . . . . . . A.7.3 Tableaux dynamiques . . . . . . . . . . . . . . . . . A.7.4 Charger un chier . . . . . . . . . . . . . . . . . . . A.7.5 Fonctions . . . . . . . . . . . . . . . . . . . . . . . A.7.6 Structure . . . . . . . . . . . . . . . . . . . . . . . A.7.7 Suite et n . . . . . . . . . . . . . . . . . . . . . . Premiers objets et dessins de fractales . . . . . . . . . . . . A.8.1 Le triangle de Sierpinski . . . . . . . . . . . . . . . A.8.2 Une classe plutt quune structure . . . . . . . . . . A.8.3 Changer dimplmentation . . . . . . . . . . . . . . A.8.4 Le ocon de neige . . . . . . . . . . . . . . . . . . . Tron . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.9.1 Serpent . . . . . . . . . . . . . . . . . . . . . . . . A.9.2 Tron . . . . . . . . . . . . . . . . . . . . . . . . . . A.9.3 Graphismes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

187 189 191 191 193 195 195 197 198 200 200 200 201 201 203 203 204 204 205 207 207 207 208 208 208 209 209 210 210 211 211 211 212 212 213 213 215 215 215 215 217 217 217 219 219 219 220 220

B Examens B.1 Examen sur machine 2007 : nonc . . . . . . . B.1.1 Chemins entre deux points . . . . . . . . B.1.2 Travail demand . . . . . . . . . . . . . B.2 Examen sur machine 2006 : nonc . . . . . . . B.2.1 Voyageur de commerce par recuit simul B.2.2 Travail demand . . . . . . . . . . . . . B.3 Examen sur machine 2005 : nonc . . . . . . . B.3.1 Construction du Modle 3D . . . . . . . B.3.2 Projection : du 3D au 2D . . . . . . . . B.3.3 Achage lcran . . . . . . . . . . . . B.3.4 Animation du ttradre . . . . . . . . . 5

TABLE DES MATIRES

TABLE DES MATIRES

B.4

B.5

B.6 B.7 B.8

B.9

B.10 B.11 B.12 B.13

B.14

B.15

B.16

B.3.5 Un modle plus labor . . . . . . . . . . . . . . Examen sur machine 2004 : nonc . . . . . . . . . . . B.4.1 Calcul de lexponentielle dun nombre complexe B.4.2 Compression RLE . . . . . . . . . . . . . . . . . Examen sur machine 2003 : nonc . . . . . . . . . . . B.5.1 Crible dratosthne . . . . . . . . . . . . . . . B.5.2 Calcul de par la mthode de Monte Carlo . . B.5.3 Serpent . . . . . . . . . . . . . . . . . . . . . . Devoir maison 2007 : nonc . . . . . . . . . . . . . . . Devoir maison 2006 : nonc . . . . . . . . . . . . . . . B.7.1 Enonc Tours de Hanoi . . . . . . . . . . . . . Devoir maison 2004 : nonc . . . . . . . . . . . . . . . B.8.1 Tableau dexcution . . . . . . . . . . . . . . . B.8.2 Constructeurs . . . . . . . . . . . . . . . . . . . B.8.3 Le compte est bon . . . . . . . . . . . . . . . . Devoir maison 2003 : nonc . . . . . . . . . . . . . . . B.9.1 Tableau dexcution . . . . . . . . . . . . . . . B.9.2 Grands entiers . . . . . . . . . . . . . . . . . . . B.9.3 Constructeurs . . . . . . . . . . . . . . . . . . . Devoir surveill 2007 : nonc . . . . . . . . . . . . . . Groupes . . . . . . . . . . . . . . . . . . . . . . . . . . Anniversaires . . . . . . . . . . . . . . . . . . . . . . . Devoir surveill 2006 : nonc . . . . . . . . . . . . . . B.13.1 Erreurs corriger . . . . . . . . . . . . . . . . . B.13.2 Quache ce programme ? . . . . . . . . . . . . B.13.3 Tableau dexcution . . . . . . . . . . . . . . . B.13.4 Huit dames . . . . . . . . . . . . . . . . . . . . Devoir surveill 2005 : nonc . . . . . . . . . . . . . . B.14.1 Erreurs corriger . . . . . . . . . . . . . . . . . B.14.2 Quache ce programme ? . . . . . . . . . . . . B.14.3 Tableau dexcution . . . . . . . . . . . . . . . B.14.4 Rsolveur de Sudoku . . . . . . . . . . . . . . . Devoir surveill 2004 : nonc . . . . . . . . . . . . . . B.15.1 Erreurs . . . . . . . . . . . . . . . . . . . . . . . B.15.2 Quache ce programme ? . . . . . . . . . . . . B.15.3 Chemins dans un graphe . . . . . . . . . . . . . B.15.4 Tours de Hano . . . . . . . . . . . . . . . . . . B.15.5 Table de hachage . . . . . . . . . . . . . . . . . Devoir surveill 2003 : nonc . . . . . . . . . . . . . . B.16.1 Tableau dexcution . . . . . . . . . . . . . . . B.16.2 Erreurs . . . . . . . . . . . . . . . . . . . . . . . B.16.3 Quache ce programme ? . . . . . . . . . . . . B.16.4 Le jeu du Pendu . . . . . . . . . . . . . . . . . B.16.5 Programme mystre . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

221 222 222 222 225 225 225 227 229 231 231 234 234 235 237 240 240 241 241 244 244 246 247 247 248 250 252 254 254 254 256 257 260 260 261 264 265 268 270 270 271 272 274 275 277 279

C La CLGraphics D Fiche de rfrence nale

6

1. Prambule

Chapitre 1 PrambuleNote : Ce premier chapitre maladroit correspond ltat desprit dans lequel ce cours a dbut en 2003, dans une priode o lInformatique avait mauvaise presse lcole des ponts. Nous le maintenons ici en tant que tmoin de ce quil faillait faire alors pour amener les lves ne pas ngliger lInformatique. Si lon ignore la navet de cette premire rdaction (et le fait que Star Wars nest plus autant la mode !), lanalyse et les conseils qui suivent restent dactualit. (Ce premier chapitre tente surtout de motiver les lves ingnieurs dans leur apprentissage de la programmation. Les enfants qui se trouveraient ici pour apprendre programmer sont srement dj motivs et peuvent sauter au chapitre suivant ! Protons-en pour tenir des propos qui ne les concernent pas...) Le Matre Programmeur 1 : "Rassure toi ! Les ordinateurs sont stupides ! Programmer est donc facile." LApprenti Programmeur 2 : "Matre, les ordinateurs ne sont certes que des machines et les dominer devrait tre ma porte. Et pourtant... Leur manque dintelligence fait justement quil mest pnible den faire ce que je veux. Programmer exige de la prcision et la moindre erreur est sanctionne par un message incomprhensible, un bug 3 ou mme un crash de la machine. Pourquoi doit-on tre aussi... prcis ?" Programmer rend maniaque ! Dailleurs, les informaticiens sont tous maniaques. Et je nai pas envie de devenir comme a...1. Permettez ce terme ouvertement Lucasien. Il semble plus appropri que lhabituel Gourou souvent utilis pour dcrire lexpert informaticien. Nous parlons bien ici dun savoir-faire transmettre de Matre Apprenti et non dune secte... 2. Le jeune Padawan, donc, pour ceux qui connaissent... 3. Je naurai aucun remord dans ce polycopi utiliser les termes habituels des informaticiens... en essayant videmment de ne pas oublier de les expliquer au passage. Anglicismes souvent incomprhensibles, ils constituent en ralit un argot propre au mtier dinformaticien, argot que doit bien videmment accepter et faire sien lApprenti sous peine de ne rien comprendre au discours de ses collgues dune part, et demployer des adaptations franaises ridicules ou peu usites dautre part. Naviguer sur la toile, envoyer un courriel ou avoir un bogue commencent peut-tre devenir des expressions comprhensibles. Mais demandez-donc votre voisin sil reoit beaucoup de pourriels (terme propos pour traduire "Spams") !

1. Prambule

M.P. : "La prcision est indispensable pour communiquer avec une machine. Cest lHomme de sadapter. Tu dois faire un eort. En contre-partie tu deviendras son matre. Rjouis-toi. Bientt, tu pourras crer ces tres obissants que sont les programmes." A.P. : "Bien, Matre..." Quel vieux fou ! Pour un peu, il se prendrait pour Dieu. La vrit, cest quil parle aux machines parce quil ne sait pas parler aux hommes. Il comble avec ses ordinateurs son manque de contact humain. Linformaticien type... Il ne lui manque plus que des grosses lunettes et les cheveux gras 4 . "Matre, je ne suis pas sr den avoir envie. Je ny arriverai pas. Ne le prenez pas mal, mais je crois tre davantage dou pour les Mathmatiques ! Et puis, quoi savoir programmer me servira-til ?" M.P. : "Les vrais problmes qui se poseront toi, tu ne pourras toujours les rsoudre par les Mathmatiques. Savoir programmer, tu devras !" A.P. : "Jessaierai..." Je me demande sil a vraiment raison ! Je suis sr quil doit tre nul en Maths. Voil la vrit ! ... Oublions l ce dialogue aussi caricatural que maladroit. Il montre pourtant clairement la situation. Rsumons : Pour celui qui sait, programmer : est un jeu denfant. est indispensable. est une activit cratrice et panouissante. Pour celui qui apprend, programmer : est dicile. ne sert rien. est une activit ingrate qui favorise le renfermement 5 sur soi-mme. Dans le cas o llve est ingnieur, nous pouvons complter le tableau : Pour le professeur, apprendre programmer : devrait tre simple et rapide pour un lve ingnieur. est plus utile quapprendre davantage de Mathmatiques. Pour llve, programmer : est un travail de "technicien 6 " quil naura jamais faire lui-mme. nest pas aussi noble que les Mathmatiques, bref, nest pas digne de lui. En fait, les torts sont partags : Le professeur : ne ralise pas que ses lves ont un niveau avanc en maths parce quils en font depuis plus de dix ans, et quil leur faudra du temps pour apprendre ne serait-ce que les bases de la programmation. Du temps... et de la pratique, car, si programmer est eectivement simple en regard de ce que ses lves savent faire en maths, il ncessite une tournure desprit compltement dirente et beaucoup de travail personnel devant la machine.4. Toute ressemblance avec des personnages rels ou imaginaires, etc. 5. Utiliser un ordinateur pour programmer a tout aussi mauvaise presse que de jouer aux jeux vido. Programmer est pourtant souvent un travail dquipe. 6. avec tout le sens pjoratif que ce terme peut avoir pour lui.

8

1. Prambule

1.1. Pourquoi savoir programmer ?

oublie quil a le plus souvent appris seul quand il tait plus jeune, en programmant des choses simples et ludiques 7 . Il devrait donc faire venir ses lves la programmation par le ct ludique, et non avec les mmes sempiternels exemples 8 . Llve : ne se rend pas compte que savoir programmer lui sera utile. Il sagit pourtant dune base qui se retrouve dans tous les langages et mme dans la plupart des logiciels modernes 9 . Et puis, considr comme "le jeune" donc le moins "allergique" aux ordinateurs, il se verra vraisemblablement coner son premier poste la ralisation de quelques petits programmes en plus de ses attributions normales. sarrange un peu trop facilement dun mpris de bon ton pour la programmation. Il lui est plus ais dapprendre une n-ime branche des mathmatiques que de faire leort dacqurir par la pratique une nouvelle tournure desprit. On laura compris, il est la fois facile et dicile dapprendre programmer. Pour lingnieur, cela demandera de la motivation et un peu deort : essentiellement de mettre ses maths de ct et de retrouver le got des choses basiques. Pour un collgien, motivation et got de leort seront au rendez-vous. Il lui restera malgr tout acqurir quelques bases darithmtique et de gomtrie. Comme annonc par le titre de ce cours, collgien et ingnieur en sont au mme point pour lapprentissage de la programmation. De plus, et cest un phnomne relativement nouveau, il en est de mme pour le dbutant et le "geek 10 ". Expliquons nous : le passionn dinformatique a aujourdhui tellement de choses faire avec son ordinateur quil sera en gnral incollable sur les jeux, internet, les logiciels graphiques ou musicaux, linstallation ou la conguration de son systme, lachat du dernier gadget USB la mode, etc. mais quen contrepartie il sera mauvais programmeur. Il y a quelques annes, il y avait peu faire avec son ordinateur sinon programmer. Programmer pour combler le manque de possibilits de lordinateur. Aujourdhui, faire le tour de toutes les possibilits dun ordinateur est une occupation plein temps ! Ainsi, le "fana info" passe-til sa journe se tenir au courant des nouveaux logiciels 11 et en oublie quil pourrait lui aussi en crer. En conclusion, collgiens ou ingnieurs, dbutants ou passiones, tous les lves sont galit. Cest donc sans complexe que lingnieur pourra apprendre programmer en mme temps que le ls de la voisine.

1.1

Pourquoi savoir programmer ?

Nous venons partiellement de le dire. Rsumons et compltons : 1. Cest la base. Apprendre un langage prcis nest pas du temps perdu car les mmes concepts se retrouvent dans la plupart des langages. De plus, les logiciels courants eux-mmes peuvent se programmer.7. Cest une erreur frquente de croire quil intressera ses lves en leur faisant faire des programmes centrs sur les mathmatiques ou le calcul scientique. De tels programmes leur seront peut-tre utiles plus tard, mais ne sont pas forcment motivants. Lalgbre linaire ou lanalyse numrique sont des domaines passionnants tudier... mais certainement pas programmer. Il faut admettre sans complexe que programmer un ipper, un master-mind ou un labyrinthe 3D est tout aussi formateur et plus motivant quinverser une matrice creuse. 8. La liste est longue, mais tellement vraie : quel cours de programmation ne rabche pas les clbres "factorielle", "suites de Fibonacci", "Quick Sort", etc ? 9. Savoir programmer ne sert pas seulement faire du C++ ou du Java, ni mme du Scilab, du Matlab ou du Maple : une utilisation avance dExcel ou du Word demande parfois de la programmation ! 10. Une rcompense qui me trouve un substitut satisfaisant cette expression consacre. 11. Sans mme dailleurs avoir le temps den creuser convenablement un seul !

9

1.2. Comment apprendre ?

1. Prambule

2. Il est frquent quun stage ou quune embauche en premier poste comporte un peu de programmation, mme, et peut-tre surtout, dans les milieux o peu de gens programment. 3. Savoir programmer, cest mieux connatre le matriel et les logiciels, ce qui est possible techniquement et ce qui ne lest pas. Mme un poste non technique, cest important pour prendre les bonnes dcisions.

1.21.2.1

Comment apprendre ?Choix du langage

Il faut dabord choisir un langage de programmation. Un ingnieur pourrait videmment tre tent dapprendre programmer en Maple, Matlab, Scilab ou autre. Il faut quil comprenne quil sagit l doutils spcialiss pour mathmaticien ou ingnieur qui lui seront utiles et qui, certes, se programment, mais pas proprement parler de langages gnralistes complets. Sans argumenter sur les dfauts respectifs des langages qui en font partie, il nous semble vident quil ne sagit pas du bon choix pour lapprentissage de la programmation. En pratique, le choix actuel se fait souvent entre C++ et Java. Bien que Java aie t conu, entre autres, dans un soucis de simplication du C++ 12 , nous prfrerons C++ pour des raisons pdagogiques : 1. C++ est plus complexe dans son ensemble mais nen connatre que les bases est dj bien susant. Nous ne verrons donc dans ce cours quun sous ensemble du C++, susant en pratique. 2. Plus complet, C++ permet une programmation de haut niveau mais aussi une programmation simple, adapte au dbutant 13 . C++ permet galement une programmation proche de la machine, ce qui est important pour le spcialiste mais aussi pour le dbutant, car seule une bonne comprhension de la machine aboutit une programmation convenable et ecace 14 . 3. C++ est souvent incontournable dans certains milieux, par exemple en nance. 4. Enn, certains aspects pratiques et pourtant simples de C++ ont disparu dans Java 15 . Encore une fois, rptons que le choix du langage nest pas le plus important et que lessentiel est dapprendre programmer.

1.2.2

Choix de lenvironnement

Windows et Linux ont leurs partisans, souvent farouchement opposs, tel point que certains nadmettent pas quil est possible dtre partisan des deux systmes la fois. Conscients des avantages et des inconvnients de chacun des deux systmes, nous nen prnons aucun en particulier 16 . Ceci dit, pour des raisons pdagogiques, nous pensons12. Nous ne rduisons videmment pas Java un sous ensemble de C++. Il lui est suprieur sur certains aspects mais il est dexpressivit plus rduite. 13. Java force un cadre de programmation objet, droutant pour le dbutant. 14. Ne pas comprendre ce que la machine doit faire pour excuter un programme, conduit des programmes inconsidrment gourmands en temps ou mmoire. 15. Les oprateurs par exemple. 16. Lidal est en fait davoir les deux "sous la main".

10

1. Prambule

1.2. Comment apprendre ?

quun environnement de programmation intgr, cest dire un logiciel unique permettant de programmer, est prfrable lutilisation de multiples logiciels (diteur, compilateur, debuggeur, etc.). Cest vrai pour le programmeur conrm, qui trouve en gnral dans cet environnement des outils puissants, mais cest encore plus crucial pour le dbutant. Un environnement de programmation, cest : Toutes les tapes de la programmation regroupes en un seul outil de faon cohrente. Editer ses chiers, les transformer en programme, passer en revue ses erreurs, dtecter les bugs, parcourir la documentation, etc. tout cela avec un seul outil ergonomique. Sans arrire pense de principe, nous avons opt pour lenvironnement de Microsoft, Visual Studio, la fois simple et puissant. Il est le plus utilis des produits commerciaux. Il en existe quelques quivalents gratuits sous linux, mais pas encore susamment aboutis pour nous faire hsiter. Cest donc le choix de Visual Studio et ce choix seul qui est la raison de lutilisation de Windows au dtriment de linux... Mieux encore, il existe maintenant une version de Visual gratuite : Visual Express. Comme pour le choix du langage, le choix de lenvironnement nest pas limitant et en connatre un permet de sadapter facilement nimporte quel autre.

1.2.3

Principes et conseils

Au niveau auquel nous prtendons lenseigner, la programmation ne requiert ni grande thorie, ni connaissances encyclopdiques. Les concepts utiliss sont rudimentaires mais cest leur mise en oeuvre qui est dlicate. Sil ny avait quun seul conseil donner, ce serait la rgle des trois "P" : 1. Programmer 2. Programmer 3. Programmer La pratique est eectivement essentielle. Cest ce qui fait quun enfant a plus de facilits, puisquil a plus de temps. Ajoutons quand mme quelques conseils de base : 1. Samuser. Cest une vidence en matire de pdagogie. Mais cest tellement facile dans le cas de la programmation, quil serait dommage de passer ct ! Au pire, si programmer nest pas toujours une partie de plaisir pour tout le monde, il vaut mieux que le programme obtenu dans la douleur soit intressant pour celui qui la fait ! 2. Bricoler. Ce que nous voulons dire par l, cest quil ne faut pas hsiter ttonner, tester, fouiller, faire, dfaire, casser, etc. Lordinateur est un outil exprimental. Mais sa programmation est elle aussi une activit exprimentale la base. Mme si le programmeur aguerri trouvera la bonne solution du premier jet, il est important pour le dbutant dapprendre connatre le langage et loutil de programmation en jouant avec eux. 3. Faire volontairement des erreurs. Provoquer les erreurs pendant la phase dapprentissage pour mieux les connatre est le meilleur moyen de comprendre beaucoup de choses et aussi de reprer ces erreurs quand elles ne seront plus volontaires. 4. Rester (le) matre 17 (de la machine et de son programme). Que programmer soit17. Le vocabulaire nest pas choisi au hasard : un programme est une suite dordres, de commandes ou dinstructions. On voit bien qui est le chef !

11

1.2. Comment apprendre ?

1. Prambule

exprimental ne signie pas pour autant quil faille faire nimporte quoi jusqu ce que a marche plus ou moins. Il faut avancer progressivement, mthodiquement, en testant au fur et mesure, sans laisser passer la moindre erreur ou imprcision. 5. Debugger. Souvent, la connaissance du debuggeur (loutil pour rechercher les bugs) est nglige et son apprentissage est repouss au stade avanc. Il sagit pourtant dun outil essentiel pour comprendre ce qui se passe dans un programme, mme dpourvu de bugs. Il faut donc le considrer comme essentiel et faisant partie intgrante de la conception dun programme. L encore, un bon environnement de programmation facilite la tche. Gardons bien prsents ces quelques principes car il est maintenant temps de... passer notre premier programme !

12

2. Bonjour, Monde !

Chapitre 2 Bonjour, Monde !(Si certains collgiens sont arrivs ici, ils sont bien courageux ! Lorsque je disais tout lheure quils pouvaient facilement apprendre programmer, je le pensais vraiment. Par contre, cest avec un peu doptimisme que jai prtendu quils pouvaient le faire en lisant un polycopi destin des ingnieurs. Enn, je suis pris mon propre pige ! Alors, tout hasard, je vais tenter dexpliquer au passage les mathmatiques qui pourraient leur poser problme.) Si lon en croit de nombreux manuels de programmation, un premier programme doit toujours ressembler a :1 2 3 4 5 6 7 8

#include using namespace std; int main() { cout