Home
LA PROGRAMMATION POUR... les élèves - imagine
Contents
1. FIGURE A 7 Deux images et diff rents traitements de la deuxieme n gatif flou relief d formation contraste et contours Dans ce TP nous allons jouer avec les tableaux bidimensionnels statiques mais stock s dans des tableaux 1D puis dynamiques Pour changer de nos passionnantes matrices nous travaillerons avec des images figure A 7 A 6 1 Allocation 1 R cup rer le projet T l charger le fichier Tp7_Initial zip sur la page habituelle le d compresser et lancer Visual C 2 Saturer la m moire Rien voir avec ce qu on va faire apr s mais il faut l avoir fait une fois Faire dans une boucle infinie des allocations de 1000000 entiers sans d sallouer et re garder la taille du process grandir Utiliser Ctr1 Shift Echap pour acc der au gestionnaire de t ches Compiler en mode Release pour utiliser la vraie ges tion du tas Le mode Debug utilise une gestion sp cifique qui aide trouver les bugs et se comporte diff remment A 6 2 Tableaux statiques 3 Niveaux de gris Une image noir et blanc est repr sent e par un tableau de pixels de dimensions constantes W 300 et H 200 Chaque pixel i j est un byte entier de 0 255 allant de 0 pour le noir 255 pour le blanc L origine est en haut gauche i est l horizontale et j la verticale Dans un tableau de byte mono dimensionnel t de taille WxH m morisant le pixel i j ent i wWx3 212 A Travaux P
2. D claration int plus int a int b Retour int signe double x 1f x lt 0 return 1 1f x gt 0 return 1 return 0 void afficher int x int y if x lt 0 y lt 0 return if x gt w y gt h return DrawPoint x y RED Appel int fint a sss int gA ess int i f 2 j g R f rences void swap int amp a int amp b int tmp a a b b tmp int x 3 y 2 swap x y Surcharge int hasard int n int hasard int a int b double hasard Op rateurs vect operator vect A vect B vect C A B Pile des appels It ratif R cursif Tableaux D finition double x 5 y 5 for int 1 0 1 lt 5 1 yli 2xx i const int n 5 int ifn j 2xn Initialisation int t 4 1 2 3 4 string s 2 ab c Affectation int s 31 11 2 3 1 t 131 for int 1 0 1 lt 3 1 tlil s 1 En param tre void init int t 4 for int i 0 i lt 4 i t i 0 4 void init int t int n for int 1 0 i lt n 1 t i 0 Taille variable int t new int n deletel t En param tre suite void f intx t int n t i void alloue int amp t t new int n 2D int A 21 31 A il J l 5 int A 2 3 1 2 3 4 5 6 void f int A 2 2 2D dans 1D int A 2x3 A i 2x31 Taille variable suite int xt xs n
3. include lt string gt using namespace std string s hop char c s 0 int l s size include lt ctime gt s double clock CLOCKS_PER_SEC Entr es Sorties include lt iostream gt using namespace std cout lt lt I lt lt i lt lt endl cin gt gt i gt gt jJ Clavier Debug F5 Step over F10 Step inside F11 Indent Ctrl A Ctrl I e Step out Maj F11 Erreurs fr quentes Pas de d finition de fonction dans une fonction int q r 4 NON if i 2 NON if i 2 NON if EN NON pragma once au d but du TE M aid fichier for int i 0 i lt 100 i NON Ne pas trop d couper EE NO int 4d Divers int i f NON double x 1 3 NON int i j x 1 3 NON x double 1 3 NON double x 10 1 y 101 for int i 1 i lt 10 1 y i 2 x i NON int int n 5 tn NON 4 NON int t4 int return t NON int t 41 t int s 3 11 2 3 t 131 t s NON int Biz t 1 2 NON struct Point double x y NON Point a a 1 2 NON include tp cpp NON Imagine Voir documentation Conseils Nettoyer en quittant Erreurs et warnings cliquer Indenter Ne pas laisser de warning Utiliser le debuggeur Faire des fonctions Tableaux pas pour transcrire une
4. Surcharge int hasard int n int hasard int a int hb double hasard T E 74 5 Les structures 5 4 Fiche de r f rence Fiche de r f rence 2 2 Tableaux D finition double x 5 y 5 for int i 0 i lt 5 i y i 2xx 11 const int n 5 int i n 3 2 n1 Initialisation int t 4 1 2 3 4 string s 2 ab c Affectation int s 3 1 2 3 t 3 for int 1 0 1 lt 3 1 tlil s i1 En param tre void init int t 4 for int 1 0 1 lt 4 1 t i 0 void init int tI int n for int i 0 i lt n 1 t i1 0 Structures struct Point double x y Color es Point aj A 2 3 a c Red Point b 1 2 5 Blue a y 3 4 Divers j i n Modulo include lt cstdlib gt i rand n x rand double RAND_ MAX include lt ctime gt Un seul appel srand unsigned int time 0 include lt cmath gt double sqrt double x double cos double x double sin double x double acos double x tinclude lt string gt using namespace std string s hop char c s 0 int l s size Entr es Sorties include lt iostream gt using namespace std cout lt lt I lt lt i lt lt endl cin gt gt i gt gt j Erreurs fr quentes Pas de d finition de fonction dans une fonction int q r 4
5. 185 12 7 Fiche de r f rence 12 Fonctions et classes param tr es templates Fiche de r f rence 5 6 Divers i i i 2 j 3 j i n Modulo include lt cstdlib gt i rand n x rand double RAND_MAX include lt ctime gt Un seul appel srand unsigned int time 0 include lt cmath gt double sqrt double x double cos double x double sin double x double acos double x tinclude lt string gt using namespace std string s hop char c s 0 int A Ai N if s 1 dE e if sl lt s2 size_t i s find h J s find h 3 k s find hop l s find hop 3 a comment b ca va txt a b si un deux trois s2 string s1 3 4 getline cin s getline cin s const char t S C_str include lt ctime gt s double clock CLOCKS_PER_SEC set i 1 istisi reset i 1 i amp 1 lt lt n test i 1 LE e le n flip i 1 a Erreurs fr quentes define _USE_MATH_DEFIN ES include lt cmath gt double pi M PI Op rateurs binaires and a amp b or alb xor a b right shift a gt gt n left shift a lt lt n complement a exemples Pas de d finition de fonction dans une fonction int q r 4 NON if i 2 NON if i 2 NON if i 2 then NON for int i 0 i lt 100 i NON int f int
6. Structures struct Point double x y Color E y Point a a x 2 3 a c Red a y 3 4 Point b 1 2 5 Blue Une structure est un objet en ti rement public gt cf ob jets Objets struct 2003 ine Re champ int f m thode int glint Y ine abs O inte 1 59 3 int j x i mon g mon x return j int main obj a x 3 int i a f class ob int y void a moi public int 2 void pour tous void autre obj A void obj a moi minis OK sanyi OK ESA OK void C6 pour tous 1 4 OK OK gt vi a mol void autre obj A xX A X OR Aj amoi 3 7 OK int main obj A B e NON ALI OK A a_moi NON A pour tous 0K A autre B 0K class obj 1 obj operator ob3 B y int main obj A B C C A B C A operator B 129 9 9 Fiche de r f rence 9 Premiers objets Fiche de r f rence 3 4 Compilation s par e include vect h aussi dans vect cpp Fonctions d clarations dans le h d finitions dans le CPP Types d finitions dans le h Ne d clarer dans le h que les fonctions utiles pragma once au d but du fichier Ne pas trop d couper Tests Comparaison lt gt N gation Combinaisons amp amp tinclude lt iostream gt using namespace std cout lt lt I lt
7. return Ls return 0 void afficher int x int Y LE 0 v lt 0 return if x gt w y gt h return DrawPoint x y RED Appel ine ME a rs ine QU ara int i f 2 j g R f rences void swap int amp a int D int tmp a a b b tmp int x 3 y 2 swap x y Surcharge int hasard int n int hasard int a for int i 1 i lt 10 1 for int 1 1 3 L10 J gt 15 1i 1 2 3 3 3 Fonctions D finition int plus int aint b int c a b int D double hasard D claration int Plus ist a int bj Retour int signe double x if x lt 0 return 17 if x gt 0 Divers i desp i 2 j 3 j i n Modulo include lt cstdlib gt i rand n x fand double RAND_MAX Entr es Sorties include lt iostream gt using namespace std cout lt lt I lt lt i lt lt endl cin gt gt gt gt Jy Erreurs fr quentes Pas de d finition de fonction dans une fonction int q r 4 NON 18 1 2 NOW If Les NON if 1 2 then NON for int i 0 1 lt 100 i NON int int i f NON double x 1 3 NON int i j x 1 3 NON x double 1 3 NON Imagine Voir documentation Clavier Debug F5 Step over F10 65 Step inside F11 Indent Ctrl A Ctrl 1 Conseils Ne
8. 2 1 2 La m moire La m moire interne du micro processeur est g r e comme des registres un peu comme les variables du C mais en nombre pr d fini Pour stocker la suite d ins tructions lui fournir on utilise de la m moire en quantit bien plus importante d sign e en g n ral par la m moire de l ordinateur Il s agit des fameuses barrettes de m moire que l on ach te pour augmenter la capacit de sa machine et dont les prix fluctuent assez fortement par rapport au reste des composants d un ordinateur Cette m moire est d coup e en octets Un octet correspond un nombre binaire de 8 bits soit 28 256 valeurs possibles Pour se rep rer dans la m moire il n est pas ques tion de donner des noms chaque octet On num rote simplement les octets et on obtient ainsi des adresses m moire Les nombres 00415461 etc vus plus haut sont des adresses Au d but ces nombres taient crits en binaire ce qui tait exactement ce que comprenait le micro processeur C est devenu d raisonnable quand la taille de la m moire a d pass les quelques centaines d octets Le contenu d un octet de m moire tant lui aussi donn sous la forme d un nombre on a opt pour un syst me adapt au fait que ces nombres sont sur 8 bits plut t que d crire les nombre en bi naire le choix de la base 16 permettait de repr senter le contenu d un octet sur deux chiffres 0 1 9 A B C D E F Le syst me hexad
9. 4 4 R cr ations 4 4 1 Multi balles Nous pouvons maintenant reprendre le programme de la balle qui rebondit donn la section 3 1 4 puis am lior avec des fonctions et de constantes lors du TP de l an nexe A 2 Gr ce aux tableaux il est facile de faire se d placer plusieurs balles la fois Nous tirons aussi la couleur et la position et la vitesse initiales des balles au hasard Plusieurs fonctions devraient vous tre inconnues L initialisation du g n rateur al atoire avec srand unsigned int time 0 qui est expliqu e dans le TP 3 annexe A 3 Les fonctions noRefreshBegin et noRefreshEnd qui servent acc l rer l affichage de toutes les balles voir documentation de Imagine annexe B Voici le listing du programme exemple d affichage malheureusement statique fi gure 4 1 include lt Imagine Graphics h gt using namespace Imagine include lt cstdlib gt include lt ctime gt using namespace std HATE AAA AE AA IAE RIA PA Constantes du programme const int width 256 Largeur de la fenetre const int height 256 Hauteur de Ta fenetre const int ball_size 4 Rayon de la balle const int nb_balls 30 Nombre de balles DEA LIT EL IIA A TANIA AAA ELIANE DES Generateur aleatoire A n appeler qu une fois avant Random void InitRandom 59 4 4 R cr ations 4 Les tableaux Entre a et b int Random int a int b srand unsigned int
10. 10 11 Objets avec allocation dynamique Tout ce que nous venons de voir est un peu abstrait Nous allons enfin d couvrir quoi a sert Consid rons le programme suivant include lt iostream gt using namespace std class vect int n double xt public void alloue int N void libere E void vect alloue int N n N t new double n void vect libere delete t int main vect v v alloue 10 v libere return 0 10 11 1 Construction et destruction Il appara t videmment que les constructeurs et les destructeurs sont l pour nous aider include lt iostream gt 146 10 Constructeurs et Destructeurs 10 11 Objets avec allocation dynamique using namespace std class vect int n double xt public vect int N vect E vect vect int N n N t new double n vect vect delete t int main vect v 10 return 0 Gr ce aux constructeurs et au destructeur nous pouvons enfin laisser les allocations et les d sallocations se faire toutes seules 10 11 2 Problemes Le malheur est que cette facon de faire va nous entra ner assez loin pour des d bu tants Nous allons devoir affronter deux types de problemes Un probl me simple Puisqu il n y a qu un seul destructeur pour plusieurs constructeurs il va falloir faire attention ce qui se passe dans le destructeur Rajoutons par exemple un c
11. DessineBalle xb i yb i cb il Boucle principale while true milliSleep 25 noRefreshBegin for int i 0 i lt nb_balls i DessineBalle xb i yb i White BougeBalle xb i yb i ub i vb i DessineBalle xb i yb il cb i noRefreshEnd endGraphics return 0 4 4 2 Avec des chocs Il n est ensuite pas tr s compliqu de modifier le programme pr c dent pour que les balles rebondissent entre elles Le listing ci apr s a t construit comme suit 1 Lorsqu une balle se d place on regarde aussi si elle rencontre une autre balle Il faut donc que BougeBalle connaisse les positions des autres balles On modifie donc BougeBalle en passant les tableaux complets des positions et des vitesses et en pr cisant juste l indice de la balle d placer lignes 71 et 110 La boucle de la ligne 78 v rifie ensuite via le test de la ligne 81 si l une des autres balles est heurt e par la balle courante Auquel cas on appelle ChocBalles qui modifie les vitesses des deux balles Notez les lignes 79 et 80 qui vitent de consid rer le choc d une balle avec elle m me nous verrons l instruction continue une autre fois 2 Les formules du choc de deux balles peuvent se trouver facilement dans un cours de pr pa ou sur le web La fonction ChocBalles impl mente ces formules No tez l inclusion du fichier lt cmath gt pour avoir acces la racine carr sqrt aux sinus et cosinus cos et sin
12. EJE Tp3_Final b bash x lt a FIGURE A 3 Master mind la console A 3 Tableaux Dans ce TP nous allons programmer un jeu de Mastermind o l utilisateur doit deviner une combinaison g n r e al atoirement par l ordinateur Le joueur dispose d un nombre d termin d essais A chaque essai d une combinaison l ordinateur four nit deux indices le nombre de pions correctement plac s et le nombre de pions de la bonne couleur mais incorrectement positionn s A 3 1 Mastermind Texte 1 R cup rer la solution de d part T l charger l archive Tp3_Initial zip sur la page du cours la d compres ser dans un r pertoire faisant appara tre les noms des deux leves et ouvrir la solution MasterMind dans Visual Studio Etudier le projet Mastermind 2 Repr senter une combinaison Nous prendrons ici une combinaison de 5 pions de 4 couleurs diff rentes La couleur d un pion sera repr sent e par un entier compris entre 0 et 3 Pour une combinaison de 5 pions nous allons donc utiliser un tableau de 5 entiers int combin 5 tableau de 5 entiers 3 Afficher une combinaison Programmer une fonction permettant d afficher une combinaison donn e l cran La mani re la plus simple de faire consistera faire afficher les diff rents chiffres de la combinaison sur une m me ligne les uns la suite des autres 4 G n rer une combinaison al atoirement En d but de partie l ordinateur doit g n
13. X X 3 G n ralement on choisit l exemple suivant pour justifier le besoin des r f rences void echangerl int x int y int t x X Y y t void echanger2 int x int y int t x x y y t int a 2 b 3 echangerl a b cout lt lt a lt lt echanger2 a b cout lt lt a lt lt 1 lt lt b lt lt 3 lt lt b lt lt endl Ce programme affiche 2 3 3 2 echanger1 ne marchant pas Une bonne fa on de comprendre le passage par r f rence est de consid rer que les variables x et y de echanger1 sont des variables vraiment ind pendantes du a et du b de la fonction appelante alors qu au moment de l appel echanger2 le x et le y de echanger2 deviennent des liens avec a et b A chaque fois que l on utilise x dans echanger2 c est en fait a qui est utilis e Pour encore mieux comprendre allez voir le premier exercice du TP 2 A 2 1 et sa solution En pratique on utilise aussi les r f rences pour faire des fonctions retournant plusieurs valeurs la fois et ce de la fa on suivante 46 I O O1 B NN 38 3 Premiers programmes 3 2 Fonctions void un_point int amp x int amp y E Vs int a b un_point a b Ainsi notre programme de dessin al atoire deviendrait include lt Imagine Graphics h gt using namespace Imagine include lt cstdlib gt using namespace std Nombre entre 0 et n 1 int hasar
14. include lt string gt using namespace std string s hop char c s 0 int l s size if sl s1 if s1 s2 LE s1252 size_t i s find h j 6 findal h 3 k s find hop 1 s find hop s a comment b g2a var txt a b sl un deux trois s2 string sl 3 4 getline cin s getline cia Ss 17 const char xt s cCc_str 169 11 7 Fiche de r f rence 11 Cha nes de caract res fichiers Fiche de r f rence 4 4 include lt ctime gt s double clock CLOCKS_PER_SEC define _USE_MATH_D include lt cmath gt double pi M Pl EFINE Entr es Sorties include lt iostream gt using namespace std cout lt lt I lt lt i lt lt endl cin gt gt i gt gt j include lt fstream gt using namespace std ofstream hop txt 7 E EE d e PP ZE fclose ifstream g hop txt if g is_open return 1 ine i double x g gt gt 1 gt gt Kj gelose i do halle 115 est 197 ofstream f Fopend hop Ext double x 101 y ofstream f hop bin iosi Dinary write const charx 10 sizeof double f write const chars sizeof double f close ifstream g hop bin 103 binary g read charx x 10xsizeof double g read const char ey sizeof double a closet E x AR DES y String s ifstream S 6 ste include lt sstream gt usi
15. 2 5 3 Le debuggeur Il est important de pouvoir suivre pas pas le programme au cours de son ex cu tion consulter la valeur des variables etc Pour cela il faut compiler dans un mode sp cial dit Debug Cela se fait avec une variable de CMake qu on peut modifier di rectement dans le fichier CMakeCache txt ou mieux sans quitter QtCreator dans l onglet Projects passer comme argument CMake DCMAKE_BUILD_TYPE Debug puis recompiler voir Figure 2 2 La touche F9 permet de mettre un point d arret la ligne courante 2 5 4 TP Vous devriez maintenant aller faire le TP en annexe A 1 Si la pratique est essen tielle en retenir quelque chose est indispensable Vous y trouverez aussi comment ins taller les outils sur votre ordinateur lien http imagine enpc fr monasse Imagine mentionn la fin du TP Voir en Figure 2 3 ce qu il faut retenir du TP Nous en savons maintenant assez pour apprendre un peu de C Introduisons notre premi re fiche de r f rence int grant ce qu il faut retenir 28 2 Bonjour Monde 2 5 Le minimum indispensable 1 Sous Windows toujours travailler en local et sauvegarder sur le disque partag cl USB etc 2 Utiliser CMake pour construire une solution Windows 3 Nettoyer clean quand on quitte 4 Lancer directement une ex cution sauve et g n re automatiquement Attention toutefois de ne pas confirmer l ex cution si la g n ration
16. Il est grand temps de revenir sur la m moire et son utilisation Nous pourrons alors mieux comprendre les variables locales comment marche exactement l appel d une fonction les fonc tions r cursives etc Apr s cela nous pourrons enfin utiliser des tableaux de taille variable sans pour autant rentrer vraiment dans la notion d licate de pointeur 7 1 L appel d une fonction Il s agit l d une nouvelle occasion pour vous de comprendre enfin ce qui se passe dans un programme 7 1 1 Exemple Consid rons le programme suivant include lt iostream gt using namespace std void verifie int p int q int quo int res if res lt 0 l res gt q q quo res p cout lt lt Tiens c est bizarre lt lt endl int divise int a int b int amp r int q q a b r a qxb verifie a b q r return q int main int num denom do cout lt lt Entrez deux entiers positifs 21 22 23 24 25 26 27 28 7 1 L appel d une fonction 7 La m moire cin gt gt num gt gt denom while num lt 0 denom lt 0 int quotient reste quotient divise num denom reste cout lt lt num lt lt lt lt denom lt lt _ lt lt quotient lt lt Il reste lt lt reste lt lt lt lt endl return 0 Calculant le quotient et le reste d une division enti re et v rifiant qu ils sont corrects il n est pas passionnant et surtout inutilement long en fait ce son
17. Par contre t attend cette ligne pour mourir En fait le tableau dont l adresse est m moris e dans s est allou ligne 3 et lib r ligne 5 La variable s qui m morise son adresse elle est cr e ligne 3 et meurt ligne 8 Pointeurs et fonctions Il est fr quent que le new et le delete ne se fassent pas dans la m me fonction atten tion du coup aux oublis Ils sont souvent int gr s dans des fonctions A ce propos lorsque des fonctions manipulent des variables de type pointeur un certain nombre de questions peuvent se poser Il suffit de respecter la logique Une fonction qui retourne un pointeur se d clare int f intx alloue int n return new int n 1 2 3 4 mesa 5 int t alloue 10 6 Un pointeur pass en param tre une fonction l est par valeur Ne pas m lan ger avec le fait qu un tableau est pass par r f rence Consid rez le programme suivant void f intx t int n tlil On modifie t i mais pas t t Une telle ligne ne changerait pas s dans la fonction appelante 7 int s new int m f s m SoNcDcDJAROUANEe 108 I O1 NN 8 Allocation dynamique 8 3 Structures et allocation dynamique En fait c est parce qu on passe l adresse d un tableau qu on peut modifier ses l ments Par ignorance nous disions que les tableaux taient pass s par r f rence en annon ant cela comme une exception Nous
18. R cup rer le programme exemple T l charger l archive Tp2 zip sur la page du cours la d compresser sur le bu reau et ouvrir la solution dans Visual Etudier le projet Hop dont voici les sources include lt iostream gt using namespace std int plus int a int b int c c a b return Cc void triplel int a a a 3 void triple2 int amp a a ax3 int main int i j 2 k 1 3 k plus i j triplel i triple2 i return 0 Debugger Ex cuter le programme pas pas et tudier la facon dont les variables changent Souvenez vous que si vous n utilisez pas Visual vous devez utiliser Cmake avec l option DCMAKE_BUILD_TYPE Debug A 2 2 Premier programme graphique avec Imagine Dans ce TP et les suivants nous utiliserons la librairie graphique d Imagine cf annexe du polycopi Elle permet de g rer tres simplement le fen trage le dessin et les entr es sorties clavier et souris 1 Programme de d part Etudier le programme du projet Tennis dont voici le source 195 A 2 Variables boucles conditions fonctions A Travaux Pratiques 1 include lt Imagine Graphics h gt 2 using namespace Imagine 3 4 5 STILL LI II NE LL I I PE EL PL I 6 Fonction principale 7 int main 8 9 Ouverture de la fenetre 10 openWindow 256 256 11 Position et vitesse de la balle 12 int xb 128 13 yb 20 14 ub 2 15 v
19. do while ok int i 1 while i lt 100 i i 1 for int i 1 1i lt 10 1 for int i 1 j 10 j gt i i i 2 j j 3 for int i for int j saute cas i if i 3 continue for int i if t i s quitte boucle break C Fiche de r f rence finale Fiche de r f rence 2 5 Fonctions D finition int plus int a int b int c a b return c void affiche int a cout lt lt a lt lt endl D claration int plus int a int b Retour int signe double x if x lt 0 return 1 if x gt 0 return 1 return 0 void afficher int x int y y lt 0 if x lt 0 return if x gt w y gt h return DrawPoint x y RED Appel int f int a IRE ous O int i f 2 3J 9 R f rences void swap int amp int amp int tmp a a b b tmp a b int x 3 y 2 swap x y Surcharge int hasard int n int hasard int a int D double hasard Op rateurs vect operator vect A vect B vect C A B Pile des appels It ratif R cursif R f rences constantes pour un passage rapide void f const objg x void g const objg8 x f x OK Valeurs par d faut void f int a int b 0 void g f 12 12 0 5 10 2 f 10 2 void f int a int b
20. la ligne Ouf Que de termes en italique Que de concepts essayer d expliquer Et pour un programme aussi simple Mais l n est pas le probl me Commencer par expliquer ce programme c est tre encore dans le vide dans le magique dans l abstrait dans l approximatif Nous ne sommes pas r ellement ma tres de la machine Taper des ins tructions et voir ce qui se passe sans comprendre ce qui se passe n est pas raisonnable En fait c est m me tr s dommageable pour la suite On ne donne pas efficacement d ordre quelqu un sans comprendre comment il fonctionne ni ce que les ordres don n s entra nent comme travail De m me on ne programme pas convenablement sans comprendre ce que l ordinateur aura exactement besoin de faire pour ex cuter ce programme C est toute cette approche qui est n glig e quand on commence comme nous venons de le faire Donc Stop Stop Stop Faux d part On reprend le 5 Je savais bien que vouloir expliquer tous les barbarismes propres aux informaticiens m interrom prait souvent Mais bon Donc un programme d marre ou est lanc Apr s quoi il s ex cute ou tourne Enfin il se termine ou meurt 6 Les donn es sont rang es ou stock es dans des variables qui m morisent des valeurs Ces variables ne sont d ailleurs pas toujours variables au sens usuel puisque certaines sont constantes 7 Qu est ce que je disais On affiche dans une fen tre console 8 En c
21. vect operator vect A vect B vect C A B Tableaux D finition double x 5 y 5 for int i 0 i lt 5 i y i1 1 2 x i const int n 5 int i n 3 2xn Initialisation int t 4 1 2 3 4 string s 2 ab c j Affectation int s 3 1 2 3 t 3 for int 1 0 1 lt 3 1 tlil s il En param tre void init int t 4 for int i 0 i lt 4 i t i 0 void init int t int n for int 1 0 i lt n 1 t i 0 Structures struct Point double x y Color e y Point a a x 2 3 a c Red Point b 1 2 5 Blue a y 3 4 Compilation s par e include vect h aussi dans vect cpp Fonctions d clarations dans le h d finitions dans le CPP Types d finitions dans le h Ne d clarer dans le h que les fonctions utiles pragma once au d but du fichier Ne pas trop d couper Divers j 3 j i n Modulo include lt cstdlib gt i rand n x rand double RAND_MAX include lt ctime gt Un seul appel srand unsigned int time 0 include lt cmath gt double sqrt double x double cos double x X double sin double x double acos double include lt string gt using namespace std string s hop char c s 0 int l s size Entr es Sorties include lt iostream gt using namespace std cout
22. LLENAS const iterator it it 1 begin it 1 end 1t s xit tor listsint gt iterator it for it l begin it l end it if xit 2 xit 4 stack queue heap Map SEE VOCE ss 184 12 Fonctions et classes param tr es templates 12 7 Fiche de r f rence Fiche de r f rence 4 6 Template Fonctions A mettre dans le fichier qui utilise ou dans un h template lt typename T gt T maxi T a T 6 1 PA Le type est trouv tout seul maxi 1 2 FIERE maxid 2 3 doubie maxi MSN on sering Objets template lt typenam class paire T x 2 publics paire 1 paire TI a T b 1 x 0 a x 1 b T add const y ES template lt typename T gt T paire lt T gt add const return x 0 x 1 1 Le type doit tre 7 pr cis paire lt int gt a 1 2 int s a somme paire lt double gt b Multiples templat lt typename T typename S gt class hop 1 hop lt int string gt A Entiers template lt int N gt class hop hop lt 3 gt A Entr es Sorties include lt iostream gt using namespace std cout lt lt I lt lt i lt lt endl cin gt gt gt gt 75 include lt fstream gt using namespace std ofstream f hop txt f lt lt 1 lt lt T lt lt 2 3 f close ifstream g hop txt if g is_open retur
23. Non standard switch c case a cout lt lt Vous avez tap break case f cout lt lt Vous avez tap f Au revoir lt lt endl fini true break case e case i case 0 case u case y cout lt lt Vous avez tap une autre voyelle lt lt endl break a lt lt endl 14 Faire if i 3 affecte 3 i puis renvoie 3 comme r sultat du test ce qui est consid r comme vrai car la convention est qu un bool en est en fait un entier faux s il est nul et vrai s il est non nul 15 C est une erreur grave et fr quente d oublier le break Sans lui le programme ex cute aussi les instructions du cas suivant 16 Attention un cin gt gt c instruction que nous verrons plus loin lit bien un caract re au clavier mais ne r agit pas chaque touche il attend qu on appuie sur la touche Entr e pour lire d un coup toutes les touches frapp es R cup rer juste une touche la console n est malheureusement pas stan dard et n est plus tr s utilis dans notre monde d interfaces graphiques Sous Windows il faudra utiliser _getch apr s avoir fait un include lt conio h gt cf lignes 3 et 10 et sous Unix getch apr s avoir fait un include lt curses h gt 36 26 27 28 29 30 31 32 I O1 amp NN 3 Premiers programmes 3 1 Tout dans le main default cout lt lt Vous avez tap autre chose lt lt en
24. alloc v n for int i 0 i lt n i OK m me si n tl lil w t 1 vect vect alloc 0 vect vect const vect amp v copy v vect vect 149 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 10 11 Objets avec allocation dynamique kill O const vect amp vect operator const vect amp v if this amp v kill copy v return v vect vect int N alloc N Pour tester constructeur de copie vect f vect a return a Pour tester le reste int main vect a b 10 c 12 d a b a a a c a d a f a b f b return 0 150 10 Constructeurs et Destructeurs 10 Constructeurs et Destructeurs 10 12 Fiche de r f rence 10 12 Fiche de r f rence Fiche de r f rence 1 4 Boucles do while ok int i l while i lt 100 i i 1 for int i 1 i lt 10 1 for int i 1 3 10 J gt 1 1i 1 2 3 3 3 for int i for int j saute cas i if i 3 continue Clavier Debug F5 Step over F10 Step inside F11 Indent Ctrl A Ctrl I Step out Maj F11 Gest t ches Ctrl Maj Ech Structures struct Point double x y Color Cy Point a a x 2 3 a c Red Point b 1 2 5 Blue Une structure est un objet en tierement
25. crire B 2xA on ne pourra pas cr er Matrice double operatorx Matrice A IMPOSSIBLE car double n est pas un objet car cela reviendrait d finir une m thode pour le type double qui n est pas un ob jet Il faudra simplement se contenter d un op rateur standard qui d ailleurs sera bien inspir d appeler la m thode Matrice operator double lambda si elle est d j programm e Matrice operator double lambda Matrice A return Axlambda d fini pr c demment rien reprogrammer B 2xA appelle operatorx 2 A qui appelle son tour A operatorx 2 Nous verrons au chapitre suivant d autres op rateurs utiles dans le cas des objets 9 6 Interface Si on regarde bien le main de notre exemple de matrice on s aper oit qu il n utilise plus les champs des Matrice mais seulement leurs m thodes En fait seule la partie struct Matrice void cree int ml int nl void detruit double get int i int j void set int i int j double x 4 et de toute fa on n appartient pas au programmeur 124 9 Premiers objets 9 7 Protection void affiche string s Matrice operatorx Matrice B int resse l utilisateur Que les dimensions soient dans des champs int m et int n et que les l ments soient dans un champ double t ne le concerne plus c est le probl me de celui qui programme les matrices Si ce dernier trouve un autre moyen de stocker un tableau bidimensionnel
26. on peut forcer certaines valeurs si besoin Comme ceci enum Code C10 200 CIl 231 C12 240 C13 Vaudra 241 C14 242 Voil C est tout pour aujourd hui Nous continuerons au prochain chapitre Il est donc temps de retrouver notre c lebre fiche de r f rence 166 11 Cha nes de caract res fichiers 11 7 Fiche de r f rence 11 7 Fiche de r f rence Fiche de r f rence 1 4 Boucles do while ok int i l while i lt 100 i i 1 for int i 1 i lt 10 1 for int i 1 3 10 J gt 1 1i 1 2 3 3 3 for int i for int j saute cas i if i 3 continue Clavier Debug F5 Step over F10 Step inside F11 Indent Ctrl A Ctrl I Step out Maj F11 Gest t ches Ctrl Maj Ech Structures struct Point double x y Color Cy Point a a x 2 3 a c Red Point b 1 2 5 Blue Une structure est un objet en tierement public gt cf ob jets a y 3 4 Variables D finition int i int k 1 m Affectation i 2 j i k 1 3 Initialisation int n 5 o n Constantes const int s 12 Port e int i i j int j 2 i j OK if ei int k 3 OK interdit j k i k Types int i 3 double x 12 3 char c A string s hop bool t true f u s u interdit loat y 1 2f ns
27. string s 2 ab c Affectation int s 3 1 2 3 t 3 for int 1 0 1 lt 3 1 4 tlil s il En param tre void init int t 4 for int 1 0 1 lt 4 i t i 0 void init int t int n for int i 0 i lt n i t i 0 Taille variable int t new int n 1 deletel t En parametre suite void f intx t int n Elli void alloue intx 8g t t new int n 2D ine ALAI 213 ATI int A 2 3 1 11 2 3 14 5 6 5 void flint ALIS 2D dans 1D int Aero A i 2 l 4 0 Taille variable suite int E kS Structures struct Point double x y Goror C Point a a x 2 3 a c Red Point b 1 2 5 Blue 7 a y 3 4 Compilation s par e include vect h aussi dans vect cpp Fonctions d clarations dans le h d finitions dans le CPP Types d finitions dans le h Ne d clarer dans le h que les fonctions utiles pragma once au d but du fichier Ne pas trop d couper 114 8 Allocation dynamique 8 6 Fiche de r f rence Fiche de r f rence 3 3 Tests Comparaison Go gt N gation Combinaisons amp amp if if i 0 else i 0 j 1 j 1 3 2 bool t i if t j 1 switch i case 1 F F break case 2 case 3 F break default Eg Entr es Sorties include lt io
28. 195 A23 Jeude IAE socorro esm tanie aue a A 197 A 3 Tableaux Lou rra a a taus 199 A 3 1 Mastermind Texte 199 A32 E II 201 AA Structures 44444 203 A Dur Li ra share al rat s t s tetes ts 203 ee ae na Re E O ue 205 A43 DICO physique ca carr 206 AS o A us d s a e eut ses SU Sas Eve 208 A 5 1 Fonctions outils 4 o sou ou mn a de ae en au 208 ASA VECTOR Re dub ce an bre ce die etre 208 ana Balle part oec sis iaa 209 ASE Retour laphysigue gt es sess e Eras 209 A A sota dia RE NAS a e MR ae di aef ii a di de ae ia 212 AGL Allocation 2 dt de aa aea de RR RAGE ESA ad 212 A 6 2 Tableaux statiques caera AA kids 212 A63 Tableauxdynamiques o s es saws meredes esnai 213 AGA COSITA DCI resres asni A 213 AGS EDIC ecg eae a A a 213 AGO UCI oa la a A a a sl A a 214 AE Rein a O A DIS A AA BR a 214 A Premiers objets et dessins de fractales a mare gr ea me 215 AJL Letrianglede DIE co e sac A a 215 A72 Une Classe plut t qu une structure o osc mu demande 216 Ada Changer dimpl mentation gt ecaa ria das dsa a 216 AJA Lelloconda neige osas a ads A aa de 217 AS M 23 13 Lou da a da bl Vies en 218 EE A RS D A D PE D ee Mn re ery 218 BD TION 2 4 a ianea Lan mate Da didier 219 ASA MARQUES ci surement eus Sas MIN Fes dame 219 B Imagine 221 BDI COMOR O a a E aa a E 221 A IN 222 A A II IN 223 PaA DKA orar e ia Aa 223 ES Installation
29. 3 donne t il le tableau suivant Ligne N fact1 3 ret fact1 3 Nfact1 2 ret fact1 2 Nfact1 1 ret fact1 1 S fact 3 3 9 fact1 5 fact1 9 fact1 5 fact1 8 fact1 Fr N N Q 10 facti 9b fact 10 fact 9b facti 10 facti pa NNNNNN ND N N Re 0 Y Y Y 6 2 A 6 oo Ce tableau devient difficile crire maintenant qu on sait que les variables locales ne d pendent pas que de la fonction mais changent chaque appel On est aussi oblig de pr ciser pour chaque num ro de ligne quel appel de fonction est concern Si on visualise la pile on comprend mieux pourquoi a marche Ainsi arriv s en ligne 8 de fact1 1 pour un appel initial fact1 3 la pile ressemble pile variable valeur place libre top N fact1 1 1 N fact1 2 2 N fact1 3 3 ce que l on peut ais ment v rifier avec le d buggeur Finalement Les fonctions r cursives ne sont pas diff rentes des autres C est le syst me d appel des fonctions en g n ral qui rend la r cursivit possible 8 Le fait de pouvoir mettre des return au milieu des fonctions est ici bien commode 94 22 23 24 25 26 27 28 32 33 7 La m moire 7 3 Fonctions r cursives 7 3 2 Efficacit Une fonction r cursive est simple et l gante crire quand le probl me s y pr te Nous venons de voir qu ell
30. 3 2 5 Variables locales et globales Nous avons vu section 3 1 1 la port e des variables La r gle des accolades s ap plique videmment aux accolades du corps d une fonction Les variables d une fonction sont donc inconnues en dehors de la fonction On parle alors de variables locales la fonction Ainsi le programme suivant est in terdit void f int x x 3 void g int y y x Erreur x inconnu Si vraiment deux fonctions utilisent des variables communes il faut alors les sortir des fonctions Elles deviennent alors des variables globales dont voici un exemple int z globale void f int x locale 49 NI O1 B amp ND o 3 2 Fonctions 3 Premiers programmes if x lt z void g int y locale Z Y L utilisation de variables globales est tol r e et parfois justifi e Mais elle constitue une solution de facilit dont les d butants abusent et il faut combattre cette tentation d s le d but les variables globales sont viter au maximum car elles permettent parfois des communications abusives entre fonctions sources de bugs les fonctions qui les utilisent sont souvent peu r utilisables dans des contextes diff rents En g n ral elles sont le signe d une mauvaise fa on de traiter le probl me a C est pourquoi les variables globales non constantes ne sont pas tol r es chez le d bu t
31. Allocation dynamique 8 3 Structures et allocation dynamique A t i 2 xj i j affiche A A Matrice B cree 3 5 for int i 0 i lt 3 i for int j 0 j lt 5 j B t i 3x3 i 3 affiche B B Matrice C produit A B affiche C C detruit C detruit B detruit A return 0 L utilisateur n a maintenant plus qu savoir qu il faut allouer et lib rer les matrices en appelant des fonctions mais il n a pas savoir ce que font ces fonctions Dans cette logique on pourra rajouter des fonctions pour qu il n ait pas non plus besoin de savoir comment les l ments de la matrice sont m moris s Il n a alors m me plus besoin de savoir que les matrices sont des structures qui ont un champ t Nous nous rappro chons vraiment de la programmation objet Bref on rajoutera en g n ral double get Matrice Mint i int j return M t i M m j void set Matrice Mint i int j double x M t i M mxj x que l utilisateur pourra appeler ainsi for int i 0 i lt 2 i for int j 0 j lt 3 j set A i j i j et que celui qui programme les matrices pourra aussi utiliser pour lui void affiche string s Matrice M cout lt lt s lt lt _ lt lt endl for int i 0 iM m i for int j 0 j lt M n j cout lt lt get Mi j lt lt cout lt lt endl o a Attention il reste facile dans ce contexte D oublier d allouer D oublier de d sallouer De ne pas d sa
32. NON if i 2 NON if i 2 NON if i 2 then NON i 0 i lt 100 i NON for int Ant EL les int i f NON double x 1 3 int i j x 1 3 NON x double 1 3 NON NON double x 10 y 10 for int i 1 i lt 10 i y 1 2 x i NON int int n 5 t n NON 4 NON int t 4l int return t NON int t 41 t int s 3 11 2 3 t 131 t s NON int t 2 t 1 2 NON struct Pointe double x y NON Point a a 11 2 s NON Imagine Voir documentation Clavier Debug F5 Step over F10 5 Step inside F11 Indent Ctrl A Ctrl I Conseils Nettoyer en quittant Erreurs et warnings cliquer Indenter Ne pas laisser de warning Utiliser le debuggeur Faire des fonctions Tableaux pas pour transcrire une formule math matique Faire des structures 75 6 Plusieurs fichiers Chapitre 6 Plusieurs fichiers Lors du dernier TP nous avons r alis deux projets quasiment similaires dont seuls les main taient diff rents Modifier apr s coup une des fonctions de la partie commune aux deux projets n cessiterait d aller la modifier dans les deux projets Nous allons voir maintenant comment factoriser cette partie commune dans un seul fichier de fa on en simplifier les ven tuelles futures modifications Au passage nous verrons comme
33. NON t 1 NON 154 11 Cha nes de caract res fichiers Chapitre 11 Cha nes de caracteres fichiers Nous commen ons avec ce chapitre un tour de tout ce qui est utile et m me souvent in dispensable et que nous n avons pas encore vu cha nes de caract res fichiers plus quelques fonctionnalit s utiles Encore une fois nous ne verrons pas tout de mani re exhaustive mais les fonctions les plus couramment utilis es Vous en connaissez suffisamment pour r aliser de nombreux programmes Ce qui vous manque en g n ral ici c est la pratique Apr s avoir affront les exercices tout faits vous r alisez que livr s vous m me il vous est difficile de vous en sortir Alors lancez vous Tentez de programmer l un des projets propos s sur la page Web du cours Vous constaterez rapidement qu il vous manque aussi quelques fonctions ou types de variables usuels Ce chapitre est l pour y rem dier 11 1 Cha nes de carat res Les cha nes de caract res sont les variables stockant des suites de caract res c est dire du texte Nous les avons d j rencontr es include lt string gt using namespace std string s hop char c s 0 int l s size Compl tons 1 Les cha nes peuvent tres compar es C est l ordre alphab tique qui est videm ment utilis if sl s1 if s1 s2 if s1 lt s2 if s1 gt s2 if s1 gt s2 if sl lt s2 11 1 Cha nes de ca
34. Ne veut rien dire pas plus que 2 3 On ne range pas une valeur dans le retour d une fonction de m me qu on n crit pas 2 3 En fait si C est possible Mais uniquement si la fonction retourne une r f rence donc un lien vers une variable int i Variable globale int amp f return ji f 3 OK Met 3 dans i Attention apprendre a un d butant est tr s dangereux En g n ral il se d p che de commettre l horreur suivante int amp f int i Var locale return i r f rence vers une variable qui va mourir C EST GRAVE f 3 NON Le i n existe plus Que va t il se passer 161 11 4 Accesseurs 11 Cha nes de caract res fichiers 11 4 2 Utilisation M me si un objet n est pas une variable globale un champ de cet objet ne meurt pas en sortant d une de ses m thodes On peut partant du programme class point double x N public void set int i double v void point set int i double v x i v point p p set 1 2 3 le transformer en class point double x N public double amp element int i y double point element int i return x i point p p element 1 2 3 11 4 3 operator Etape suivante ceci devient encore plus utile quand on conna t operator qui per met de red finir les parentheses class point double x N public double operator int i double amp point operator i
35. ajouter un nouveau projet Imagine appel Duel dans cette m me solution Recopier par exemple par copier coller int gralement le contenu du fichier Tp4 cpp dans un fichier Duel cpp Une fois cette copie faite modifier le fichier CMakeLists txt en ajoutant deux lignes indiquant que l ex cutable Duel d pend de Duel cpp et utilise la biblioth que Graphics d Imagine vous de jouer Transformer le projet Duel l aide des fonctions qui y sont d j pr sentes en un jeu de tir deux joueurs Chacun des deux joueurs a une position fix e et divers soleils sont plac s al atoirement dans l cran Chaque joueur tour de r le peut 204 A Travaux Pratiques A 4 Structures 14 15 16 X Imagine yox X Imagine FIGURE A 5 Corps c lestes et jeu de tir lancer une Balle avec la vitesse initiale de son choix la balle subissant les effets de gravitation des divers soleils et disparaissant au bout de 250 pas de temps d affichage Le gagnant est le premier qui r ussit atteindre l autre Conseils pratiques positionner sym triquement les joueurs par rapport au centre de pr f rence mi hauteur en laissant une marge d un huiti me de la largeur sur le c t utiliser la fonction GetMouse pour conna tre la position de la souris en d duire la vitesse d sir e par le joueur en retranchant ces coordonn es celles du centre de l
36. avec un constructeur un programme qui ne se compile plus class point int x y public point int X int Y 136 10 Constructeurs et Destructeurs 10 3 Cas g n ral point point int X int Y x X y Y point a 2 3 construit avec point X Y point b ERREUR point n existe plus et il faut alors rajouter un constructeur vide m me s il ne fait rien class point int x y public point point int X int Y point point point point int X int Y X X Y Y point a 2 3 construit avec point X Y point b OK construit avec point 10 3 3 Tableaux d objets Il n est pas possible de sp cifier globalement quel constructeur est appel pour les l ments d un tableau C est toujours le constructeur vide qui est appel point t 3 Construit 3 fois avec le constructeur vide sur chacun des l ments du tableau pointx s new point n Idem n fois pointx u new point 1 2 n ERREUR et HORREUR Un essai de construire les uli avec point 1 2 qu n existe pas Il faudra donc crire point u new point n for int i 0 i lt n i u i set 1 2 ce qui n est pas vraiment identique car on construit alors les points vide puis on les affecte Par contre il est possible d crire point t 3 point 1 2 point 2 3 point 3 4 ce qui n est videmment pas faisable pour un tableau de taille variable 137 NI O1 BB
37. ca coraa id nadia a ve RR A 4 224 C Fiche de r f rence finale 227 1 Pr ambule Chapitre 1 Pr ambule Note Ce premier chapitre maladroit correspond a l tat d esprit dans lequel ce cours a d but en 2003 dans une p riode o l Informatique avait mauvaise presse l cole des Ponts Nous le maintenons ici en tant que t moin de ce qu il fallait faire alors pour amener les l ves ne pas n gliger l Informatique Si l on ignore la na vet de cette premi re r daction et le fait que Star Wars n est plus autant la mode l analyse et les conseils qui suivent restent d actualit Ce premier chapitre tente surtout de motiver les l ves ing nieurs dans leur apprentissage de la programmation Les enfants qui se trouveraient ici pour apprendre programmer sont s rement d j motiv s et peuvent sauter au chapitre suivant Profitons en pour tenir des propos qui ne les concernent pas Le Ma tre Programmeur Rassure toi Les ordinateurs sont stupides Program mer est donc facile L Apprenti Programmeur Ma tre les ordinateurs ne sont certes que des ma chines et les dominer devrait tre ma port e Et pourtant Leur manque d in telligence fait justement qu il m est p nible d en faire ce que je veux Programmer exige de la pr cision et la moindre erreur est sanctionn e par un message incom pr hensible un bug ou m me un crash de la machine Pourquoi doit on tre aussi
38. crire mais plut t point p 1 2 OUI 138 10 Constructeurs et Destructeurs 10 5 TP L utilit de ces objets temporaires est visible sur un exemple r el point point operator point b point c x b x y b y return c point a 1 2 b 2 3 c a f b s crira plut t point point operator point b return point x b x y b y c point 1 2 f point 2 3 FIGURE 10 1 Jeu de Tron 10 5 TP Nous pouvons faire une pause et aller faire le TP que nous proposons en A 8 Il s agit de programmer le jeu de motos de Tron figure 10 1 10 6 R f rences Constantes 10 6 1 Principe Lorsqu on passe un objet en param tre une fonction il est recopi Cette recopie est source d inefficacit A nsi dans le programme suivant const int N 1000 class vecteur double t N E class matrice double t N J N 139 10 6 R f rences Constantes 10 Constructeurs et Destructeurs r sout AX B void solve matrice A vecteur B vecteur amp X vecteur b x matrice a solve a b x r sout ax b les variables A et B de la fonction solve sont des copies des objets a et b de la fonction appelante Notez bien que pass par r f rence le param tre X n est pas une copie car il s agit juste d un lien vers la variable x La recopie de a dans A n est pas une tr s bonne chose La variable a fait dans notre cas pas moins de 8 millions d octets les
39. cuter les fonctions pas pas sous debuggeur les fonctions inline sont compil es comme des fonctions normales en mode Debug Seul le mode Re lease profitera donc de l acc l ration Cas des m thodes Dans le cas d une m thode il faut bien penser la mettre dans le ficher h si la classe tait d finie en plusieurs fichiers C est le moment de r v ler ce que nous gar dions cach 4 Les programmeurs C pourraient aussi tre tent s de programmer des macros ie des raccourcis avec des define ce que nous n avons pas appris faire Celles ci sont moins puissantes que les inline car elles ne v rifient pas les types ne permettent pas d acc der aux champs priv s etc Le programmeur C les utilisera avec parcimonie 164 11 Cha nes de caract res fichiers 11 5 Assertions Il est possible de D FINIR UNE M THODE ENTI REMENT DANS LA D FINI TION DE LA CLASSE au lieu de seulement l y d clarer puis placer sa d finition en dehors de celle de la classe Cependant ceci n est pas obliga toire ralentit la compilation et va l encontre de l id e qu il faut masquer le contenu des m thodes l utilisateur d une classe C est donc R SERV AUX PETITES FONCTIONS en g n ral de type inline a Contrairement ce qu il faut faire en Java Encore une source de mauvaises habitudes pour le programmeur Java qui se met C Voici ce que cela donne en pratique class ma
40. dans un endroit d cid par le C de tel sorte que l instruction 8B45F8 aille bien chercher la variable a C est un travail p nible que le C fait pour nous et que les programmeurs faisaient autrefois la main Bref on a en plus adresse m moire contenu repr sente 00500000 ai 00500001 az a 00500002 a3 00500003 a4 00500004 bi 00500005 ba b 00500006 ba 00500007 ba o les octets a1 a4 combin s donnent l entier a sur 32 bits Certains processeurs dits big endian d cident a ajazaza d autres little endian que a ayazazai Cela signifie que Tout comme pour les instructions un nombre stock par un micro processeur dans un fichier peut ne pas tre compr hensible par un autre micro processeur qui relit le fichier 23 Les variables ayant plus de 256 valeurs possibles sont forc ment stock es sur plusieurs octets Ainsi avec 4 octets on peut compter en binaire sur 4 x 8 32 bits soit 2 valeurs possibles plus de 4 milliards 24 Ce qui tait le plus p nible n tait pas de d cider o il fallait ranger les variables en m moire mais d ajuster les instructions en cons quence Si on se trompait on risquait d crire au mauvais endroit de la m moire Au mieux cela effa ait une autre variable ce comportement est encore possible de nos jours au pire cela effa ait des instructions et le programme pouvait faire de grosses b tises ce
41. finie avant la fonction main void DessineBalle int x int y Color col De m me d finir une fonction void BougeBalle int amp x int amp y int amp u int amp v pour g rer les rebonds et le d placement de la balle A 2 3 Jeu de Tennis Nous allons rendre ce programme plus ludique en y ajoutant deux raquettes se d pla ant horizontalement en haut et en bas de l cran et command es par les touches du clavier 1 Affichage des raquettes Ajouter dans la fonction main des variables xr1 yr1 xr2 yr2 d di es la position des deux raquettes Puis d finir une fonction DessineRaquette en prenant mod le 197 A 2 Variables boucles conditions fonctions A Travaux Pratiques X Imagine v A xX FIGURE A 2 Mini tennis sur DessineBalle Placer les appels de ces fonctions aux endroits appropri s dans la boucle principale 2 Gestion du clavier La gestion du clavier est r alis e pour vous par la fonction Clavier dont nous ignorerons le contenu pour l instant Cette fonction nous permet de savoir direc tement si une des touches qui nous int ressent q et s pour le d placement de la premiere raquette k et 1 pour la deuxi me sont enfonc es ou non Cette fonc tion Clavier int amp sens1 int amp sens2 retourne dans sens1 et sens2 les valeurs 0 1 ou 1 0 pas de d placement 1 vers la gauche 1 vers la droite 3 D placement des raquettes Coder le d placement d une raque
42. lt lt I lt lt i lt lt endl cin gt gt i gt gt J 87 6 4 Fiche de r f rence 6 Plusieurs fichiers Fiche de r f rence 3 3 Erreurs fr quentes Pas de d finition de fonction dans une fonction int q r 4 NON if i 2 NON if i 2 NON if i 2 then NON i 0 i lt 100 i NON DRE EC dus int i f NON double x 1 3 int i j x 1 3 NON x double 1 3 double x 10 y 10 for int 1 1 i lt 10 1 yli 2xx i NON for int NON NON int n 5 int t nl NON int 4 NON int t 4 return t NON int t 4 t int s 3 1 1 2 3 t 31 t s NON int t 21 t 1 2 NON struct Point double x y NON Point a a 1 2 NON include tp cpp NON Imagine Voir documentation Clavier Debug F5 Step over F10 5 Step inside F11 Indent Ctrl A Ctrl I Conseils Nettoyer en quittant Erreurs et warnings cliquer Indenter Ne pas laisser de warning Utiliser le debuggeur Faire des fonctions Tableaux pas pour transcrire une formule math matique Faire des structures Faire des fichiers s par s Le h doit suffire l utilisa teur qui ne doit pas regarder le cpp 88 NI O1 B amp ND ND EE A id ei aaa NI OO O1 YN 7 La m moire Chapitre 7 La m moire
43. me type les structures sont utilis es pour regrouper plusieurs variables afin de les manipuler comme une seule On cr e un nouveau type dont les variables en question deviennent des sous variables appel es champs de la structure Voici par exemple un type Point pos s dant deux champs de type double nomm s x et y struct Point double x y y Les champs se d finissent avec la syntaxe des variables locales d une fonction Atten tion par contre Ne pas oublier le point virgule apr s l accolade qui ferme la d finition de la structure L utilisation est alors simple La structure est un nouveau type qui se manipule exacte ment comme les autres avec la particularit suppl mentaire qu on accede aux champs avec un point Point a a x 2 3 a y 3 4 On peut videmment d finir des champs de diff rents types et m me des structures dans des structures struct Cercle Point centre double rayon Color couleur 71 5 2 Les structures 5 Les structures E Cercle C C centre x 12 C centre y 13 C rayon 10 4 C couleur Red L int r t des structures est vident et il faut Regrouper dans des structures des variables d s qu on rep re qu elles sont logiquement li es Si un programme devient p nible parce qu on passe syst matiquement plusieurs param tres identiques de nombreuses fonc tions alors il est vraisemblable que les param tres en question puissent tre a
44. pile variable valeur pile variable valeur pile variable valeur place libre top gt pv 23 place libre Av 3 quo 7 res 2 place libre top gt a 23 a 23 b 3 b 3 qa 7 qa 7 Y reste r reste denom 3 denom 3 top denom 3 num 23 num 23 num 23 quotient quotient quotient 7 reste 2 reste 2 reste 2 pris par les a pris par les s pris par les fonctions a fonctions g fonctions avant main des avant main se avantmain FIGURE 7 2 Pile et variables locales De gauche droite tape b ligne 12 tape c ligne 5 et tape g ligne 25 26 Les param tres sont en fait des variables locales Leur seule sp cificit est d tre initialis s d s le d but de la fonction avec les valeurs pass es l appel de la fonction 7 2 2 La pile Les variables locales et donc les param tres ne sont pas m moris es des adresses fixes en m moire d cid es la compilation Si on faisait a les adresses m moire en question devraient tre r serv es pendant toute l ex cution du programme on ne pourrait y ranger les variables locales d autres fonctions La solution retenue est beau coup plus conome en m moire Les variables locales sont m moris es dans un pile Quand une variables locale est cr e elle est rajout e en haut de cette pile Quand elle meurt en g n ral quand on quitte sa fonction elle est sor tie de la pile Ainsi au fur et mesure des ap
45. rer al atoirement une combinaison faire deviner l utilisateur Nous allons pour cela utiliser les fonctions d clar es dans le fichier cstdlib notamment la fonction rand permettant de g n rer un nombre au hasard entre 0 et RAND MAX Afin d obtenir un nombre entre 0 etn on proc dera de la mani re suivante x rand n 199 A 3 Tableaux A Travaux Pratiques Pour que la s quence de nombres g n r e ne soit pas la m me d une fois sur l autre il est n cessaire d initialiser le g n rateur avec une graine variable La mani re la plus simple de proc der consiste utiliser l heure courante La fonc tion time d clar e dans le fichier ctime permet de l obtenir En fin de compte la fonction suivante nous permet donc de g n rer une combi naison include lt cstdlib gt include lt ctime gt using namespace std void genereCombinaison int combin 5 for int i 0 i lt 5 i combin i rand 4 appels au generateur srand unsigned int time 0 initialisation genereCombinaison combin 5 Changer la complexit du jeu Rapidement vous allez devenir des experts en Mastermind Vous allez alors vou loir augmenter la difficult Il suffira alors d allonger la longueur de la combinai son ou d augmenter le nombre de couleurs possibles Cela vous est dores et d j tres facile si vous avez pens d finir une constante globale pour chacune de ces deux grandeurs Si ce n est pa
46. s est mal pass e 5 Double cliquer sur un message d erreur positionne l diteur sur l er reur 6 Toujours bien indenter 7 Ne pas laisser passer des warnings 8 Savoir utiliser le debuggeur 9 Touches utiles F5 Debug Continue F10 Step over ra ME Step inside Ctrl A Ctrl I QtCreator Indent selection FIGURE 2 3 Ce qu il faut retenir du TP 1 Fiche de r f rence 1 1 Entr es Sorties Clavier Nettoyer en quittant ds BESAS Debug F5 2 a Erreurs et warnings cliquer using namespace std Step over F10 MA Indenter e Step inside F11 i EE l HFa e pas laisser de warn ng Gout le Edi dede Chi Cual P id GEN Fe Doar Utiliser le debuggeur Conseils 29 3 Premiers programmes Chapitre 3 Premiers programmes Par s exp rimenter au fur et mesure avec notre environnement de programmation il est temps d apprendre les premiers rudiments du C Nous allons commencer par programmer n importe comment puis nous ajouterons un minimum d organisation en apprenant faire des fonctions On organise souvent un manuel de programmation de facon logique par rapport au langage en diff rents points successifs les expressions les fonctions les variables les instructions etc Le r sultat est indigeste car il faut alors tre exhaustif sur chaque point Nous allons plut t ici essayer de voir les choses telles qu el
47. Collision en les retirant de Gravitation cpp Ne pas oublier les lignes sui vantes que l on pourra retirer de Gravitation cpp include lt cstdlib gt include lt ctime gt using namespace std Attention de ne pas placer le nouveau fichier dans le build directory de CMake Vous devez bien placer ce fichier dans le dossier des sources le m me que Gra vitation cpp N oubliez pas de modifier les arguments de add_executable du CMakeLists txt pour y ajouter Tools cpp Vous n avez pas besoin de re lancer Cmake ou de fermer votre IDE Celui ci va d tecter le changement du CMakeLists txt et vous proposer de recharger le projet s il ne le fait pas auto matiquement Acceptez sa proposition il relance Cmake en coulisses 3 et un fichier de d clarations Ajouter un nouveau fichier d en t te nomm Tools h Inclure la protection contre la double inclusion vue en cours pragma once Y placer les d clarations des fonctions mises dans Tools cpp ainsi que la d finition de dt en retirant celle ci de main Rajouter au d but de Tools cpp et de Gravitation cpp un include Tools h A 5 2 Vecteurs 4 Structure Vector Cr er dans un nouveau fichier Vector h une structure repr sentant un vecteur du plan avec deux membres de type double Ne pas oublier le m canisme de protection contre la double inclusion D clarer et non d finir les op rateurs et fonction suivants Vector operator Vector a Vector b Somme
48. Ensuite un tableau doit avoir une taille fixe connue la compilation Cette taille peut tre un nombre ou une variable constante mais pas une variable M me si on pense que le compilateur pourrait conna tre la taille il joue au plus idiot et n accepte que des constantes 1 double x 10 y 4 z 51 OK 2 const int n 5 3 int ifn j 2 n k n 1 OK 4 int nl nl n a m me pas de valeur 5 int Clinlls 77 done ERREUR 6 int n2 7 cin gt gt n2 n2 prend une valeur mais connue 8 uniquement l ex cution 9 int t2 n2 donc ERREUR 10 int n3 11 n3 5 n3 prend une valeur connue 12 l ex cution mais non constante 13 int t3 n3 donc ERREUR SI 54 O NI GO gl D O1 amp ND HR OS O1 4 Les tableaux 4 2 Initialisation Connaissant ces deux points on peut tr s facilement utiliser des tableaux Attention toutefois ne pas utiliser de tableau quand c est inutile notamment quand on traduit une formule math matique Je m explique Si vous devez calculer s 3 f i pour f donn e par exemple F 1 3i 4 n allez pas crire comme on le voit parfois double f 100 for int i 1 i lt 100 i f i 3x 1i 4 double s for int i 1 i lt 100 i s s flil ni m me ayant corrig vos bugs double f 100 Stocke f i dans fli 1 for int i 1 i lt 100 i f i 1 3 xi 4 Attention aux indices double s 0 Ca va
49. Inline appel rapide inline double sqr double x return xxx double y sqr z 3 R f rence en retour int i Var globale int amp return 1 f 3 i 3 Tableaux D finition double x 51 y 515 for int 1 0 1 lt 5 1 ylil 2xx 1 const int n 5 int ifn j 2xn Initialisation int t 4 1 2 3 4 string s 2 ab c Affectation int s 3 1 2 3 t 31 for int i 0 i lt 3 i tlil s il En param tre void init int t 4 for int i 0 1i lt 4 i t i 0 void init int tl int n for int i 0 i lt n i t i 1 0 Taille variable int t new int n deletel t En param tre suite void f intx t int n t il void alloue intx amp t t new int n 2D int A 2 1 31 AL des int A 2 3 E A LAS OT void f int A 2 2 2D dans 1D int A 2x3 5 ATETZ Sees Taille variable suite int xt xs n En param tre fin void f const intx t int n s t i OK t i l NON Structures struct Point double x y Color c Point a a x 2 3 a c Red Point b 1 2 5 Blue a y 3 4 Une structure est un objet en ti rement public gt cf ob jets 229 C Fiche de r f rence finale Fiche de r f rence 3 5 Objets struct obj int x champ f m thode i
50. add_executable EssaiQtCreator main cpp Cela indique qu on a un fichier de code source main cpp et que notre programme ex cutable s appelera EssaiQtCreator On crit ce fichier dans le m me dossier que le fichier source main cpp dossier source On lance QtCreator et on lance l option Open file or project dans le menu File On lui donne le fichier CMakeLists txt comme projet Dans la fen tre de configuration on s lectionne un dossier o g n rer les fichiers dossier de build Pour cela cliquer sur Browse et cr er un nouveau dossier puis cliquer le bouton Configure project On peut voir un message du type Configuring done Generating done Build files have been written to home pascal TEMP Build 26 2 Bonjour Monde 2 5 Le minimum indispensable o uy main cpp EssaiQtCreator QE Creator File Edit Build Debug Analyze Tools Window Help Projects ATI O e p main cpp welcome IM 5 EssaiQtCreator CMakeLists txt MES Bl main cpp gt main int Line 1 Col 1 Er x 1m int main return 0 U BW N Analyze Compile Output gt WM 19 44 36 Running steps for project EssaiQtCreator 19 44 36 Starting usr bin make Scanning dependencies of target EssaiQtCreator 100 Building CXX object CMakeFiles EssaiQtCreator dir main cpp o l Linking CXX executable EssaiQtCreator 100 Built target EssaiQtCreator 19 44
51. arr te lorsqu il atteint l instruction correspondant la ligne de source debugger Si c est compliqu mettre au point c est tr s simple utiliser surtout dans un environnement de pro grammation graphique Nous verrons au fur et mesure des TP comment le debuggeur peut aussi inspecter les appels de fonctions espionner la modification d une variable etc 46 souvent appel IDE Integrated Development Environment 47 Un fichier en c sera consid r comme du C 48 D bogueur en fran ais 25 2 5 Le minimum indispensable 2 Bonjour Monde 2 5 Le minimum indispensable 2 5 1 Pour comprendre le TP Voici le programme C strictement minimal crit dans un fichier main cpp int main Le mot r serv main indique le point d entr e du programme C est une fonction un bloc de code Comme une fonction math matique elle prend une ou plusieurs entr es et a une valeur de retour Pour cette fonction il n y a rien entre les parentheses ce qui signifie qu elle n a pas d argument en entr e Par contre elle retourne une valeur enti re type int comme integer Cette fonction ne fait rien la liste de ses instructions est vide bloc entre accolades Mais quelle est la valeur retourn e par cette fonction Cette fonction retourne la valeur 0 qui par convention indique que tout est normal pour ce programme Pour tre plus explicite il aurait mieux valu crire int main return 0 ce qui
52. ceux l et en profiter pour utiliser l instruction continue c Relief la d riv e suivant une diagonale donne une impression d ombres projet es par une lumiere rasante Approcher cette d riv e par diff rence finie elle est proportionnelle I 1 3 1 1I i 1 j 1 S arranger pour en faire une image allant de 0 255 d Contours calculer par diff rences finies la d riv e horizontale d I i 1 5 I i 1 5 2 et la d riv e verticale d puis la norme du gradient VI yd d et afficher en blanc les points o cette norme est sup rieure un seuil e Deforme Construire une nouvelle image sur le principe J i j I f i 5 avec f bien choisie On pourra utiliser un sinus pour aller de 0 w 1 et de 0 H 1 de fa on non lin aire A 6 7 Suite et fin 13 S il reste du temps s amuser R tr cir une image Au lieu du n gatif on peut par exemple changer le contraste Comment 214 A Travaux Pratiques A 7 Premiers objets et dessins de fractales A 7 Premiers objets et dessins de fractales FIGURE A 8 Fractales Dans ce TP nous allons nous essayer la programmation objet Nous allons trans former une structure vecteur en une classe et l utiliser pour dessiner des courbes frac tales figure A 8 A 7 1 Le triangle de Sierpinski 1 R cup rer le projet T l charger le fichier Tp8_Initial zip sur la page habitue
53. compilateur d cide de placer i Ce qui suit le double slash est une remarque le compilateur ignore toute la fin de la ligne ce qui permet de mettre des commentaires aidant la compr hension du programme La ligne 3 affiche la valeur de i puis un espace sans aller la ligne Les lignes 4 5 et 6 d finissent un int nomm j recopie la valeur de i soit 2 dans j puis m morise 1 dans i Notez bien que i et j sont bien deux variables diff rentes i passe 1 mais j reste a 2 La ligne 8 nous montre comment d finir simultan ment plusieurs variables du m me type La ligne 9 nous apprend que l on peut affecter des variables simultan ment une m me valeur A la ligne 12 des variables sont d finies et affect es en m me temps En fait on parle plut t de variables initialis es elles prennent une valeur initiale en m me temps qu elles sont d finies Notez que pour des raisons d efficacit les variables ne sont pas initialis es par d faut tant qu on ne leur a pas affect une valeur et si elles n ont pas t initialis es elles valent n importe quoi Attention toutefois il est inutile de tenter une initialisation simultan e C est in terdit La ligne 14 provoque une erreur Enfin on peut rajouter const devant le type d une variable celle ci devient alors constante et on ne peut modifier son contenu La ligne 15 d finit une telle variable et la ligne 16 est une e
54. couper un programme est la meilleure fa on de ne plus avoir envie de le faire la fois suivante Encore une fois le bon crit re est ici que la bonne solution est g n ralement la moins fatiguante En fait pouvoir r utiliser le travail d j fait est le fil conducteur d une bonne program mation Pour l instant nous nous contentons gr ce aux fonctions de r utiliser ce que nous venons de taper quelques lignes plus haut Plus tard nous aurons envie de r uti liser ce qui aura t fait dans d autres programmes ou longtemps auparavant ou dans les programmes d autres personnes et nous verrons alors comment faire Prenons le programme suivant qui dessine des traits et des cercles au hasard et dont la figure 3 1 montre un r sultat 1 include lt Imagine Graphics h gt 2 using namespace Imagine 41 3 2 Fonctions 3 Premiers programmes include lt cstdlib gt using namespace std int main openWindow 300 200 for int i 0 i lt 150 i int xl rand 300 Point initial int yl rand 200 int x2 rand 300 Point final int y2 rand 200 Color c Color rand 256 rand 256 rand 256 RVB drawLine x1 y1 x2 y2 c Trac de segment int xc rand 300 Centre du cercle int yc rand 200 int rc rand 10 Rayon Color cc Color rand 256 rand 256 rand 256 RVB fillCircle xc yc rc cc 7 Cercle endGraphics return 0 La premi re chose qui choque c e
55. cout lt lt i lt lt endl En g n ral le for est utilis comme dans l exemple pr c dent pour effectuer une boucle avec une variable un indice qui prend une s rie de valeurs dans un certain intervalle On trouvera en fait plut t for int i 1 i lt 100 i cout lt lt i lt lt endl quand on sait que On peut d finir la variable dans la premiere partie du for Attention cette va riable admet le for pour port e elle n est plus utilisable en dehors du for i est une abbr viation de i i 1 Puisqu il n y a ici qu une seule instruction dans la boucle les accolades taient inutiles On utilise aussi la virgule pour mettre plusieurs instructions dans l instruction fi nale du for Ainsi le programme suivant part de i 1 et j 100 et augmente i de 2 et diminue j de 3 chaque tour jusqu ce que leurs valeurs se croisent for int i 1 j 100 j gt i i i 2 j j 3 cout lt lt i lt lt lt lt j lt lt endl Notez aussi qu on peut abr ger i i 2 en i 2 et j j 3 en j 3 18 Les vieux C ne permettaient pas de d finir la variable dans la premi re partie du for Des C un peu moins anciens permettaient de le faire mais la variable survivait au for 19 Pour les curieux a n a en fait rien d extraordinaire car plusieurs instructions s par es par une virgule deviennent en C une seule instruction qui consiste ex cuter l une apr s
56. crit le projet La ligne qui nous int resse est la suivante add_executable Tp1 Tp1 cpp Elle indique que le programme s appellera Tp1 Tp1 exe sous Windows et que le code source pour le construire est dans le fichier Tp1 cpp a Visual donc sous Windows n est pas capable d interpr ter le fichier CMakeLists txt il faut utiliser le programme Cmake au pr alable Lancer donc ce programme et aller chercher comme r pertoire source code Tp1_Initial par le bou ton Browse source C est une bonne id e de s parer les fichiers g n r s des sources s lectionner dans la ligne suivante un nouveau r per toire Build Cliquer Generate et s lectionner le bon g nerateur Visual Studio 2008 sur les machines de l cole Si tout s est bien pass on peut fermer Cmake et ouvrir le fichier solution extension sln dans le r per toire Build ce qui lance Visual Studio b Sous Linux lancer Kdevelop le menu Open Project et choisir le CMakeLists txt Les choix propos s par d faut en particulier le mode Debug sont corrects Kdevelop comprend le format CMakeLists et est capable de lancer Cmake lui m me c QtCreator Linux Windows ou Mac conna t galement Cmake donc proc dez comme avec Kdevelop 3 Programmation a Rajouter cout lt lt Hello lt lt endl sur la ligne avant return 0 A 1 L environnement de programmation A Travaux Pratiques 4 G n ration
57. dans la fen tre de la pile d appel nous voyons appara tre la ligne 13 et ses variables dans leur tat alors que le programme est en 5 Entre autres le q affich est celui de divise et vaut 7 e Toujours sans avancer voici l tat du main et de ses variables entre autres reste est bien pass 2 depuis la ligne 12 de divise f Nous ex cutons maintenant la suite jusqu nous retrouver en ligne 24 au re tour de divise Pour cela on peut faire du pas pas d taill ou simplement deux fois de suite un pas pas sortant Maj F11 pour relancer jusqu sortir de verifie puis jusqu sortir de divise On voit bien quotient qui est encore non d fini et aussi la valeur de retour de divise non encore affect e quotient g Un pas pas de plus et nous sommes en 25 26 La variable quotient vaut enfin 7 2 Variables Locales Il va tre important pour la suite de savoir comment les param tres et les variables locales sont stock s en m moire 7 2 1 Param tres Pour les param tres c est simple 4 Step Out ou Maj F11 ou Notez aussi la possibilit de continuer le programme jusqu une certaine ligne sans avoir besoin de mettre un point d arr t temporaire sur cette ligne mais simplement en cliquant sur la ligne avec le bouton de droite et en choisissant Run to line 7 92 7 La m moire 7 3 Fonctions r cursives
58. dans le registr ax le contenu de l adresse o est m moris e la variable a 00415A64 imul eax eax 3 effectuer eax eaxx 3 00415A67 mov ecx dword ptr b idem mais b dans ecx 00415A6A lea dx eaxtecxx 2 effectuer edx eaxtecxx 2 00415A6D mov dword ptr c edx mettre le contenu du registre edx l adresse o est m moris e la variable c Ce programme est d sign comme du Code Machine Le nombre au d but de chaque ligne est une adresse Nous allons en reparler A part lui le reste est relativement li sible pour l Homme attention c est moi qui ai ajout les remarques sur le cot droit Ceci parce qu il s agit d un programme en langage assembleur c est dire un langage o chaque instruction est vraiment une instruction du micro processeur mais o le nom de ces instructions ainsi que leurs arguments sont explicites En r alit le micro processeur ne comprend pas l assembleur Comprendre mov eax dword ptr a lui demanderait non seulement de d coder cette suite de symboles mais aussi de sa voir o est rang e la variable a Le vrai langage du micro processeur est le langage machine dans lequel les instructions sont des nombres Voici ce que a donne pour notre c 3xa 2xb 00415A61 8B 45 F8 00415A64 6B CO 03 00415A67 8B 4D EC 00415A6A 8D 14 48 00415A6D 89 55 EOQ A part encore une fois la colonne de gauche chaque suite de nombres 1 correspond v
59. de double libre lui de le faire En fait Si l utilisateur des Matrice se conforme aux d clarations des m thodes ci dessus leur concepteur peut les programmer comme il l entend Il peut m me les reprogrammer ensuite d une autre fa on les programmes de l uti lisateur marcheront toujours C est le concept m me d une interface Le concepteur et l utilisateur des objets se mettent d accord sur les m thodes qui doivent exister Le concepteur les programme il impl mente l interface L utilisateur les utilise de son c t Le concepteur peut y retoucher sans g ner l utilisateur En particulier le fichier d en t te de l objet est le seul qui int resse l utilisa teur C est lui qui pr cise l interface sans rentrer dans les d tails d impl mentation Bref reli es uniquement par l interface utilisation et impl men tation deviennent ind pendantes a Ilse trouve en g n ral face au difficile probl me du choix de l impl mentation certaines fa ons de stocker les donn es peuvent rendre efficaces certaines m thodes au d triment de certaines autres ou bien consommer plus ou moins de m moire etc Bref c est lui qui doit g rer les probl mes d algorithmique C est aussi en g n ral ce qui fait que pour une m me interface un utilisateur pr f rera telle ou telle impl mentation le concepteur devra aussi faire face la concurrence b Ce qui est s r c est que les
60. de la structure 14 On peut en fait d finir ce qui existe d j sur les types de base Attention il est impossible de red finir les op rations des types de base Pas question de donner un sens diff rent 1 1 85 6 3 R cr ation TP suite et fin 6 Plusieurs fichiers return m x n x m y n y int main vect a 1 2 b 3 4 vect c 2xa double s axb return 0 Remarquez que les deux fonctions ainsi d finies sont diff rentes bien que de m me nom operatorx car elles prennent des param tres diff rents cf surcharge section 3 2 6 6 3 R cr ation TP suite et fin Le programme du TP pr c dent tant un exemple parfait de besoin de fichiers s pa r s structures bien identifi es partag es par deux projets nous vous proposons dans le TP A 5 de convertir et terminer notre programme de simulation de gravitation et de duel dans l espace 6 4 Fiche de r f rence La fiche habituelle Fiche de r f rence 1 3 Variables D finition int i int k 1 m Affectation i 2 jsi k 1 3 Initialisation int n 5 o n Constantes const int s 12 Port e int 1 i j interdit int 3 2 i j OK if 3 gt 1 int k 3 j k OK i k interdit Types int i 3 double x 12 3 char c A string s hop bool t true float y 1 2f unsigned int 3 4 signed char d 128 unsigned char d 25 complex lt d
61. deux y gagnent le concepteur peut am liorer son impl men tation sans g ner l utilisateur l utilisateur peut changer pour une impl mentation concurrente sans avoir retoucher son programme 9 7 Protection 9 7 1 Principe Tout cela est bien beau mais les d tails d impl mentation ne sont pas enti rement cach s la d finition de la structure dans le fichier d en t te fait appara tre les champs utilis s pour l impl mentation Du coup l utilisateur peut tre tent des les utiliser Rien ne l emp che en effet des faire des b tises Matrice A A cree 3 2 A m 4 Aie Les acc s vont tre faux ou tout simplement de pr f rer ne pas s emb ter en rempla ant 5 Etil en existe Par exemple pour stocker efficacement des matrices creuses c est dire celles dont la plupart des l ments sont nuls Ou bien en utilisant des objets impl mentant d j des tableaux de fa on s re et efficace comme il en existe d j en C standard ou dans des biblioth ques compl mentaires disponibles sur le WEB Etc etc 125 9 7 Protection 9 Premiers objets for int i 0 i lt 3 i for int j 0 j lt 2 j A set i 0 par for int i 0 i lt 6 i A t i 0 Horreur Et si on impl mente autrement Dans ce cas l utilisation n est plus ind pendante de l impl mentation et on a perdu une grande partie de l int r t de la programmation objet C est ici qu intervient la possibilit d
62. en temps ou m moire 10 1 Pr ambule 1 2 Comment apprendre 4 Enfin certains aspects pratiques et pourtant simples de C ont disparu dans Java Depuis quelques ann es un langage qui s impose de plus en plus est le Python La raison est qu il est portable puissant et facile d acc s Cependant il pr sente des in conv nients Il est en constante volution non standardis et la compatibilit entre les versions n est pas garantie De plus les structures de donn es de Python certes tr s utiles cachent la complexit qu il y a derri re du point de vue de la gestion m moire et il est important pour un ing nieur d tre conscient de ce qui se passe en coulisse Encore une fois r p tons que le choix du langage n est pas le plus important et que l essentiel est d apprendre programmer 1 2 2 Choix de l environnement Windows et Linux ont leurs partisans souvent farouchement oppos s tel point que certains n admettent pas qu il est possible d tre partisan des deux syst mes la fois Conscients des avantages et des inconv nients de chacun des deux syst mes nous n en pr nons aucun en particulier Ceci dit pour des raisons p dagogiques nous pensons qu un environnement de programmation int gr c est dire un logiciel unique permettant de programmer est pr f rable l utilisation de multiples logiciels diteur compilateur debuggeur etc C est vrai pour le programmeur con
63. formule math matique Faire des structures Faire des fichiers s par s Le h doit suffire l utilisa teur qui ne doit pas regarder le cpp Ne pas abuser du r cursif Ne pas oublier delete Compiler r guli rement include lt cassert gt assert x 0 y 1 x 101 8 Allocation dynamique Chapitre 8 Allocation dynamique Nous revenons une fois de plus sur l utilisation du tas pour g rer des tableaux de taille variable Apr s avoir mentionn l existence de tableaux bidimensionnels de taille fixe nous d taillons l allocation dynamique d j vue en 7 4 2 et expliquons enfin les pointeurs du moins partiellement A travers l exemple des matrices et des images en TP nous m langeons struc tures et allocation dynamique Il s agira l de notre structure de donn e la plus complexe avant l arriv e tant attendue et maintenant justifi e des objets 8 1 Tableaux bidimensionnels 8 1 1 Principe Il existe en C des tableaux deux dimensions Leur utilisation est similaire celle des tableaux standards Il faut utiliser des crochets lignes 1 et 4 du programme ci dessous Attention i j et non i j L initialisation est possible avec des accolades ligne 5 Attention accolades im briqu es Leurs dimensions doivent tre constantes lignes 6 et 7 1 int A 2 3 BIO 2 3 2 for int i 0 i lt 2 i 3 for int j 0 j lt 3 j 4 A iJ j i j
64. g gt gt i gt gt X gt gt S g close 2 Il est bon de v rifier que l ouverture s est bien pass e Une erreur fr quente est de pr ciser un mauvais nom de fichier le fichier n est alors pas ouvert ifstream g data hop txt if g is_open cout lt lt help lt lt endl return 1 Attention toujours utiliser le slash portable et non le backslash m me sous Windows On peut aussi avoir besoin de savoir si on est arriv au bout du fi chier do while g eof 3 Une fonction en fait macro du pr processeur utile de Imagine dans Com mon est srcPath qui remplace un chemin relatif en chemin absolu en faisant pr c der le chemin par l emplacement du dossier contenant le fichier source Ainsi le fichier sera trouv quel que soit le dossier courant dans lequel est lanc le programme Ainsi si notre dossier source est home pascal Test 157 11 2 Fichiers 11 Cha nes de caract res fichiers ifstream g srcPath hop txt cherchera le fichier home pascal Test hop txt m me si notre programme se trouve dans le dossier build L quivalent pour le type stringeststringSrcPath 4 Un fichier peut s ouvrir apr s construction ofstream f f open hop txt 5 Moins fr quent mais tr s utile conna tre on peut crire dans un fichier direc tement la suite d octets en m moire qui correspond une variable ou un tableau Le fichier est alors moins vo
65. g n ral une croissance anarchique de la m moire utilis e on parle de fuite de m moire Pour le reste on ne change rien Programmer un tableau de cette fa on fait qu il est m moris dans le tas et non plus dans la pile On fait donc ainsi 1 Pour les tableaux de taille variable 2 Pour les tableaux de grande taille Voici ce que cela donne sur un petit programme include lt iostream gt using namespace std void remplit int t int n for int i 0 i lt n i t i i 1 int somme int t int n int s 0 for int i 0 i lt n i s t i return s void fixe const int n 5000 int t n remplit t n int s somme t n cout lt lt s lt lt devrait valoir n lt lt n n 1 2 lt lt endl 13 Et le d butant oublie toujours la deuxi me ce qui a pour cons quence des programmes qui gros sissent en quantit de m moire occup e 97 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 7 5 L optimiseur 7 La m moire void variable int n cout lt lt Un entier SVP cin gt gt n int t new int n Allocation remplit t n int s somme t n cout lt lt s lt lt devrait valoir lt lt nx n 1 2 lt lt endl delete t Desallocation ne pas oublier int main fixe variable return 0 7 4 3 Essai d explication Ce qui suit n est pas essentiel pour un d butant mais peut
66. i do D but de la boucle cout lt lt Un nombre entre 1 et 10 _SVP cin gt gt i while i lt 1 II i gt 10 Retourne au d but de la boucle si 17 On voit bien que le switch n est pas toujours plus clair ni plus court C est comme tout il faut l utiliser bon escient Et plus nous conna trons de C plus nous devrons nous rappeler cette r gle et viter de faire des fonctions pour tout des structures de donn es pour tout des objets pour tout des fichiers s par s pour tout etc 37 11 12 13 14 3 1 Tout dans le main 3 Premiers programmes ce test est vrai cout lt lt Merci Vous avez tap lt lt i lt lt endl return 0 Notez la ligne 9 qui met dans i un nombre tap au clavier La variable cin est le pendant en entr e console in de la sortie cout Vient ensuite le while qui v rifie le test au d but de la boucle Le programme sui vant affiche les entiers de 1 100 int i 1 while i lt 100 cout lt lt i lt lt endl 1 1 1 Enfin on a cr e une boucle sp ciale tant elle est fr quente le for qui ex cute une instruction avant de d marrer effectue un test au d but de chaque tour comme le while et ex cute une instruction la fin de chaque boucle Instruction initiale test et instruction finale sont s par es par un ce qui donne le programme suivant absolu ment quivalent au pr c dent int i for i 1 i lt 100 i i 1
67. i int j assert i gt 0 return x i Mx3 double operator int i int j const assert i gt 0 return x i Mx3 Compilation s par e include vect h aussi dans vect cpp Fonctions d clarations dans le h d finitions dans le CPP Types d finitions dans le h Ne d clarer dans le h que les fonctions utiles pragma once au d but du fichier Ne pas trop d couper STL min max complex lt double gt z pair lt int string gt p p first 2 p second hop include lt list gt using namespace std list lt int gt l l push_front 1 if 1 find 3 1 end list lt int gt const_iterator it it 1 begin it 1 end 1t s xit for list lt int gt iterator it for it 1 begin it 1 end 1it if xit 2 xit 4 stack queue map set heap vector 230 C Fiche de r f rence finale Fiche de r f rence 4 5 Entr es Sorties include lt iostream gt using namespace std cout lt lt I lt lt i lt lt endl cin gt gt i gt gt J include lt fstream gt using namespace std ofstream f hop txt E lt lt LE lt lt 23 f close ifstream g hop txt if g is_open return 1 int i double x g gt gt i gt gt x g close do while g eof ofstream f f open hop txt double x 10 y ofstream f hop bin los binary f w
68. int amp x cout lt lt x lt lt endl void f const int amp y double z y OK ne modifie pas y g y OK Pas besoin d aller regarder dans g int a 1 f a Avec les objets nous avons besoin d une nouvelle notion En effet consid rons maintenant void f const obj o 0 80 OR Il faut indiquer au compilateur si la m thode g modifie ou non l objet o Cela se fait avec la syntaxe suivante class obj void g const 141 10 7 Destructeur 10 Constructeurs et Destructeurs o void obj 8 const void f const obj amp o o g OK M thode constante Cela n est finalement pas compliqu On pr cise qu une m thode est constante c est dire qu elle ne modifie pas son objet en pla ant const derri re les parenth ses de sa d claration et de sa d finition On pourrait se demander si toutes ces complications sont bien n cessaires notre point de d part tant juste le passage rapide de param tres en utilisant les r f rences En r alit placer des const dans les m thodes est une tr s bonne chose Il ne faut pas le vivre comme une corv e de plus mais comme une fa on de pr ciser sa pens e suis je ou non en train d ajouter une m thode qui modifie l objets Le compilateur va ensuite v rifier pour nous la coh rence de ce const avec tout le reste Ceci a deux effets importants D couverte de bugs la compilation O
69. int k l m D finition multiple k 1 3 Affectation multiple m 4 cout lt lt k lt lt lt lt l lt lt lt lt m lt lt a int n 5 0 n p INI_MAX Initialisations cout lt lt n lt lt lt lt O lt lt lt lt p lt lt endl int q r 4 Erreur const int s 12 s 13 Erreur kl 4 fl Me 11 11 Dans ce programme 3 Nous avons aussi vu que cette simple id e donne d j lieu deux fa ons d utiliser les 4 octets big endian ou little endian 4 Coin des coll giens c est dire 0 1 2 mais aussi 1 2 3 5 un pres 6 En fait les int s adaptent au processeur et un programme compil sur un processeur 64 bits aura des int sur 64 bits Si l on a besoin de savoir dans quel cas on est le C fournit les constantes INT_MIN et INT_MAX qui sont les valeurs minimales et maximales prises par les int 7 L tout le monde fait pareil On compte en binaire partir de 0 et arriv 2147483647 le suivant est 2147483648 puis 2147483647 et ainsi de suite jusqu 1 On a par exemple O 000 000 1 000 001 2147483647 011 111 2147483648 100 000 2147483647 100 001 2 111 110 1 111 111 32 3 Premiers programmes 3 1 Tout dans le main Les lignes 1 et 2 d finissent une variable nomm e i de type int puis affecte 2 cette variable La repr sentation binaire de 2 est donc stock e en m moire l o le
70. int n 9 C est une erreur classique de d butant que de vouloir abuser du r cursif 10 Sous Visual il s arr te pour n 5000 environ 11 Nous verrons dans un autre chapitre les fonctions inline qui r pondent ce probl me 95 34 35 36 37 39 40 41 42 43 44 45 46 47 48 32 33 34 35 36 37 7 4 Le tas 7 La m moire if n lt 2 return 1 return fib1 n 2 fib1 n 1 cette fonction a la mauvaise id e de s appeler tr s souvent n 10 appelle n 9 etn 8 mais n 9 appelle lui aussi n 8 de son c t en plus den 7 n 7 qui lui m me est appel par tous les n 8 lanc s etc Bref cette fonction devient rapidement tr s lente Ainsi pour n 40 elle s appelle d j 300 000 000 de fois elle m me ce qui prend un certain temps Il est donc raisonnable d en programmer une version d r cursiv e D r cursiv e int fib2 int n int fnm2 1 fnml 1 for int i 2 i lt n i int fn fnm2 fnml fnm2 fnml foml fn return fnml Mentionnons aussi qu il existe des fonctions suffisamment tordues pour que leur ver sion r cursive ne se contente pas de s appeler un grand nombre de fois en tout mais un grand nombre de fois en m me temps ce qui fait qu ind pendamment des questions d efficacit leur version r cursive fait d border la pile d appels 7 4 Le tas La pile n est pas la seule zone de m moire utilis e par les programmes Il y a aussi le tas heap en an
71. la fin Par exemple void dis _bonjour_a_la_ dame string nom _ de la dame cout lt lt Bonjour Mme lt lt nom_de la dame lt lt gon lt lt endl dis_bonjour_a_la_dame Germaine dis_bonjour_a_la_dame Fitzgerald 23 Pourquoi vouloir le faire Dans notre cas parce que la fonction rand utilis e est suffisante pour des applications courantes mais pas assez pr cise pour des applications math matiques Par exemple faire un modulo ne r partit pas vraiment quitablement les nombres tir s Enfin nous avons oubli d initialiser le g n rateur al atoire Si vous le permettez nous verrons une autre fois ce que cela signifie et comment le faire en modifiant juste la fonction hasard 43 3 2 Fonctions 3 Premiers programmes 2 Une fonction peut comporter plusieurs instructions return Cela permet de sor tir quand on en a envie ce qui est bien plus clair et plus proche de notre fa on de penser int signe_avec_un_seul_return double x int s if x 0 s 0 else if x lt 0 s 1 else s 1 return s int signe_plus_simple double x if x lt 0 return 1 if x gt 0 Notez l absence de else devenu inutile return 1 return 0 3 Pour une fonction void on utilise return sans rien derri re pour un retour en cours de fonction void telephoner_avec_un_seul_return string nom if j_ai_le_ telephone if mon telephone _ marche if est_dans_l_annuaire n
72. la syntaxe ci dessus Il est impossible d appeler 224 un constructeur sur un objet d j cr a Ce qui explique qu il n est pas besoin de lui pr ciser un type de retour Ici c est le constructeur point point int X int Y qui est d fini Notez bien qu il est impossible d appeler un constructeur sur un objet d j contruit point a 1 2 OK Valeurs initiales On ne fait pas comme a pour changer les champs de 4 a point 3 4 ERREUR Mais plut t comme a a set 3 4 OK 10 3 Cas g n ral 10 3 1 Constructeur vide Lorsqu un objet est cr e sans rien pr ciser c est le construteur vide qui est appel c est dire celui sans param tre Ainsi le programme class obj public obj O 1 En r alit il y a une autre raison plus profonde et trop difficile expliquer ici qui fait qu en g n ral d s qu on programme des objets cette fa on d initialiser devient impossible 134 10 Constructeurs et Destructeurs 10 3 Cas g n ral e obj obj cout lt lt hello lt lt endl obj a appelle le constructeur par d faut affiche hello Le constructeur vide obj 0bj est appel chaque fois qu on construit un objet sans pr ciser de param tre Font exception les param tres des fonc tions et leur valeur de retour qui eux sont construits comme des recopies des objets pass s en param tre ou retourn s a Nous allo
73. le faire en lisant un polycopi destin des ing nieurs Enfin je suis pris mon propre pi ge Alors tout hasard je vais tenter d expliquer au passage les math matiques qui pourraient leur poser probl me Si l on en croit de nombreux manuels de programmation un premier programme doit toujours ressembler a include lt iostream gt using namespace std int main cout lt lt Hello World lt lt endl return 0 Eh bien allons y D cortiquons le Dans ce programme qui affiche l cran le texte Hello World les lignes 1 et 2 sont des instructions magiques qui servent pou voir utiliser dans la suite cout et endl La ligne 4 int main d finit une fonction appel e main qui renvoie un nombre entier Cette fonction est sp ciale car c est la fonction principale d un programme C celle qui est appel e automatiquement quand le 1 Cette expression vestige de l poque o les ordinateurs taient dot s d un cran capable de n affi cher que des caract res et non des graphiques courbes dessins etc signifie aujourd hui que l affichage se fera dans une fen tre simulant l cran d un ordinateur de cette poque Cette fen tre est appel e ter minal console fen tre de commande fen tre DOS xterm etc suivant les cas Souvenons nous avec un minimum de respect que c tait d j un progr s par rapport la g n ration pr c dente d pourvue d cran et qui utilisa
74. les membres Rajouter des accesseurs en lecture et en criture pour les membres et les utiliser syst matiquement dans le programme principal L id e est de cacher aux utilisa teurs de la classe Vector les d tails de son impl mentation 6 Dessin r cursif d un arbre Nous allons maintenant dessiner un arbre Pour cela il faut partir d un tronc et remplacer la deuxieme moiti de chaque branche par deux branches de m me longueur formant un angle de 20 degr s avec la branche mere La figure ci dessous illustre le r sultat obtenu pour diff rentes profondeurs de r cursion crire une fonction r cursive pour dessiner une telle courbe Vous aurez besoin lt FIGURE A 10 Construction de l arbre de la fonction Rotate de la classe Vector A 7 3 Changer d impl mentation 7 Deuxieme impl mentation Modifier l impl mentation de la classe Vector en rempla ant les membres double x y par un tableau double coord 2 Quelles sont les modifications apporter dans main cpp 8 Vecteurs de dimension sup rieure L avantage de cette derni re impl mentation est qu elle se g n ralise ais ment des vecteurs de dimension sup rieure Placer une constante globale DIM gale 2 au d but de Vector h et rendre la classe Vector ind pendante de la dimen sion NB la fonction Rotate et les accesseurs que nous avons crits ne se g n ra lisent pas directement aux dimensions sup rieures Les laisser tels quels po
75. les plates formes Sous Windows et Mac il vient avec les librairies Qt dont de toutes facons nous avons besoin pour utiliser Imagine que nous utiliserons pour tout ce qui est interface graphique De plus sous Windows nous n avons pas de 15 Les op rateurs par exemple 16 Ainsi l op ration 3 4 donnera 0 en Python 2 quotient de division euclidienne et 0 75 en Java 3 17 L id al est en fait d avoir les deux sous la main 18 Le seul utilisable diront les mauvaises langues 11 1 2 Comment apprendre 1 Pr ambule compilateur C par d faut mais en installant la version de Qt pour MinGW on b n ficie justement du compilateur MinGW Un autre compilateur pour Windows est celui de Microsoft qui vient avec VisualStudio qui est certes gratuit mais ne l installez que si a ne vous d range pas de donner Microsoft des informations personnelles qui ne le concernent en rien 12 3 Principes et conseils Au niveau auquel nous pr tendons l enseigner la programmation ne requiert ni grande th orie ni connaissances encyclop diques Les concepts utilis s sont rudimen taires mais c est leur mise en oeuvre qui est d licate S il n y avait qu un seul conseil donner ce serait la r gle des trois P 1 Programmer 2 Programmer 3 Programmer La pratique est effectivement essentielle C est ce qui fait qu un enfant a plus de facili t s puisqu il a plus de temps Ajoutons quand m m
76. matrice h et un matrice cpp struct Matrice int mn 3 Coin des enfants les matrices et les vecteurs vous sont inconnus Ca n est pas grave Comprenez le source quand m me et rattrapez vous avec le TP qui lui joue avec des images 109 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 8 3 Structures et allocation dynamique 8 Allocation dynamique doublex t g Matrice cree int m int n Matrice M M m m M n n M t new double mxn return M void detruit Matrice M delete M t Matrice produit Matrice A Matrice B if A n B m cout lt lt Erreur lt lt endl exit 1 Matrice C cree A m B n for int i 0 i lt A m i for int j 0 j lt B n j Cij Ai0xB0j AilxB1j C t i C m j 0 for int k 0 k lt A n k C t i C mxj A t i A mxk xB t k B mx3 return C void affiche string s Matrice M cout lt lt s lt lt lt lt endl for int i 0 idMm i for int j 0 j lt M n j cout lt lt M t i M m j lt lt cout lt lt endl Me ti 4 Utilisateur int main Matrice A cree 2 3 for int i 0 i lt 2 i for int j 0 j lt 3 j 110 60 61 62 63 64 65 66 67 68 69 70 71 72 73 10 11 12 13 14 15 16 51 52 53 39 40 41 42 43 44 45 46 8
77. mieux comme ca for int i 1 i lt 100 i s s f i 1 mais plut t directement sans tableau double s 0 for int i 1 i lt 100 i s s 3 i 4 Ou mieux s 3x1 4 ce qui pargnera la machine un tableau donc de la m moire et des calculs et vous des bugs donc vos nerfs Notez qu ici on utilise la relation de r currence pour calculer s100 Comme calculer s on n a besoin que de garder en m moire 5 _ o0n peut se contenter d une seule variable s qu on met jour 4 2 Initialisation Tout comme une variable un tableau peut tre initialis int t 4 1 2 3 4 string s 2 hip hop y Attention la syntaxe utilis e pour l initialisation ne marche pas pour une affecta tion int t 2 t 1 2 Erreur 1 Coin des coll giens c est dire s f 1 f 2 f 100 2 Nous verrons plus bas que l affectation ne marche m me pas entre deux tableaux Tout ceci s ar rangera avec les objets 55 NI ON O1 amp ND Raja ei ei Hi pa DD O1 NN 4 3 Sp cificit s des tableaux 4 Les tableaux 43 Sp cificit s des tableaux Les tableaux sont des variables un peu sp ciales Ils ne se comportent pas toujours comme les autres variables 4 3 1 Tableaux et fonctions Tout comme les variables on a besoin de passer les tableaux en param tres des fonctions La syntaxe utiliser est simple void affiche int s 4 for int i 0 i lt 4 i c
78. milieu cout lt lt Serait ce lt lt c lt lt char r do 21 Coin des coll giens compter modulo N c est retomber 0 quand on atteint N Modulo 4 cela donne 0 1 2 3 0 1 2 3 0 Par exemple 12 10 vaut 2 et 11 3 aussi Ici le modulo 100 sert retomber entre 0 et 99 39 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 NI O1 B ND 25 26 27 3 1 Tout dans le main 3 Premiers programmes cin gt gt r while r l amp amp r l amp amp r if r trouve true else if r b c 1 C est moins on essaie entre a et c 1 else a c 1 C est plus on essaie entre c 1 et b while trouve amp amp a lt b if trouve cout lt lt Quel boss je suis lt lt endl else cout lt lt Vous avez trich lt lt endl return 0 On peut aussi compl ter le programme suppl mentaire du TP de l annexe A 1 Il s agissait d une balle rebondissant dans un carr Voir l annexe B pour les instructions graphiques include lt Imagine Graphics h gt using namespace Imagine int main int w 300 h 210 openWindow w h Fen tre graphique int i 0 j 0 Position int di 2 dj 3 Vitesse while true fillRect i j 4 4 RED Dessin de la balle milliSleep 10 On attend un peu if i diow i di lt 0 di di Rebond horizontal si on sort int ni i di Nouvelle position if j dj gt
79. nb_balls Color cb nb_balls Couleurs des balles InitRandom for int i 0 i lt nb_balls i InitBalle xb i yb i ub i vb i cb i DessineBalle xb i yb i cb i Boucle principale while true milliSleep 25 noRefreshBegin for int i 0 i lt nb_balls i DessineBalle xb i yb i White BougeBalle xb yb ub vb i DessineBalle xb i yb i cb i noRefreshEnd endGraphics return 0 4 4 3 M langer les lettres Le programme suivant considere une phrase et permute al atoirement les lettres int rieures de chaque mot c est dire sans toucher aux extr mit s des mots Il utilise pour cela le type string cha ne de caract re pour lequel s i renvoie le i me caract re de la cha ne s et s size le nombre de caract res de s nous expliquerons plus tard la notation objet de cette fonction La phrase consid r e ici devient par exemple Ctete pteite psahre dreviat erte ecorne libslie puor vorte parvue ceeravu 63 NI O1 B amp ND 4 4 R cr ations 4 Les tableaux L avez vous comprise Peu importe C est le listing que vous devez comprendre tinclude lt iostream gt include lt string gt include lt cstdlib gt include lt ctime gt using namespace std 4 AAA AAA NAAA NA IA ARA AAA AAA AAA Generateur aleatoire A n appeler qu u void InitRandom Entre a et b srand unsigned ne fois avant Random in
80. pas ici 29 Il est p nible qu une ROM ne puisse tre modifi e Alors une poque on utilisait des m moires modifiables malgr tout mais avec du mat riel sp cialis EPROMS Maintenant on a souvent recours de la m moire pouvant se modifier de fa on logicielle m moire flashable ou pour de tr s petites quantit s de donn es une m moire consommant peu CMOS et compl t e par une petite pile Dans un PC la m moire qui sert d marrer s appelle le BIOS Il est flashable et ses param tres de r glage sont en CMOS Attention l usure de la pile 30 A chaque fois qu on allumait l ordinateur mais aussi chaque fois que le programme plantait et s effacait lui m me c est dire la plupart du temps 31 Tr s lent et tr s peu fiable mais le quotidien des ordinateurs personnels 32 Le luxe Un lecteur de 40Ko co tait 5000F 33 Les premiers taient de v ritables moteurs de voiture r serv s aux importants centres de calcul 21 2 2 Syst me d exploitation 2 Bonjour Monde P riph riques On appelle encore p riph riques diff rents appareils reli s l ordinateur clavier souris cran imprimante modem scanner etc Ils taient initialement l pour servir d interface avec l Homme comme des entr es et des sorties entre le micro processeur et la r alit Maintenant il est difficile de voir encore les choses de cette fa on Ainsi les cartes graphiques qui pouvaient tre
81. pour les fonctions inline Le langage pr voit une solution avec le mot cl export mais les compilateurs actuels n impl mentent pas encore cette fonctionnalit 173 12 1 template 12 Fonctions et classes param tr es templates return x i paire lt int gt p 1 2 r int i p 1 paire lt double gt q q 1 2 2 Dans le cas de la classe tres simple ci dessus on aura recours aux fonctions inline vues en 11 4 5 Paire de deux variables de type T Fonctions courtes et rapides en inline template lt typename T gt class paire T x 2 public constructeurs inline paire inline paire T A T B x 0 A x 1 B accesseurs inline T operator int i const assert i 0 i 1 return x i inline T operator int i assert i 0 i 1 return x i y Lorsque plusieurs types sont g n riques on les s pare par une virgule Paire de deux variables de types diff rents template lt typename S typename T gt class paire public Tout en public pour simplifier S x T y constructeurs inline paire inline paire S X T Y x X y Y paire lt int double gt P 1 2 3 paire lt string int gt Q Q x pierre Q y 25 174 12 Fonctions et classes param tr es templates 12 1 template Enfin on peut aussi rendre g n rique le choix d un entier n uplet de variables de type T Attention chaque nuplet lt T N gt sera un type diff rent t
82. pouvons maintenant rectifier Un tableau est en fait pass via son adresse Cette adresse est pass e par valeur Mais ce m canisme permet la fonction appel e de modifier le tableau Dire qu un tableau est pass par r f rence tait un abus de langage simplificateur Si on veut vraiment passer le pointeur par r f rence la syntaxe est logique intx amp t Un cas typique de besoin est 1 t et n seront modifi s et plus seulement t 1 2 void alloue intx amp t int amp n 3 cin gt gt n n est choisi au clavier 4 t new int In 5 6 es 7 intx t 8 int n 9 alloue t n t et n sont affect s par alloue 10 a 11 delete t Ne pas oublier pour autant Bizzarerie Les lignes 7 et 8 ci dessus auraient pu s crire int t n En fait il faut remettre une toile devant chaque variable lorsqu on d finit plusieurs pointeurs en m me temps Ainsi int xt s xu d finit deux pointeurs d int les variables t et u et un int la variable s 8 3 Structures et allocation dynamique Passer syst matiquement un tableau et sa taille toutes les fonctions est videm ment p nible Il faut les r unir dans une structure Je vous laisse m diter l exemple suivant qui pourrait tre un passage d un programme impl mentant des matrices et leur produit include lt iostream gt include lt string gt using namespace std fonctions sur les matrices pourraient etre dans un
83. pr cis Programmer rend maniaque D ailleurs les informaticiens sont tous maniaques Et je n ai pas envie de devenir comme ca 1 Permettez ce terme ouvertement Lucasien Il semble plus appropri que l habituel Gourou souvent utilis pour d crire l expert informaticien Nous parlons bien ici d un savoir faire transmettre de Ma tre Apprenti et non d une secte 2 Le jeune Padawan donc pour ceux qui connaissent 3 Je n aurai 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 incompr hensibles ils constituent en r alit un argot propre au m tier d informaticien argot que doit bien vi demment accepter et faire sien l Apprenti sous peine de ne rien comprendre au discours de ses coll gues d une part et d employer des adaptations fran aises ridicules ou peu usit es d autre part Naviguer sur la toile envoyer un courriel ou avoir un bogue commencent peut tre devenir des expressions com pr hensibles Mais demandez donc votre voisin s il re oit beaucoup de pourriels terme propos pour traduire Spams 1 Pr ambule M P La pr cision est indispensable pour communiquer avec une machine C est l Homme de s adapter Tu dois faire un effort En contre partie tu deviendras son ma tre R jouis toi Bient t tu pourras cr er ces tres ob issants que sont les p
84. prendre 2 4294967296 valeurs possibles Par convention les int stockent les nombres entiers relatifs avec autant de nombres n gatifs que de nombres positifs 5 soit dans le cas de 32 bits de 2147483648 2147483647 suivant une certaine correspondance avec le binaire Dire qu une variable est un int c est pr ciser son type Certains langages n ont pas la notion de type ou essaient de deviner les types des variables En C c est initia lement pour pr ciser la m moire et le format des variables qu elles sont typ es Nous verrons que le compilateur se livre un certain nombre de v rifications de coh rence de type entre les diff rentes parties d un programme Ces v rifications pourtant bien pratiques n taient pas faites dans les premi res versions du C petit fr re du C car avant tout r p tons le Pr ciser un type c est pr ciser la place m moire et le format d une variable Le compilateur s il pourra mettre cette information profit pour d tecter des erreurs de programmation en a avant tout besoin pour traduire le source C en langage machine D finition Affectation Initialisation Constantes Avant de voir d autres types de variables regardons sur un exemple la syntaxe utiliser int i D finition 1 2 Affectation cout lt lt i lt lt int j j i i l Ne modifie que i pas j cout lt lt i lt lt lt lt j lt lt 2 3
85. probl me suivant comment utiliser dans le fichier principal ce qui ce trouve dans les autres fichiers En effet nous savions cf section 3 2 4 qu une fonction n tait connue que dans les lignes qui suivaient sa d finition ou son ventuelle d claration Par connue il faut comprendre que le compilateur sait qu il existe ailleurs une fonction de tel nom avec tel type de retour et tels param tres Malheureusement une fonction n est pas connue en dehors de son fichier Pour l utiliser dans un autre fichier il faut donc l y d clarer En clair nous allons devoir proc der ainsi Fichier hop cpp 2 Heureusement en fait car lorsque l on r unit des fichiers de provenances multiples il est pr f rable que ce qui se trouve dans les diff rents fichiers ne se m lange pas de fa on anarchique 78 6 Plusieurs fichiers 6 1 Fichiers s par s D finitions void f int x int 80 1 Autres fonctions Fichier main cpp D clarations void f int x int 80 init main Utilisation int a g f a Nous pourrions aussi videmment d clarer dans hop cpp certaines fonctions de main cpp pour pouvoir les utiliser Attention toutefois si des fichiers s utilisent de fa on crois e c est peut tre que nous sommes en train de ne pas d couper les sources convenable ment 6 1 2 Avantages Notre motivation initiale tait de mettre une partie du co
86. que l utilisateur n ait pas regarder le fichier s par lui m me a D ailleurs si l utilisateur le regarde il peut tre tent de tirer profit de ce qui s y trouve et d utiliser plus que ce que l en t te d clare Or le cr ateur du fichier s par et de l en t te peut par la suite tre amen changer dans son source la fa on dont il a programm les fonctions sans pour autant changer leurs fonctionnalit s L utilisateur qui a trich en allant regarder dans le fichier s par peut alors voir ses programmes ne plus marcher Il n a pas respect la r gle du jeu qui tait de n utiliser que les fonctions de l en t te sans savoir comment elles sont impl ment es Nous reparlerons de tout a avec les objets Nous pourrons alors faire en sorte que l utilisateur ne triche pas De toute fa on notre niveau actuel le cr ateur et l utilisateur sont une seule et m me personne elle de ne pas tricher 6 1 7 Inclusions mutuelles En passant l action le d butant d couvre souvent des probl mes non pr vus lors du cours Il est m me en g n ral imbattable pour cela Le probl me le plus fr quent qui survient avec les fichiers d en t te est celui de l inclusion mutuelle Il arrive que les fichiers d en t te aient besoin d en inclure d autres eux m mes Or si le fichier A h inclut B h et si B h inclut A h alors toute inclusion de A h ou de B h se solde par une ph nom ne d inclusions sans fi
87. radeti ba 98 7o LOpImis Uf a A AR AAA AA 98 E RETOS o aaa a ARA e as TS 99 7 7 Examens sur machine 99 7 8 Fiche de r f rence aa du Ne Rd ARA AA 100 Allocation dynamique 103 8 1 Tableaux bidimensionnels 103 SLL PUDE y ca ane a Neue Re RD RER AAA 103 612 MOTS 24 2 HR RU Ra RDA aa Load 104 8 1 3 Solution 4 4 5 0 4 nas de bee da bn de dan sie dat 105 82 AMOO ASUMA lt o s A a d e ADN Re RS ads 106 8 2 1 POUR CE marche o as a saarra AAA 106 8 2 2 Erreursclassigues o io cosa EIA 107 0 23 KONSOUEDC S isaac AA A es 108 8 3 Structures et allocation dynamique 46e a a de 109 8 4 Bouclesetcontinus o eaa as acea de Naak e tee dd a 112 ES Meor 113 8 6 Fiche der f rendc e IEA 113 Premiers objets 117 A se espies menk dek eah aa m ea ea RR iae S 117 92 NN RE Li rai add a 118 O ra s naca n s Aaa Nea Ne a a ue oo oi au 120 9 4 Exemple des Malrlt s oo s ccoooa a erae e e e A 120 939 Lasdesop AMM 122 9 6 Interface cocos a a 124 9 7 Protection ss saa ea saci a su ete a ie a a a 125 A PIE seasea Cana aE E a a a e E a 125 9 7 2 Structures vs Classes Le due dau Le da AR 127 9 7 3 Accesseurs 127 a de DE ae a A 128 99 Fichede r f rence a 4 dus a 44 D dia tn ia diese de es 128 Constructeurs et Destructeurs 133 10 1 LE PEDIDOS lt lt so e sai a AAA ICRA ERA ARAS 133 BLE Lido gt uo sa ee a ER A A AR d 134 i
88. recopier dans A prend du temps M me pour des objets un peu moins volumineux si une fonction est appel e souvent cette recopie peut ralentir le programme Lorsqu une fonction est courte il n est pas rare non plus que ce temps de recopie soit sup rieur celui pass dans la fonction L id e est alors pour des objets volumineux de les passer eux aussi par r f rence m me si la fonction n a pas les modifier Il suffit donc de d finir la fonction solve ainsi void solve matrice amp A vecteur amp B vecteur amp X pour acc l rer le programme Cependant cette solution n est pas sans danger Rien ne garantit en effet que solve ne modifie pas ses param tres A et B Il est donc possible suivant la fa on dont solve est programm e qu en sortie de solve a b x a et b eux m mes aient t modifi s alors que pr c demment c taient leurs copies A et B qui l taient C est videmment g nant Le C offre heureusement la possibilit de demander au compilateur de v rifier qu une variable pass e par r f rence n est pas modifi e par la fonction Il suffit de rajouter const au bon endroit void solve const matrice amp A const vecteur amp B vecteur amp X Si quelque part dans solve ou dans les sous fonctions appel es par solve la variable A ou la variable B est modifi e alors il y aura erreur de compilation La r gle est donc Lorsqu un param tre obj o d une fonction est de taille impor
89. s en utilisant le moins possible de m moire avec la convention que la propri t n est vraie ssi le n bit de l entier est 1 Un seul entier de 32 bits pourra par ainsi m moriser 32 propri t s l o il aurait fallu utiliser 32 variables de type bool Voici comment on utilise les op rateurs ci dessus pour manipuler les bits en question 178 12 Fonctions et classes param tr es templates 12 3 Valeur conditionnelle i 1 lt lt n passe 1 le bit n de i i amp 1 lt lt n passe 0 le bit n de i i 1 lt lt n inverse le bit n de i if i amp 1 lt lt n vrai ssi le bit n de i est 1 Il existe aussi d autres utilisations fr quentes des op rateurs binaires non pour des raisons de gain de place mais pour des raisons de rapidit 1 lt lt n vaut 2 sinon il faudrait faire int pow 2 n i gt gt 1 calcule 2 rapidement i gt gt n calcule 2 rapidement i amp 255 calcule i 256 rapidement idem pour toute puissance de 2 12 3 Valeur conditionnelle Il arrive qu on ait choisir entre deux valeurs en fonction du r sultat d un test Une construction utile est alors test vall val2 qui vaut vall si test est vrai et val2 sinon Ainsi if x gt y maxi X else maxi y pourra tre remplac par maxi x gt y x y Il ne faut pas abuser de cette construction sous peine de programme illisible 12 4 Boucl
90. time 0 return a rand b a 1 UT VI VTT TT TT TT TT TT TT TT TITI TT AAA Position et vitesse aleatoire void InitBalle int amp x int amp y int amp u int amp v Color amp c x Random ball_size width ball_size y Random ball_size height ball_size u Random 0 4 v Random 0 4 c Color byte Random 0 255 byte Random 0 255 byte Random 0 255 LE LIST ETAT IL A AN LAN ALA AIDA Affichage d une balle void DessineBalle int x int y Color col fillRect x ball_size y ball_size 2 ball_size 1 2 ball_size 1 col 11 1 1 1 1 1 1 1 1 1 1 111 1 11 Deplacement d une balle void BougeBalle int amp x int amp y int amp u int amp v Rebond sur les bords gauche et droit if x u gt width ball_size x u lt ball_size u u Rebond sur les bords haut et bas et comptage du score if y v lt ball_size y v gt height ball_ size V V Mise a jour de la position x u y v LE LIL LIT LI NII IL A I NL RATA Fonction principale int main Ouverture de la fenetre openWindow width height Position et vitesse des balles int xb nb_balls yb nb_balls ub nb_balls vb nb_balls Color cb nb_balls Couleurs des balles InitRandom for int i 0 i lt nb_balls i InitBalle xb i yb i ub i vb i cb i 60 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 23 24 25 26 27 28 29 4 Les tableaux 4 4 R cr ations
91. vaut 13 11 2 3 Objets et fichiers Le grand int r t des lt lt et gt gt est la possibilit de les red finir pour des objets C est technique mais il suffit de recopier Voici comment struct point int x y e ostream amp operator lt lt ostream amp f const point amp p f lt lt px lt lt MT lt lt py ou quoi que ce Soit d autre on a d cid ici d crire les deux coordonn es s par es par un espace return f istream operator gt gt istream f point amp p f gt gt p x gt gt p y ou quoi que ce soit d autre return f point p cin gt gt p cout lt lt p ofstream f hop txt f lt lt p stent g hop txt 8 gt gt P 11 3 Valeurs par d faut 11 3 1 Principe Souvent utile On peut donner des valeurs par d faut aux derniers param tres d une fonction valeurs qu ils prendront s ils ne sont pas pr cis s l appel 3 Ils ont l air un peu p nibles utiliser pour le programmeur habitu au printf et scanf du C On voit ici enfin leur puissance 159 11 3 Valeurs par d faut 11 Cha nes de caracteres fichiers void f int a int b 0 int c 0 void g f 12 Appelle f 12 0 0 f 10 2 Appelle f 10 2 0 f 1 2 3 Appelle f 1 2 3 S il y a d claration puis d finition on ne pr cise les valeurs par d faut que dans la d claration void f int a int b 0 d claration voi
92. vect C A B Pile des appels It ratif R cursif R f rences constantes pour un passage rapide void f const obje x 1 void g const obje x EEE ORK 151 10 12 Fiche de r f rence 10 Constructeurs et Destructeurs Fiche de r f rence 2 4 Tableaux D finition double x 5 y 5 for int i 0 1 lt 5 1 y i 2x x 1 5 const int n 5 int dial 201 Initialisation int t 4 1 2 3 4 string s 2 J ab c Affectation int S 31 11 2 3 Et 31 int 1 0 1 lt 3 1 tlil s il fOr En param tre void init int t 4 for int i 0 i lt 4 i t i 0 void init int tl int n for int i 0 i lt n i t i 0 Taille variable int t new int n deletel t En param tre suite void f intx x t int n t il void alloue intx g t t new int In 2D int A 2 A i 3 1 int A 2113 j 11 2 3 4 5 6 void f int Af 2 2 2D dans 1D int A 2x3 A i 2x31 3 l Taille variable suite int t s n Objets struct obj int x champ int f m thode int g int y y int obJ f int i g 3 mon g int j x i mon x return j int main obj a a x 3 int i a f class obj int x y void a moi public int z void pour _tous void autre obj A y void obj a_moi Xe OK ssy O
93. ventuellement r pondre ses interrogations S il comprend tant mieux sinon qu il oublie et se contente pour l instant de la r gle pr c dente Pour avoir acc s toute la m moire de l ordinateur on utilise le tas Le tas est une zone m moire que le programme poss de et qui peut cro tre s il en fait la demande au syst me d exploitation et s il reste de la m moire de libre videmment Pour utiliser le tas on appelle une fonction d allocation laquelle on demande de r server en m moire de la place pour un certain nombre de variables C est ce que fait new int n Cette fonction retourne l adresse de l emplacement m moire qu elle a r serv Nous n avons jamais rencontr de type de variable capable de m moriser une adresse Il s agit des pointeurs dont nous reparlerons plus tard Un pointeur vers de la m moire stockant des int est de type int D o le int t pour m moriser le retour du new Ensuite un pointeur peut s utiliser comme un tableau y compris comme param tre d une fonction Enfin il ne faut pas oublier de lib rer la m moire au moment o le tableau de taille constante aurait disparu c est ce que fait la fonction delete t qui lib re la m moire point e par t 7 5 L optimiseur Mentionnons ici un point important qui tait n glig jusqu ici mais que nous allons utiliser en TP 14 Plus exactement ce que le syst me d exploitation veut bien attribuer au maximum chaque pro g
94. 0 3 ou double x 1 3 0 Si comme dans notre cas on a affaire deux variables de type int il suffit de convertir une de ces variables en double avec la syntaxe double que nous verrons plus tard 1 Fonction sans param tre x hop et non x hop 2 Division enti re double x 1 0 3 et non double x 1 3 double x double i j et non double x i j ni m me double x double i j a Cette conversion en double arrive trop tard 3 2 3 Passage par r f rence Lorsqu une fonction modifie la valeur d un de ses param tres et si ce param tre tait une variable dans la fonction appelante alors la variable en question n est pas modifi e Plus clairement le programme suivant choue 45 3 2 Fonctions 3 Premiers programmes void triple int x X X x3 int a 2 triple a cout lt lt a lt lt endl Il affiche 2 et non 6 En fait le param tre x de la fonction triple vaut bien 2 puis 6 Mais son passage 6 ne modifie pas a Nous verrons plus loin que x est m moris un endroit diff rent de a ce qui explique tout C est la valeur de a qui est pass e la fonction triple et non pas la variable a On parle de passage par valeur On peut toutefois faire en sorte que la fonction puisse vraiment modifier son param tre On s agit alors d un passage par r f rence ou par variable Il suffit de rajouter un amp derri re le type du param tre void triple int amp x
95. 1 4 Accesseurs 11 Cha nes de caract res fichiers 11 45 inline Principe Derni re tape appeler une fonction et r cup rer sa valeur de retour est un m canisme complexe donc long Appeler A i au lieu de faire A x i Mx est une grande perte de temps on passe plus de temps appeler la fonction A operator i j et r cup rer sa valeur de retour qu ex cuter la fonction elle m me Cela pourrait nous conduire retourner aux structures en oubliant les classes Il existe un moyen de supprimer ce m canisme d appel en faisant en sorte que le corps de la fonction soit recopi dans le code appelant lui m me Pour cela il faut d clarer la fonction inline Par exemple inline double sqr double x return Xxx double y sqr z 3 fait exactement comme si on avait crit y z 3 z 3 sans qu il n y ait d appel de fonction Pr cautions Bien comprendre ce qui suit Une fonction inline est recompil e chaque ligne qui l appelle ce qui ralentit la compilation et augmente la taille du programme inline est donc r serv aux fonctions courtes pour lesquelles l appel est p na lisant par rapport au corps de la fonction Si la fonction tait d clar e dans un h et d finie dans un cpp il faut maintenant la mettre enti rement dans le h car l utilisateur de la fonction a besoin de la d finition pour remplacer l appel de la fonction par son corps Pour pouvoir ex
96. 15 t 1 2 NON es S t On perd s deletel t delete s D j fait int at es 7 S est int non intx t new int n s new int n NON Imagine Voir documentation Conseils Nettoyer en quittant Erreurs et warnings cliquer Indenter Ne pas laisser de warning Utiliser le debuggeur Faire des fonctions Tableaux pas pour transcrire une formule math matique Faire des structures Faire des fichiers s par s Le h doit suffire l utilisa teur qui ne doit pas regarder le cpp Ne pas abuser du r cursif Ne pas oublier delete Compiler r guli rement tinclude lt cassert gt assert x 0 y 1 x 115 9 Premiers objets Chapitre 9 Premiers objets Nous abordons maintenant notre derni re tape dans la direction d une meilleure organisa tion des programmes Tant t nous structurions davantage les instructions fonctions fichiers tant t nous nous int ressions aux donn es structures tableaux Nous allons maintenant pen ser donn es et instructions simultan ment c est la l id e premi re des objets m me s ils pos sedent de nombreux autres aspects Enfin nous justifierons l emploi des objets par la notion d interface 9 1 Philosophie R unir les instructions en fonctions ou fichiers est une bonne chose R unir les don n es en tableaux ou structures aussi Il arrive que les deux soient li s C est d ailleurs ce
97. 36 The process usr bin make exited normally ARAS 19 44 36 Elapsed time 00 00 main cpp Help Essai eator Default 1 Issues PA Search Results ME Application Output EST TIC TT SES OML JS Console RE FIGURE 2 1 QtCreator apr s compilation du programme de test En coulisses OtCreator a lanc le programme CMake et on voit les messages d infor mation de ce programme Allons voir dans ce dossier home pascal TEMP Build On y trouve entre autres le fichier CMakeCache txt qui a t g n r Celui ci contient des variables que nous changerons plus tard Dans OtCreator cliquer sur le marteau pour lancer la phase de compilation C est la m me effet que lancer l option Build all du menu Build On peut constater Figure 2 1 dans la fen tre Compile Output ce qu il a fait cr er le fichier main cpp o en compilant main cpp dition de liens Linking cr ation du programme ex cutable EssaiQtCreator On peut v rifier l existence de ce programme dans le r pertoire de build Le triangle vert permet de lancer le programme depuis QtCreator qui indique dans la fen tre Ap plication Output Starting home pascal TEMP Build EssaiQtCreator home pascal TEMP Build EssaiQtCreator exited with code 0 Le programme s est bien lanc et est sorti avec la valeur 0 2 5 2 Un peu plus On se sert aussi dans le TP du cout qui signifie character out
98. Appelcpp 26 Name Value Type denom 3 int num 23 int quotient 0 int reste 4197024 int Name Value Type a 23 int b 3 int q 7 int r 4197024 int amp Value Type p 23 int q 3 int quo E int res 2 int Value Type 23 int 3 int 7 int 2 int amp Name Value Type denom 3 int num 23 int quotient 0 int reste 2 int Name Value Type denom 3 int num 23 int quotient 0 int reste 2 int return 7 int Name Value Type denom 3 int num 23 int quotient 7 int reste 2 int FIGURE 7 1 Appels de fontions Une pile est une structure permettant de m moriser des donn es dans laquelle celles ci s empilent de telle sorte que celui qui est rang en dernier dans la pile en est extrait en premier En anglais une pile stack est aussi appel e LIFO last in first out On y empile push et on y d pile pop les donn es Par exemple apr s un push 1 un push 2 et un push 3 le premier pop donnera 3 le deuxi me pop0 donnera 2 et un dernier pop donnera 1 Pour une file en anglais queue c est la m me chose mais le premier arriv est le premier sorti FIFO Par exemple apr s un push 1 un push 2 et un push 3 le premier pop donnera 1 le deuxi me pop donnera 2 et un dernier pop donnera 3 3 Dernier rentr premier sorti 91 7 2 Variables Locales 7 La m moire 7 1 2 Pile des appels et d buggeur Observons donc la figure 7 1 obtenue en lan ant notre progr
99. B o 5 NON RAS OK A a_moi NON A pour_tous OK A autre B OK class obj obj operator obj B y int main obj A B C C A B C A operator B M thodes constantes void obj f const void g const objg8 x x f OK Constructeur class point int X y public point int X int Y point point int X int Y y Y point a 2 3 Constructeur vide obj 0bJ obj a Objets temporaires vec vec operator vec b return vec x b x y b y c vec 1 2 f vec 2 3 Destructeur obj obj Constructeur de copie obj o0bj const obje o Utilis par obj b a obj b a mieux que obj b b a param tres des fonctions valeur de retour Affectation obj amp obj operator const obj amp o return this Objets avec allocation dyna mique automatique cf sec tion 10 11 Accesseurs class mat double xx publ ie doubleg operator int 1 tt 3 41 assert i gt 0 return x i Mxj double operator int tint 3J constl assert i gt 0 return x i Mxj Divers j i n Modulo include lt cstdlib gt i rand n x rand double RAND_MAX include lt ctime gt Un seul appel srand unsigned int time 0 include lt cmath gt double sqrt double x double cos double x X double sin double x double acos double
100. B DI T E S 5 6 7 int B 2118 1 1 2 3 44 5 61 const Ent M2 N 3 gt Tableau 2D Notez que B 0 est int CIMJIN le tableau 1D 1 2 3 et B 1 le 4 ls tableau 1D 4 5 6 La figure ci dessus montre le tableau B noter que B 0 et B 1 sont des tableaux 1D repr sentant les lignes de B 1 c est dire l allocation de m moire dans le tas avec new et delete NI O1 B ND 8 1 Tableaux bidimensionnels 8 Allocation dynamique 8 1 2 Limitations Vis vis des fonctions les particularit s sont les m mes qu en 1D Impossible de retourner un tableau 2D Passage uniquement par variable mais avec une restriction suppl mentaire On est oblig de pr ciser les dimensions d un tableau 2D param tre de fonc tion Impossible donc de programmer des fonctions qui peuvent travailler sur des tableaux de diff rentes tailles comme dans le cas 1D cf 4 3 1 C est tr s restrictif et explique que les tableaux 2D ne sont pas toujours utilis s On peut donc avoir le programme suivant Passage de param tre double trace double A 2 2 double t 0 for int i 0 i lt 2 i t A 1 1 return t Le passage est toujours par r f rence void set double A 2 3 for int i 0 i lt 2 i for int j 0 j lt 3 j A i j i double D 2 2 1 2 3 4 double t trace D double E 2 3 set E mais il est impossible de programmer
101. E omis c MO z Help FIGURE A 1 QtCreator montrant le code machine et les registres 9 Enfin pour voir quoi ressemble du code machine ex cuter jusqu un point d arr t puis faire Debug Windows Disassembly On peut aussi dans ce m me menu voir les registres du micro processeur Il arrive qu on se retrouve dans la fen tre code machine sans l avoir demand quand on debugge un programme pour lequel on n a plus le fichier source Cet affichage est en fait tr s utile pour v rifier ce que fait le compilateur et voir s il optimise bien 10 Pour faire l tape pr c dente sous QtCreator on peut s lectionner l option Ope rate by Instruction du menu Build Les registres sont visibles en allant dans le menu Window puis Views Voir Figure F5 MM Debug Touches utiles F10 LE _ Step over G F11 Stepinside A 1 4 S il reste du temps T l chargez le programme suppl mentaire Tp1_Final zip sur la page du cours http imagine enpc fr monasse Info jouez avec et compl tez le A 1 5 Installer Imagine chez soi Allez voir surhttp imagine enpc fr monasse Imagine Installez sur votre ordinateur portable et essayez de refaire ce TP avec QtCreator 194 A Travaux Pratiques A 2 Variables boucles conditions fonctions A 2 Variables boucles conditions fonctions A 2 1 Premier programme avec fonctions 1 NI O1 B ND
102. K ZE OK void obj pour_ tous OK a_moi OK void autre obj A X A X OK A a_moi OK int main obj A B 0 NON NE OK A a_moi NON A pour_tous OK A autre B OK class obj obj operator obj B y int main obj A B C C A B C A operator B M thodes constantes void 067 E consti void g const obj x f Red A7 OK Constructeur class point int x yi publics posnt int X 10 Xj points 2polnt int X int Y 1 x X y Y point amp 2 3 Constructeur vide obj oH obj a Objets temporaires vec vec operator vec b return vec x b x y b y c vec 1 2 f vec 2 3 15 Destructeur SDJ D Constructeur de copie ob3 0b3 const obj o Utilis par 0b3 b a obj b a mieux que obj b b a param tres des fonctions valeur de retour Affectation obj amp obj operator const obj amp o return this Objets avec allocation dyna mique automatique cf sec tion 10 11 152 10 Constructeurs et Destructeurs 10 12 Fiche de r f rence Fiche de r f rence 3 4 Compilation s par e tinclude vect h aussi dans vect cpp Fonctions d clarations dans le h d finitions dans le CPP Types d finitions dans le h Ne d clarer dans le h que les fonctions utiles
103. LA PROGRAMMATION POUR g les l ves ing nieurs z ou les coll giens vi d butants Y ou confirm s Cours de l cole des Ponts ParisTech 2015 2016 Renaud Keriven et Pascal Monasse IMAGINE cole des Ponts ParisTech monasse imagine enpc fr Version lectronique et programmes http imagine enpc fr monasse Info Ne traitez pas vos ordinateurs comme des tres vivants Ils n aiment pas qa Cet ordinateur ne fait pas du tout ce que je veux Exact Il fait ce que tu lui demandes de faire TABLE DES MATI RES TABLE DES MATIERES Table des matieres 1 Pr ambule 1 1 Pourquoi savoir programmer Comment apprendre Le 1 2 1 Choix du langage 1 2 2 Choix de l environnement 1 2 3 Principes et conseils 2 Bonjour Monde 2 1 L ordinateur 42 ua 44 4 ae 4 2 1 1 Le micro processeur 2 1 2 Lam moire 2 13 Autres Composants 2 2 Syst me d exploitation 2 3 La Compilation aaa 444 2 4 L environnement de programmation 24 1 Noms de fichiers 2 4 2 Debuggeur ss 2 5 Le minimum indispensable 2 5 1 Pour comprendre le TP 252 VIUDO see 2 5 3 Led bugeeur ci A Ma A 3 Premiers programmes 3 1 Tout danslemain 3 1 1 Variables caia 3 1 2 Tests 3 1 3 Boucl s Li ja msi ere 3 1 4 R cr ations 3 2 PONCHONS oc 2 0 don en 3 2 1 Retour 3 2 2 P
104. ND 10 4 Objets temporaires 10 Constructeurs et Destructeurs 10 4 Objets temporaires On peut en appelant soi m me un constructeur construire un objet sans qu il soit rang dans une variable En fait il s agit d un objet temporaire sans nom de variable et qui meurt le plus t t possible a Attention nous avions d j dit qu on ne pouvait pas appeler un constructeur d un objet d j construit Ici c est autre chose on appelle un constructeur sans pr ciser d objet Ainsi le programme void f point p point g 1 point e 1 2 pour le retourner return e point a 3 4 uniquement pour pouvoir appeler f point c 5 6 on pourrait avoir envie de faire b c a pour mettre b 5 6 peut largement s all ger en ne stockant pas dans des variables les points pour lesquels ce n tait pas utile void f point p point g return point 1 2 retourne directement l objet temporaire point 1 2 f point 3 4 Passe directement l obj temp point 3 4 point b b 8 b point 5 6 affecte directement b l objet temporaire point 5 6 Attention la ligne 12 elle est utile quand b existe d j mais bien comprendre qu on construit un point 5 6 temporaire qui est ensuite affect b On ne remplit pas b directement avec 5 6 comme on le ferait avec un b set 5 6 Attention aussi l erreur suivante tr s fr quente Il ne faut pas
105. ON if i 2 NON if i 2 then NON i 0 i lt 100 i NON int f int i f NON double x 1 3 int i j x 1 3 NON x double 1 3 NON double x 10 y 10 for int i 1 i lt 10 i y 1 2 x i NON for int NON int n 5 int tin NON int 41 NON ine l41 return tz 7 7 NONI ime Class sti int s 3 1 2 3 t 3 t s NON int t 2 t 1 2 2 NON Imagine Voir documentation Clavier Debug F5 Step over F10 Step inside F11 Indent Ctrl A Ctrl I Conseils Nettoyer en quittant Frreurs et warnings cliquer Indenter Ne pas laisser de warning Utiliser le debuggeur Faire des fonctions Tableaux pas pour transcrire une formule math matique 67 5 Les structures Chapitre 5 Les structures Les fonctions et les boucles nous ont permis de regrouper des instructions identiques Les tableaux permettent de grouper des variables de m me type mais pour manipuler plusieurs va riables simultan ment il est tout aussi indispensable des fabriquer des structures de donn es 5 1 R visions Avant cela il est utile de nous livrer une petite r vision qui prendra la forme d un inventaire des erreurs classiques commises par de nombreux d butants et m me de celles plus rares mais plus originales constat
106. Properties X Project 1 E 21 53 2 LI Header Files ES o a y Source Files El Misc Ci hop cpp Name hop cpp C main cpp Content False 3 EN Project 2 File Type C C Code 1 Header Files E LY Source Files Included In Project True 138 hop cpp Relative Path JProjectiihop cpp Ci main2 cpp FIGURE 6 2 M me source dans deux projets 6 13 Utilisation dans un autre projet 6 1 4 Fichiers d en t tes Le fichier s par nous permet de factoriser une partie du source Toutefois il faut taper les d clarations de toutes les fonctions utilis es dans chaque fichier les utilisant Nous pouvons mieux faire Pour cela il est temps d expliquer ce que fait l instruction include que nous rencontrons depuis nos d buts La ligne include nom est automatiquement remplac e par le contenu du fichier nom avant de proc der la compilation Il s agit bien de remplacer par le texte complet du fichier nom comme avec un simple copier coller Cette op ration est faite avant la compilation par un programme dont nous n avions pas parl le pr processeur Les lignes commen ant par un lui seront destin es Nous en verrons d autres Attention jusqu ici nous utilisions une forme l g rement diff rente include lt nom gt qui va chercher le fichier nom dans les r per toires des biblioth ques C Gr ce cette possibilit du pr processeur il nous suffit de mettre les d clarations se rapportant
107. Roue if i 2 then NON vec v l 2 OUI A AER for int 1 0 1 lt 100 1 obj t new obj n time 0 NON delete t manque include lt cmath gt a a oe Lie double sqrt double x void flint OR En D double cos double x double x 1 3 NON void f int a int b 0 double sin double x O aE void f int a NON double acos double x e J yon Ne pas tout mettre inline us o A 5 MA string s hop for int E a 0 yli 2xx i NON char c s 0 f 3 HORREUR int pe int n gt iE 1 int t n NON ARESE G if s e int f 4 NON TA if s1 lt s2 int t 4 PSU size t i s find h us j s find h 3 return t NON f 3 NON k s find hop if i gt 0 i lt n NON l s find hop 3 int t 4 t if i lt 0 i gt n NON a comment ine SIN 2 38 01317 1 db Mes de b ca va t s NON A txt a b int t 2 if esd si un deux tiois t 1 2 NON break Non s2 string s1 3 4 boucles seulement getline cin s struct SOLNE getline cin s double x y const char x t s c_str NON for anga Point a TOR ne include lt ctime gt 7 5 s double clock a 1 2 NON VE Gaa CLOCKS_PER_SEC include tp cpp NON break NON quitte define _USE MATH_DEFINES int f int t 11 1 NON juste boucle j include lt cmath gt int t 2 3 NON
108. Vector operator Vector a Vector b Diff rence double norme2 Vector a Norme euclidienne 208 A Travaux Pratiques A 5 Fichiers s par s 10 11 Vector operator Vector a double lambda Mult scalaire Vector operator double lambda Vector a Mult scalaire Fonctions et op rateurs sur les Vector Cr er un nouveau fichier Vector cpp Mettre un include du fichier d en t te correspondant et d finir les op rateurs qui y sont d clar s Rappel sqrt est d fini dans le fichier d en t te syst me lt cmath gt ne pas oublier non plus le using namespace std qui permet d utiliser cette fonction Astuce une fois qu une version de operator est d finie la deuxi me version peut utiliser la premiere dans sa d finition Vecteur vitesse et vecteur position Syst matiquement remplacer dans Gravitation cpp les vitesses et positions par des objets de type Vector y compris dans la d finition de la structure Balle Utiliser autant que possible les op rateurs et fonction d finis dans Vector cpp A 5 3 Balle part Structure Balle D placer la structure Balle dans un nouveau fichier d en t te Balle h Puisque Balle utilise les types Vector et Color il faut aussi ajouter ces lignes include lt Imagine Graphics h gt using namespace Imagine include Vector h Fonctions associ es D placer toutes les fonctions annexes prenant des Balle en param tres dans un nouvea
109. a Dans la fen tre Solution explorer de Visual Studio rechercher et afficher le fichier Tp1 cpp b Build Build solution ou F7 ou bouton correspondant c V rifier l existence d un fichier Tp1 Tp1 exe sous Windows dans Build Tp1 Build Tp1 Debug sous Windows 5 Ex cution a Sous Kdevelop il faut commencer par aller dans le menu Configure launches ajouter avec le bouton et s lectionner l ex cutable On peut alors le lancer avec le bouton Execute b Lancer le programme sous Visual avec Debug Start Without Debugging ou Ctr1 F5 ou bouton correspondant Il faut d abord lui pr ciser quel programme lancer clic droit sur le projet Tp1 dans l explorateur de solu tion S lectionner comme projet de d marrage Une fen tre fonds noir console s ouvre dans laquelle le programme s ex cute et la fen tre console reste ouverte jusqu l appui d une touche du clavier c V rifier qu on a en fait cr un programme ind pendant qu on peut lancer dans une fen tre de commande Essayer de le lancer depuis le gestionnaire de fichiers standard le pro gramme se referme tout de suite Dans les menus Windows D marrer Ex cuter Ouvrir cmd 1 Taper D puis cd Documents and Settings login Bureau Tp1l Tpl Debug apprenez profiter de la compl tion automatique avec la touche TAB V rifier la pr sence de Tp1 exe av
110. a boule lancer et en multipliant par un facteur 0 00025 Am liorations Faire en sorte qu il y ait syst matiquement un gros soleil au centre de l cran de masse non n cessairement cons quente afin d emp cher les tirs directs Initialisation correcte Modifier la fonction de placement des soleils de fa on ce que les soleils ne s in tersectent pas initialement et qu ils soient une distance minimale de 100 pixels des emplacements des joueurs Chocs lastiques figure A 5 gauche Tout faire voluer tout faire rebondir On retourne dans le projet Gravitation Tout faire bouger y compris les soleils Utiliser pour les chocs lastiques la fonction Chocs qui fait rebondir les deux corps Faire en sorte que lors de l initialisation les soleils ne s intersectent pas A 4 2 Aide Fonctions fournies void InitRandom est ex cuter une fois avant le premier appel Random double Random double a double b 205 A 4 Structures A Travaux Pratiques renvoie un double al atoirement entre a et b compris Ex cuter une fois InitRandom avant la premi re utilisation de cette fonction void ChocSimple double x double y double amp vx double amp vy double m double x2 double y2 double vx2 double vy2 fait rebondir la premi re particule de coordonn es x y de vitesse vx vy et de masse m sur la deuxi me de coordonn es x2 y2 et de vitesse vx2 vy2 sans d placer la
111. a exactement le m me effet car la fonction main retourne 0 si on ne le pr cise pas Mais le cas de cette fonction est sp cial il est pr f rable d tre plus explicite et de pr ciser qu on retourne la valeur 0 Notons au passage qu on a crit l ordre return sur une nouvelle ligne que comme toute instruction elle se termine avec point virgule obligatoire et qu on a d cal cette instruction vers la droite on dit indent pour bien montrer qu on est l int rieur du bloc Le compilateur est indiff rent aux retours la ligne et aux indentations ils sont pr sents uniquement pour faciliter la lecture pour nous le programmeur Cependant ne les consid rez pas comme optionnels il est pri mordial d crire un programme propre et lisible Pour ceux qui connaissent ce langage notez que le Python se passe des accolades et marque un bloc par l indentation qui de vient obligatoire Le fait que celle ci ne soit pas significative en C ne veut pas dire qu on doit faire n importe quoi Insistons donc d j sur le fait qu il faut indenter Ce programme ne fait rien mais il faut quand m me v rifier qu il est correct c est dire qu il respecte la syntaxe et qu il suffit cr er un programme ex cutable Pour cela nous allons utiliser Cmake qui a l avantage d tre multi plates formes et d tre compatible avec tous les environnements de d veloppement courants Cr ons donc un fichier CMakeLists txt de contenu suivant
112. a fonction Collision Jeu de tir Ouvrir un nouveau projet Afin de partir dans deux voies diff rentes et travailler proprement ajouter un nouveau projet appel Due1 dans cette m me solution On ajoute un dossier Duel au m me niveau que Gravitation et on modifie le CMakeLists txt Ne pas refaire deux fois le travail Comme nous aurons besoins des m mes fonctions dans ce projet que dans le projet Gravitation ajouter au projet sans en cr er de nouveaux les fichiers Vector h Vector cpp Balle h Balle cpp Tools Tools cpp Les fichiers sont les m mes que dans le projet Gravitation ils ne sont pas recopi s Mettre au d but de Duel cpp fichier placer dans le r pertoire Duel les include correspondants Essayer de compiler Duel cpp Comme le compilateur n arrive pas trouver les fichiers inclus qui ne sont pas dans le m me r pertoire il faut lui indiquer o les trouver include Gravitation Tools h Pour le CMakeLists txt du r pertoire Duel inspirez vous de celui de Gravi tation vous de jouer Transformer le projet Duel l aide des fonctions d finies auparavant en un jeu de tir deux joueurs Chacun des deux joueurs a une position fix e et divers soleils sont plac s al atoirement dans l cran Chaque joueur tour de r le peut lancer une Balle avec la vitesse initiale de son choix la balle subissant les effets de gravitation des divers soleils et disparais
113. accolades etc Le menu Edit Advanced fournit de quoi bien indenter Pour rep rer des erreurs toujours bien indenter Ctrl K Ctrl F Visual Ctrl I OtCreator indenter la zone s lec tionn e Ctrl A Ctrl K Ctrl F Visual Ctrl A Ctrl I OtCreator tout in denter 5 Warnings du compilateur En modifiant le main provoquer les warnings suivants a int i 1 2 5 cout lt lt i lt lt endl Ex cuter pour voir le r sultat b int i 1 4 if i 3 cout lt lt salut lt lt endl Ex cuter c int i j j i Ex cuter r pondre abandonner d Provoquer le warning inverse variable d clar e mais non utilis e e Ajouter exit comme premi re instruction de main Appeler une fonction en oubliant les arguments arrive souvent Ex cuter pour voir Corriger en mettant exit 0 Il y a maintenant un autre warning Pourquoi La fonc tion exit quitte le programme en urgence 2 Certains de ces warnings ne se manifestent qu en niveau d exigence le plus lev pour le mettre en place clic droit sur le projet dans la fen tre de gauche menu Propri t s onglet C s lectionner le warning level 4 3 moins exigent est le d faut 192 A Travaux Pratiques A 1 L environnement de programmation Il est tres formellement d conseill de laisser passer des warnings Il faut les corriger au fur et mesure Une option du compilateur propose m me de les cons
114. ais pas proprement parler de langages g n ralistes complets Sans argumenter sur les d fauts respectifs des lan gages qui en font partie il nous semble vident qu il ne s agit pas du bon choix pour l apprentissage de la programmation En pratique le choix actuel se fait souvent entre C et Java Bien que Java ait t con u entre autres dans un souci de simplification du C nous pr f rerons C pour des raisons p dagogiques 1 C est plus complexe dans son ensemble mais n en conna tre que les bases est d j bien suffisant Nous ne verrons donc dans ce cours qu un sous ensemble du C suffisant en pratique 2 Plus complet C permet une programmation de haut niveau ma s aussi une programmation simple adapt e au d butant C permet galement une pro grammation proche de la machine ce qui est important pour le sp cialiste mais aussi pour le d butant car seule une bonne compr hension de la machine aboutit une programmation convenable et efficace 3 C est souvent incontournable dans certains milieux par exemple en finance 12 Nous ne r duisons videmment pas Java un sous ensemble de C Il lui est sup rieur sur certains aspects mais il est d expressivit plus r duite 13 Java force un cadre de programmation objet d routant pour le d butant 14 Ne pas comprendre ce que la machine doit faire pour ex cuter un programme conduit des pro grammes inconsid r ment gourmands
115. amme d exemple sous debuggeur En regardant la partie gauche de chaque tape nous pouvons voir la pile des appels La partie droite affiche le contenu des variables param tres et valeurs de retour dont nous pouvons constater la coh rence avec le tableau pr c dent a Comme l indique la pile des appels nous sommes ligne 24 de la fonction main qui se trouve tre le seul l ment de la pile main est la fonction d entr e du programme V rifiez les variables et le fait qu elles valent n importe quoi ici 0 pour quotient et 4197024 pour reste tant qu elles ne sont pas initialis es ou affect es b Avan ons en pas pas d taill touche F11 jusqu la ligne 12 Nous sommes dans la fonction divise q vient de valoir 7 et la ligne 24 de main est descendue d un cran dans la pile des appels c Nous sommes maintenant la ligne 5 dans verifie La pile des appels un ni veau de plus divise est en attente la ligne 13 et main toujours en 24 V rifiez au passage que la variable q affich e est bien celle de verifie qui vaut 3 et non pas celle de divise d Ici l ex cution du programme n a pas progress et nous en sommes toujours la ligne 5 Simplement le debuggeur offre la possibilit en cliquant sur la pile d appel de regarder ce qui se passe un des niveaux inf rieurs notamment pour afficher les instructions et les variables de ce niveau Ici en cliquant sur la ligne de divise
116. ans le fichier utils h sont d finis 1 4 entiers gauche bas haut droite de telle mani re que a la fonction x x 1 4 transforme gauche en bas bas en droite droite en haut et haut en gauche cette fonction correspond donc un quart de tour dans le sens trigonom trique b la fonction x x 1 4 transforme gauche en haut haut en droite droite en bas et bas en gauche cette fonction correspond donc un quart de tour dans le sens des aiguilles d une montre 2 un tableau de 4 points dir de telle mani re que moyennant la d finition d une fonction permettant de faire la somme de deux points la fonction p p dir d renvoie a pour d gauche le point correspondant au d calage de p de 1 vers la gauche b pour d haut le point correspondant au d calage de p de 1 vers la haut c pour d droite le point correspondant au d calage de p de 1 vers la droite d pour d bas le point correspondant au d calage de p de 1 vers la bas A 8 2 Tron A partir du jeu de Serpent r alis pr c demment nous allons facilement pouvoir impl menter le jeu Tron Le programme tron exe vous donne une id e du r sultat recherch Le principe de ce jeu est que chaque joueur pilote une moto qui laisse der ri re elle une trace infranchissable Le but est de survivre plus longtemps que le joueur adverse 1 Passage deux joueurs A partir de la fonction jeu_1p cr er une fonction jeu_2p impl mentant un jeu de serp
117. ant Voir le programme pr c dent o g parle f au travers de z 3 2 6 Surcharge Il est parfois utile d avoir une fonction qui fait des choses diff rentes suivant le type d argument qu on lui passe Pour cela on peut utiliser la surcharge Deux fonctions qui ont des listes de param tres diff rentes peuvent avoir le m me nom Attention deux fonctions aux types de retour diff rents mais aux param tres identiques ne peuvent avoir le m me nom a Car alors la fa on de les appeler permettra au compilateur de savoir laquelle des fonc tions on veut utiliser b Car alors le compilateur ne pourra diff rencier leurs appels Ainsi nos fonctions hasard de tout l heure peuvent tr s bien s crire Nombre entre 0 et n 1 int hasard int n return rand n Nombre entre a et b int hasard int a int b return a rand b a 1 Nombre entre O et 1 double hasard 50 11 12 13 14 15 16 3 Premiers programmes 3 3 TP X Imagine xy o Os FIGURE 3 2 Mini tennis return rand double RAND MAX int i hasard 3 entre 0 et 2 int j hasard 2 4 entre 2 et 4 double k hasard entre 0 et 1 33 TP Nous pouvons maintenant aller faire le deuxieme TP donn en annexe A 2 afin de mieux comprendre les fonctions et aussi pour obtenir un mini jeu de tennis figure 3 2 3 4 Fiche de r f rence Nous commen ons maint
118. arait important de mentionner des maintenant que les complexes existent en C Coin des coll giens pas de panique Vous apprendrez ce que sont les nombres complexes plus tard Ils ne seront pas utilis s dans ce livre 35 ND N ND N N NF HA HA 4 Hi HA HA Hi Ha a O1 NN h OO NI ON O1 NN KR O NI ON O1 NN e 3 1 Tout dans le main 3 Premiers programmes Enfin une derni re chose tr s importante penser utiliser et non sous peine d avoir des surprises C est peut tre l erreur la plus fr quente chez les d butants Elle est heureusement signal e aujourd hui par un warning Attention utiliser if i 3 et non if i 3 Le switch On a parfois besoin de faire telle ou telle chose en fonction des valeurs possibles d une variable On utilise alors souvent l instruction switch pour des raisons de clart de pr sentation Chaque cas possible pour les valeurs de la variable est pr cis avec case et doit se terminer par break Plusieurs case peuvent tre utilis s pour pr ciser un cas multiple Enfin le mot cl default placer en dernier correspond aux cas non pr cis s Le programme suivant r agit aux touches tap es au clavier et utilise un switch pour afficher des commentaires passionnants include lt iostream gt using namespace std include lt conio h gt Non standard int main bool fini false char c do c _getch
119. aram tres 3 2 3 Passage par r f rence 3 2 4 Port e D claration D finition 3 2 5 Variables locales et globales DER UIT osa E EE a AR 3 4 Fiche de r f rence TABLE DES MATI RES TABLE DES MATIERES 4 Les tableaux 4 1 Premiers tableaux 4 2 Initialisation 4 3 Sp cificit s des tableaux 43 1 Tableaux et fonctions 4 3 2 Affectation 44 R cr ations 44 1 Multi balles SOS NS E 4 6 Fiche de r f rence 5 Les structures 5 1 R VISIENS oc 5 1 1 Erreurs classiques 5 1 2 Erreurs originales 5 13 Conseils 5 2 Les structures 5 2 1 D finition 5 2 2 Utilisation 5 3 R cr ation TP 5 4 Fiche de r f rence 6 Plusieurs fichiers 6 1 Fichiers s par s 6 1 1 Principe 6 1 2 Avantages 6 1 3 Utilisation dans un autre projet 6 1 4 Fichiers d en t tes 6 15 A ne pas faire 6 1 6 Impl mentation 6 1 7 Inclusions mutuelles 6 1 8 Chemin d inclusion 6 2 Op rateurs lt lt o ue d 6 3 R cr ation TP suite et fin 6 4 Fiche de r f rence 7 La m moire 7 1 L appel d une fonction 7 1 1 Exemple 7 1 2 Pile des appels et d buggeur 7 2 Variables Locales 7 2 1 Param tres Taa Lapi sense sst nowa 7 3 Fonctions r cursives 7 3 1 Pourquoi a marche TABLE DES MATIERES TABLE DES MATIERES 10 FAE o A OOO 96 7 4 2 Tableaux de taille variable 97 743 Essaidexplication LA Lu caas sedead ne
120. arde pas tout un bloc de code Hif 0 N importe quoi ici ce sera ignor par le compilateur endif 6 1 8 Chemin d inclusion Puisque le include prend un fichier la question se pose de savoir o le pr proces seur doit chercher Pour les fichiers du syst me par exemple include lt iostream gt leur chemin est connu du compilateur et on n a pas s en occuper Pour les autres il y a deux r gles de recherche dans le dossier courant celui qui contient le cpp dans une liste de dossiers indiqu s par l utilisateur Pour le deuxi me cas on dispose de l instruction include_directories de Cmake utiliser dans le CMakeLists txt Par exemple quand on fait include Imagine Graphics h il va chercher un dossier Imagine contenant un fichier Graphics h Toujours utili ser le slash direct qui fonctionne sur toutes les plates formes et non le backslash qui ne fonctionne que sous Windows De m me respecter les majuscules Pour savoir o le trouver on a dans le CMakeLists txt find_package Imagine ImagineUseModules Mastermind Graphics La commande ImagineUseModules est sp cifique Imagine d o le find_package mais appelle include_directories en lui donnant comme chemin lt IMAGINEPP ROOT gt include avec lt IMAGINEPP_ROOT gt le chemin d installation d Imagine 11 Notez que les commandes du pr processeur ne se terminent pas par un p
121. arder le cpp Ne pas abuser du r cursif Ne pas oublier delete Compiler r guli rement tinclude lt cassert gt assert x 0 y 1 x Faire des objets Ne pas toujours faire des ob jets Penser interface impl men tation utilisation 153 define _USE_MATH_DEFINE 10 12 Fiche de r f rence 10 Constructeurs et Destructeurs Fiche de r f rence 4 4 Erreurs fr quentes int 4 NON int t new int 21 Pas de d finition de fonction int t 4 intx s new int 2 dans une fonction ce s t On perd s one return t NON deletel t int q r 4 NON delete s D j fait 4 l s aA p int t 4 t f int t s s est int de 2 ENT int s 3 11 2 3 4 13 non intx AE SAFTEN CHEN FA RONI say E NONI t new int n for int i 0 i lt 100 i int t 2 s new int n NON l NON t 1 2 NON A del ANDE E diva struct Point int y3 int i f NON double x y public double x 1 3 NON NON int ipj Point a b x 1 3 NON a 1 2 NON ee x double i j NON tinclude tp cpp NON vec a 2 3 NON double x 10 y 10 int f int t 1 11 NON vec v vec 1 2 NON for int i 1 i lt 10 1 int t 2 3 NON vec v 1 2 2 QUI y 1 2x x 1 NON t i jl1 NON objx t new obj n int n 5 intx t delete t manque int t n
122. art alors qu il faut faire bool allok true for int i 0 i lt n i allok allok amp amp ok i if allok ou m me mieux voyez vous la diff rence bool allok true for int i 0 i lt n amp amp allok i allok allok amp amp ok i if allok qu on peut finalement simplifier en bool allok true for int i 0 i lt n amp amp allok i allok 0k i if allok 1 Ne me faites pas dire ce que je n ai pas dit Les informaticiens th oriques considerent parfois les programmes comme des formules mais a n a rien voir 70 5 Les structures 5 2 Les structures Il est compr hensible que le d butant puisse tre victime de son manque de savoir d une mauvaise assimilation des le ons pr c dentes de la confusion avec un autre langage ou de son imagination d bordante Toutefois il faut bien comprendre qu un langage est finalement lui aussi un programme limit et con u pour faire des choses bien pr cises En cons quence il est plus raisonnable d adopter la conduite suivante Tout ce qui n a pas t annonc comme possible est impossible 5 1 3 Conseils Indenter Indenter Indenter Cliquer sur les messages d erreurs et de warnings pour aller directement la bonne ligne Ne pas laisser de warning Utiliser le debuggeur 5 2 Les structures 5 2 1 D finition Si les tableaux permettent de manipuler plusieurs variables d un m
123. atif On transforme un fichier source le programme C en un fichier objet suite d instructions en langage machine Cependant le fichier objet ne se suffit pas lui m me Des instructions suppl men taires sont n cessaires pour former un fichier ex cutable complet de quoi lancer le main Plus pr cis ment tout ce que le process doit faire avant et apres l ex cution de main des fonctions ou variables faisant partie du langage et que le programmeur utilise sans les reprogrammer lui m me comme cout cout min etc L ensemble de ces instructions constitue ce qu on appelle une biblioth que des fonctions ou variables programm es par le programmeur lui m me dans d autres fichiers source compil s par ailleurs en d autres fichiers objet mais qu il veut utiliser dans son programme actuel La synth se de ces fichiers en un fichier ex cutable s appelle l dition des liens Le pro gramme qui r alise cette op ration est plus souvent appel linker qu diteur de liens En r sum la production du fichier ex cutable se fait de la fa on suivante 1 Compilation fichier source fichier objet 2 Link fichier objet autres fichiers objets biblioth que standard ou autres fichier ex cutable 42 m me s il est parfois pr trait pour acc l rer l ex cution 43 Par opposition le vrai langage machine du processeur est alors appel code natif 44 Les princ
124. au fichier s par dans un troisi me fichier et de l inclure dans les fichiers principaux Il est d usage de prendre pour ce fichier suppl mentaire le m me nom que le fichier s par mais avec l extension h on appelle ce fichier un fichier d en t tef Pour cr er ce fichier faire comme pour le source mais en choisissant C Header File au lieu de C Source File Voila ce que cela donne Fichier hop cpp D finitions void f int x int g 4 Toujours le moindre effort 5 Les fichiers d en t te iost ream etc sont parfois appel s en t tes syst me Leur nom ne se termine pas toujours par h voir apr s mais rien ne les distingue fondamentalement d un fichier d en t te habituel Certains noms de headers syst me commencent par la lettre c comme cmath ce sont ceux h rit s du C 6 h comme header on voit aussi parfois hpp pour les distinguer des headers du C 80 6 Plusieurs fichiers 6 1 Fichiers s par s Autres fonctions Fichier hop h D clarations void f int x int g Fichier main cpp du premier projet include hop h int main Utilisation int a 8 f a Fichier main2 cpp du deuxi me projet il faut pr ciser l emplacement complet de l en t te qui se trouve dans le r pertoire du premier projet include Project1 hop h int main Utilisation f 12 int b g En fait pour tre sur que les fonc
125. availler le processeur successivement par petites tranches sur les diff rents programmes Il s agit de donner la main de mani re intelligente et qui table mais aussi de replacer un process interrompu dans la situation qu il avait quitt e lors de son interruption 2 G rer la m moire d di e chaque process En pratique une partie ajustable de la m moire est r serv e chaque process La m moire d un process devient m moire virtuelle si un process est d plac un autre endroit de la m moire physique la RAM il ne s en rend pas compte On en profite m me pour mettre tempo rairement hors RAM donc sur disque dur un process en veille On peut aussi utiliser le disque dur pour qu un process utilise plus de m moire que la m moire physique mais attention le disque tant tr s lent ce process risque de devenir lui aussi tr s lent Lorsqu un process besoin de trop de m moire il utilise sans pr ve nir le disque dur la place de la m moire et peut devenir tr s lent On dit qu il swappe ou pagine Seule sa lenteur et le bruit du disque dur permet en g n ral de s en rendre compte on peut alors s en as surer avec le gestionnaire de t che du syst me Autre progr s on g re maintenant la m moire virtuelle de fa on s parer les process entre eux et au sein d un m me process la m moire contenant les ins tructions de celle contenant les donn es Il est rigoureusemen
126. b 3 16 Boucle principale 17 while true 18 Affichage de la balle 19 fillRect xb 3 yb 3 7 7 Red 20 Temporisation 21 milliSleep 20 22 Effacement de la balle 23 fillRect xb 3 yb 3 7 7 White 24 Rebond 25 if xb ub gt 253 26 ub ub 27 Mise a jour de la position de la balle 28 xb ub 29 yb vb 30 31 endGraphics 32 return 0 33 Ne pas s int resser la fonction Clavier G n rer puis ex cuter la solution Que se passe t il 2 Aide de Visual Studio A tout moment la touche F1 permet d acc der la documen tation du mot cl situ sous le curseur Tester cette fonctionnalit sur les mots cl s if while et return Touche utile F1 Acc der la documentation 3 Comprendre le fonctionnement du programme Identifier la boucle principale du programme Elle se d compose ainsi a Affichage de la balle b Temporisation de quelques millisecondes pour que la balle ne se d place pas trop vite 196 A Travaux Pratiques A 2 Variables boucles conditions fonctions c Effacement de la balle d Gestion des rebonds e Mise jour des coordonn es de la balle Pourquoi la ligne comportant l instruction while suscite t elle un warning A quoi sert la condition formul e par l instruction if 4 Gestion de tous les rebonds Compl ter le programme afin de g rer tous les rebonds Par exemple il faut in verser la vitesse hor
127. ci est aujourd hui impossible sous Windows ou Linux et ne concerne plus que certains syst mes 25 Nous faisons ici un horrible mensonge des fins simplificatrices Dans notre cas les variables taient des variables locales la fonction main donc stock es dans la pile Elles ne sont pas une adresse m moire d finie l avance de mani re absolue mais une adresse relative l emplacement o la fonction rangera ses variables locales en fonction de ce que le programme aura fait avant Cela explique la simplicit de l instruction mov eax dword ptr a dans notre cas Nous verrons tout cela plus tard 26 Comme les PowerPC des vieux Macs 27 Comme les processeurs Intel et AMD 20 2 Bonjour Monde 2 1 L ordinateur 2 1 3 Autres Composants Micro processeur et m moire nous avons vu le principal Compl tons le tableau avec quelques autres l ments importants de l ordinateur Types de m moire La m moire dont nous parlions jusqu ici est de la m moire vive ou RAM Elle est rapide mais a la mauvaise id e de s effacer quand on teint l ordinateur Il faut donc aussi de la m moire morte ou ROM c est dire de la m moire conservant ses donn es quand l ordinateur est teint mais qui en contre partie ne peut tre modifi e Cette m moire contient en g n ral le minimum pour que l ordinateur d marre et ex cute une t che pr d finie Initialement on y stockait les instructions n cessaires pour qu
128. cimal tait adopt Les conversions de binaire hexad cimal sont tr s simples chaque chiffre hexad cimal valant pour un paquet de 4 bits alors qu entre binaire et d cimal c est moins imm diat Il est aujour d hui encore utilis quand on d signe le contenu d un octet ou une adresse Ainsi notre fameux c 3xa 2 b devient en m moire 17 Encore un anglicisme 18 Aujourd hui typiquement une ou plusieurs barrettes pour un total de 1 ou 2Go on l a d j dit Souvenons nous avec une larme l oeil des premiers PC qui avaient 640Ko kilo octet soit 1024 octets voire pour les plus ag s d entre nous des premiers ordinateurs personnels avec 4Ko ou m me des premi res cartes programmables avec 256 octets 19 byte en anglais Attention donc ne pas confondre byte et bit surtout dans des abr viations comme 512kb s donn es pour le d bit d un acc s internet b bit B byte 8 bits 20 Le coin des coll giens en binaire ou base 2 on compte avec deux chiffres au lieu de dix d ha bitude c est dire en d cimal ou base 10 Cela donne 0 1 10 11 100 101 110 111 Ainsi 111 en binaire vaut 7 Chaque chiffre s appelle un bit On voit facilement qu avec un chiffre on compte de 0 1 soit deux nombres possibles avec deux chiffres de 0 3 soit 4 2 x 2 nombres avec 3 chiffres de 0 7 soit 8 2 x 2 x 2 nombres Bref avec n bits on peut coder 2 2 multipli par lui m me n fois nomb
129. consid r es comme un p riph rique allant avec l cran sont elles devenues une partie essentielle de l ordinateur v ritables puis sances de calcul tel point que certains programmeur les utilisent pour faire des cal culs sans m me afficher quoi que ce soit Plus encore c est l ordinateur qui est parfois juste consid r comme maillon entre diff rents appareils Qui appellerait p riph rique un cam scope qu on relie un ordinateur pour envoyer des vid os sur internet ou les transf rer sur un DVD Ce serait presque l ordinateur qui serait un p riph rique du cam scope 2 2 Syst me d exploitation Notre vision jusqu ici est donc la suivante 1 Le processeur d marre avec les instructions pr sentes en ROM 2 Ces instructions lui permettent de lire d autres instructions pr sentes sur le disque dur et qu il recopie en RAM 3 Il ex cute les instructions en question pour il lire des donn es entr es pr sentes elles aussi sur le disque dur et g n rer de nouvelles donn es sorties A moins que les entr es ou les sorties ne soient chang es via les p riph riques Assez vite ce principe a volu 1 Le contenu du disque dur a t organis en fichiers Certains fichiers repr sen taient des donn es d autres des programmes d autres encore contenaient eux m mes des fichiers 2 Les processeurs devenant plus rapides et les capacit s du disque dur plus impor tantes on a eu envie de g rer
130. coso varones ua duada 162 TLAS Operat r anos L an a AN RA A R aiei da A a 162 11 4 4 Surcharge et m thode constante 163 TLAS Mne AI 164 11 5 Assertions 165 116 Types A II 166 11 7 Ficheder f rence o eo 26 d s A G aota AL e de a 4 amp 167 12 Fonctions et classes param tr es templates 171 T21 tenplete amp LU ea L RAS ts A aA a FAR r EST E i LEA 171 EA III II III 171 12 1 2 template etfichiefs coord AAA 172 PAP EU E E E E E E E 173 E A 176 seo o MA III 178 12 3 Valeur conditionnelle c c o o o vous 4 179 124 Boucles et break co dax se 4 ne e dou a 179 125 Variables st tigu s oso cs rame ARA AAA 180 12 6 const etta leaux EE csacsr ese dsk epe L pe Lp E npa kA 181 12 7 Fiche de r f rence 182 A Travaux Pratiques 189 Al L environnement de programmation os es esa eran a 189 All Bonjour Mondel osa edoa dau rat kaotada edt adi ka 189 AL2 Premi res erreurs o cs cca conca udna dent 191 AlS DUETO esgeri ari chanh ia a ha an a Ea EA 193 Adlas Dilie MA ni k d ai i an dons 194 A15 InstallerImaginet chez soi eo rwa re cocs esce eoa caa ss 194 4 TABLE DES MATIERES TABLE DES MATIERES A 2 Variables boucles conditions fonctions 195 A 2 1 Premier programme avec fonctions 195 A 2 2 Premier programme graphique avec Imagine
131. d w yl hasard h Point initial int x2 hasard w y2 hasard h Point final Color c Color hasard 256 hasard 256 hasard 256 drawLine x1 y1 x2 y2 c Trac de segment int xc hasard w yc hasard h Centre du cercle int rc hasard w 20 Rayon Color cc Color hasard 256 hasard 256 hasard 256 fillCircle xc yc rce cc Cercle endGraphics return 0 On pourrait penser que hasard w est aussi long taper que rand w et que notre fonction est inutile C est un peu vrai Mais en pratique nous n avons alors plus nous souvenir de l existence de la fonction rand ni de comment on fait un modulo C est m me mieux que a nous devenons ind pendant de ces deux fonctions et si vous voulions tirer des nombres au hasard avec une autre fonction Y nous n aurions plus qu modifier la fonction hasard C est encore une r gle importante On doit galement faire une fonction quand on veut s parer et factoriser le travail Il est ensuite plus facile de modifier la fonction que toutes les lignes qu elle a remplac es a Moindre effort toujours 3 2 1 Retour Nous venons de d finir sans l expliquer une fonction hasard qui prend un para m tre n de type int et qui retourne un r sultat de type int lui aussi Il n y a pas grand chose savoir de plus si ce n est que 1 Une fonction peut ne rien renvoyer Son type de retour est alors void et il n y a pas de return
132. d g f 12 Appelle f 12 0 10 2 Appelle f 10 2 void f int a int b ne pas re pr ciser ici le b par d faut 11 3 2 Utilit En g n ral on part d une fonction int f int a int b 1 Puis on veut lui rajouter un comportement sp cial dans un certain cas int f int a int b bool special Plut t que de transformer tous les anciens appels f en f false il suffit de faire int f int a int b bool special false pour laisser les anciens appels inchang s et uniquement appeler f true dans les futurs cas particuliers qui vont se pr senter 11 3 3 Erreurs fr quentes Voici les erreurs fr quentes lorsqu on veut utiliser des valeurs par d faut 1 Vouloir en donner aux param tres au milieu de la liste 160 11 Cha nes de caract res fichiers 11 4 Accesseurs void f int a int b 3 int c NON Les derniers param tres Pas ceux du milieu 2 Engendrer des probl mes de surcharge void f int a void f int a int b 0 Probl me de surcharge Re On ne saura pas r soudre f 1 11 4 Accesseurs Voici en cinq tapes les points utiles conna tre pour faire des accesseurs pratiques et efficaces 11 4 1 R f rence comme type de retour Voici une erreur souvent rencontr e qui fait hurler ceux qui comprennent ce qui se passe int i Variable globale int f return i f 3
133. d int n return rand n Color une_couleur return Color hasard 256 hasard 256 hasard 256 void un_point int w int h int amp x int amp y x hasard w y hasard h int main const int w 300 h 200 openWindow w h for int i 0 i lt 150 i int x1 y1 Point initial un_point w h x1 y1 int x2 y2 Point final un_point w h x2 y2 Color c une_couleur drawLine x1 y1 x2 y2 c Trac de segment int xc yc Centre du cercle un_point w h xc yc int rc hasard w 20 Rayon Color cc une_couleur fillCircle xc yc rc cc Cercle endGraphics return 0 47 40 26 27 28 29 30 31 32 33 34 IS O1 NN 3 2 Fonctions 3 Premiers programmes Avec le conseil suivant penser utiliser directement le r sultat d une fonction et ne pas le m mori ser dans une variable lorsque c est inutile Il devient m me int x1 y1 Point initial un_point w h x1 y1 int x2 y2 Point final un_point w h x2 y2 drawLine x1 y1 x2 y2 une_couleur Trac de segment int xc ye Centre du cercle un_point w h xc yc int rc hasard w 20 Rayon fillCircle xc yc rc une_couleur Cercle 3 2 4 Port e D claration D finition Depuis le d but nous cr ons des fonctions en les d finissant Il est parfois utile de ne conna tre que le type de retour et les param tres d une fonction sans pour autant savoir c
134. dans le tas l adresse m moris e dans t Lorsque t est un tableau de taille fixe t i d signe son i l ment Lorsque t est un pointeur d int t i d signe la variable int stock e i places plus loin en m moire que celle situ e l adresse t Ainsi apr s un int t n comme apr s un intx t new int n la syntaxe t i d signe bien ce qu on veut Lorsque t est un tableau de taille fixe la syntaxe t tout court d signe l adresse dans la pile laquelle le tableau est m moris De plus lorsqu une fonction prend un tableau comme param tre la syntaxe int s signifie en r alit que s est l adresse du tableau Ce qui fait qu en fin de compte une fonction f int s est con ue pour qu on lui passe une adresse s elle marche videmment avec les tableaux allou s dynamiquement qui ne sont finalement que des adresses c est plut t l appel f t avec t tableau de taille fixe qui s adapte en passant f l adresse o se trouve le tableau 2 Ici une place est videmment le nombre d octets n cessaires au stockage d un int 106 8 Allocation dynamique 8 2 Allocation dynamique logiquement on devrait m me d clarer f par f int s au lieu de f int s Les deux sont en fait possibles et synonymes Vous pouvez donc maintenant programmer en comprenant ce genre de choses double somme doublex t int n Syntaxe pointeur double s 0 for int i 0 i lt n i s
135. de using namespace Imagine B 1 Common Le module Common d finit entre autres la classe Color cod e par un m lange de rouge vert et bleu la quantit de chacun cod e par un entier entre 0 et 255 Color noir Color 0 0 0 Color blanc Color 255 255 255 Color rouge Color 255 0 0 Un certain nombre de constantes de ce type sont d j d finies BLACK WHITE RED GREEN BLUE CYAN MAGENTA YELLOW Un type byte synonyme de unsigned char est d fini pour coder une valeur enti re entre 0 et 255 Tr s pratique srcPath fait pr c der la cha ne de caract re argument par le chemin complet du r pertoire contenant le fichier source L quivalent pour un argument de type string est stringSrcPath B 2 Graphics B Imagine const char fichier srcPath mon_fichier txt string s mon_fichier txt s stringSrcPath s En d autres termes le fichier sera trouv quel que soit l emplacement de l ex cutable La classe template FArray s utilise pour des tableaux de taille petite et connue la compilation allocation statique Pour des tableaux de taille non connue la com pilation allocation dynamique utiliser Array Pour les matrices et vecteurs utiliser FMatrix et FVector utilisant l allocation statique comme indiqu par le pr fixe F fixed Les quivalents dynamiques sont dans LinAlg B 2 Graphics Le module Graphics propose du dessin en 2D et 3D Les coordonn es 2D sont en pix
136. de dans un fichier s par pour l utiliser dans un autre projet En fait d couper son code en plusieurs fichiers a d autres int r ts Rendre le code plus lisible et vitant les fichiers trop longs et en regroupant les fonctions de facon structur e Acc l rer la compilation Lorsqu un programme devient long et complexe le temps de compilation n est plus n gligeable Or lorsque l on r g nere un projet l environnement de programmation ne recompile que les fichiers sources qui ont t modifi s depuis la g n ration pr c dente Il serait en effet inutile de recompi ler un fichier source non modifi pour ainsi obtenir le m me fichier objet Donc changer quelques lignes dans un fichier n entra nera pas la compilation de tout le programme mais seulement du fichier concern Attention toutefois ne pas s parer en de trop nombreux fichiers Il devient alors plus compliqu de s y retrouver et de naviguer parmi ces fichiers 3 C est en r alit un peu plus compliqu un source peu d pendre via des inclusions cf section 6 1 4 d autres fichiers qui eux peuvent avoir t modifi s Il faut alors recompiler un fichier dont une d pendance a t modifi e Ces d pendances sont g r es automatiquement par Cmake 79 6 1 Fichiers s par s 6 Plusieurs fichiers Solution Explorer Solution Test 2 projects A X Ea AE Properties aX CSA Solution Test 2 projects hop cpp File
137. de l objet au m me titre que ses champs D ailleurs les champs d un objet sont parfois appel s membres de l objet et ses m thodes des fonc tions membres Voici ce que cela donne en C struct obj int xX champ x int m thode f int g int y m thode g int main obj a a x 3 int i a f 118 9 Premiers objets 9 2 Exemple simple int j a g 2 Il y a juste un d tail mais d importance la d finition de la structure obj ci dessus ne fait que d clarer les m thodes Elles ne sont d finies nulle part dans le code pr c dent Pour les d finir on fait comme pour les fonctions habituelles sauf que pour permettre plusieurs objets d avoir les m mes noms de m thodes on pr fixe leur d finition par le nom de l objet suivi de a Ce m canisme existe aussi pour les fonctions usuelles Ce sont les espaces de nom que nous avons rencontr s et contourn s imm diatement avec using namespace std pour ne pas avoir crire std cout Voici comment cela s crit struct objl int x champ x int f m thode f d claration int g int y m thode g d claration y struct obj2 double x champ x double f m thode f d claration y int objl f m thode f de obj1 d finition return int objl g int y m thode g de obj1 d finition return double obj2 f m thode f de obj2 d finition ret
138. deuxi me void Choc double x double y double amp vx double amp vy double m double x2 double y2 double amp vx2 double amp vy2 double m2 fait rebondir les deux particules l une contre l autre bool Collision double x1 double y1 double vx1 double vyl double rl double x2 double y2 double vx2 double vy2 double r2 renvoie true si le corps de coordonn es x1 y1 de vitesse vx1 vy1 et de rayon r1 est sur le point d entrer en collision avec le corps de coordonn es x2 y 2 de vitesse vx2 vy2 et de rayon r2 et false sinon A 4 3 Th orie physique NB Cette section n est donn e que pour expliquer le contenu des fonctions pr programm es fournies avec l nonc Elle peut tre ignor e en premiere lecture Acc l ration La somme des forces exerc es sur un corps est gale au produit de sa masse par l acc l ration de son centre de gravit Fou MAT G A Gravitation universelle Soient deux corps A et B Alors A subit une force d attraction Chocs lastiques Soient A et B deux particules rentrant en collision Connaissant tous les param tres avant le choc comment d terminer leur valeur apr s En fait seule la vitesse des par ticules reste calculer puisque dans l instant du choc les positions ne changent pas Durant un choc dit lastique trois quantit s sont conserv es 1 la quantit de mouvement B m va mgUp 2 le moment cin tique M maax va tmgBTBX VB q
139. dl break while fini return 0 Si vous avez tout compris le switch pr c dant ceci est quivalent a if C 4 cout lt lt Vous_avez tap _ a else if 0 cout lt lt Vous avez tap f Au revoir lt lt endl fini true else if c e c 1 I e 0 II c u Il c y7 cout lt lt Vous avez tap une autre voyelle lt lt endl else cout lt lt Vous avez tap autre chose lt lt endl lt lt endl Avant tout rappelons la principale source d erreur du switch Dans un switch ne pas oublier les break Vous avez pu remarquer cette ligne 2 un peu cryptique Un namespace est un pr fixe pour certains objets Le pr fixe des objets standard du langage est std Ainsi cout et endl ont pour nom complet std cout et std endl La ligne 2 permet d omettre ce pr fixe 3 1 3 Boucles Il est difficile de faire un programme qui fait quelque chose sans avoir la possibilit d ex cuter plusieurs fois la m me instruction C est le r le des boucles La plus utili s e est le for mais a n est pas la plus simple comprendre Commen ons par le do while qui tourne en rond tant qu un test est vrai Le programme suivant attend que l utilisateur tape au clavier un entier entre 1 et 10 et lui r itere sa question jusqu a obtenir un nombre correct include lt iostream gt using namespace std int main int
140. donc garde ne pas utiliser ce terme lorsque r devient trop petit Initialisation al atoire Cr er et utiliser la place des conditions initiales donn es pour le soleil une fonction initialisant une Bal le sa position tant dans la fen tre sa vitesse nulle son rayon entre 5 et 15 et sa masse valant le rayon divis par 20 Vous aurez probablement besoin de la fonction Random Des soleils par milliers Placer 10 soleils al atoirement et en tenir compte l affichage dans le calcul du d placement de l ast roide Diminuer le pas de temps de calcul Afin d viter les erreurs dues la discr tisation du temps diminuer le pas de temps dt pour le fixer 0 01 voire 0 001 si la machine est assez puissante R gler la fr quence d affichage en cons quence inversement proportionnelle dt Lancer plusieurs fois le programme Chocs lastiques simples Faire rebondir l ast roide Faire subir des chocs lastiques l ast roide chaque fois qu il s approche trop d un soleil de fa on ce qu il ne rentre plus dedans fonction ChocSimple et r tablir dt une valeur plus lev e par exemple 0 1 modifier la fr quence d af fichage en cons quent Pour savoir si deux corps sont sur le point d entrer en collision utiliser la fonction Collision Jeu de tir figure A 5 droite Ouvrir un nouveau projet Afin de partir dans deux voies diff rentes et travailler proprement nous allons
141. du tableau qui ne peuvent tre modifi s Cette possibilit de pr ciser qu un tableau ne peut tre modifi est d autant plus im portante qu un tableau est toujours pass en r f rence sans le const on ne pourrait assurer cette pr servation des valeurs void f int t 4 void g const int t 4 181 12 7 Fiche de r f rence 12 Fonctions et classes param tr es templates void h const intx t int n modifie peut tre al int a 4 f a g a ne modifie pas al h a 4 ne modifie pas al 12 7 Fiche de r f rence Fiche de r f rence 1 6 Boucles do while ok int i 1 while i lt 100 i i 1 for int 1 1 i lt 10 1 for int i 1 3j 10 j gt i 1i 1 2 3 3 3 for int IS for int JS 1 saute cas i if i 3 continue For int des if t il 8s quitte boucle break Clavier Debug F5 Step over F10 5 Step inside F11 Indent Ctrl A Ctrl 1 Step out Maj F11 Gest t ches Ctrl Maj Ech Tests Comparaison l lt gt lt gt N gation Combinaisons amp amp if i 0 j 1 if i 0 else switch i case 1 e 7 break case 2 case 3 7 break default LE M mx x gt y 2X y 182 12 Fonctions et classes param tr es templates 12 7 Fiche de r f rence Fiche de r f renc
142. e 2 6 Fonctions Pile des appels j i D finition It ratif R cursif k 1 3 int plus int a int b R f rences constantes pour Initialisation int c a b un passage rapide int n 5 0o n return c void f const obj amp x Constantes y const int s 12 void affiche int a cout lt lt a lt lt endl void g const obj amp x 7 Port e f x OK a i j interdit D claration Aa de Z int j 2 int plus int a int b Valeurs par d faut i 3 ok Retour FH f int a int b 0 if 1 int signe double x vora gU int k 3 E 12 Z7 E E270 if x lt 0 j k OK El f 10 2 10 2 j if x gt 0 o i k interdit return 1 void f int a int b he return 0 o JP int i 3 void afficher int x Inline appel rapide LR int y inline double is if x lt 0 ji y lt 0 sqr double x string s hop bool t true return return xxx fl 21 2f if x gt w y gt h gat lair tet ri unsigned int j 4 DrawPoint x y RED double y sqr z 3 ns a R f f unsigned char d 25 sE Erence en retour complex lt double gt Appel int i Var globale z 2 3 int f int a int amp f E int a return 1 A Variables globales int i f 2 j g f paa T E UN 0 3 i 3 const int m 12 R f rences void void swap int a Structures n 10 OK int amp b
143. e MA E 134 10 3 1 Constructeur vide 20000 a don da RR AA A AA ce 134 10 3 2 Plusieurs constructeurs 44 4 oc censos tas 136 1033 LORS Tople e saoe a sum LA LG Re RER AR 137 e e Lu en mieu firm eo er a 138 a aaa aaa ad e 139 10 6 R f rences Constantes cin ua REA LEA S E 139 AI III 139 10 6 2 M thodes constantes a a 140 10 7 IESTENC EUNE iec caa aa SE a a ae is 142 TABLE DES MATI RES TABLE DES MATI RES 10 8 Destructeurs et tableaux L 24 ner em rana RARA 144 A a MM II 144 10 10Affectation don da a a dE ba 145 10 110bjets avec allocation dynamique o o ooooosornsecrsss 146 10 11 1 Construction el destruction 2 4 2 93 do a 146 10 11 2 Probl mes 147 a ds a de O O ed 148 10 12Fiche de r f rence so se suis o lt 4 151 11 Cha nes de caract res fichiers 155 11 1 Chaines D s y cin une dune we RER LERRE EX EX 155 LEZ PEME 2 di a LU RL RER A To TU RS 157 ANA Da DU bu did oui had oi Ride a con 157 11 2 2 Cha nes et fichiers csa au a Ra ue at mn at ad a 158 11 2 3 Objets et CIM iia 159 114 3 Valeurs par d faut 55 cs rea AAA 159 ALL PrAngip s secim esmda aa a dates 159 LL Valle errores a a a de 160 LOS XEUESINEQUEES cs has has hab R e tdt E E E S Y 160 EL Accesses 2 a o cas a de de ob de de 4 de le dd hu 161 11 4 1 R f rence comme type de retour oie tons ge are da 161 1142 Utilisation
144. e autres la fonction s size qui re tourne la taille de la cha ne s la syntaxe de cette fonction sera comprise plus tard dans le cours Une petite explication sur s i 0 Les caract res type char sont en fait une valeur num rique le code ASCII 0 donne le code ASCII du caract re z ro On peut le v rifier en faisant par exemple cout lt lt int 0 lt lt endl Il faut convertir en entier sinon on lui demande d afficher un char et donc il affiche le caract re associ au code ASCII 0 Cette valeur est 48 Il se trouve que les chiffres de 0 9 ont des codes ASCII cons cutifs 0 48 1 49 9 57 Le type string de la variable s se comporte comme un tableau de char Ainsi s i 0 vaut 0 si s i est le caract re 0 1 0 1 si c est le caract re 1 etc 7 Traitement d une combinaison Il faudrait maintenant programmer une fonction comparant une combinaison donn e avec la combinaison trouver Cette fonction devrait renvoyer deux va leurs le nombre de pions de la bonne valeur bien plac s puis dans les pions restant le nombre de pions de la bonne valeur mais mal plac s Par exemple si la combinaison trouver est 02113 00000 1 pion bien plac 0xxxx 0 pion mal plac xxxxx 20000 0 pion bien plac xxxxx 2 pions mal plac s 20xxx 13133 2 pions bien plac s xx1x3 1 pion mal plac 1xxxx 13113 3 pions bien plac s xx113 0 pion mal plac xxxxx 12113 4 pio
145. e le programmeur puisse remplir ensuite la RAM avec les instructions de son programme Il fallait retaper le programme chaque fois On a donc rapidement eu recours des moyens de stockage pour sauver programmes et donn es l extinction de l ordinateur Il suffisait alors de mettre en ROM le n cessaire pour g rer ces moyens de stockages Moyens de stockage Certains permettent de lire des donn es d autres d en crire d autres les deux la fois Certains ne d livrent les donn es que dans l ordre de mani re s quentielle d autres dans l ordre que l on veut de mani re al atoire Ils sont en g n ral bien plus lents que la m moire et c est s rement ce qu il faut surtout retenir On recopie donc en RAM la partie des moyens de stockage sur laquelle on travaille Faire travailler le micro processeur avec le disque dur est BEAUCOUP plus lent qu avec la m moire 1000 fois plus lent en temps d acc s 100 fois plus en d bit a Rajoutez un facteur 50 suppl mentaire entre la m moire et la m moire cache du proces seur Au d but les moyens de stockages taient m caniques cartes ou bandes perfo r es Puis ils devinrent magn tiques mini cassettes t disquettes disques durs ou bandes magn tiques Aujourd hui on peut rajouter les CD DVD les cartes m moire les cl s USB etc etc 28 Moins que les registres ou m me que le cache m moire du processeur dont nous ne parlerons
146. e n est toujours pas facile suivre ou debugger Il faut aussi savoir que la pile des appels n est pas infinie et m me relativement limit e Ainsi le programme suivant Fait d border la pile int fact3 int n if n 1 return 1 return nxfact3 n 1 erreur dans lequel une erreur s est gliss e va s appeler th oriquement l infini et en pratique s arr tera avec une erreur de d passement de la pile des appels Mais la vraie raison qui fait qu on vite parfois le r cursif est qu appeler une fonction est un m canisme co teux Lorsque le corps d une fonction est suffisamment petit pour que le fait d appeler cette fonction ne soit pas n gligeable devant le temps pass ex cuter la fonction elle m me il est pr f rable d viter ce m canisme d appel Dans le cas d une fonction r cursive on essaie donc s il est n cessaire d crire une version d r cursiv e ou it rative de la fonction Pour notre factorielle cela donne Version it rative int fact2 int n int f 1 for int i 2 i lt n i FRS return f ce qui apr s tout n est pas si terrible Enfin il arrive qu crire une fonction sous forme r cursive ne soit pas utilisable pour des raisons de complexit Une exemple classique est la suite de Fibonacci d finie par l fp f l fn fn 1 fn 2 et qui donne 1 1 2 3 5 8 En version r cursive Tr s lent int fibl
147. e programme C Ce fichier source tait transform en fichier objet par le compilateur puis le linker compl tait le fichier objet avec les bibliotheques du C pour en faire un fichier ex cutable En fait un projet peut contenir plusieurs fichiers sources Il suffit pour cela de rajouter un fichier cpp la liste des sources du projet Dans OtCreator ouvrir le menu File New File or Project oufaireCtrl N choisir comme mod le C Source File lui donner un nom et bien s assurer qu on le met dans le dossier des sources et non dans le dossier de build Rajouter ce fichier dans le CMakeLists txt add_executable Hop main cpp hop cpp Ainsi en rajoutant un fichier C hop un projet contenant d j main cpp on se retrouve avec une structure de projet identique celle de la figure 6 1 Apr s cela chaque g n ration du projet consistera en 1 Compilation chaque fichier source est transform en un fichier objet de m me nom mais de suffixe obj Les fichiers sources sont donc compil s ind pendam ment les uns des autres 2 Link les diff rents fichiers objets sont r unis et compl t s avec les biblioth ques du C en un seul fichier ex cutable de m me nom que le projet Une partie des instructions du fichier principal celui qui contient main peut donc tre d port e dans un autre fichier Cette partie sera compil e s par ment et r int gr e pendant l dition des liens Se pose alors le
148. e quelques conseils de base 1 S amuser C est une vidence en mati re de p dagogie Mais c est tellement facile dans le cas de la programmation qu il serait dommage de passer c t Au pire si programmer n est pas toujours une partie de plaisir pour tout le monde il vaut mieux que le programme obtenu dans la douleur soit int ressant pour celui qui Va fait 2 Bricoler Ce que nous voulons dire par l c est qu il ne faut pas h siter t ton ner tester fouiller faire d faire casser etc L ordinateur est un outil exp rimen tal Mais sa programmation est elle aussi une activit exp rimentale la base M me si le programmeur aguerri trouvera la bonne solution du premier jet il est important pour le d butant d apprendre conna tre le langage et l outil de programmation en jouant avec eux 3 Faire volontairement des erreurs Provoquer les erreurs pendant la phase d ap prentissage pour mieux les conna tre est le meilleur moyen de comprendre beau coup de choses et aussi de rep rer ces erreurs quand elles ne seront plus volon taires 4 Rester le ma tre de la machine et de son programme Que programmer soit exp rimental ne signifie pas pour autant qu il faille faire n importe quoi jusqu ce que a marche plus ou moins Il faut avancer progressivement m thodique ment en testant au fur et mesure sans laisser passer la moindre erreur ou im pr cision 5 Debugger Souvent la connaissance du d
149. e y for int i 0 i lt m i y i 0 for int j 0 j lt n j y il A iwmxj x j l denle P 2 3 x 3 y 2 H P Zi produit P 2 3 x y y Px 105 DO XD O1 ND A Rh Neo O 8 2 Allocation dynamique 8 Allocation dynamique 8 2 Allocation dynamique Il n y a pas d allocation dynamique possible pour les tableaux 2D Il faut donc vrai ment les m moriser dans des tableaux 1D comme expliqu ci dessus pour pouvoir les allouer dynamiquement dans le tas L exemple suivant montre comment faire Il utilise la fonction produit donn e ci dessus sans qu il soit besoin de la red finir int m n doublex A new double mxn doublex x new double n doublex y new double m J A X produit A m n x y y Ax delete A delete x delete y 8 2 1 Pourquoi a marche Il est maintenant temps d expliquer pourquoi une fois allou s nous pouvons utili ser des tableaux dynamiques exactement comme des tableaux de taille fixe Il suffit de comprendre les tapes suivantes 1 int t n d finit une variable locale donc de la m moire dans la pile capable de stocker n variables int int t d finit une variable de type pointeur d int c est dire que t peut m moriser l adresse d une zone m moire contenant des int new int n alloue dans le tas une zone m moire pouvant stocker n int et renvoie l adresse de cette zone D o le intx t new int n 4 delete t libere
150. eCombinaison int combi nbcases int n permet d afficher la combinaison combi sur la ligne n Au d but du programme on laisse en haut de la fen tre graphique autant de lignes libres que le joueur a d essais pour y afficher le d roulement du jeu On affiche en bas de la fen tre graphique un mini mode d emploi qui r sume les correspondances entre touches et couleurs 2 Mastermind graphique R ins rer dans ce projet les fonctions de g n ration al atoire d une combinaison et de comparaison de deux comparaisons crites pr c demment Puis reprogram mer la boucle principale du jeu en utilisant l affichage graphique 3 Ultime am lioration On souhaite pouvoir effacer une couleur apr s l avoir tap e au cas o l on se serait tromp Etudier les fonctions int Clavier et void getCombinaison int int La premi re prend d j en compte la touche Retour arri re mais pas la seconde qui la consid re comme une erreur de frappe Modifier cette derni re en cons quence 202 A Travaux Pratiques A 4 Structures A 4 Structures Avertissement Dans ce TP nous allons faire voluer des corps soumis la gravita tion puis leur faire subir des chocs lastiques Il s agit d un long TP qui nous occupera plusieurs s ances En fait le TP suivant sera une r organisation de celui ci Les sec tions 11 et 15 ne sont donn es que pour les l ves les plus l aise et ne seront abord es qu en deuxi me sema
151. ebuggeur l outil pour rechercher les bugs est n glig e et son apprentissage est repouss au stade avanc Cet outil est pourtant pratique pour comprendre ce qui se passe dans un programme m me 19 sous Linux le compilateur usuel est GCC GNU Compiler Collection et Clang sous Mac soutenu par Apple Le projet GNU d veloppe de nombreux outils indispensables et libres pour compl ter le syst me d exploitation Clang s inspire fortement de GCC pour l utilisation mais dispose d une licence diff rente qui ne ferme pas la porte des extensions non libres 20 Minimal GNU for Windows une adaptation de GCC pour Windows 21 Le vocabulaire n est pas choisi au hasard un programme est une suite d ordres de commandes ou d instructions On voit bien qui est le chef 12 1 Pr ambule 1 2 Comment apprendre d pourvu de bugs Il faut donc le consid rer comme essentiel et faisant partie int grante de la conception d un programme L encore un bon environnement de programmation facilite la t che Gardons bien pr sents ces quelques principes car il est maintenant temps de passer notre premier programme 13 2 Bonjour Monde Chapitre 2 Bonjour Monde Si certains coll giens sont arriv s ici ils sont bien courageux Lorsque je disais tout l heure qu ils pouvaient facilement apprendre programmer je le pensais vraiment Par contre c est avec un peu d optimisme que j ai pr tendu qu ils pouvaient
152. ec la commande dir Taper Tp1 Touche utile Visual Ctrl F5 Start without debugging 6 Fichiers On a d j suivi la cr ation des fichiers principaux au fur et mesure Constater la pr sence de Tp1 obj qui est la compilation de Tp1 cpp que le linker a ensuite utilis pour cr er Tp1 exe Voir aussi la pr sence de nombreux fichiers de travail Quelle est la taille du r pertoire de Build de Tp1 clic droit propri t s 7 Nettoyage Supprimer les fichiers de travail et les r sultats de la g n ration avec Build Clean solution puis fermer Visual Studio Quelle est la nouvelle taille du r pertoire 8 Compression Sous Windows en cliquant droite sur le r pertoire Tp1 fabriquer une archive comprim e Tp1 zip ou Tp1 7z suivant la machine Attention il faut quitter Visual Studio avant de comprimer Il peut sinon y avoir une erreur ou certains fichiers trop importants peuvent subsister 1 Sur certaines machines il faut en fait aller sur C v rifiez en regardant o est install votre projet 190 A Travaux Pratiques A 1 L environnement de programmation Il faut quitter Visual Studio avant de comprimer 9 Envoi Envoyer le fichier par mail a son responsable de PC en indiquant bien le nom de son bin me et en mettant ENPCInfo1A dans le sujet Notez bien qu avec Cmake nous avons deux dossiers Le dossier source contenant les fichiers Tp1 cpp e
153. ecteur C plus A B double n norme C Votre environnement de d veloppement vous permet de naviguer facilement entre les diff rents fichiers de votre projet Par exemple avec QtCreator vous pouvez passer du header au source ou vice versa par l option Switch Header Source F4 du menu contextuel obtenu par un clic droit dans l diteur Pour suivre un include vous pou vez aussi vous mettre sur le nom du fichier et choisir l option Follow Symbol Under Cursor F2 du m me menu 82 6 Plusieurs fichiers 6 1 Fichiers s par s 6 15 A ne pas faire Il est fortement conseill de 1 ne pas d clarer dans l en t te toutes les fonctions du fichier s par mais seule ment celles qui seront utilis es par le fichier principal Les fonctions secondaires n ont pas appara tre 8 2 ne jamais inclure un fichier s par lui m me C est g n ralement une grosse b tise Donc pas de include vect cpp 6 1 6 Impl mentation Finalement la philosophie de ce syst me est que Le fichier s par et son en t te forment un tout coh rent impl mentant un certain nombre de fonctionnalit s Celui qui les utilise qui n est pas n cessairement celui qui les a pro gramm s se contente de rajouter ces fichiers son projet d inclure l en t te dans ses sources et de profiter de ce que l en t te d clare Le fichier d en t te doit tre suffisamment clair et informatif pour
154. el l axe des x est vers la droite et l axe des y vers le bas attention ce n est pas le sens math matique usuel Le point 0 0 est donc le coin haut gauche de la fen tre pour les fonctions de trac ou de l cran pour openWindow openWindow 500 500 Taille de fen tre drawRect 10 10 480 480 RED Coin haut gauche 10 10 largeur 480 hauteur 480 drawLine 10 10 490 490 BLUE Diagonale Window w openWindow 100 100 Autre fen tre setActiveWindow w S lection pour les prochains trac s drawString 10 10 Du texte MAGENTA Mettre du texte endGraphics Attend un clic souris avant de fermer les fen tres Si on a beaucoup de dessins faire la suite et qu on veut n afficher que le r sultat final c est plus esth tique on encadre le code de trac par noRefreshBegin noRefreshEnd Pour faire une animation il est utile de faire une petite pause entre les images pour r guler la cadence milliSleep 50 Temps en millisecondes Attention cependant ne pas intercaler une telle commande entre un noRefreshBegin et un noRefreshEnd car rien ne s afficherait pendant cette pause On peut charger une image loadGreyImage loadColorImage ou sauvegar der saveGreyImage saveColorImage dans un fichier Attention ces fonctions allouent de la m moire qu il ne faut pas oublier de lib rer apres usage bytex g int largeur hauteur if loadGreyImage srcPa
155. em au lieu de iostream c Oublier le apr s std d inte au lieu de int e cou au lieu de cout f Oublier les guillemets fermant la cha ne Hello _ g Rajouter une ligne i 3 avant le return A ce propos il est utile de d couvrir que Double cliquer sur un message d erreur positionne l diteur sur l er reur 191 A 1 L environnement de programmation A Travaux Pratiques 3 Erreur de linker Il est un peu t t pour r ussir mettre le linker en erreur Il est pourtant indis pensable de savoir diff rencier ses messages de ceux du compilateur En g n ral le linker indiquera une erreur s il ne trouve pas une fonction ou des variables parce qu il manque un fichier objet ou une biblioth que C est aussi une erreur s il trouve deux fois la m me fonction a Rajouter une ligne f 2 avant le return et faire Ctr1 F7 C est pour l ins tant une erreur de compilation b Corriger l erreur de compilation en rajoutant une ligne pour l instant ma gique void f int i avant la ligne avec main Compiler sans linker il n y a plus d erreur G n rer le programme le linker constate l absence d une fonction f utilis e par la fonction main qu il ne trouve nulle part 4 Indentations Avec toutes ces modifications le programme ne doit plus tre correctement in dent C est pourtant essentiel pour une bonne compr hension et rep rer d ven tuelle erreur de parenth ses
156. emp cher l utilisateur d acc der certains champs ou m me certaines m thodes Pour cela 1 Remplacer struct par class tous les champs et les m thodes de viennent priv s seules les m thodes de l objet lui m me ou de tout autre objet du m me type peuvent les utiliser 2 Placer la d claration public dans la d finition de l objet pour d bu ter la zone partir de laquelle seront d clar s les champs et m thodes publics c est dire accessibles tous a Bref les m thodes de la classe en question b On pourrait nouveau d clarer des passages priv s avec private puis publics etc Il existe aussi des passages prot g s notion qui d passe ce cours Voici un exemple class obj int x y void a_moi public int Z void pour_tous void une_autre obj A E void obj a_moi OK y OK rA OK void obj pour_tous x OK a_moi OK void obj une_autre obj A x A x OK A a_moi OK int main obj A B Akk NON 126 9 Premiers objets 9 7 Protection A 7 OK A a_moi NON A pour_tous OK A une_autre B OK Dans le cas de nos matrices que nous avions d j bien programm es il suffit de les d finir comme suit class Matrice int mn doublex t public void cree int ml int nl void detruit double get int i int j void set int i int j double x
157. emplace avantageusement au niveau clart et mise en page for if A if 1B a Ceci est rapprocher de l utilisation du return en milieu de fonction pour vacuer les cas particuliers section 7 3 112 8 Allocation dynamique 8 5 TP FIGURE 8 3 Deux images et diff rents traitements de la deuxi me n gatif flou relief d formation contraste et contours 8 5 TP Le TP que nous proposons en A 6 est une illustration de cette fa on de manipuler des tableaux bidimensionnels dynamiques travers des structures de donn es Pour changer de nos passionnantes matrices nous travaillerons avec des images figure 8 3 8 6 Fiche de r f rence Fiche de r f rence 1 3 Boucles do while ok int i l while i lt 100 i i 1 for int i 1 i lt 10 i for int i 1 3 10 J gt 1 1 1 2 3 3 3 for int i f r int J us x saute cas 1 3 if 1 3 continue Variables D finition int iy int k l m Affectation 1 2 j i k 1 3 Initialisation int n 5 o n Constantes const int s 12 Port e int iy i j interdit int j 2 i j OK LE J gt 1 int k 3 j k OK i k interdit Types int i 3 double x 12 3 char c A string s hop bool t true float y 1 2f unsigned int 3 4 signed char d 128 unsig
158. emplate lt typename T int N gt class nuplet T x N public accesseurs inline T operator int i const assert i gt 0 amp amp i lt N return x i inline T operator int i assert i gt 0 amp amp lt N return x i nuplet lt int 4 gt A A 1 3 nuplet lt string 2 gt B B 1 pierre Les fonctions doivent videmment s adapter template lt typename T int N gt T somme nuplet lt T N gt u T s u 0 for int i 1 iN i s u i return s nuplet lt double 3 gt C cout lt lt somme C lt lt endl Au regard de tout a on pourrait tre tent de mettre des template partout Et bien non valeur instanciation des types ou des entiers g n riques de la taille Les templates sont d licats programmer longs compiler etc Il ne faut pas en abuser Il vaut mieux plut t commencer des classes ou des fonctions sans template On ne les rajoute que lorsqu appara t le besoin de r utiliser l existant avec des types diff rents Et r p tons le encore une fois le compi lateur cr e une nouvelle classe ou une nouvelle fonction chaque nouvelle a Les nuplets ci dessus n ont donc rien voir avec des tableaux de taille variables Tout se passe comme si on avait programm des tableaux de taille constante pour plusieurs valeurs 175 12 1 template 12 Fonctions et classes param tr es templates 12 14 STL Les template sont d lica
159. en A 7 qui dessine quelques courbes fractales figure 9 1 en illustrant le concept d objet 9 9 Fiche de r f rence Fiche de r f rence 1 4 Boucles Step inside F11 do Indent Ctrl A Ctrl pat Step out Maj F11 hil lok x i EA Gest t ches Ctrl Maj Ech int i l while i lt 100 Variables es D finition i i 1 i int 1 int k 1 m for int i 1 i lt 10 i Affectation i 2 for int i 1 3 10 J gt 1 J 1 i i 2 j 3 3 k 1 3 Initialisation for int i int n 5 o n for int j 1 Constantes saute cas i j const int s 12 E ies LE E D Port e continue int 1 i j interdit int j 2 Clavier i j OK a el if j gt 1 Debug F5 int ke3 Step over F10 5 j k OK i k interdit Types int i 3 double x 12 3 char c A string s hop bool t true float y 1 2f unsigned int 3 4 signed char d 128 unsigned char d 25 complex lt double gt z 2 3 Variables globales int N const int m 12 void f n 10 OK int i m OK Conversion int i int x 3 float x float 1 3 Pile Tas 128 9 Premiers objets 9 9 Fiche de r f rence Fiche de r f rence 2 4 Fonctions D finition int plus int a int b int c a b return Cc void affiche int a cout lt lt a lt lt endl
160. enant nous fabriquer une fiche de r f rence qui servira d aide m moire lorsqu on est devant la machine Nous la compl terons apres chaque chapitre avec ce qui est vu dans le chapitre Les nouveaut s par rapport la fiche pr c dente sont en rouge La fiche finale est en annexe C Fiche de r f rence 1 2 Variables int 3 2 signed char d 128 D finition i j OK unsigned char d 25 inte ds LE del 4 complex lt double gt int k 1 m int k 3 A E Affectation Jaky ORI i 2 MEF f destes Variables globales Jr int nj k 1 3 T const int m 12 Initialisation a Aa 3 void f y 4 int n 5 d al A 10 OK double x 12 3 A Constantes ghar esi Ri int i m OK const int s 12 string s hop Port e bool Estena Conversion ing float y 1 2f inte i int 5 1 i j interdit unsigned int 3 4 float x tEloatd i d 51 3 4 Fiche de r f rence 3 Premiers programmes Fiche de r f rence 2 2 Tests Comparaison lt gt lt N gation Combinaisons amp amp if i 0 if i 0 else j 1 j 1 j 2 4 i 1 2 if nU a bool t i LE 6 j 1 switch 1 4 Case 1 F F break case 2 case 3 F break default F Boucles d while ok int i 1 while i lt 100 4 pi Al return Es void affiche int a cout lt lt a lt lt endl
161. ent 2 joueurs On utilisera pour ce joueur les touches S X Det F La fonction Clavier renverra donc les entiers int S int 2 int D et int F Remarque on ne g rera qu une touche par tour soit un seul appel la fonction Clavier par tour 2 Ultimes r glages a G rer la collision entre les deux serpents b Le principe de Tron est que la trace des mobiles reste Pour impl menter cela il suffit d allonger nos serpents chaque tour A 8 3 Graphismes Petit bonus pour les rapides nous allons voir comment g rer des graphismes un peu plus sympas que les rectangles uniformes que nous avons utilis s jusqu ici L ob jectif est de remplacer le carr de t te par une image que l on d place chaque tour Nous allons utiliser pour cela les Nat iveBitmap d Imagine qui sont des images affichage rapide Pour charger une image dans une Nat iveBitmap on proc de ainsi 219 A 8 Tron A Travaux Pratiques Entiers pass s par r f rence lors du chargement de l image pour qu y soient stock es la largeur et la hauteur de l image int w h Chargement de l image bytex rgb loadColorImage nom_fichier bmp rgb w h D claration de la NativeBitmap NativeBitmap ma_native_bitmap w h On place l image dans la NativeBitmap ma_native_bitmap setColorlmage 0 0 rgb w h L affichage d une Nat iveBitmap l cran se fait alors avec la m thode void putNativeBitmap int
162. ent 41 Il se contente de modifier anarchiquement ses donn es ce qui est d j pas mal 23 2 3 La Compilation 2 Bonjour Monde un programme C en un fichier ex cutable est un travail difficile mais utile Cer tains logiciels disposant d un langage de programmation comme Maple ou Scilab ne transforment pas leurs programmes en langage machine Le travail de traduction est fait l ex cution du programme qui est alors analys au fur et mesure on parle alors de langage interpr t L ex cution alors est videmment tres lente D autres lan gages comme Java d cident de r soudre les probl mes de portabilit c est dire de d pendance au processeur et au syst me en pla ant une couche interm diaire entre le processeur et le programme la machine virtuelle Cette machine videmment crite pour un processeur et un syst me donn s peut ex cuter des programmes dans un langage machine virtuel le byte code Un programme Java est alors traduit en son quivalent dans ce langage machine Le r sultat peut tre ex cut sur n importe quelle machine virtuelle Java La contrepartie de cette portabilit est videmment une perte d efficacit La traduction en code natif ou en byte code d un programme s appelle la compila tion Un langage compil est alors opposer un langage interpr t Dans le cas du C et de la plupart des langages compil s Fortran C etc la compilation se fait vers du code n
163. ent et ne sont donc utilisables qu a partir de la ligne o elles sont d finies Elles ont une dur e de vie limit e et meurent d s que l on sort du bloc limit par des accolades auquel elles appartiennent C est ce qu on appelle la port e d une variable a C est un peu plus compliqu pour les variables globales Nous verrons a aussi Ainsi en prenant un peu d avance sur la syntaxe des tests que nous allons voir tout de suite le programme suivant provoque des erreurs de port e aux lignes 2 et 8 int i i j Erreur j n existe pas encore int j 2 if j gt 1 int k 3 j k i k Erreur k n existe plus Autres types Nous verrons les diff rents types au fur et mesure Voici malgr tout les plus courants int i 3 Entier relatif double x 12 3 Nombre r el double pr cision char c A Caract re string s hop Cha ne de caract res bool t true Bool en vrai ou faux Les nombres r els sont en g n ral approch s par des variables de type double double pr cision ici sur 8 octets Les caract res sont repr sent s par un entier sur un oc tet sur certaines machines de 128 127 sur d autres de 0 255 la correspondance caract re entier tant celle du code ASCII 65 pour A 66 pour B etc qu il n est heu reusement pas besoin de conna tre puisque la syntaxe A entre simples guillemets est traduite en 65 par le compilateur etc L
164. erator b si jamais celui ci existe Rajoutons donc void obj operator const obj amp o cout lt lt notre programme et il affiche Ma Li F 0 obj 1 obj 2 obj 3 obj 4 copy 5 obj 6 copy On raffine en g n ral un peu L instruction a b c entre trois entiers marche pour deux raisons Elle se lit a b c L instruction b c affecte c b et retourne la valeur de c Pour pouvoir faire la m me chose entre trois objets on reprogrammera plut t l affec tation ainsi obj obj operator const obj amp o cout lt lt return o La obj a b c a b c OK car a b c ou m me ainsi ce qui d passe nos connaissances actuelles mais que nous pr conisons car cela vite de recopier un objet au moment du return const obj amp obj operator const obj amp o cout lt lt return o ti obj a b c a b c OK car a b c 145 10 11 Objets avec allocation dynamique 10 Constructeurs et Destructeurs Un dernier conseil Attention ne pas abuser Il n est utile de reprogrammer le constructeur par copie et l op rateur d affectation que lorsqu on veut qu ils fassent autre chose que leur comportement par d faut a Contrairement au constructeur vide qui lui n existe plus d s qu on d finit un autre constructeur et qu il est donc en g n ral indispensable de reprogrammer m me pour repro duire son comportement par d faut
165. erdit int j 2 i j OK if j gt 1 4 int k 3 OK j k i k interdit Types int i 3 double x 12 3 char c A string s hop bool t true float y 1 2f unsigned int 3 4 signed char d 128 unsigned char d 25 complex lt double gt zZ 2 3 Variables globales int n const int m 12 void f n 10 int i m OK OK Conversion int i int x j float x float i Pile Tas Tests Comparaison l lt gt lt gt N gation Combinaisons amp amp if i 0 3 1 if i 0 j else j 1 2 r break case 2 case 3 F break default Boucles do while ok int i 1 while i lt 100 i i 1 for int i 1 i lt 10 1 for int i 1 3 10 J gt 1 i i1 2 3 3 3 Fonctions D finition int plus int a int b int c a b return c void affiche int a cout lt lt a lt lt endl D claration int plus int a int b Retour int signe double x if x lt 0 return 1 if x gt 0 return 1 return 0 void afficher int x int y if x lt 0 y lt 0 return if x gt w y gt h return DrawPoint x y RED Appel int f int a INE g A csse 7 int i f 2 j g R f rences void swap int amp a int amp b int tmp a a b b tmp int x 3 y 2 swap Xx y Surcharge int hasard int n in
166. es Il dialogue avec le monde ext rieur via de la m moire en plus grande quantit que ses registres Cette m moire contient sous forme de nombres les instructions ex cuter et les donn es sur lesquelles travailler Les instructions sont typiquement Lire ou crire un nombre dans un registre ou en m moire Effectuer des calculs simples addition multiplication etc Tester ou comparer des valeurs et d cider ventuellement de sauter une autre partie de la suite d instructions 10 Un computer quoi 11 Cette notion est videmment d pendante de notre savoir faire informatique l instant pr sent Les premiers langages taient plus loign s de l Homme car plus proches de la machine qui tait alors rudimentaire et l on peut envisager que les futurs langages seront plus proches de l Homme 12 Pentium ou autre 13 Plus exactement la fr quence laquelle il ex cute ses instructions Aujourd hui l horloge va envi ron 3GHz Mais attention une instruction demande plus d un cycle d horloge 14 Aujourd hui typiquement 1Go giga octets soit 1024 x 1024 x 1024 m moires de 8 bits m moires pouvant stocker des nombres entre 0 et 255 17 2 1 L ordinateur 2 Bonjour Monde Voici par exemple ce que doit faire le micro processeur quand on lui demande d ex cuter c 3xa 2xb en C o a b c sont trois variables enti res 00415A61 mov eax dword ptr a mettre
167. es chez certains Enfin nous r p terons encore et toujours les m mes conseils 5 1 1 Erreurs classiques En vrac Mettre un seul dans les tests if i 2 Oublier les parenth ses if Utiliser then if i 2 then Mettre des virgules dans un for for int i 0 i lt 100 i Oublier les parenth ses quand on appelle une fonction sans param tre int f int i f Vouloir affecter un tableau un autre int s 4 1 2 3 4 t 4 t s 5 1 R visions 5 Les structures 5 1 2 Erreurs originales L le d butant ne se trompe plus il invente carr ment avec sans doute le fol espoir que a existe peut tre Souvent non seulement a n existe pas mais en plus a ne colle ni aux grands principes de la syntaxe du C ni m me ce qu un compilateur peut comprendre Deux exemples M langer la syntaxe si peu void set int t 5 int s 5 Jusque l tout va bien set int s 5 La c est quand m me n importe quoi alors qu il suffit d un set s Vouloir faire plusieurs choses la fois ou ne pas comprendre qu un programme est une suite d instructions ex cuter l une apr s l autre et non pas une for mule Par exemple croire que le for est un symbole math matique comme gt ou J Ainsi pour ex cuter une instruction quand tous les ok i sont vrais on a d j vu tenter un if for int i 0 i lt n i ok i Du grand
168. es doubles guillemets sont eux r serv s aux cha nes de caract res ll Enfin les bool ens sont des variables qui valent vrai true ou faux false Voici pour information quelques types suppl mentaires float y 1 2f Nombre r el simple pr cision unsigned int j 4 Entier naturel signed char d 128 Entier relatif un octet unsigned char d 254 Entier naturel un octet complex lt double gt z 2 3 Nombre complexe o l on trouve les float nombres r els moins pr cis mais plus courts que les double ici sur 4 octets Les curieux pourront explorer la documentation de Visual et voir que 11 Attention l utilisation des string n cessite un include lt string gt au d but du programme 34 3 Premiers programmes 3 1 Tout dans le main les float valent au plus FLT _ MAX ici environ 3 4e 38 1 et que leur valeur la plus petite strictement positive est FLT _ MIN ici environ 1 2e 38 de m me que pour les double les constantes DBL _MAX et DBL _MIN valent ici environ 1 8e 308 et 2 2e 308 les unsigned int entiers positifs utilis s pour aller plus loin que les int dans les positifs de 0 UINT_MAX soit 4294967295 dans notre cas les unsigned char qui vont de 0 255 les signed char qui vont de 128 127 et enfin les nombres complexes 3 1 2 Tests Tests simples Les tests servent ex cuter telle ou telle instruction en fonction de la va
169. es et break Nous avons d j rencontr la section 8 4 l instruction continue qui saute la fin d une boucle et passe au tour d apr s Tr s utile aussi la commande break sort de la boucle en ignorant tout ce qu il restait y faire Ainsi le programme bool arreter false for int i 0 i lt N amp amp larreter i A if B arreter true else C if D arreter true else E 179 12 5 Variables statiques 12 Fonctions et classes param tr es templates devient de facon plus lisible et plus naturelle for int i 0 iN i if B break if D break Questions r currentes des d butants 1 break ne sort pas d un if if d if break NON Ne sort pas du if mais ventuellement d un for qui serait autour 2 break ne sort que de la boucle courante pas des boucles autour for int i 0 iN i for int j 0 j M j if break termine la boucle en j et passe donc en ligne 10 pas en ligne 12 3 break et continue marchent videmment avec while et do while de la m me fa on qu avec for 12 5 Variables statiques Il arrive souvent qu on utilise une variable globale pour m moriser de fa on per manente une valeur qui n int resse qu une seule fonction Fonction random qui appelle srand toute seule au premier appel bool first true double random if first 180 12 Fonctions et classes para
170. es et duel Un d but de jeu de Yam s struct Tirage int de 5 champ de type tableau Tirage lancer Tirage t for int i 0 i lt 5 i t de i 1 rand 6 Un d de 1 6 return t Tirage t t lancer Attention tout comme pour les tableaux la syntaxe utilis e pour l initialisation ne marche pas pour une affectation Point P P 1 2 7 Erreur D ailleurs r p tons le Tout ce qui n a pas t annonc comme possible est impossible 5 3 R cr ation TP Nous pouvons maintenant aller faire le TP de l annexe A 4 afin de mieux com prendre les structures Nous ferons m me des tableaux de structures Nous obtien drons un projectile naviguant au milieu des toiles puis un duel dans l espace figure HE 4 La situation s am liorera avec les objets 5 Coin des coll giens il y a dans ce TP des math matiques et de la physique pour tudiant de l enseignement sup rieur mais on peut tres bien faire les programmes en ignorant tout ca 73 5 4 Fiche de r f rence 5 Les structures 5 4 Fiche de r f rence Encore une fois nous compl tons en rouge la fiche de r f rence avec ce qui a t vu pendant ce chapitre et son TP Fiche de r f rence 1 2 Variables D finition int iy int k 1 m Affectation i 2 j i k 1 3 Initialisation int n 5 o n Constantes const int s 12 Port e inti
171. et l arc cosinus acos 3 On r alise ensuite que les variables enti res qui stockent positions et vitesses font que les erreurs d arrondis s accumulent et que les vitesses deviennent nulles On bascule alors toutes les variables concern es en double en pensant bien les reconvertir en int lors de l affichage ligne 37 Le tout donne un programme bien plus anim On ne peut videmment constater la diff rence sur une figure dans un livre T l chargez donc le programme sur la page du cours EST EL ARIANE AAA AAA A Position et vitesse aleatoire void InitBalle double x double amp y double amp u double v Color amp c x Random ball_size width ball_size y Random ball_size height ball_size u Random 0 4 v Random 0 4 61 4 4 R cr ations 4 Les tableaux c Color byte Random 0 255 byte Random 0 255 byte Random 0 255 11 1 1 1 1 1 111 1 1 1 1 1 11 Affichage d une balle void DessineBalle double x double y Color col fillRect int x ball_size int y ball_size 2xball_size 1 2xball_size 1 col 11 1 1 1 1 1 1 1 11 11 1111 11 11 Choc elastique de deux balles spheriques cf labo ntic org include lt cmath gt void ChocBalles double amp x1 double amp y1 double amp u1 double amp v1 double amp x2 double amp y2 double amp u2 double amp v2 Distance double o02o01x x1 x2 0201y y1 y2 double d sqrt 0201xx020o1x 020o1y o02o01
172. et le num ro de ligne o elle se trouve offre la possibilit de debugger le programme etc Elle ne ralentit pas les programmes car elle dispara t la compilation en mode Release C est une fonction peu connue des d butants et c est bien dommage Par exemple include lt cassert gt int n cin gt gt n assert n gt 0 int t new int n Allocation Si l utilisateur entre une valeur n gative les cons quences pourraient tre f cheuses En particulier une valeur n gative de n serait interpr t e comme un grand entier car le attend un entier non sign ainsi 1 serait compris comme le plus grand int possible et le new serait probablement un chec A noter que si n 0 un tableau nul l allocation marche Mais dans ce cas t 0 n existe m me pas La seule chose qu on peut donc faire avec un tableau nul c est le d sallouer avec delete t Il est toujours utile de se pr munir contre une telle exception en v rifiant que la valeur est raisonnable 7 7 Examens sur machine Nous vous conseillons aussi de vous confronter aux examens propos s en annexe Vous avez toutes les connaissances n cessaires 99 7 8 Fiche de r f rence 7 La m moire 7 8 Fiche de r f rence Fiche de r f rence 1 2 Variables D finition int i int k 1 m Affectation i 2 j i k 1 3 Initialisation int n 5 0o n Constantes const int s 12 Port e int i i j int
173. et m me dans la plu part des logiciels modernes Et puis consid r comme le jeune donc le moins allergique aux ordinateurs il se verra vraisemblablement confier son premier poste la r alisation de quelques petits programmes en plus de ses attributions normales s arrange un peu trop facilement d un m pris de bon ton pour la program mation Il lui est plus ais d apprendre une n i me branche des math ma tiques que de faire l effort d acqu rir par la pratique une nouvelle tournure d esprit On l aura compris il est la fois facile et difficile d apprendre programmer Pour l ing nieur cela demandera de la motivation et un peu d effort essentiellement de mettre ses maths de c t et de retrouver le go t des choses basiques Pour un coll gien motivation et go t de l effort seront au rendez vous Il lui restera malgr tout acqu rir quelques bases d arithm tique et de g om trie Comme annonc par le titre de ce cours coll gien et ing nieur en sont au m me point pour l apprentissage de la programmation De plus et c est un ph nom ne relativement nouveau il en est de m me pour le d butant et le geek Expliquons nous le passionn d informatique a aujourd hui tellement de choses faire avec son ordinateur qu il sera en g n ral in collable sur les jeux internet les logiciels graphiques ou musicaux l installation ou la configuration de son syst me l achat du dernier gadget USB
174. et voir que F5 red marre le programme jus qu au prochain point d arr t rencontr 8 Ajouter i max k avant le return Utiliser Step into ou F11 ou le bouton correspondant quand le curseur est sur cette ligne Constater la diff rence avec F10 193 A 1 L environnement de programmation A Travaux Pratiques Y Disassembler main EssaiQtCreator Qt Creator File Edit Build Debug Analyze Tools Window Help Pro S Y CE 4 Disassembler main Line 27 Col 1 sad Name Value ES EssaiqtCreator Ox400af3 lt 0x0035 gt movl 0x1 0x8 rbp i CMakeLists Ext 13 c 3 a b b co main cpp Ox400afa lt 0x003c gt mov Oxc rbp edx Si Ox400afd lt 0x003f gt mov Sedx seax Ox400aff lt 0x0041 gt add eax eax E Ox400b01 lt 0x0043 gt add Seax sedx Bou Ox400b03 lt 0x0045 gt mov Ox8 rbp eax Ox400b06 lt 0x0048 gt add edx eax Ox400b08 lt 0x004a gt mov eax 0x4 rbp 14 return 0 Ox400b0b lt 0x004d gt mov 0x0 eax G O x Projects Analyze 0x400b10 lt 0x0052 gt leaveq Ox400b11 lt 0x0053 gt retq Essai eator CZ SZ 52 E Threads 1 EssaiQtCreator Stopped end stepping range If Function File Name Value Base 16 A main main cpp rax 7 Default a m o Open Docu FE rex TFFFF77Fc870 6 Disassembler main rdx m P rsi 7FFFF7ad19e0 rdi 1 rbp 7TFFFFFFFe210 rsp 7FFFFFFFe200 Breakpoints Registers J issues JE EJ Applicatio MEA Compile o J
175. ete t manque NON void int a 2 1nt D void f int aint b 0 void f int 4 5 NONI Ne pas tout mettre inline int E f 3 HORREUR inte F 10 i return 1 f 3 NON Imagine Voir documentation 170 12 Fonctions et classes param tr es templates Chapitre 12 Fonctions et classes param tr es templates Nous continuons dans ce chapitre un inventaire de diverses choses utiles Parmi elles les structures de donn es de la STL Standard Template Library n cessiteront la compr hension des template Nous aborderons donc cet aspect int ressant du C 12 1 template 12 1 1 Principe Consid rons la fonction classique pour changer deux variables void echange int amp a int amp b int tmp tmp a a b b tmp int i j echange i j Si nous devions maintenant changer deux variables de type double il faudrait r crire une autre fonction echange identique aux d finitions de type pr s Heureuse ment le C offre la possibilit de d finir une fonction avec un type g n rique un peu comme un type variable que le compilateur devra instancier au moment de l appel de la fonction en un type pr cis Cette programmation g n rique se fait en d finissant un template Echange deux variables de n importe quel type T template lt typename T gt void echange T amp a T amp b T tmp tmp a 12 1 templa
176. firm qui trouve en g n ral dans cet environnement des outils puissants mais c est encore plus crucial pour le d butant Un environnement de programmation c est Toutes les tapes de la programmation regroup es en un seul outil de fa on co h rente Editer ses fichiers les transformer en programme passer en revue ses erreurs d tecter les bugs parcourir la documentation etc tout cela avec un seul outil ergonomique Diff rents environnements de d veloppement peuvent tre choisis L environnement de r f rence sous Windows est celui de Microsoft Visual Studio qui existe en ver sion gratuite Express C est probablement l un des meilleurs logiciels issus de la firme de Redmond Sous Linux conseillons KDevelop et sous Mac XCode L inconv nient est qu ils n ont pas par d faut les m mes raccourcis clavier que Visual Certains fonc tionnent sous toutes les plates formes Linux Windows Mac en particulier QtCrea tor L avantage de ce dernier est qu il utilise par d faut les m mes raccourcis clavier que Visual Studio mais qu il comprend en plus le format CMake dont nous reparle rons dans les TP Son interface est fortement inspir e de KDevelop et XCode Comme pour le choix du langage le choix de l environnement n est pas limitant et en conna tre un permet de s adapter facilement n importe quel autre Le reste de ce poly est orient vers QtCreator Notons qu il est facile d installation sur toutes
177. glais 7 4 1 Limites La pile est limit e en taille La pile d appel n tant pas infinie et les variables locales n tant pas en nombre illimit il est raisonnable de r server une pile de relativement petite taille Essayez donc le programme int main const int n 500000 int tIn Il s ex cute avec une erreur stack overflow La variable locale t n est pas trop grande pour l ordinateur elle est trop grande pour tenir dans la pile Jusqu pr sent on savait qu on tait limit aux tableaux de taille constante En r alit on est aussi limit aux petits tableaux Il est donc grand temps d apprendre utiliser le tas 12 500000x4 soit 2Mo seulement 96 NI O1 amp ND ND N ND N N NE Hi mA Hi Hi Hi Hi pap pa O1 NN A O NI ON O1 NN A 7 La m moire 7 4 Le tas 7 4 2 Tableaux de taille variable Nous fournissons ici une r gle appliquer en aveugle Sa compr hension viendra plus tard si n cessaire Lorsqu on veut utiliser un tableau de taille variable il n y a que deux choses faire mais elle sont essentielles toutes les deux 1 Remplacerint t n parintx t new int n ou l quivalent pour un autre type que int 2 Lorsque le tableau doit mourir en g n ral en fin de fonction rajouter la ligne delete t Le non respect de la r gle 2 fait que le tableau reste en m moire jusqu la fin du pro gramme ce qui entraine en
178. h II j dj lt 0 dj dj Rebond vertical si on sort int nj j dj fillRect i j 4 4 WHITE Effacement i ni On change de position j nj endGraphics return 0 Notez ce endGraphics dont la fonction est d attendre un clic de l utilisateur avant de terminer le programme de mani re laisser la fen tre visible le temps n cessaire Cette fonction n est pas standard et elle est dans le namespace Imagine La ligne 2 40 3 Premiers programmes 3 2 Fonctions E WinLib FIGURE 3 1 Traits et cercles au hasard permet de l appeler sans utiliser son nom complet Imagine endGraphics Les autres fonctions appel es dans ce petit programme openWindow fillRect et milliSleep sont aussi fournies par Imagine 3 2 Fonctions Lorsqu on met tout dans le main on r alise tr s vite que l on fait souvent des copier coller de bouts de programmes Si des lignes de programmes commencent se ressembler c est qu on est vraisemblablement devant l occasion de faire des fonctions On le fait pour des raisons de clart mais aussi pour faire des conomies de frappe au clavier Il faut regrouper les passages identiques en fonctions pour obtenir un programme clair et pour moins se fatiguer Attention bien comprendre quand faire une fonction et ne pas simple ment d couper un programme en petits morceaux sans aucune logique a ou juste pour faire plaisir au professeur Mal d
179. h_front 3 l 3 2 l push_back 4 l 3 2 4 l push_front 5 1 5 3 2 4 l push_front 2 2 5 3 2 4 Pour d signer un emplacement dans une liste on utilise un it rateur Pour d signer un emplacement en lecture seulement on utilise un t rateur constant Le sert ensuite acc der l l ment situ l emplacement d sign par l it rateur Seule difficult le type de ces it rateurs est un peu compliqu taper 2 Nous n avons pas vu comment d finir de nouveaux types cach s dans des classes C est ce qui est fait ici 176 12 Fonctions et classes param tr es templates 12 1 template list lt int gt const_iterator it it l begin Pointe vers le d but de la liste cout lt lt xit lt lt endl affiche 2 it l find 3 Pointe vers l endroit ou se trouve le premier 3 if it 1 end cout lt lt 3 est dans la liste lt lt endl list lt int gt iterator it2 it2 1 find 3 Pointe vers l endroit ou se trouve le premier 3 it 6 maintenant l 2 5 6 2 4 Les it rateurs servent galement parcourir les listes d o leur nom Parcourt et affiche une liste template lt typename T gt void affiche list lt T gt 1 cout lt lt for list lt T gt const_iterator it l begin it l end it cout lt lt xit lt lt cout lt lt lt lt endl Ly 4 Remplace a par b dans
180. i f NON double x 1 3 NON int i j x 1 3 NON x double 1 3 NON double x 10 y 10 for int gt y i 2 x 1 5 NON int n 5 int tin NON int 4 1 NON int t 4 return t NON p nt t 41 t int s 3 1 2 3 t 131 t s NON int tl 215 t 1 2 fl NON struct Point double x y NON Point a a 1 2 NON include tp cpp NON int f int t 1 NON int t 2 31 NON t i j NON intx tj t 1 NON int t new int 2 int s new int 2 s t On perd s deletel t delete s D j fait int xt s s est int non intx t new int n y s new int n NON class vec int Xx y public vec a 2 3 NON vec v vec 1 2 NON vec v 1 2 OUI obj t new obj n delete t manque NON void f int a 2 int b void f int a int b 0 void f int a NON Ne pas tout mettre inline int f 3 HORREUR inte int 1 return 1 f 3 NON if i gt 0 amp i lt n NON if 1 lt 0 i gt n NON LE ass LE isa break Non boucles seulement for i for J sus ME Coro break NON quitte juste boucle j int i double x J max 1 0 OK y max x 0 NON 77 0 0 t n n 0 max est un template STL Imagine Voir docume
181. id rer comme des erreurs A 1 3 Debugger Savoir utiliser le debuggeur est essentiel Il doit s agir du premier r flexe en pr sence d un programme incorrect C est un v ritable moyen d investiga tion plus simple et plus puissant que de truffer son programme d instruc tions suppl mentaires destin es espionner son d roulement 1 Taper le main suivant int main int i j k 1 2 j 3xi if j 5 k 3 else k 2 return 0 2 Pour pouvoir utiliser le debuggeur avec QtCreator ou Kdevelop il faut compiler en mode Debug Cela se fait en modifiant une variable de Cmake Sous QtCreator aller dans l onglet Projects et ajouter comme argument DCMAKE_BUILD TYPE Debug Cela crit dans le fichier CMakeCache txt g n r par Cmake 3 Lancer le programme sous le debuggeur avec Build Start ou F5 ou le bou ton correspondant Que se passe t il 4 Placer un point d arr t en cliquant dans la colonne de gauche la hauteur de la ligne i 2 puis relancer le debuggeur 5 Avancer en Step over avec F10 ou le bouton correspondant et suivre les va leurs des variables dans la fen tre sp ciale ou en placant sans cliquer la souris sur la variable 6 A tout moment on peut interrompre l ex cution avec Stop ou Maj F5 Arr ter l ex cution avant d atteindre la fin de main sous peine de partir dans la fonction qui a appel main 7 Placer un deuxi me point d arr t
182. idemment une instruction pr cise C est tout de suite moins compr hensible Notons que chaque micro processeur son jeu d instructions ce qui veut dire que la tra duction de c 3xa 2xb en la suite de nombres 8B45F86BC0038B4DEC8D14488955E0 est propre au Pentium que nous avons utilis pour notre exemple Une fois traduit en langage machine pour un micro processeur donn un programme C n a de sens que pour ce micro processeur Remarquons aussi que les concepteurs du Pentium ont d cid de cr er une instruction sp cifique pour calculer edx eax ecxx2 en une seule fois car elle est tr s fr quente Si on avait demand c 3xa 3xb notre programme serait devenu 00415A61 8B 45 F8 mov eax dword ptr a 00415A64 6B CO 03 imul eax eax 3 00415A67 8B 4D EC mov ecx dword ptr b 00415A6A 6B C9 03 imul ecx ecx 3 00415A6D 03 C1 add eax ecx 00415A6F 89 45 EO mov dword ptr c eax 15 Nombres un peu bizarres certes puisqu il contiennent des lettres Patience jeune Padawan Nous en reparlons aussi tout de suite 16 Et pourtant les informaticiens programmaient comme cela il n y a pas si longtemps C tait d j tr s bien par rapport l poque ant rieure o il fallait programmer en base 2 et beaucoup moins bien que lorsqu on a pu enfin programmer en assembleur 18 2 Bonjour Monde 2 1 L ordinateur car lea edx eaxtecxx3 n existe pas Mais revenons nos nombres
183. igned int j 4 igned char d 128 nsigned char d 25 complex lt double gt TAZAS Variables globales TRE D const int m 12 void f n 10 int i m OK OK Conversion int i int x j float x float i Pile Tas Type num r enum Dir N E S W void avance Dir d Tests Comparaison Le gt N gation Combinaisons amp amp if i 0 j l if i 0 j 1 else j 2 WU bool t 1 0 Ef E j 1 switch i case 1 er 7 break case 2 case 3 7 break default r Conseils Nettoyer en quittant Frreurs et warnings cliquer Indenter Ne pas laisser de warning Utiliser le debuggeur Faire des fonctions Tableaux pas pour transcrire une formule math matique Faire des structures Faire des fichiers s par s Le h doit suffire l utilisa teur qui ne doit pas regarder le cpp Ne pas abuser du r cursif Ne pas oublier delete Compiler r guli rement include lt cassert gt assert x 0 y 1 x Faire des objets Ne pas toujours faire des ob jets Penser interface impl men tation utilisation 167 11 7 Fiche de r f rence 11 Cha nes de caract res fichiers Fiche de r f rence 2 4 Fonctions D finition int plus int a int b int c a b ret
184. il for En param tre void init int t 4 1 for int i 0 i lt 4 i t i 0 void init int t int n i 0 i lt n i 0 for int t i Taille variable intx t new int n deletel t En param tre suite void f intx t int n t i void alloue intx x8 t 1 t new int n 2D int A 2 31 A il 3 1 5 int A 2 3 1 273 Fr Arare 7 void f int A 21 2 2D dans 1D int A 2x x3 A i 2x3 5 Taille variable suite Int E sm Compilation s par e include vect h aussi dans vect cpp Fonctions d clarations dans le h d finitions dans le Cpp Types d finitions dans le h Ne d clarer dans le h que les fonctions utiles pragma once au d but du fichier Ne pas trop d couper 168 11 Cha nes de caract res fichiers 11 7 Fiche de r f rence Fiche de r f rence 3 4 Objets struct obj int x champ int f m thode int g int y y int ObJ E int i g 3 mon g int j x i mon x return j int main obj a a x 3 int i a f class obj int x y void a moi public ine z void pour _tous void autre obj A void obj a_moi E OK Yi OK Sd OK void obj pour_tous OK OK X 2 a_moi void autre obj A X A X OK A a_moi OK int main obj A
185. ine En section A 4 2 sont d crites quelques unes des fonctions utiliser et en A 4 3 leur justification physique A 4 1 Etapes Mouvement de translation 1 Pour commencer tudier le projet T l charger le fichier TP4 zip sur la page habituelle le d compresser et lancer votre environnement de d veloppement Parcourir le projet en s attardant sur les variables globales et la fonction main inutile de regarder le contenu des fonc tions d j d finies mais non utilis es Le programme fait voluer un point x y selon un mouvement de translation constante vx vy et affiche r gulierement un disque centr en ce point Pour ce faire afin de l effacer on retient la position du disque au dernier affichage dans ox et oy par ailleurs deux instructions commen ant par NoRefresh sont plac es autour des instructions graphiques afin d acc l rer l affichage 2 Utiliser une structure Modifier le programme de fa on utiliser une structure Balle renfermant toute l information sur le disque position vitesse rayon couleur 3 Fonctions d affichage Cr er et utiliser une fonction void AfficheBalle Balle D affichant le disque D et une autre void EffaceBalle Balle D l effacant 4 Faire bouger proprement le disque Pour faire voluer la position du disque remplacer les instructions correspon dantes d j pr sentes dans main par un appel une fonction qui modifie les coordonn es d une Balle en leur ajo
186. int b int c a b return c void affiche int a cout lt lt a lt lt endl D claration int plus int a int b Retour int signe double x 1f x lt 0 return 1 if x gt 0 return 1 return 0 void afficher int x int y if x lt 0 y lt 0 return if x gt w y gt h return DrawPoint x y RED Appel int f int a int g f int i f 2 j g R f rences void swap inte a int amp b int tmp a a b b tmp int x 3 y 2 swap x y Surcharge int hasard int n int hasard int a int b double hasard 66 4 Les tableaux 4 6 Fiche de r f rence Fiche de r f rence 2 2 Divers itt j 3 j i n Modulo include lt cstdlib gt i rand n x rand double RAND_MAX include lt ctime gt Un seul appel srand unsigned int time 0 include lt cmath gt double double double double tinclude lt string gt using namespace std string s hop char c s 0 int l s size sqrt double x cos double x sin double x acos double x Entr es Sorties include lt iostream gt using namespace std cout lt lt I lt lt i lt lt endl cin gt gt i gt gt j Erreurs fr quentes Pas de d finition de fonction dans une fonction int q r 4 NON if i 2 N
187. int i double pi M_ Pl t l1 1 NON db Op rateurs binaires D AL j max i 0 OK and a amp b t 1 NON y max x 0 NON or alb int t new int 2 1 0 0 et non 0 max xor ab int s new int 2 est un template STL right shift a gt gt n s t On perd s left shift a lt lt n deletel t Anne complement a delete s D j fait Voir documentation 232
188. ipes de la compilation sont une des mati res de base de l informatique traditionnelle et tres formatrice Quand on sait programmer un compilateur on sait tout programmer Evidemment un compilateur est un programme On le programme avec le compilateur pr c dent M me chose pour les syst mes d exploitation Elle n cessite un cours part enti re et nous n en parlerons pas ici 45 Une biblioth que est en fait un ensemble de fichiers objets pr existants regroup s en un seul fi chier Il peut s agir de la biblioth que des fonctions faisant partie de C appel e biblioth que standard mais aussi d une biblioth que suppl mentaire fournie par un tiers 24 2 Bonjour Monde 2 4 L environnement de programmation 24 L environnement de programmation L environnement de programmation est le logiciel permettant de programmer Dans notre cas il s agit de QtCreator Dans d autres cas il peut simplement s agir d un ensemble de programmes Un environnement contient au minimum un diteur pour cr er les fichiers sources un compilateur linker pour cr er les ex cutables un debuggeur pour traquer les erreurs de programmation et un gestionnaire de projet pour g rer les diff rents fichiers sources et ex cutables avec lesquels on travaille Nous reportons ici le lecteur au texte du premier TP En plus de quelques notions rudimentaires de C que nous verrons au chapitre suivant quelques informations suppl mentaires son
189. ire ET sur des entiers Il est d fini ainsi effectuer a amp b revient consid rer l criture de a et de b en binaire puis effectuer un ET bit par bit avec la table 1 amp 1 donne 1 1 amp 0 0 amp 1 et 0 amp 0 donnent 0 Par exemple 13 amp 10 vaut 8 car en binaire 1101 amp 1010 vaut 1000 Il existe ainsi toute une panoplie d op rateurs binaires symbole utilisation nom r sultat exemple amp a amp b et 1 amp 1 1 0 sinon 13610 8 alb ou 010 0 1 sinon 13110 15 A ab ou exclusif 110 011 1 0 sinon 13110 7 gt gt a gt gt n d calage d cale les bits de a n fois vers la 13 gt gt 2 3 droite droite et comble gauche avec des 0 les n premiers de droite sont perdus lt lt a lt lt n d calage d cale les bits de a n fois vers la 5 lt lt 2 20 gauche gauche et comble droite avec des 0 a compl ment 1 0 0 1 13 14 Remarques Ces instructions sont particuli rement rapides car simples pour le processeur Le fait que a b existe est aussi source de bugs il ne s agit pas de la fonction puissance Le r sultat de d pend en fait du type si par exemple i est un entier non sign sur 8 bits valant 13 alors i vaut 242 car 00001101 vaut 11110010 En pratique tout cela ne sert pas faire joli ou savant mais manipuler les nombres bit par bit Ainsi il arrive souvent qu on utilise un int pour m moriser un certain nombre de propri t
190. ironment variable IMAGINEPP_ROOT S endif set CMAKE_MODULE_PATH S CMAKE MODULE PATH S d CMake find_package Imagine project Balle add_executable Balle Balle cpp ImagineUseModules Balle Graphics La deuxi me ligne cherche lire la variable du syst me dite variable d environne ment IMAGINEPP_ROOT La valeur de cette variable doit tre le chemin absolu du dossier d intallation d Imagine comme par exemple usr share Imagine Une v rification est faite que ce dossier existe bien sinon on affiche le message d erreur et on indique la valeur de la variable Le message d erreur le plus courant est Error environment variable IMAGINEPP_ROOT Comme rien ne s affiche apr s le c est que la variable IMAGINEPP_ROOT n existe probablement pas On ajoute le sous dossier CMake qui indique o chercher pour le find_package Cette commande va charger le fichier usr share Imagine CMake FindImagine cmake quit contient des commandes CMake dont ImagineUseModules Cette derni re fait deux choses Indique o chercher lors des include comme par exemple dans le dossier usr share Imagine include 224 B Imagine B 5 Installation Ainsi l instruction include Imagine Graphics h inclura le fichier usr share Imagine include Imagine Graphics h Indique qu i
191. it une imprimante pour communiquer avec l homme ce qui tait relativement peu interactif 2 Entendons par l des instructions que nous n expliquons pas pour l instant Il n y a mal heureusement rien de magique dans la programmation 3 On dit aussi retourne A qui renvoie t elle cet entier Mais celui qui l a appel e voyons 4 Voil maintenant vous savez qui appelle main Dans un programme les fonctions s appellent les unes les autres Mais main n est appel e par personne puisque c est la premi re de toutes Du moins en apparence car en r alit le programme a plein de choses faire avant d arriver dans main et il commence par plusieurs autres fonctions que le programmeur n a pas conna tre et qui finissent par appeler main D ailleurs si personne ne l appelait qui main retournerait elle un entier 2 Bonjour Monde programme est lanc D limit e par les accolades ligne 5 et ligne 8 la fonction main se termine ligne 7 par return 0 qui lui ordonne de retourner l entier 0 Notons au passage que toutes les instructions se terminent par un point virgule Enfin la ligne 6 seule ligne int ressante cout lt lt Hello World lt lt endl affiche gr ce la variable cout qui correspond la sortie console des donn es s par es par des lt lt La premi re de ces donn es est la cha ne de caract res Hello World La deuxi me endl est un retour
192. izontale ub quand la balle va toucher les bords gauche ou droit de la fen tre 5 Variables globales Doubler la hauteur de la fen tre Modifier la taille de la balle Cela n cessite de modifier le code plusieurs endroits Aussi la place de valeurs num riques en dur il vaut mieux d finir des variables Afin de simplifier et bien que a ne soit pas toujours conseill utiliser des variables globales constantes Pour cela ins rer tout de suite apr s les deux lignes d include le code suivant const int width 256 Largeur de la fenetre const int height 256 Hauteur de la fenetre const int ball_size 3 Rayon de la balle et reformuler les valeurs num riques du programmes l aide de ces variables Le mot cl const indique que ces variables ne peuvent tre modifi es apres leur initialisation Essayer de rajouter la ligne width 300 au d but de la fonction main et constater que cela provoque une erreur de compilation 6 Utilisation de fonctions La balle est dessin e deux fois au cours de la boucle la premiere fois en rouge et la deuxi me fois en blanc pour l effacer Ici le dessin de la balle ne n cessite qu une ligne mais cela pourrait tre beaucoup plus si sa forme tait plus com plexe Aussi pour que le programme soit mieux structur et plus lisible et que le code comporte le moins possible de duplications regrouper l affichage de la balle et son effacement dans une fonction DessineBalle d
193. l autre les diff rentes instructions ainsi rassembl es 20 Toujours pour les curieux il s arr te pour i 39 et j 43 38 I O1 B ND I O1 B NN 3 Premiers programmes 3 1 Tout dans le main 3 1 4 R cr ations Nous pouvons d j faire de nombreux programmes Par exemple jouer au juste prix Le programme choisit le prix et l utilisateur devine include lt iostream gt include lt cstdlib gt using namespace std int main int n rand 100 nombre deviner entre O et 99 int i do cout lt lt Votre prix cin gt gt i if in cout lt lt C est moins lt lt endl else if i lt n cout lt lt C est plus lt lt endl else cout lt lt Gagne lt lt endl while i n return 0 Seule la ligne 7 a besoin d explications la fonction rand fournit un nombre entier au hasard entre 0 et RAND_MAX On a besoin de rajouter include lt cstdlib gt pour l utiliser est la fonction modulo C est videmment plus int ressant quand c est le programme qui devine Pour cela il va proc der par dichotomie afin de trouver au plus vite include lt iostream gt using namespace std int main cout lt lt Choisissez un nombre entre 1 et_100 lt lt endl 1 cout lt lt Repondez par ou lt lt endl int a 1 b 100 Valeurs extr mes bool trouve false do int c a b 2 On propose le
194. l clone im1 10 10 CYAN N affecte pas im2 Ainsi si on passe une image comme param tre d une fonction puisque c est le constructeur par copie qui est appel tout se passe comme si on avait pass par r f rence void f Image lt Color gt im Passage par valeur im 10 10 CYAN f iml Modifie quand m me le pixel 10 10 Une erreur courante est de chercher lire ou crire des coordonn es au del des bornes du tableau typiquement une erreur dans un indice de boucle B 4 LinAlg Le module LinAlg propose l alg bre lin aire avec des classes matrice et vecteur 223 B 5 Installation B Imagine Matrix lt float gt 1 2 2 Taille 2x2 1 fil1 0 0f Matrice nulle 1 0 0 1 1 1 1 0f Matrice identit cout lt lt det I lt lt det I lt lt endl D terminant Les op rateurs d addition matrice matrice vecteur vecteur soustraction matrice matrice vecteur vecteur et multiplication matrice matrice matrice vecteur sont bien s r d finis Comme pour les images attention de ne pas sortir des bornes en acc dant aux l ments des matrices et vecteurs Une fonction tr s utile est 1inSolve pour r soudre un syst me lin aire B 5 Installation Examinons le fichier CMakeLists txt d un programme utilisant Imagine cmake_ minimum _ required VERSION 2 6 file TO_CMAKE_PATH M MSENV IMAGINEPP ROOT d if NOT EXISTS S d message FATAL ERROR Error env
195. l faut lier la biblioth que 1ibImageGraphics a lors de l dition de liens link elle se trouve dans usr share Imagine 1lib 225 C Fiche de r f rence finale C Fiche de r f rence finale Annexe C Fiche de r f rence finale Fiche de r f rence 1 5 Variables D finition int is int k 1 m Affectation i 2 J 1 k 1 3 Initialisation int n 5 o n Constantes const int s 12 Port e int i 1 i j int 3 2 i j OK if j gt 1 1 int k 3 OK interdit j k i k Types int i 3 double x 12 3 char c A string s hop bool t true float y 1 2f unsigned int 3 4 signed char d 128 unsigned char d 25 complex lt double gt ZA 2 3 interdit Variables globales int n const int m 12 void n 10 OK int i m OK Conversion int i int x j float x float i Pile Tas Type num r enum Dir N E S W void avance Dir dj Variables statiques int f static bool once truej if once once false Tests Comparaison d lt gt lt gt N gation Combinaisons amp amp if i 0 j 1 if i 0 j 1 else j 2 if i 0 j 1 k 2 bool t i 0 if t j 1 switch i case 1 break case 2 case 3 7 break default F mx x gt y x y Boucles
196. la mode etc mais qu en contrepartie il sera mauvais programmeur Il y a quelques ann es il y avait peu faire avec son ordinateur sinon programmer Programmer pour combler le manque de possibilit s de l ordinateur Aujourd hui faire le tour de toutes les possibilit s d un ordinateur est une occupation plein temps Ainsi le fana info passe t il sa jour n e se tenir au courant des nouveaux logiciels et en oublie qu il pourrait lui aussi 7 C est une erreur fr quente de croire qu il int ressera ses l ves en leur faisant faire des pro grammes centr s sur les math matiques ou le calcul scientifique De tels programmes leur seront peut tre utiles plus tard mais ne sont pas forc ment motivants L algebre lin aire ou l analyse num rique sont des domaines passionnants tudier mais certainement pas programmer Il faut admettre sans complexe que programmer un flipper un master mind ou un labyrinthe 3D est tout aussi formateur et plus motivant qu inverser une matrice creuse 8 La liste est longue mais tellement vraie quel cours de programmation ne rab che pas les c l bres factorielle suites de Fibonacci Quick Sort etc 9 Savoir programmer ne sert pas seulement faire du C ou du Java ni m me du Scilab du Matlab ou du Maple une utilisation avanc e d Excel ou du Word demande parfois de la programmation 10 Une r compense qui me trouve un substitut satisfaisant cette expression co
197. lair un texte 9 Ce qui signifie que la suite de l affichage sur la console se fera sur une nouvelle ligne 16 2 Bonjour Monde 2 1 L ordinateur Chapitre 2 deuxi me essai Comment a marche Le probl me avec le programme pr c dent est qu il est tr s loin de ce qu un ordi nateur sait faire naturellement En fait un ordinateur ne sait pas faire de C Il ne sait que calculer 1 transformer des nombres en autres nombres Bien que peu compr hensible pour le d butant un programme en C se veut le plus proche possible de l Homme tout en restant videmment accessible la machine Le C est un lan gage tres complet peut tre m me trop Il peut tre relativement proche de la machine si n cessaire et au contraire de haut niveau quand il le faut La largeur de son spectre est une des raisons de son succ s C est aussi ce qui fait que son apprentissage complet demande un long travail et nous ne verrons ici qu un partie restreinte du C 2 1 L ordinateur Pour savoir ce qu un ordinateur sait vraiment faire il faut commencer par son or gane principal le micro processeur 2 1 1 Le micro processeur 2 3 Quel qu il soit et quelle que soit sa vitesse un micro processeur ne sait faire que des choses relativement basiques Sans tre exhaustif retenons juste ceci Il sait ex cuter une suite ordonn e d instructions Il poss de un petit nombre de m moires internes appel es registr
198. le Modulo de lt cstdl ib gt le RAND_MAX de lt ctime gt seul appel unsigned int time 0 de lt cmath gt sqrt double x cos double x Xx sin double x acos double de lt string gt namespace std s hop s 0 s size de lt ctime gt le clock CKS_PER_SEC e _USE_MATH_DEFINE de lt cmath gt pi M_PI Imagine Voir documentation 130 9 Premiers objets 9 9 Fiche de r f rence Fiche de r f rence 4 4 Conseils Nettoyer en quittant Erreurs et warnings cliquer Indenter Ne pas laisser de warning Utiliser le debuggeur Faire des fonctions Tableaux pas pour transcrire une formule math matique Faire des structures Faire des fichiers s par s Le h doit suffire l utilisa teur qui ne doit pas regarder le cpp Ne pas abuser du r cursif Ne pas oublier delete Compiler r guli rement include lt cassert gt assert x 0 y 1 x Faire des objets Ne pas toujours faire des ob jets Penser interface impl men tation utilisation 131 10 Constructeurs et Destructeurs Chapitre 10 Constructeurs et Destructeurs Dans ce long chapitre nous allons voir comment le C offre la possibilit d intervenir sur ce qui se passe la naissance et la mort d un objet Ce m canisme essentiel repose su
199. le constructeur de copie Ceci dit en factorisant le travail faire dans quelques petites fonctions priv es la solution n est pas si compliqu e Nous vous la soumettons en bloc Elle peut m me servir de sch ma pour la plupart des objets similaires 3 Ne pas d sallouer provoque videmment des fuites de m moire D sallouer deux fois provoque dans certains cas une erreur C est le cas en mode Debug sous Visual ce qui aide rep rer les bugs 4 Il suffit de rajouter un test amp v this pour rep rer ce cas ce qui nous d passe un petit peu 5 Ceci n est que le premier pas vers une s rie de fa on de g rer les objets Doit on recopier les ta bleaux Les partager en faisant en sorte que le dernier utilisateur soit charg de d sallouer Etc etc 148 NI O1 B amp ND 10 Constructeurs et Destructeurs 10 11 Objets avec allocation dynamique include lt iostream gt using namespace std class vect champs int n double xt fonctions priv es void alloc int N void kill void copy const vect amp v public constructeurs obligatoires vect vect const vect amp v destructeur vect affectation const vect amp operator const vect amp v constructeurs suppl mentaires vect int N 3 void vect alloc int N n N if n 0 t new double n void vect kill if n 0 delete t void vect copy const vect v
200. les se pr sentent quand on apprend progressivement et sur un peu tous les sujets la fois Ainsi ce n est que dans un autre chapitre que nous verrons la fa on dont les fonctions m mo risent leurs variables dans la pile 3 1 Tout dans le main Rien dans les mains rien dans les poches mais tout dans le main Voici comment un d butant programme C est d j une tape importante que de programmer au kilom tre en pla ant l int gralit du programme dans la fonction main L essentiel est avant tout de faire un programme qui marche 3 1 1 Variables Types Les variables sont des m moires dans lesquelles sont stock es des valeurs ou don n es Une donn e ne pouvant tre stock e n importe comment il faut chaque fois d cider de la place prise en m moire nombre d octets et du format c est dire de la fa on dont les octets utilis s vont repr senter les valeurs prises par la variable Nous avons d j rencontr les int qui sont le plus souvent aujourd hui stock s sur quatre octets 1 La contre partie de cette pr sentation est que ce polycopi s il est fait pour tre lu dans l ordre est peut tre moins adapt servir de manuel de r f rence 2 Et bien des l ves d s que le professeur n est plus derri re NI O1 B amp ND Ra Hoi hi fi Hi ji SO O1 NN A 3 1 Tout dans le main 3 Premiers programmes soit 32 bits et pouvant
201. leur d une ou de plusieurs variables Ils sont toujours entre parenth ses Le et s crit amp amp le ou la n gation l galit la non galit et les in galit s gt gt lt et lt Si plusieurs instructions doivent tre ex cut es quand un test est vrai if ou faux else on utilise des accolades pour les regrouper Tout cela se comprend facilement sur l exemple suivant if i 0 i est il nul cout lt lt i est nul lt lt endl if i gt 2 i est il plus grand que 2 j 3 else j 5 Si on est ici c est que i lt 2 Cas plus compliqu if i 3 II j 2 amp amp k 3 II i gt j amp amp i gt k Ici i est diff rent de 3 ou alors j vaut 2 et k est diff rent de 3 ou alors on n a pas i plus grand a la fois de j et de k cout lt lt Une premi re instruction lt lt endl cout lt lt Une deuxi me instruction lt lt endl Les variables de type bool en servent m moriser le r sultat d un test bool t i 3 l j 4 if t k 5 12 Coin des coll giens 10 ou 1e 38 vaut 1 suivi de 38 z ros 107 ou 1e 38 vaut 0 000 01 avec 37 z ros avant le 1 En compliquant 3 4e 38 vaut 34 suivis de 37 z ros 38 chiffres apr s le 3 et 1 2e 38 vaut 0 00 012 toujours avec 37 z ros entre la virgule et le 1 le 1 est la place 38 13 Il est trop t t pour comprendre la syntaxe objet de cette d finition mais il nous p
202. lle le d compres ser et lancer Visual C Etudier la structure Vector d finie dans les fichiers Vector cppetVector h 2 Interfacage avec Imagine La structure Vector ne comporte pas de fonction d affichage graphique Ajouter dans main cpp des fonctions drawLine etdrawTriangle prenant des Vector en param tres Il suffit de rebondir sur la fonction void drawLine int x1 int yl int x2 int y2 const Color amp c int pen_w d Imagine Le dernier param tre contr le l paisseur du trait 3 Triangle de Sierpinski C est la figure fractale choisie par l ENPC pour son logo La figure ci dessous illustre sa construction crire une fonction r cursive pour dessiner le triangle de Sierpinski Cette fonc ANA bla FIGURE A 9 Construction du triangle de Sierpinski tion prendra en param tres les trois points du triangle en cours et l epaisseur du 215 A 7 Premiers objets et dessins de fractales A Travaux Pratiques trait Les trois sous triangles seront dessin s avec un trait plus fin Ne pas oublier la condition d arr t de la r cursion Utiliser cette fonction dans le main en lui fournissant un triangle initial d pais seur 6 A 7 2 Une classe plut t qu une structure 4 Classe vecteur Transformer la structure Vector en une classe Y incorporer toutes les fonctions et les op rateurs Passer en public le strict n cessaire Faire les modifications n cessaires dans main cpp 5 Accesseurs pour
203. llouer ce qu il faut si on fait A B entre deux matrices C est alors deux fois la zone allou e initialement pour B qui est d sallou e lorsqu on libere 111 8 4 Boucles et continue 8 Allocation dynamique Brito es A t ena A t S ses A t A R A cree 2 3 A B detruit A detruit B B cree 2 3 FIGURE 8 2 Attention au double delete le code A B fait pointer deux fois sur la m me zone m moire alors qu il n y a plus de pointeur sur le tableau du haut donc une fuite m moire puisqu il n est plus possible de la lib rer Le detruit B lib re ZX Z une zone m moire qui l avait d j t avec des cons quences f cheuses A et B tandis que la m moire initiale de A ne le sera jamais comme on peut le voir sur la Fig 8 2 La programmation objet essaiera de faire en sorte qu on ne puisse plus faire ces erreurs Elle essaiera aussi de faire en sorte que l utilisateur ne puisse plus savoir ce qu il n a pas besoin de savoir de fa on rendre vraiment ind pendantes la conception des matrices et leur utilisation 8 4 Boucles et continue Nous utiliserons dans le TP l instruction continue qui est bien pratique Voici ce qu elle fait lorsqu on la rencontre dans une boucle toute la fin de la boucle est saut e et on passe au tour suivant A nsi for if A continue if B continue est quivalent et r
204. lt i lt lt endl cin gt gt gt gt jy Erreurs fr quentes dans une fonction int q r 4 NON if i 2 NON if i 2 NON if i 2 for int NON Dnts LU Vase int i f NON double x 1 3 NON int i j x 1 3 NON x double 1 3 NON E E Oh double x 10 y 10 if i 0 LE for int i 1l1 i lt 10 i else j 2 y i1 2x x 1 NON int n 5 if i 0 int t n NON j 1 int f 4 NON k 2 int t 41 st Hot stos return t NON if t j 1 int t 4 t f y int s 31 1 2 3 t 31 Go Wi t s NON case 1 gt int 11 21 pc t 1 2 NON break struct Point case 2 double x y case 3 NON y Point a break a 1 2 NON default include tp cpp NON f int f int t NON int t 2 3 NON Entr es Sorties t i j NON Pas de d finition de fonction then NON i 0 i lt 100 i intx CLASS g int t intx s s t delete delete int xt t new s new NON new int 2 1 new int 2 On perd s t s D j fait S s est int non intx intin int n NON Divers j 3 j i n inclu i rand n x rand doub inclu Un srand inclu double double double double inclu using string char c int 1 inclu s doub CLO defin inclu doub
205. lumineux l criture et la lecture plus rapides pas besoin de traduire un nombre en une suite de caract res ou l inverse double x 10 double y ofstream f hop bin ios binary f write const char x 10x sizeof double f write const char amp y sizeof double f close ifstream g hop bin ios binary g read charx x 10x sizeof double g read const charx amp y sizeof double g close Attention ne pas oublier le mode d ouverture ios binary 11 2 2 Cha nes et fichiers 1 Pour ouvrir un fichier il faut pr ciser le nom avec une cha ne au format C D o la conversion void lire string nom ifstream f nom c_str Conversion obligatoire 2 Pour lire une cha ne avec des espaces m me chose qu avec cin getline g s getline g s 3 Enfin un peu technique mais tr s pratique les stringstream qui sont des cha nes simulant des fichiers virtuels On les utilise notamment pour convertir une cha ne en nombre ou l inverse include lt sstream gt using namespace std string s 12 stringstream f 158 11 Cha nes de caracteres fichiers 11 3 Valeurs par d faut int i Cha ne vers entier f lt lt s On crit la cha ne f gt gt i On relit un entier i vaut 12 i Entier vers cha ne f clear Ne pas oublier si on a d j utilis f f lt lt i On crit un entier f gt gt s On relit une cha ne s
206. m tr es templates 12 6 const et tableaux first false srand unsigned int time 0 return double rand RAND_MAX Le danger est alors que tout le reste du programme voie cette variable globale et l uti lise ou la confonde avec une autre variable globale Il est possible de cacher cette variable dans la fonction gr ce au mot cl static plac devant la variable Fonction random qui appelle srand toute seule au premier appel avec sa variable globale masqu e l int rieur double random static bool first true Ne pas oublier static if first first false srand unsigned int time 0 return double rand RAND MAX Attention il s agit bien d une variable globale et non d une variable locale Une variable locale mourrait la sortie de la fonction ce qui dans l exemple pr c dent donnerait un comportement non d sir NB Il est aussi possible de cacher une variable globale dans une classe toujours gr ce static Nous ne verrons pas comment et renvoyons le lecteur la documenta tion du C 12 6 const et tableaux Nous avons vu malgr nous const char comme param tre de certaines fonctions ouverture de fichier par exemple Il nous faut donc l expliquer il ne s agit pas d un pointeur de char qui serait constant mais d un pointeur vers des char qui sont constants Il faut donc retenir que plac devant un tableau const signifie que ce sont les l ments
207. mage srcPath ppd jpg t W H fait la m me chose mais convertit l image en noir et blanc Afficher l image en noir et blanc A 6 5 Fonctions 8 D couper le travail On ne garde plus que la partie noir et blanc du programme Faire des fonctions pour allouer d truire afficher et charger les images bytex Allouelmage int W int H void Detruitlmage byte xl void Affichelmage bytex I int W int H byte Chargelmage charx name int amp W int amp 9 Fichiers Cr er un image cpp et un image h en cons quence 213 A 6 Images A Travaux Pratiques A 6 6 Structure 10 Principe Modifier le programme pr c dent pour utiliser une structure struct Image bytex t int w h g Allouelmage et ChargeImage pourront retourner des Image 11 Ind pendance Pour ne plus avoir savoir comment les pixels sont stock s rajouter byte Get Image I int i int j void Set Image I int i int j byte g 12 Traitements Ajouter dans main cpp diff rentes fonctions de modification des images Image Negatif Image I Image Flou Image 1 Image Relief Image I Image Contours Image I double seuil Image Deforme Image I et les utiliser a Negatif changer le noir en blanc et vise versa par une transformation affine b Flou chaque pixel devient la moyenne de lui m me et de ses 8 voisins Attention aux pixels du bords qui n ont pas tous leurs voisins on pourra ne pas moyenner
208. n pour ne pas m langer avec les champs m ml n n1 t new double mxn void Matrice detruit delete t double Matrice get int i int j return t i wmxj void Matrice set int i int j double x t i m j x void Matrice affiche string s cout lt lt s lt lt lt lt endl for int i 0 i lt m i for int j 0 j lt n j cout lt lt get i j lt lt cout lt lt endl Ly A Matrice operatorx Matrice A Matrice B if A n B m cout lt lt Erreur lt lt endl exit 1 121 9 5 Cas des op rateurs 9 Premiers objets Matrice C C cree A m B n for int i 0 i lt A m i for int j 0 j lt B n j Cij Ai0 xB0j Ail1xB1j C set i j 0 for int k 0 k lt A n k C set i j C get i j A get 1 k x B get k j return C JT main int main Matrice A A cree 2 3 for int i 0 i lt 2 i for int j 0 j lt 3 j A set i j it j A affiche A Matrice B B cree 3 5 for int i 0 i lt 3 i for int j 0 j lt 5 j B set i j i j B affiche B Matrice C AxB C affiche C C detruit B detruit A detruit return 0 9 5 Cas des op rateurs Il est un peu dommage que l op rateur x ne soit pas dans l objet Matrice Pour y rem dier on adopte la convention suivante Soit A un objet S il poss de une m thode operatorop objB B alors AopB ap
209. n 1 int i double x g gt gt i gt gt x g close do while g eof ofstream f f open hop txt double x 10 y ofstream f hop bin los binary f write const charx x 10xsizeof double f write const charx 8y sizeof double f close ifstream g hop bin los binary g read charx x 10 sizeof double g read const charx amp y sizeof double g close string s ifstream f s c_str include lt sstream gt using namespace std stringstream f Cha ne vers entier E E f gt gt i Entier vers cha ne f clear f lt lt i E gt gt Si ostream operator lt lt ostream f const point amp p f lt lt p x lt lt T lt p y return f istream operator gt gt istreams f pointg p gt gt p x gt gt p y return f Conseils Nettoyer en quittant Erreurs et warnings cliquer Indenter Ne pas laisser de warning Utiliser le debuggeur Faire des fonctions Tableaux pas pour transcrire une formule math matique Faire des structures Faire des fichiers s par s Le h doit suffire l utilisa teur qui ne doit pas regarder le cpp Ne pas abuser du r cursif Ne pas oublier delete Compiler r guli rement include lt cassert gt assert x 0 y 1 x Faire des objets Ne pas toujours faire des ob jets Penser interface impl men tation utilisation
210. n pensait qu un objet n tait pas modifi et il l est Optimisation du programme La fin du chapitre peut tre consid r e comme difficile Il est toutefois recommand de la com prendre m me si la ma trise et la mise en application de ce qui s y trouve est laiss e aux plus avanc s 10 7 Destructeur Lorsqu un objet meurt une autre de ses m thodes est appel e le destructeur Le destructeur est appel quand l objet meurt porte le nom de la classe pr c d de comme les constructeurs n a pas de type n a pas de param tres Il n y a donc qu un seul destructeur par classe Un exemple sera plus parlant Rajoutons un destructeur au programme de la section 10 3 2 Lorsque le compilateur sait qu un objet reste constant pendant une partie du programme il peut viter d aller le relire chaque fois Le const est donc une information pr cieuse pour la partie optimi sation du compilateur 142 10 Constructeurs et Destructeurs 10 7 Destructeur include lt iostream gt using namespace std class obj public obj obj O obj obj cout lt lt obj obj obj cout lt lt La void f obj d obj 80 1 obj e cout lt lt 6 lt lt return e int main cout lt lt O lt lt obj a cout lt lt 1 lt lt AS for int i 2 i lt 4 i obj b cout lt lt i lt lt He
211. n qui provoque une erreur 1 Pour viter cela on utilise une instruction du pr processeur signalant qu un fichier d j inclus ne doit plus l tre nouveau on ajoute 8 On devrait m me tout faire pour bien les cacher et pour interdire au fichier principal de les utiliser Il serait possible de le faire d s maintenant mais nous en reparlerons plut t quand nous aborderons les objets 9 Une m me fonction peut alors se retrouver d finie plusieurs fois dans le fichier s par et dans le fichier principal qui l inclut Or s il est possible de d clarer autant de fois que n cessaire une fonction il est interdit de la d finir plusieurs fois ne pas confondre avec la surcharge qui rend possible l existence de fonctions diff rentes sous le m me nom cf section 3 2 6 10 Les pr processeurs savent heureusement d tecter ce cas de figure 83 6 1 Fichiers s par s 6 Plusieurs fichiers pragma once au d but de chaque fichier d en t te Certains compilateurs peuvent ne pas conna tre pragma once On utilise alors une astuce que nous donnons sans explication Choisir un nom unique propre au fichier d en t te Par exemple VECT_H pour le fichier vect h Placer ifndef VECT_H et define VECT_H au d but du fichier vect h et Hendif la fin Cela utilise la commande if du pr processeur Notons un autre usage parfois utile en cours de d veloppement pour que le compilateur ne reg
212. ned char d 25 complex lt double gt z 2 3 Variables globales int n const int m 12 void f n 10 OK int i m OK Conversion int i int x j float x float i j Pile Tas 113 8 6 Fiche de r f rence 8 Allocation dynamique Fiche de r f rence 2 3 Clavier Debug F5 Step over F10 5 Step inside F11 Indent Ctrl A Ctrl I Step out Maj F11 Gest t ches Ctrl Maj Ech Fonctions D finition int plus int a int b int c a b return c void affiche int a cout lt lt a lt lt endl D claration int plus int a int b Retour int signe double x 1f x lt 0 return 1 1f x gt 0 return 1 return 0 void afficher int x int y if x lt 0 y lt 0 return if x gt w y gt h return DrawPoint x y RED Appel int f int a int FL sese int i f 2 j g R f rences void swap int amp a int amp b int tmp a a b b tmp int x 3 y 2 swap x y Surcharge int hasard int n int hasard int a int b double hasard Op rateurs vect operator vect A vect B vect C A B Pile des appels It ratif R cursif Tableaux D finition double x 5 y 5 for int 1 0 1 lt 5 1 y i 1 2 x i const int n 5 int ifn j 2xn Initialisation int t 4 1 2 3 4
213. ng namespace std stringstream f 1 Cha ne vers entier E Se tf gt de Entier vers cha ne Clear gt E lt lt us f gt gt Si ostream operator lt lt ostream f const pointep e A Te Puy return f istream amp operator gt gt istream f pointe p f gt gt p X gt gt p Yy retu n E Erreurs fr quentes Pas de d finition de fonction dans une fonction int q r 4 NON if i 2 NON if i 2 NON if i 2 then NON for int i 0 1 lt 100 1 NON int f int i f NON double x 1 3 NON int i j x 1 3 NON x double 1 3 NON double x 10 y 101 r for int i 1 i lt 10 1 y 1 2 x 1 NON int int n 5 t In NON 4 NON int 1 41 int return t NON int t 4 t s 3 1 273Frt I3 NON int t s int t 21 t 1 2 NON struct Point double x y NON Point a a 1 2 NON include tp cpp NON int f int t 1 NON int t 2 31 NON t i j NON intx t t 1 NON int t new int 2 intx s new int 2 s t On perd s deletel t delete s D j fait int t s s est int non intx int nl int n NON t new s new class vec int X y public vec a 2 3 NON vec v vec 1 2 NON vec v 1 2 OUI obj t new obj n del
214. ns bien plac s x2113 0 pion mal plac xxxxx Pour commencer et pouvoir tout de suite tester le jeu programmer une fonction renvoyant uniquement le nombre de pions bien plac s 8 Boucle de jeu Nous avons maintenant notre disposition toutes les briques n cessaires il n y a plus qu les assembler pour former un jeu de mastermind Pensez par ailleurs ajouter la d tection de la victoire quand tous les pions sont bien plac s et celle de la d faite quand un nombre limite d essais a t d pass 9 Version compl te Compl ter la fonction de traitement d une combinaison pour qu elle renvoie galement le nombre de pions mal plac s A 3 2 Mastermind Graphique Le jeu de Mastermind que nous venons de r aliser reste malgr tout tr s peu convi vial Nous allons y rem dier en y ajoutant une interface graphique 1 Etude du projet de d part Passer dans le projet MastermindGraphique Sous Visual penser le d finir comme projet de d marrage pour que ce soit lui qui se lance l ex cution son nom doit appara tre en gras dans la liste des projets 3 m me si la fonction de traitement d une combinaison est pour l instant incompl te 201 A 3 Tableaux A Travaux Pratiques X FIGURE A 4 Master mind graphique Les fonctions graphiques sont d j d finies Elles fonctionnent selon un principe de division de la fen tre graphique en lignes La fonction void affich
215. ns ni de percuter les murs La solution de d part comporte deux fichiers utils hetutils cpp qui contiennent une structure point qu il faudra ventuellement toffer de m thodes utiles et une fonction destin e r cup rer les touches clavier pour l interaction avec les joueurs Il s agit ici de concevoir un objet Serpent dot des m thodes ad quates plus une fonction jeu_1p exploitant les capacit s du Serpent pour reproduire le comportement d sir On pourra dans un premier temps ne pas g rer les collisions avec le bord et avec lui m me et ne les rajouter que dans un second temps Votre travail se d com pose en 6 tapes 1 sur papier D finir l interface de la classe Serpent c est dire lister toutes les fonctionnalit s n cessaires 2 sur papier R fl chir l impl mentation de la classe Serpent comment stocker les donn es comment programmer les diff rentes m thodes lire en pr liminaire les remarques du paragraphe suivant 3 Dans un fichier serpent h crire la d claration de votre classe Serpent ses membres ses m thodes ce qui est public ce qui ne l est pas 4 Soumettre le r sultat de vos r flexions votre enseignant pour valider avec lui les choix retenus 218 A Travaux Pratiques A 8 Tron 5 Impl menter la classe Serpent c est dire programmer les m thodes que vous avez d clar es 6 Programmer la fonction jeu_1p utilisant un Serpent Remarque D
216. ns voir plus loin cette construction par copie Ainsi le programme include lt iostream gt using namespace std class obj public obj y obj obj cout lt lt obj void f obj d obj g 1 obj e cout lt lt 6 lt lt return e int main cout lt lt 0 lt lt obj a cout lt lt 1 lt lt for int i 2 i lt 4 i obj b cout lt lt i lt lt MW Wa w 13 4 f a cout lt lt 5 lt lt 3 a g 135 10 3 Cas g n ral 10 Constructeurs et Destructeurs return 0 affiche 0 obj 1 obj 2 obj 3 obj 4 5 obj 6 Bien rep rer les deux objets non construits avec obj obj le param tre d de f copie de a et la valeur de retour de g copie de e 10 3 2 Plusieurs constructeurs Un objet peut avoir plusieurs constructeurs class point int x y public point int X int Y point int V y point point int V point a 2 3 construit avec point X Y point b 4 construit avec point V Il faut cependant retenir la chose suivante Si on ne d finit aucun constructeur tout se passe comme s il n y avait qu un constructeur vide ne faisant rien Mais attention d s qu on d finit soi m me un constructeur le constructeur vide n existe plus sauf si on le red finit soi m me Par exemple le programme class point int x y point a a set 2 3 point b OK devient
217. nsacr e 11 Sans m me d ailleurs avoir le temps d en creuser convenablement un seul 9 1 1 Pourquoi savoir programmer 1 Pr ambule en cr er En conclusion coll giens ou ing nieurs d butants ou passionn s tous les l ves sont galit C est donc sans complexe que l ing nieur pourra apprendre programmer en m me temps que le fils de la voisine 1 1 Pourquoi savoir programmer Nous venons partiellement de le dire R sumons et compl tons 1 C est la base Apprendre un langage pr cis n est pas du temps perdu car les m mes concepts se retrouvent dans la plupart des langages De plus les logiciels courants eux m mes peuvent se programmer 2 Il est fr quent qu un stage ou qu une embauche en premier poste comporte un peu de programmation m me et peut tre surtout dans les milieux o peu de gens programment 3 Savoir programmer c est mieux conna tre le mat riel et les logiciels ce qui est possible techniquement et ce qui ne l est pas M me un poste non technique c est important pour prendre les bonnes d cisions 1 2 Comment apprendre 1 2 1 Choix du langage Il faut d abord choisir un langage de programmation Un ing nieur pourrait vi demment tre tent d apprendre programmer en Maple Matlab Scilab ou autre Il faut qu il comprenne qu il s agit l d outils sp cialis s pour math maticien ou ing nieur qui lui seront utiles et qui certes se programment m
218. nt d finir un op rateur sur de nouveaux types R sumons notre progression dans le savoir faire du programmeur 1 Tout programmer dans le main c est un d but et c est d j bien 2 Faire des fonctions pour tre plus lisible et ne pas se r p ter Axe des instruc tions 3 Faire des tableaux et des structures pour manipuler plusieurs variables la fois Axe des donn es Nous rajoutons maintenant 4 Faire plusieurs fichiers pour utiliser des parties communes dans diff rents pro jets ou solutions A nouveau axe des instructions Solution Explorer Solution A X a E Cl Solution Test 1 project E Ez Project 1 Y Header Files 3 LS Source Files Ci hop cpp C main cpp FIGURE 6 1 Plusieurs fichiers sources dans Visual 1 Toujours cette id e que nous explorons les diff rentes composantes du langages quand le besoin s en fait sentir 6 1 Fichiers s par s 6 Plusieurs fichiers 6 1 Fichiers s par s Nous allons r partir notre code source dans plusieurs fichiers Mais avant toute chose Pour un maximum de portabilit du code choisir des noms de fichiers avec seulement des caracteres standard pas de lettres accentu es ni d espace D ailleurs il est aussi pr f rable d viter les accents pour les noms de variables et de fonctions tant pis pour la correction du francais 6 1 1 Principe Jusqu pr sent un seul fichier source contenait notr
219. nt g int y int int ObJ E int i g 3 mon g int j x i mon x return j int main obj a a x 3 int i a f class obj int x y void a moi public ine z void pour _tous void autre obj A void obj a_moi E OK Yi OK Sd OK void obj pour_ tous f OK OK X 2 a_moi void autre obj A X A X OK A a_moi OK int main obj A B o 5 NON RAS OK A a_moi NON A pour_tous OK A autre B OK class obj obj operator obj B y int main obj A B C C A B C A operator B M thodes constantes void obj f const void g const objg8 x x f OK Constructeur class point int X y public point int X int Y point point int X int Y y Y point a 2 3 Constructeur vide obj 0bJ obj a Objets temporaires vec vec operator vec b return vec x b x ytb y c vec 1 2 f vec 2 3 Destructeur obj 0bJ Constructeur de copie obj o0bj const obje o Utilis par obj b a obj b a mieux que obj b b a param tres des fonctions valeur de retour Affectation obj amp obj operator const obj amp o return this Objets avec allocation dyna mique automatique cf sec tion 10 11 Accesseurs class mat double xx public doubles operator int
220. nt i return x i point p p 1 2 3 Joli non Notez que l on peut passer plusieurs param tres ce qui est utile par exemple pour les matrices class mat 162 11 Cha nes de caract res fichiers 11 4 Accesseurs double x Mx N public double operator int i int j double amp mat operator int i int j return x i Mxj mat A A 1 2 2 3 11 4 4 Surcharge et m thode constante Nous sommes maintenant face un probl me le programme pr c dent ne permet pas d crire void f mat amp A A 1 1 2 OK void f const mat amp A double x A 1 1 NON Le compilateur ne sait pas que cette ligne ne modifiera pas A car la m thode operator n est pas constante Il y a heureusement une solution pro grammer deux accesseurs en profitant du fait qu entre une m thode et une m thode constante il y a surcharge possible m me si elles ont les m mes param tres Cela donne class mat double x Mx N public M me nom m mes param tres mais l une est const Donc surcharge possible double operator int i int j double operator int i int j const double mat operator int i int j const return x i Mxj double amp mat operator int i int j return x i Mxj void f mat amp A A 1 1 2 OK appelle le premier operator void f const mat amp A double x A 1 1 OK appelle le deuxi me 163 1
221. ntation 186 12 Fonctions et classes param tr es templates 12 7 Fiche de r f rence Fiche de r f rence 6 6 Tableaux D finition double x 5 y 5 for int 1 0 1 lt 5 1 y i 2xx 1 1 const int n 5 int i n 3 2 n1 Initialisation int t 4 1 2 3 47 string s 2 ab c Affectation int s 3 1 1 2 3 t 131 for int 1 0 1 lt 3 1 tlil s i En param tre void init int t 4 1 for int 1 0 1 lt 4 1 t il 0 void init int tl int n for int i 0 i lt n i t i 0 Taille variable int t new int n deletel t En param tre suite void f intx x t int n t il void alloue intxg t t new int n 2D int A 2 3 A il 3 1 5 int A 2 31 11 2 3 14 5 6 void f int A 2 2 2D dans 1D int A 2x3 5 A i 2x3 7 Taille variable suite IDE AE SD En param tre fin void E const int E int 4 se tlitle OK Elise f f NON 187 A Travaux Pratiques Annexe Travaux Pratiques Note les corrig s seront disponibles sur la page web du cours apr s chaque TP A1 L environnement de programmation A 1 1 Bonjour Monde 1 Connexion Se connecter sous Windows ou Linux 2 Projet T l charger l archive Tp1_Initial zip sur la page du cours la d compresser sur le bureau Le fichier CMakeLists txt d
222. oint virgule mais avec la fin de ligne 84 6 Plusieurs fichiers 6 2 Op rateurs 6 2 Op rateurs Le C permet de d finir les op rateurs etc quand les op randes sont de nou veaux types Voici tres succinctement comment faire Nous laissons au lecteur le soin de d couvrir seul quels sont les op rateurs qu il est possible de d finir Consid rons exemple suivant qui d finit un vecteur 1 2D et en impl mente l ad dition struct vect double x y vect plus vect m vect n vect p m x n x m y n y return p int main vect a 1 2 b 3 4 vect c plus a b return 0 Voici comment d finir le entre deux vect et ainsi remplacer la fonction plus struct vect double x y vect operator vect m vect n vect p m x n x m y n y return p int main vect a 1 2 b 3 4 vect c a b return 0 Nous pouvons aussi d finir un produit par un scalaire un produit scalaire etc Produit par un scalaire vect operator x double s vect m vect p sxm x sxm y return p Produit scalaire double operatorx vect m vect n 12 Coin des coll giens vous ne savez pas ce qu est un vecteur mais vous tes plus forts en pro grammation que les vieux Alors regardez les sources qui suivent et vous saurez ce qu est un vecteur 2D 13 Dans ce cas on utilise axb et non a b le point n tant pas d finissable car r serv l acc s aux champs
223. om int numero numero_telephone nom composer numero if ca_decroche parler raccrocher void telephoner_plus_simple string nom if j_ai_le_telephone return if mon telephone_marche return if est_dans_l_annuaire nom return int numero numero_telephone nom composer numero 24 Contrairement certains vieux langages comme le Pascal 44 3 Premiers programmes 3 2 Fonctions if ca_decroche return parler raccrocher 3 2 2 Param tres Nous n avons vu que des fonctions un seul param tre Voici comment faire pour en passer plusieurs ou n en passer aucun Nombre entre a et b int hasard2 int a int b return a rand b a 1 Nombre entre O et 1 double hasard3 return rand double RAND MAX int a hasard2 1 10 double x hasard3 Attention bien utiliser x hasard3 et non simplement x hasard3 pour appeler cette fonction sans param tre Ce simple programme est aussi l occasion de parler d une erreur tr s fr quente la division de deux nombres entiers donne un nombre entier Ainsi crire double x 1 3 est une erreur car le C commence par calculer 1 3 avec des entiers ce qui donne 0 puis convertit 0 en double pour le ranger dans x Il ne sait pas au moment de calculer 1 3 qu on va mettre le r sultat dans un double Il faut alors faire en sorte que le 1 ou le 3 soit une double et crire double x 1
224. omment elle est programm e c est dire sans conna tre le corps de la fonction Une des raisons de ce besoin est que comme les variables les fonctions ont une port e et ne sont connues que dans les lignes de source qui lui succ dent Ainsi le programme suivant ne compile pas int main 0 return 0 void f car la ligne 3 f n est pas connue Il suffit ici de mettre les lignes 6 et7 avant le main pour que le programme compile Par contre il est plus difficile de faire compiler void f void g 0 g Erreur g inconnue puisque les deux fonctions on besoin l une de l autre et qu aucun ordre ne conviendra Il faut alors conna tre la r gle suivante 48 D O1 amp ND HR 3 Premiers programmes 3 2 Fonctions Remplacer le corps d une fonction par un s appelle d clarer la fonc tion D clarer une fonction suffit au compilateur qui peut patienter jus qu sa d finition a En r alit le compilateur n a besoin que de la d claration C est le linker qui devra trou ver quelque part la d finition de la fonction ou plus exactement le r sultat de la compilation de sa d finition Notre programme pr c dent peut donc se compiler avec une ligne de plus void g D claration de g void f g OK fonction d clar e void g D finition de g f
225. onstructeur vide vect vect alors la destruction d un objet cr vide va vouloir d sallouer un champ t absurde Il faudra donc faire par exemple vect vect n 0 vect vect 147 10 11 Objets avec allocation dynamique 10 Constructeurs et Destructeurs if n 0 delete t Des probl mes compliqu s Le programme suivant ne marche pas int main vect v 10 w 10 W V return 0 Pourquoi Parce que l affectation par d faut recopie les champs de v dans ceux de w Du coup v et w se retrouvent avec les m mes champs t Non seulement ils iront utiliser les m mes valeurs d o certainement des r sultats faux mais en plus une m me zone du tas va tre d sallou e deux fois tandis qu une autre ne le sera pas Il faut alors reprogrammer l affectation ce qui n est pas trivial On d cide en g n ral de r allouer la m moire et de recopier les l ments du tableau const vect amp vect operator const vect amp v if n 0 delete t On se desalloue si necessaire n v n if n 0 t new double n Reallocation et recopie for int i 0 i lt n i t i v t i return v Cette version ne marche d ailleurs pas si on fait v v car alors v est d sallou avant d tre recopi dans lui m me ce qui provoque une lecture dans une zone qui vient d tre d sallou e 10 11 3 Solution Des probl mes identiques se posent pour
226. ouble gt z 2 3 Variables globales int 5 const int m 12 void f n 10 OK int i m OK Conversion int i int x 3 float x float 1 3 Tests Comparaison l lt gt lt gt N gation Combinaisons amp amp if i 0 j 1 if i 0 j 1 else j 2 if i 0 j 1 k 2 bool t i 0 5 if t j 1 switch i case 1 7 break case 2 case 3 7 break default er 86 6 Plusieurs fichiers 6 4 Fiche de r f rence Fiche de r f rence 2 3 Boucles do while ok int i 1 while i lt 100 i i 1 for int i 1 i lt 10 i for int i 1 3j 10 j gt i 1i 1 2 3 3 3 Fonctions D finition int plus int a int b int c a b return c void affiche int a cout lt lt a lt lt endl D claration int plus int a int b Retour int signe double x if x lt 0 return 1 1f x gt 0 return 1 return 0 void afficher int x int y if x lt 0 y lt 0 return if x gt w y gt h return DrawPoint x y RED Appel ine UCINE lt a ess int Dl sea int i f 2 j g R f rences void swap int amp a int amp b int tmp a a b b tmp int x 3 y 2 swap x y Surcharge int hasard int n int hasard int a int b double hasard Op rateurs
227. out lt lt s i lt lt endl affiche t mais il faut savoir deux choses Un tableau est toujours pass par r f rence bien qu on n utilise pas le era amp Une fonction ne peut pas retourner un tableau a Un void f ints t 4 ou toute autre syntaxe est une erreur b On comprendra plus tard pourquoi par souci d efficacit les concepteurs du C ont voulu qu un tableau ne soit ni pass par valeur ni retourn donc Rappel ceci ne marche pas void affectel int x int val x v al Rappel c est ceci qui marche void affecte2 int amp x int val x val Une fonction qui marche sans 6 void remplit int s 4 int val for int i 0 i lt 4 i s i val int a 1 affectel a 0 a ne sera pas mis 0 3 Il est du coup de plus en plus fr quent que les programmeurs utilisent directement des variables de type vector qui sont des objets impl mentant les fonctionnalit s des tableaux tout en se comportant d avantage comme des variables standard Nous pr f rons ne pas parler des maintenant des vector car leur compr hension n cessite celle des objets et celle des template Nous pensons aussi que la connaissance des tableaux m me si elle demande un petit effort est incontournable et aide la compr hension de la gestion de la m moire 56 17 18 19 20 21 22 M NI O1 B ND NI O1 B ND Ra 4 Les tableau
228. pellera cette m thode pour tout B de type objB En clair le programme struct objA 122 9 Premiers objets 9 5 Cas des op rateurs struct objB n ii int operator objA A objB B int main objA A objB B int i A B appelle operator A B peut aussi s crire struct objA int operator objB B struct objB int objA operator objB B int main objA A objB B int i A B appelle maintenant A operator B ce qui pour nos matrices donne struct Matrice Matrice operatorx Matrice B E AxB appelle A operatorx B donc tous les champs et fonctions utilis s directement concernent ce qui tait pr fix pr c demment par A Matrice Matrice operator Matrice B On est dans l objet A du AxB appel if n B m Le n de A cout lt lt Erreur lt lt endl exit 1 Matrice C C cree m B n 123 9 6 Interface 9 Premiers objets for int i 0 i lt m i for int j 0 j lt B n j Cij Ai0 xB0j Ai1 xB1j C set i j 0 for int k 0 k lt n k get i j sera celui de A C set i j C get i j get i k B get k j return C Notez aussi que l argument de l op rateur n a en fait pas besoin d tre un objet Ainsi pour crire le produit B Ax2 il suffira de cr er la m thode Matrice Matrice operator double lambda B Ax2 Appelle A operatorx 2 Par contre pour
229. pels les variables locales s empilent la m moire est utilis e juste pendant le temps n cessaire La figure 7 2 montre trois tapes de la pile pendant l ex cution de notre exemple 7 3 Fonctions r cursives Un fonction r cursive est une fonction qui s appelle elle m me La fonction la plus classique pour illustrer la r cursivit est la factorielle Voici une fa on simple et r cur 5 Souvenons nous du chapitre 2 6 Et permettra de faire des fonctions r cursives cf section suivante 7 Coin des coll giens La factorielle d un nombre entier n s crit n et vaut n 1x2x x n 93 NOo0 XQ 01 10 7 3 Fonctions r cursives 7 La m moire sive de la programmer int factl int n if n 1 return 1 return n fact1 n 1 On remarque videmment que les fonctions r cursives contiennent en g n ral au d but et en tout cas avant l appel r cursif une condition d arr t ici si n vaut 1 la fonction retourne directement 1 sans s appeler elle m me 7 3 1 Pourquoi a marche Si les fonctions avaient m moris leurs variables locales des adresses fixes la r cursivit n aurait pas pu marcher l appel r cursif aurait cras les valeurs des va riables Par exemple fact1 3 aurait cras la valeur 3 m moris e dans n par un 2 en appelant fact1 2 C est justement gr ce la pile que le n de fact1 2 n est pas le m me que celui de fact1 3 Ainsi l appel fact1
230. plate ralentit la compilation et augmente la taille des pro grammes 2 On ne peut plus mettre la d claration dans un fichier d en t te et la d finition dans un fichier cpp car tous les fichiers utilisateurs doivent conna tre aussi la d finition Du coup la r gle est de tout mettre dans le fichier d en t te 1 12 1 3 Classes Il est fr quent qu une d finition de classe soit encore plus utile si elle est g n rique C est possible Mais attention Dans le cas des fonctions c est le compilateur qui d termine tout seul quels types sont utilis s Dans le cas des classes c est l utilisateur qui doit pr ciser en permanence avec la syntaxe obj lt type gt le type utilis Paire de deux variables de type T template lt typename T gt class paire T x 2 public constructeurs paire paire T A T B accesseurs T operator int i const T operator int i template lt typename T gt paire lt T gt paire template lt typename T gt paire lt T gt paire T A T B x 0 A x 1 B template lt typename T gt T paire lt T gt operator int i const assert i 0 l i 1 return x i template lt typename T gt T amp paire lt T gt operator int i assert i 0 l i 1 1 Ceci est g nant et va l encontre du principe consistant mettre les d clarations dans le h et masquer les d finitions dans le cpp Cette remarque a d j t formul e
231. plusieurs programmes et d en ex cuter plusieurs l un apr s l autre puis plusieurs en m me temps multi t ches puis pour plu sieurs utilisateurs en m me temps multi utilisateurs enfin avec plusieurs pro cesseurs par machine Pour g rer tout cela s est d gag le concept de syst me d exploitation Windows Unix dont linux et MAC OS sont les plus r pandus Le syst me d exploitation est aujour d hui responsable de g rer les fichiers les interfaces avec les p riph riques ou les uti lisateurs mais son r le le plus d licat est de g rer les programmes ou t ches ou 34 Les plus courantes taient les textes o chaque octet repr sentait un caract re C tait le c l bre code ASCII 65 pour A 66 pour B etc A l re du multim dia les formats sont aujourd hui nombreux concurrents et plus ou moins normalis s 35 On parle de fichier ex cutable 36 Les r pertoires 37 Aujourd hui c est pire Un programme est souvent lui m me en plusieurs parties s ex cutant en m me temps les threads Quant au processeur il ex cute en permanence plusieurs instructions en m me temps on dit qu il est super scalaire 38 Operating System 39 Esp rons qu un jour les utilisateurs ne seront pas eux aussi des p riph riques 22 2 Bonjour Monde 2 3 La Compilation process en train de s ex cuter Il doit pour cela essentiellement faire face deux pro bl mes 1 Faire tr
232. pragma once au d but du break default eE Entr es Sorties include lt iostream gt using namespace std cout lt lt I lt lt i lt lt endl cin gt gt i gt gt 3 fichier Divers Ne pas trop d couper i ie Tests i 2 Comparaison j 3 EURE 2 lt j i n Modulo N gation include lt cstdlib gt Combinaisons amp amp i rand bn A AA x rand if i 0 j 1 double RAND_MAX else 372 include lt ctime gt Un seul appel if 1 0 srand unsigned int j l time 0 k 2 include lt cmath gt double sqrt double x bool t i 0 double cos double x if t double sin double x j 1 double acos double x switch i include lt string gt Case 1 using namespace std E string s hop e char c s 0 break int l1 s size Case 2 tinclude lt ctime gt Case 3 s double clock CLOCKS_PER_SEC include lt cmath gt double pi M PI Imagine Voir documentation Conseils Nettoyer en quittant Erreurs et warnings cliquer Indenter Ne pas laisser de warning Utiliser le debuggeur Faire des fonctions Tableaux pas pour transcrire une formule math matique Faire des structures Faire des fichiers s par s Le h doit suffire l utilisa teur qui ne doit pas reg
233. provisoirement quitt es Les fonctions s appelant les unes les autres on se retrouve avec des appels de fonc tions imbriqu s les uns dans les autres main appelle divise qui lui m me appelle verifie Plus pr cis ment cette imbrication est un empilement et on parle de pile des appels Pour mieux comprendre cette pile nous allons utiliser le debuggeur Avant cela pr cisons ce qu un informaticien entend par pile 1 par exemple 24a et 24b 2 Et d ailleurs main a lui m me t appel par une fonction a laquelle il renvoie un int 90 7 La m moire 7 1 L appel d une fonction CZ s E Threads Function File Line 1 Appel 0 main CZ s_ E Threads Function File Appelcpp 24 Line 1 Appel 0 divise 1 main b Appelcpp 12 Appelcpp 24 9 El e Threads 1 Appel Level Function File Line 0 verifie Appelcpp 5 1 divise Appelcpp 13 2 main Appelcpp 24 c 9 El e Threads Function File Line 1 Appel verifie divise 2 main d E Appel cpp 5 Appel cpp 13 Appel cpp 24 SZ E Threads Function File Line 1 Appel 0 verifie 1 divise 2 main e Appelcpp 5 Appel cpp 13 Appelcpp 24 A A TE Function File Line 1 Appel 0 main Appelcpp 24 C SZ E Threads Function File Line 1 Appel 0 main 8 Pile File
234. public gt cf ob jets a y 3 4 Variables D finition int i int k 1 m Affectation i 2 j i k 1 3 Initialisation int n 5 o n Constantes const int s 12 Port e int i i j int j 2 OK 3 gt 1 4 int k 3 OK interdit i j if j k i k Types int i 3 double x 12 3 char c A string s hop bool t true f u s u interdit loat y 1 2f nsigned int j 4 igned char d 128 nsigned char d 25 complex lt double gt z 23 Variables globales int n const int m 12 void f n 10 int i m OK OK Conversion int i int x j float x float i j Pile Tas Fonctions D finition int plus int a int b int c a b return c void affiche int a cout lt lt a lt lt endl D claration int plus int a int b Retour int signe double x 1f x lt 0 return 1 1f x gt 0 return 1 return 0 void afficher int x int y if x lt 0 y lt 0 return if x gt w y gt h return DrawPoint x y RED Appel int f int a ine g me int i f 2 j g R f rences void swap inte a int amp b int tmp a a b b tmp int x 3 y 2 swap x y Surcharge int hasard int n int hasard int a int b double hasard Op rateurs vect operator vect A vect B
235. put et qui permet d afficher ce qu on veut dans le terminal end1 signifie end of line retour la ligne On pourra aussi tester le cin qui permet de lire dans le terminal ce qu entre l utilisateur int i 2 j cout lt lt i lt lt i lt lt endl cout lt lt Entrez un entier cin gt gt j cout lt lt Le double de lt lt j lt lt 1 LA tt est lt lt 2xj lt lt endl 27 2 5 Le minimum indispensable 2 Bonjour Monde o9 y main cpp EssaiQtCreator Qt Creator File Edit Build Debug Analyze Tools Window Help EssaiQtCreator Welcome CUTE Editor Code Style Dependencies Edit QG x Add Kit daki Desktop Manage Kits Build Run reis CMake Analyze Build directory home pascal TEMP Build Browse Help CMake arguments bDCMAKE_BUILD_TYPE Debug Essai eator Generator Unix Generator LR Build Steps Default Make make Details w Add Build Step gt Clean Steps LEN 2 Type to locate Ctri K Fl issues JE J Applicatio MEA Compite o ME omus c PE General m ME FIGURE 2 2 QtCreator configur pour compiler en mode Debug A noter que le terminal int gr de QtCreator ne supporte pas l entr e par l utilisateur Il faut donc lancer avec un terminal ext rieur en allant dans l onglet Projects rubrique Run et cliquer le bouton Run in terminal Enfin le TP utilise la commande conditionnelle if else
236. que nous avons constat naturellement dans les exemples des chapitres pr c dents dans lesquels un fichier regroupait souvent une structure et un certain nombre de fonc tions s y rapportant C est dans ce cas qu il faut faire des objets L id e est simple un objet est un type de donn e poss dant un certain nombre de fonctionnalit s propres Ainsi Ce ne sont plus les fonctions qui travaillent sur des donn es Ce sont les donn es qui poss dent des fonctionnalit s 2 _ Ces fonctionnalit s sont souvent appel es les m thodes de l objet En pratique luti lisation d un objet remplacera ce genre d instructions obj a int i f a fonction f appliqu e a a par obj a int i a f appel a la m thode f de a 1 Le plus important tant l h ritage que nous ne verrons pas dans ce cours pr f rant nous consacrer d autres aspects du C plus indispensables et n glig s jusqu ici 2 Nous exposerons une facon simple de cr er des interfaces Un programmeur C exp riment utilisera plut t de l h ritage et des fonctions virtuelles pures ce qui d passe largement ce cours 3 Il arrive m me parfois qu un objet regroupe des fonctionnalit s sans pour autant stocker la moindre donn e Nous n utiliserons pas ici cette fa on de pr senter les choses dont le d butant pourrait rapidement abuser 9 2 Exemple simple 9 Premiers objets Vous l avez compris il s agit ni plu
237. r Ps M pue Ly x f a cout lt lt 5 lt lt a 8 return 0 RE SES Ly 4 Il affiche maintenant 0 obj 1 obj 2 obj 3 obj 4 5 obj 6 Rep rez bien quel moment les objets sont d truits Constatez aussi qu il y a plus d appels au destructeur 7 qu au constructeur 5 nous n avons pas encore parl du constructeur pour les objets qui sont construits par copie 143 Ae NN 10 8 Destructeurs et tableaux 10 Constructeurs et Destructeurs 10 8 Destructeurs et tableaux Le destructeur est appel pour tous les l ments du tableau Ainsi if a b obj t 10 appellera 10 fois le constructeur vide en ligne 2 et dix fois le destructeur en ligne 4 Dans le cas d un tableau dynamique c est au moment du delete que les destructeurs sont appel s avant la d sallocation du tableau if a b obj x t new obj n n appels obj delete t n appels obj Attention il est possible d crire delete t sans les C est une erreur Cette syntaxe est r serv e une autre utilisation du new delete L utiliser ici a pour cons quence de bien d sallouer le tas mais d oublier d appeler les destructeurs sur les t i 10 9 Constructeur de copie Voyons enfin ce fameux constructeur Il n a rien de myst rieux Il s agit d un construc teur prenant en param tre un autre objet en g n ral en r f rence constante Le constr
238. r la notion de constructeur et de destructeur Ces notions sont tr s utiles m me pour le d butant qui devra au moins conna tre leur forme la plus simple Nous poursuivrons par un aspect bien pratique du C tant pour l efficacit des programmes que pour la d couverte de bugs la compilation une autre utilisation du const Enfin pour les plus avanc s nous expliquerons aussi comment les probl mes de gestion du tas peuvent tre ainsi automatis s 10 1 Le probl me Avec l apparition des objets nous avons transform struct point int x y E point a a x 2 a y 3 i a x j a y en class point int x y public void get int amp X int amp Y void set int X int Y point a a set 2 3 a get i j Cons quence point a 2 3 10 2 La solution 10 Constructeurs et Destructeurs est maintenant impossible On ne peut remplir les champs priv s d un objet m me l initialisation car cela permettrait d acc der en criture une partie priv e 10 2 La solution La solution est la notion de constructeur class point int x y public point int X int Y point point int X int Y x X y Y point a 2 3 Un constructeur est une m thode dont le nom est le nom de la classe elle m me Il ne retourne rien mais son type de retour n est pas void il n a pas de type de retour Le constructeur est appel la cr ation de l objet et ses param tres sont pass s avec
239. ramme ce qui est en g n ral r glable mais en tout cas moins que la m moire totale bien que beaucoup plus que la taille de la pile 98 7 La m moire 7 6 Assertions Il y a plusieurs facons de traduire en langage machine un source C Le r sultat de la compilation peut donc tre diff rent d un compilateur l autre Au moment de compiler on peut aussi rechercher produire un ex cutable le plus rapide possible on dit que le compilateur optimise le code En g n ral l optimisation n cessite un plus grand travail mais aussi des transformations qui font que le code produit n est plus facilement d buggable On choisit donc en pratique entre un code debuggable et un code optimis Jusqu ici nous utilisions toujours le compilateur en mode Debug Lorsqu un pro gramme est au point et seulement lorsqu il l est on peut basculer le compilateur en mode Release pour avoir un programme plus performant Dans certains cas les gains peuvent tre consid rables Un programmeur exp riment fait m me en sorte que l op timiseur puisse efficacement faire son travail Ceci dit il faut respecter certaines r gles Ne pas debugger quand on est en mode Release Rester en mode Debug le plus longtemps possible pour bien mettre au point le programme 7 6 Assertions Voici une fonction tr s utile pour faire des programmes moins bugg s La fonction assert pr vient quand un test est faux Elle pr cise le fichier
240. rat res 11 Cha nes de caract res fichiers 2 On peut chercher un caract re dans un cha ne size_t i s find h position de h dans s size_t j s find h 3 position de h dans s partir de la position 3 en ignorant s 0 s 2 Attention c est le type size_t qui est utilis et non int Consid rez le comme un entier mais pour lequel C choisit lui m me sur combien d oc tets il faut le m moriser Si le caract re n est pas trouv find retourne string npos une constante dont la valeur importe peu 3 On peut aussi chercher une sous cha ne size_t i s find hop ou est hop dans s size_t j s find hop 3 ou est hop dans s partir de la position 3 4 Ajouter une cha ne la fin d une autre string a comment string b ca va les amis string txt a b 5 Extraire une sous cha ne string s1 un deux trois string s2 string s1 3 4 sous cha ne de longueur 4 commen ant en s1 3 ici deux 6 Attention la r cup ration d une string au clavier coupe la cha ne si l on appuie sur la touche Entr e mais aussi au premier espace rencontr Ainsi si l on tape bonjour les amis le programme string s cin gt gt s Jusqu Entr e ou un espace r cup rera bonjour comme valeur de s et ventuellement les puis amis si l on programme d autres cin gt gt t Pour r cup rer la ligne compl te espace
241. ratiques A 6 Images Stocker une image noire et l afficher avec putGreyImage 0 0 t W H Idem avec une image blanche Idem avec un d grad du noir au blanc attention aux conversions entre byte et double Idem avec t i j 128 128 sin 4ri W sin 4r3 H cf figure A 7 Utiliser define _USE_MATH_DEFINES include lt cmath gt pour avoir les fonctions et les constantes math matiques M_PI vaut r 4 Couleurs Afficher avec putColorImage 0 0 r 9 b W H une image en couleur sto ck e dans trois tableaux r g et b rouge vert bleu Utiliser la fonction click pour attendre que l utilisateur clique avec la souris entre l affichage pr c dent et ce nouvel affichage A 6 3 Tableaux dynamiques 5 Dimensions au clavier Modifier le programme pr c dent pour que W et H ne soient plus des constantes mais des valeurs entr es au clavier Ne pas oublier de d sallouer A 6 4 Charger un fichier 6 Image couleur La fonction loadColorImage srcPath ppd jpg r g b W H charge le fichier ppd jpg qui est dans le r pertoire contenant les sources srcPath alloue elle m me les tableaux r g b les remplit avec les pixels de l image et affecte aussi W et H en cons quence Attention ne pas oublier de d sallouer les tableaux r g b avec delete apr s usage Charger cette image et l afficher Ne pas oublier les d sallocations 7 Image notr et blanc La fonction loadGreyI
242. rator B M thodes constantes void obj f const void g const objg8 x x f OK Constructeur class point int X y public point int X int Y point point int X int Y y Y point a 2 3 Constructeur vide obj 0bJ obj a Objets temporaires vec vec operator vec b return vec x b x y b y c vec 1 2 f vec 2 3 Destructeur obj obj Constructeur de copie obj o0bj const obje o Utilis par obj b a obj b a mieux que obj b b a param tres des fonctions valeur de retour Affectation obj amp obj operator const obj amp o return this Objets avec allocation dyna mique automatique cf sec tion 10 11 Accesseurs class mat double xx public doubles operator int i int j assert i gt 0 return x i Mx3 double operator int i int j const assert i gt 0 return x i Mx3 Compilation s par e include vect h aussi dans vect cpp Fonctions d clarations dans le h d finitions dans le CPP Types d finitions dans le h Ne d clarer dans le h que les fonctions utiles pragma once au d but du fichier Ne pas trop d couper STL min May complex lt double gt z pal scine string py Pr Elest 2 p second hop include lt list gt using namespace std Iistint gt Ls 1 push front 1 14 L Findt s L end
243. re davantage de Math matiques Pour l l ve programmer est un travail de technicien qu il n aura jamais faire lui m me n est pas aussi noble que les Math matiques bref n est pas digne de lui En fait les torts sont partag s Le professeur 4 Toute ressemblance avec des personnages r els ou imaginaires etc 5 Utiliser un ordinateur pour programmer a tout aussi mauvaise presse que de jouer aux jeux vid o Programmer est pourtant souvent un travail d quipe 6 avec tout le sens p joratif que ce terme peut avoir pour lui 8 1 Pr ambule ne r alise pas que ses leves ont un niveau avanc en maths parce qu ils en font depuis plus de dix ans et qu il 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 effectivement simple en regard de ce que ses leves savent faire en maths il n cessite une tournure d esprit compl tement diff rente et beaucoup de travail personnel devant la machine oublie qu il a le plus souvent appris seul quand il tait plus jeune en pro grammant des choses simples et ludiques Il devrait donc faire venir ses l ves la programmation par le c t ludique et non avec les m mes sem piternels exemples L l ve ne se rend pas compte que savoir programmer lui sera utile Il s agit pour tant d une base qui se retrouve dans tous les langages
244. res Je me souviens avoir appris la base 2 en grande section de maternelle avec des cubes en bois trange programme scolaire Et je ne dis pas a pour me trouver une excuse d tre devenu informaticien Quoique 21 Coin des coll giens suite en base 16 ou hexad cimal on compte avec 16 chiffres Il faut inven ter des chiffres au del de 9 et on prend A B C D E F Quand on compte cela donne 0 1 2 9 A B C D E F 10 11 12 13 19 1A 1B 1C Ainsi 1F en hexad cimal vaut 31 Avec 1 chiffre on compte de 0 15 soit 16 nombres possibles avec 2 chiffres de 0 255 soit 256 16 x 16 nombres possibles etc Un octet peut s crire avec 8 bits en binaire ou 2 nombres en hexad cimal et va de 0 255 ou 11111111 en binaire ou FF en hexad cimal 22 Dans ce cas sur plus de 2 chiffres 8 pour les processeurs 32 bits 16 pour les processeurs 64 bits 19 2 1 L ordinateur 2 Bonjour Monde adresse m moire contenu repr sente 00415A61 8B 00415A62 45 mov eax dword ptr a 00415463 F8 00415464 6B 00415465 CO imul eax eax 3 La m moire ne sert pas uniquement stocker la suite d instructions ex cuter mais aussi toutes les variables et donn es du programme les registres du micro processeur tant insuffisants Ainsi nos variables a b c sont stock es quelque part en m moire sur un nombre d octets suffisant pour repr senter des nombres entiers ici 4 octets et
245. rite const charx x 10xsizeof double f write const charx g sizeof double f close ifstream g hop bin ios binary g read charx x 10xsizeof double g read const charx ey sizeof double g close string s ifstream f s c_str include lt sstream gt using namespace std stringstream f Cha ne vers entier f lt lt s f gt gt 1 Entier vers cha ne f clear E lt lt f gt gt S ostream operator lt lt ostream f yr const pointep f lt lt p x lt lt lt lt p y return f istream operator gt gt istream amp f pointe p f gt gt p x gt gt p y return f hop lt int string gt A Entiers template lt int N gt class hop Template one i hop lt 3 gt A Fonctions A mettre dans le fichier qui utilise Conseils ou dans un h template lt typenam T maxi T a T b T gt Le type est trouv tout seul maxi 1 2 int maxi 2 3 double maxi a c string Objets template lt typenam class paire T x 2 public paire paire T a T b x 0 a x 1 b T add const y T gt template lt typename T gt T paire lt T gt add constj return x 0 1 x 11 Le type doit tre pr cis paire lt int gt a 1 2 int s a somme paire lt double gt b Multiples templat lt t
246. rogrammes A P Bien Ma tre Quel vieux fou Pour un peu il se prendrait pour Dieu La v rit c est qu il parle aux machines parce qu il ne sait pas parler aux hommes Il comble avec ses ordinateurs son manque de contact humain L informaticien type Il ne lui manque plus que des grosses lunettes et les cheveux gras Ma tre je ne suis pas s r d en avoir envie Je n y arriverai pas Ne le prenez pas mal mais je crois tre davantage dou pour les Math matiques Et puis quoi savoir programmer me servira t il M P Les vrais probl mes qui se poseront toi tu ne pourras toujours les r soudre par les Math matiques Savoir programmer tu devras A P J essaierai Je me demande s il a vraiment raison Je suis s r qu il doit tre nul en Maths Voil la v rit Oublions l ce dialogue aussi caricatural que maladroit Il montre pourtant claire ment la situation R sumons Pour celui qui sait programmer est un jeu d enfant est indispensable est une activit cr atrice et panouissante Pour celui qui apprend programmer est difficile ne sert rien est une activit ingrate qui favorise le renfermement sur soi m me Dans le cas o l l ve est ing nieur nous pouvons compl ter le tableau Pour le professeur apprendre programmer devrait tre simple et rapide pour un l ve ing nieur est plus utile qu apprend
247. rreur En r sum une fois les lignes 14 et 16 supprim es ce passionnant programme af fiche 21233455 2147483647 Les noms de variable sont compos s uniquement des caract res a z et majus cules chiffres et underscore _ vitez celui ci il n est pas tr s esth tique mais ne peuvent pas commencer par un chiffre N utilisez pas de caract res accentu s car cela pose des probl mes de portabilit Port e Dans l exemple pr c dent les variables ont t d finies au fur et mesure des be soins Ce n est pas une vidence Par exemple le C ne permettait de d finir les variables que toutes d un coup au d but du main En C on peut d finir les variables en cours de route ce qui permet davantage de clart Mais attention 8 Le nom d une variable est aussi appel identificateur Les messages d erreur du compilateur utilise ront plut t ce vocabulaire 9 Ainsi un entier ne vaut pas O lorsqu il est cr et les octets o il est m moris gardent la valeur qu il avaient avant d tre r quisitionn s pour stocker l entier en question C est une mauvaise id e d utiliser la valeur d une variable qui vaut n importe quoi et un compilateur mettra g n ralement un warning si on utilise une variable avant de lui fournir une valeur 10 du moins sur une machine 32 bits cf remarque pr c dente sur INT MAX 33 3 1 Tout dans le main 3 Premiers programmes les variables n exist
248. s compris il faudra faire un getline cin s Toute la ligne jusqu Entr e On pourra ventuellement pr ciser un autre caract re que la fin de ligne getline cin s Tout jusqu un non compris 7 Convertir une string en une cha ne au format C le C m morise ses cha nes dans des tableaux de caract res termin s par un 0 Certaines fonctions prennent encore en param tre un char ou un const charx Il faudra alors leur passer s c_str pour convertir une variable s de type string cf section 11 2 2 1 En r alit il faut utiliser le type string size_ type 2 Nous n avons pas encore vu le r le de const avec les tableaux 156 11 Cha nes de caract res fichiers 11 2 Fichiers string s hop hop const char xt s c_str Vous trouverez d autres fonctions dans l aide en ligne de votre environnement de d ve loppement ou tout simplement propos es par celui ci quand vous utiliserez les string 11 2 Fichiers 11 2 1 Principe Pour lire et crire dans un fichier on proc de exactement comme avec cout et cin On cr e simplement une variable de type ofstream pour crire dans un fichier ou de type ifstream pour lire 1 Voici comment faire include lt fstream gt using namespace std ofstream f hop txt f lt lt 1 lt lt 7 lt lt 2 3 lt lt f close r t lt lt salut lt lt endl ifstream g hop txt int i double x string s
249. s le cas il est grand temps de le faire D finissez par exemple const int nbcases 5 longueur de la combinaison const int nbcoul 4 nombre de couleurs diff rentes Reprenez le code que vous avez d ja crit en utilisant ces constantes Il est tres important de stocker les param tres constants dans des variables cela fait gagner beaucoup de temps lorsque l on veut les modifier 6 Saisie d une combinaison au clavier La fonction suivante que nous vous demanderons d admettre saisit une cha ne de caract res string au clavier et remplit le tableau combil avec les chiffres que les nbcases premiers caract res de la cha ne repr sentent void getCombinaison int combi nbcases cout lt lt Votre essai string s cin gt gt s for int i 0 i lt nbcases i combi i s i 0 Attention le cin ne fonctionne pas depuis le terminal int gr de QtCreator d ailleurs la fen tre s appelle Application Output ne supporte pas l Input il faut lui dire d utiliser un terminal externe Aller dans l onglet Projects rubrique Run et cli quer le bouton Run in Terminal 200 A Travaux Pratiques A 3 Tableaux Dans le cadre de notre Mastermind il s agit de modifier cette fonction pour qu elle contr le que la cha ne rentr e est bien de bonne taille et que les chiffres sont bien entre 0 et nbcoul 1 L essai devra tre redemand jusqu ce que la combinaison soit valide On utilisera entr
250. s ni moins de ranger les fonctions dans les objets Attention crions tout de suite haut et fort qu il ne faut pas abuser des objets surtout lorsqu on est d butant Les dangers sont en effet de voir des objets l o il n y en n a pas Instructions et donn es ne sont pas toujours li es de mal penser l organisation des donn es ou des instructions en ob jets Un conseil donc quand a devient trop compliqu pour vous abandonnez les objets Ce qui ne veut pas dire qu un d butant ne doit pas faire d objets Des petits objets dans des cas simples sont toujours une bonne id e Mais seule l exp rience permet de correctement organiser son programme avec les bons objets les bonnes fonctions etc Un exemple simple lorsqu une fonction travaille sur deux types de donn es le d butant voudra souvent s acharner en faire malgr tout une m thode de l un des deux objets et transformer objl a obj2 b int i f a b f appliqu e a a et b en objl a obj2 b int i a f b m thode f de a appliqu e a b Est ce bien la chose faire Seuls un peu de recul et d exp rience permettent de rester simple quand il le faut Le premier code tait le plus logique la fonction f n a souvent rien faire chez a ni chez b 9 2 Exemple simple On l aura compris dans les exemples pr c dents les m thodes des objets sont consi d r es comme faisant partie du type
251. sant au bout de 250 pas de temps d affichage Le gagnant est le premier qui r ussit atteindre l autre Conseils pratiques positionner sym triquement les joueurs par rapport au centre de pr f rence mi hauteur en laissant une marge d un huiti me de la largeur sur le c t utiliser la fonction GetMouse pour conna tre la position de la souris en d duire la vitesse d sir e par le joueur en retranchant ces coordonn es celles du centre de la boule lancer et en multipliant par un facteur 0 00025 Am liorations Faire en sorte qu il y ait syst matiquement un gros soleil au centre de l cran de masse non n cessairement cons quente afin d emp cher les tirs directs Initialisation correcte Modifier la fonction de placement des soleils de fa on ce que les soleils ne s in tersectent pas initialement et qu ils soient une distance minimale de 100 pixels des emplacements des joueurs Chocs lastiques Tout faire voluer tout faire rebondir On retourne dans le projet Gravitation Tout faire bouger y compris les soleils 210 A Travaux Pratiques A 5 Fichiers s par s Imagine FIGURE A 6 Corps c lestes et jeu de tir Utiliser pour les chocs lastiques la fonction Chocs qui fait rebondir les deux corps Faire en sorte que lors de l initialisation les soleils ne s intersectent pas 211 A 6 Images A Travaux Pratiques A 6 Images
252. st l appel r p t rand et modulo pour tirer un nombre au hasard On aura souvent besoin de tirer des nombres au hasard dans un certain intervalle et il est naturel de le faire avec une fonction Au passage nous corrigeons une deuxieme chose qui choque les entiers 300 et 200 reviennent souvent Si nous voulons changer les dimensions de la fen tre il faudra remplacer dans le pro gramme tous les 300 et tous les 200 Il vaudrait mieux mettre ces valeurs dans des variables et faire d pendre le reste du programme de ces variables C est un d faut constant de tous les d butants et il faut le corriger tout de suite Il faut d s le d but d un programme rep rer les param tres constants uti lis s plusieurs reprises et les placer dans des variables dont d pendra le programme On gagne alors beaucoup de temps quand on veut les modi fier par la suite a Encore la r gle du moindre effort Si on fait trop de copier coller ou de remplacer avec l diteur c est mauvais signe Bref notre programme devient Nombre entre 0 et n 1 int hasard int n return rand n int main 22 part videmment la syntaxe objet des variables de type Color pour lesquelles on se permet un Color r v b bien en avance sur ce que nous sommes cens s savoir faire 42 3 Premiers programmes 3 2 Fonctions const int w 300 h 200 openWindow w h for int i 0 i lt 150 i int x1 hasar
253. stantes const int s 12 Port e int i i j int j 2 i j OK if 3 gt 1 int k 3 OK interdit j k i k Types int i 3 double x 12 3 char c A string s hop bool t true float y 1 2f unsigned int 3 4 signed char d 128 unsigned char d 25 complex lt double gt 2 2 3 interdit Variables globales int ri const int m 12 void f n 10 int i m OK OK Conversion int i int x 3 float x float i 3 Tests Comparaison ke lt gt lt gt N gation Combinaisons if i 0 3 1 if i 0 j 1 else 3 2 bool t i 0 if t j 1 switch i Case 1 LE 7 break case 2 case 3 7 break default y Tableaux D finition double x 5 y 5 for int 1 0 155714 y il 2 x 1 const int n 5 int ilal Jln Initialisation int t 41 11 2 3 4 5 string s 21 1 ab e Py Affectation fat S1S1 11 231 517 for int 1 071 lt 35 144 ctll s il En param tre void init int t 41 for int 1 0 1 lt 4 i tl1I 07 void init int t inte nj for int 1 0 1 lt n31 t i 0 Boucles do while ok int i l while i lt 100 i i 1 for int i 1 i lt 10 i for int 1 1 3 10 J gt 1i i i 2 j j 3 Fonctions D finition int plus int a
254. stream gt using namespace std cout lt lt I lt lt i lt lt endl cin gt gt i gt gt j Divers j 3 j i n Modulo include lt cstdlib gt i rand n x rand double RAND_MAX include lt ctime gt Un seul appel srand unsigned int time 0 include lt cmath gt double sqrt double x double cos double x double sin double x double acos double x include lt string gt using namespace std string s hop char c s 0 int l s size include lt ctime gt s double clock CLOCKS_PER_SEC struct Point double x y NON Point a a 1 2 NON include tp cpp NON int f int t 1 1 NON int t 2 31 NON tl lso Y NON int Es t 1 NON intx t new int 2 intx s new int 2 define _USE MATH DEFINE include lt cmath gt double pi M PI Erreurs fr quentes Pas de d finition de fonction dans une fonction int q r 4 NON if i 2 NON if i 2 NON if i 2 then NON i 0 i lt 100 i NON int fass int i f NON double x 1 3 NON int i j x 1 3 NON x double 1 3 NON double x 10 1 y 10 for int i 1 i lt 10 1 y 1 2x x i 5 NON for int int int n 5 tin NON 4 NON int t 4 int return t NON int t 4 t int s 3 1 2 3 t 3 t s NON int ElZ2
255. struct Point int i m OK int tmp a double x y a b b tmp A Color c Conversion J int i int x j swap x y a x 2 3 a y 3 4 Pile Tas Surcharge a c Red Type num r int hasard int n Point b 1 2 5 Blue enum Dir N E S W int hasard int a Une structure est un objet en void avance Dir d int b ti rement public gt cf ob variables statiques double hasard jets int FO Op rateurs static bool once true Variabl vect operator M if once vect A vect B D finition once false int i int k 1 m ray Affectation vect C A B 1 2 183 12 7 Fiche de r f rence 12 Fonctions et classes param tr es templates Fiche de r f rence 3 6 Objets struct obj int x champ int f m thode int g int y y int ObJ E int i g 3 mon g int j x i mon x return j int main obj a a x 3 int i a f class obj int x y void a moi public ine z void pour _tous void autre obj A void obj a_moi E OK Yi OK Sd OK void obj pour_tous OK OK X 2 a_moi void autre obj A X A X OK A a_moi OK int main obj A B o 5 NON RAS OK A a_moi NON A pour_tous OK A autre B OK class obj obj operator obj B y int main obj A B C C A B C A ope
256. t Soit N u 7 a u 7 g u le carr de la distance en question On a N u P a t P B t u 740 Y s t Ce qui donne avec des notations suppl mentaires Nu AT t Uu HAF t AT t u t AT 1 La norme toujours positive est minimale au point u tel que N u 0 soit AP t AT t tm ATO Donc 1 si tm lt t le minimum est atteint en t 2 sit lt tm lt t dt le minimum est atteint en tn 3 sinon t dt lt tm le minimum est atteint en t dt Ce qui nous donne explicitement et simplement la plus petite distance atteinte entre les deux corps entre t et t dt 207 A 5 Fichiers s par s A Travaux Pratiques A 5 Fichiers s par s Nous allons poursuivre dans ce TP les simulations de gravitation et de chocs las tiques entam es la semaine derni re en s parant dans diff rents fichiers les diff rentes fonctions et structures utilis es 1 De bonnes bases Reprenez le travail en cours de la semaine derni re Si vous avez t au bout de celui ci ou au moins jusqu la question 7 incluse faites en une sauvegarde s par e pour pouvoir vous y reporter si les travaux entrepris dans ce TP ont tendance tout casser A 5 1 Fonctions outils 2 Un fichier de d finitions Ajouter un nouveau fichier source nomm Tools cpp au projet Y placer les fonctions fournies l avance au d but du TP4 InitRandom Random Choc ChocSimple et
257. t double x Mx N public inline double amp operator int i int j return x i Mxj inline double operator int i int j const return x i Mxj y 11 5 Assertions Rappelons l existence de la fonction assert vue en 7 6 Il ne faut pas h siter s en servir car elle facilite la compr hension du code r pond la question quels sont les pr suppos s ce point du programme et facilite le diagnostic des erreurs Sachant qu elle ne co te rien en mode Release car non compil e il ne faut pas se priver de l utiliser Voici par exemple comment rendre s rs nos accesseurs include lt cassert gt class mat double x Mx N public inline double amp operator int i int j assert i gt 0 amp amp i M amp amp j gt 0 amp amp j N return x i Mxj inline double operator int i int j const assert i gt 0 amp i M amp amp j gt 0 amp amp j N return x i Mxj 165 11 6 Types num r s 11 Cha nes de caracteres fichiers 11 6 Types num r s C est une bonne id e de passer par des constantes pour rendre un programme plus lisible const int nord 0 est 1 sud 2 0uest 3 void avance int direction mais il est maladroit de faire ainsi Il vaut mieux conna tre l existence des types num r s enum Dir nord est sud ouest void avance Dir direction Il s agit bien de d finir un nouveau type qui en r alit masque des entiers Une pr cision
258. t CMakeLists txt Le dossier build que vous avez choisi au d marrage de Cmake Le plus important est le premier puisque le deuxi me peut toujours tre r g n r avec Cmake N envoyez votre enseignant que le r pertoire source il recompilera lui m me Votre build lui est probablement inutile car il n utilise pas le m me syst me que vous Ainsi quand vous avez termin un projet ou un TP n h sitez pas nettoyer en supprimant votre dossier build mais gardez pr cieusement votre dossier source c est celui ci qui repr sente le r sultat de votre travail Bien que Cmake autorise d utiliser un m me r pertoire pour les deux c est viter pour bien s parer les sources et les fichiers g n r s automatiquement A 1 2 Premi res erreurs 1 Modifier le programme Modifier le programme en changeant par exemple la phrase affich e a Tester une nouvelle g n ration ex cution V rifier que Visual Studio sauve le fichier automatiquement avant de g n rer b Modifier nouveau le programme Tester directement une ex cution Visual Studio demande automatiquement une g n ration Lancer directement une ex cution sauve et g n re automatique ment Attention toutefois de ne pas confirmer l ex cution si la g n ration s est mal pass e 2 Erreurs de compilation Provoquer constater et apprendre reconna tre quelques erreurs de compilation a includ au lieu de include b ost r
259. t hasard int a int hb double hasard Op rateurs vect operator vect A vect B vect C A B Pile des appels It ratif R cursif 100 7 La m moire 7 8 Fiche de r f rence Fiche de r f rence 2 2 Tableaux D finition double x 5 y 5 for int i1 0 1 lt 5 1 y i1 2x x 1 5 const int n 5 int i n1 3 2x xn1 Ihnitialisation int t 4 1 2 3 4 string s 2 ab c Affectation int s 3 1 2 3 t 31 for int i 0 i lt 3 i tlil s 111 En param tre void init int t 4 for int i 0 i lt 4 i t i 0 void init int tl int n for int i 0 i lt n i t i 0 Taille variable int t new int n 1 deletel t Structures struct Point double x y Color Point a a x 2 3 a c Red Point b 1 2 5 Blue a y 3 4 Compilation s par e include vect h aussi dans vect cpp Fonctions d clarations dans le h d finitions dans le CPP Types d finitions dans le h Ne d clarer dans le h que les fonctions utiles i ie 1 2 J 3 Modulo include lt cstdlib gt j i n i rand n x rand double RAND_ MAX include lt ctime gt Un seul appel srand unsigned int time 0 include lt cmath gt double sqrt double x double cos double x double sin double x double acos double x
260. t i return s int t1 4 double s1 somme t1 4 intx t2 new int n double s2 somme t2 n delete t2 8 2 2 Erreurs classiques Vous comprenez maintenant aussi les erreurs classiques suivantes que vous n vi terez pas pour autant 1 2 3 Oublier d allouer int t for int i 0 i lt n i t i Horreur t vaut n importe quoi comme adresse Oublier de d sallouer void f int n int t new int n On oublie delete t Chaque appel f va perdre n int dans le tas Ne pas d sallouer ce qu il faut int t new int n intx s new int n s t Aie Du coup s contient la m me adresse que t On n a pas recopi la zone point e par t dans celle point e par s delete t OK delete s Cata Non seulement on ne lib re pas la m moire 107 D NI O1 amp ND 8 2 Allocation dynamique 8 Allocation dynamique initialement m moris e dans s mais en plus on d salloue nouveau celle qui vient d tre lib r e 8 2 3 Cons quences Quand lib rer Maintenant que vous avez compris new et delete vous imaginez bien qu on n at tend pas toujours la fin de l existence du tableau pour lib rer la m moire Le plus t t est le mieux et on lib re la m moire d s que le tableau n est plus utilis void f int t 10 int s new int n delete s si s ne sert plus dans la suite Autant lib rer maintenant
261. t impossible qu un process bugg puisse modifier ses instructions ou la m moire d un autre process en crivant un mauvais endroit de la m moire Avec l arriv e des syst mes d exploitation les fichiers ex cutables ont du s adapter pour de nombreuse raisons de gestion et de partage de la m moire En pratique un programme ex cutable linux ne tournera pas sous Windows et r ciproquement m me s ils contiennent tous les deux des instructions pour le m me processeur Un fichier ex cutable est sp cifique non seulement un processeur donn mais aussi un syst me d exploitation donn Au mieux tout comme les versions successives d une famille de processeur essaient de continuer comprendre les instructions de leurs pr d cesseurs tout comme les versions successives d un logiciel essaient de pouvoir lire les donn es produites avec les versions pr c dentes les diff rentes versions d un syst me d exploitation essaient de pouvoir ex cuter les programmes faits pour les versions pr c dentes C est la com patibilit ascendante que l on paye souvent au prix d une complexit et d une lenteur accrues 2 3 La Compilation Tout en essayant de comprendre ce qui se passe en dessous pour en tirer des infor mations utiles comme la gestion de la m moire nous avons entrevu que transformer 40 Les processeurs ont videmment volu pour aider le syst me d exploitation faire cela efficacem
262. t juste les lignes 11 et 12 qui font tout Il s agit par contre d un bon exemple pour illustrer notre propos Une bonne fa on d expliquer exhaustivement son d roulement est de remplir le ta bleau suivant d j rencontr au TP A 2 En ne mettant que les lignes o les variables changent en supposant que l utilisateur rentre 23 et 3 au clavier et en indi ant avec des lettres les diff rentes tapes d une m me ligne cela donne Ligne num denom quotient reste a b r qa reta Po 4 quo res 18 21 23 3 23 23 3 24a 23 3 9 23 3 23 3 reste 10 23 3 23 3 reste 11 23 3 23 3 reste 7 12 23 3 2 23 3 reste 7 13a 23 3 2 23 3 reste 7 4 23 3 2 23 3 reste 7 23 3 7 2 5 23 3 2 23 3 reste 7 23 3 7 2 7 23 3 2 23 3 reste 7 13b 23 3 2 23 3 reste 7 14 23 3 2 123 3 reste 7 7 15 23 3 2 7 24b 23 3 7 2 7 25 23 3 7 2 28 A posteriori on constate qu on a implicitement suppos que lorsque le programme est en train d ex cuter divise la fonction main et ses variables existent encore et qu elles attendent simplement la fin de divise Autrement dit Un appel de fonction est un m canisme qui permet de partir ex cuter mo mentan ment cette fonction puis de retrouver la suite des instructions et les variables qu on avait
263. t time 0 int Random int a int b return a rand b a 1 TESELIIIA A AAA PRIE TC EI IIA ATL Permuter les lettres interieures de s n fois string Melanger string s int n int l int s size if 1 lt 3 return s string t s for int i 0 i lt n i int a Random 1 1 2 int b do b Random 1 1 2 while a b char c t la t al t b return t int main const int n 11 string phraseln Cette petite phrase devrait tre InitRandom t b c encore lisible pour votre paurre cerveau 64 48 49 50 51 52 53 4 Les tableaux 4 5 TP GAGNE FIGURE 4 2 Master mind for int i 0 i lt n i cout lt lt Melanger phrase i 3 lt lt cout lt lt endl mom LL 1 return 0 4 5 TP Nous pouvons maintenant aller faire le troisi me TP donn en annexe A 3 afin de mieux comprendre les tableaux et aussi pour obtenir un master mind voir figure 4 2 le r sultat d une partie int ressante 4 6 Fiche de r f rence Comme promis nous compl tons en rouge la fiche de r f rence avec ce qui a t vu pendant ce chapitre et son TP 65 4 6 Fiche de r f rence 4 Les tableaux Fiche de r f rence 1 2 Variables D finition int 15 int k 1 m Affectation i 2 j i k 1 3 Initialisation int n 5 o n Con
264. t utiles pour le suivre 2 4 1 Noms de fichiers L extension le suffixe sert se rep rer dans les types de fichier Un fichier source C se terminera par cpp Un fichier objet sera en obj Windows ou o Linux Mac Un fichier ex cutable en exe Windows ou sans extension Linux Mac Nous verrons aussi plus loin dans le cours Les en t te C ou headers servant tre inclus dans un fichier source fichiers Rial Les biblioth ques ensembles de fichiers objets archiv s en un seul fichier fi chiers lib ou d11 Windows ou a ou so Linux Mac 2 4 2 Debuggeur Lorsqu un programme ne fait pas ce qu il faut on peut essayer de comprendre ce qui ne va pas en truffant son source d instructions pour imprimer la valeur de certaines donn es ou simplement pour suivre son d roulement Ca n est videmment pas tres pratique Il est mieux de pouvoir suivre son d roulement instruction par instruction et d afficher la demande la valeur des variables C est le r le du debuggeur Lorsqu un langage est interpr t il est relativement simple de le faire s ex cute pas pas car c est le langage lui m me qui ex cute le programme Dans le cas d un langage compil c est le micro processeur qui ex cute le programme et on ne peut pas l arr ter chaque instruction Il faut alors mettre en place des points d arr t en modifiant tem porairement le code machine du programme pour que le processeur s
265. tante c est une bonne id e de le remplacer par const obj amp o a En r alit le programme s en trouvera acc l r pour la plupart des objets courants 10 6 2 M thodes constantes Consid rons le programme suivant void g int amp x cout lt lt x lt lt endl 140 10 Constructeurs et Destructeurs 10 6 R f rences Constantes void f const int y double z y OK ne modifie pas y 8 y OK int a 1 f a La fonction f ne modifie pas son param tre y et tout va bien Imaginons une deuxi me version de g void g int amp x X Alors y serait modifi e dans f cause de l appel g Le programme ne se compi lerait videmment pas En r alit la premiere version de g serait refus e elle aussi car pour savoir si une sous fonction modifie ou non un des param tres d une fonction le compilateur ne se base que sur la d claration de cette sous fonction et non sur sa d finition complete a Le C n essaie pas de deviner lui m me si une fonction modifie ses param tres puisque la logique est que le programmeur indique lui m me avec const ce qu il veut faire et que le compilateur v rifie que le programme est bien coh rent Bref notre premier programme ne se compilerait pas non plus car l appel g y avec const int amp y impose que g soit d clar e void g const int amp x Le bon programme est donc void g const
266. te 12 Fonctions et classes param tr es templates a b b tmp int a 2 b 3 double x 2 1 y 2 3 echange a b instancie T en int echange x y instancie T en double Autre exemple Maximum de deux variables a condition que operator gt existe pour le type T template lt typename T gt T maxi T a T b return a gt b a b La d claration typename T pr cise le type g n rique On peut en pr ciser plusieurs Cherche e1 dans le tableau tabl et met dans e2 l element de tab2 de meme indice Renvoie false si non trouv template lt typename T1 typename T2 gt bool cherche T1 e1 T2 amp e2 const Tlx tabl const T2 tab2 int n for int i 0 i lt n i if tabl il el e2 tab2 i return true return false string noms 3 jean pierre paul int ages 3 21 25 15 string nm pierre int ag if cherche nm ag noms ages 3 it n m cout lt lt nm lt lt _a lt lt ag lt lt ans lt lt endl 12 1 2 template et fichiers Il faut bien comprendre que Le compilateur ne fabrique pas une fonction magique qui arrive tra vailler sur plusieurs types Il cr e en r alit autant de fonctions qu il y a d utilisations de la fonction g n rique avec des types diff rents ie d ins tanciations 172 12 Fonctions et classes param tr es templates 12 1 template Pour ces raisons 1 Faire des fonctions tem
267. ter int j x i champ x de l objet dont la m thode f est en train de Ss ex cuter return j int main objl al a2 int il al f Cet appel va utiliser al g ligne 2 et al x ligne 4 int i2 a2 f Cet appel va utiliser ligne 2 a2 g et a2 x ligne 4 Il est d ailleurs normal qu un objet accede simplement ses champs depuis ses m thodes car si un objet n utilise pas ses champs dans une m thode c est probablement qu on est en train de ranger dans cet objet une fonction qui n a rien voir avec lui cf abus mentionn plus haut 9 4 Exemple des matrices En programmation un exemple de source vaut mieux qu un long discours Si jus qu ici vous naviguiez dans le vague les choses devraient maintenant s claircir Voil donc ce que devient notre exemple du chapitre 8 avec des objets include lt iostream gt include lt string gt using namespace std fonctions sur les matrices 120 9 Premiers objets 9 4 Exemple des matrices pourraient etre dans un matrice h et matrice cpp declarations dans le h struct Matrice int mn doublex t void cree int ml int nl void detruit double get int i int j void set int i int j double x void affiche string s Js Matrice operator Matrice A Matrice B I _ d finitions dans le cpp void Matrice cree int ml int n1 Notez que les parametres ne s appellent plus met
268. th image jpg g largeur hauteur cerr lt lt Impossible d ouvrir le fichier lt lt srcPath image jpg lt lt endl exit 1 Dessine avec coin haut gauche en 0 0 222 B Imagine B 3 Images putGreyImage 0 0 g largeur hauteur delete l g Ne pas oublier A noter srcPath d fini dans Common qui indique de chercher dans le dossier conte nant les fichiers source En fait pour viter de g rer soi m me la m moire des images il existe une classe d di e cela B 3 Images Le module Images g re le chargement la manipulation et la sauvegarde des images Image lt byte gt im Image en niveaux de gris if load im srcPath fichier_image png cerr lt lt Impossible 4 ouvrir_ le fichier lt lt srcPath fichier_image png lt lt endl exit 1 display im Dessine dans la fen tre active im 0 0 128 Met le pixel en gris save im fichier_image2 png Sauvegarde l image dans un fichier Attention la recopie et l affectation op rateur sont des op rations peu co teuses qui en fait ne font qu un lien entre les images sans r elle copie Ce qui fait que la modification de l une affecte l autre Image lt Color gt im1 100 100 Image lt Color gt im2 iml Constructeur par recopie im1 10 10 CYAN assert im2 10 10 CYAN im2 a t affect e Pour faire une vraie copie plut t qu un lien on utilise im2 im
269. tions d finies dans hop cpp sont coh rentes avec leur d claration dans hop h et bien que a soit pas obligatoire on inclut aussi l en t te dans le source ce qui donne Fichier hop cpp include hop h D finitions void f int x int g 1 Autres fonctions 7 On peut aussi pr ciser au compilateur une liste de r pertoires o il peut aller chercher les fichiers d en t te voir la section 6 1 8 81 6 1 Fichiers s par s 6 Plusieurs fichiers En pratique le fichier d en t te ne contient pas seulement les d clarations des fonc tions mais aussi les d finitions des nouveaux types comme les structures utilis s par le fichier s par En effet ces nouveaux types doivent tre connus du fichier s par mais aussi du fichier principal Il faut donc vraiment 1 Mettre dans l en t te les d clarations des fonctions et les d finitions des nouveaux types 2 Inclure l en t te dans le fichier principal mais aussi dans le fichier s par Cela donne par exemple Fichier vect h Types struct Vecteur double x y ES D clarations double norme Vecteur V Vecteur plus Vecteur A Vecteur B Fichier vect cpp include vect h Fonctions et types D finitions double norme Vecteur V Vecteur plus Vecteur A Vecteur B Autres fonctions Fichier main cpp du premier include vect h int main Utilisation V
270. tique void affiche2 int t int n for int i 0 i lt n i cout lt lt t i lt lt endl 57 12 13 14 15 NI O1 B amp ND 4 4 R cr ations 4 Les tableaux int t1 2 1 2 int t2 3 3 4 5 affiche2 t1 2 OK affiche2 t2 3 OK 4 3 2 Affectation C est simple Affecter un tableau ne marche pas Il faut traiter les l ments du tableau un par un Ainsi le programme int s 4 1 2 3 4 t 4 t s ERREUR de compilation ne marche pas et on est oblig de faire int s 4 1 2 3 4 t 4 for int i 0 i lt 4 i t il s i OK Le probleme c est que Affecter un tableau ne marche jamais mais ne g n re pas toujours une er reur de compilation ni m me un warning C est le cas entre deux para m tres de fonction Nous comprendrons plus tard pourquoi et l effet exact d une telle affectation Fonction qui ne marche pas Mais qui compile tr s bien void setl int s 4 int t 4 t s Ne fait pas ce qu il faut mais compile sans warning Fonction qui marche et qui compilel void set2 int s 4 int t 4 for int i 0 i lt 4 i t il s il OK int s 4 1 2 3 4 t 4 setl s t Sans effet set2 s t OK 58 NI O1 B amp ND 4 Les tableaux 4 4 R cr ations FIGURE 4 1 Des balles qui rebondissent momentan ment fig es Allez sur la page du cours pour un programme anim
271. ts programmer mais pas a utiliser Le C offre un cer tain nombre de fonctions et de classes utilisant les template Cet ensemble est commu n ment d sign sous le nom de STL Standard Template Library Vous en trouverez la documentation compl te sous Visual ou d faut sur Internet Nous exposons ci dessous quelques exemples qui devraient pouvoir servir de point de d part et faciliter la compr hension de la documentation Des fonctions simples comme min et max sont d finies de fa on g n rique int i max 1 3 double x min 1 2 3 4 Attention une erreur classique consiste appeler max 1 2 3 le compilateur l inter prete comme le max d un int et d un double ce qui provoque une erreur Il faut taper max 1 2 3 Les complexes sont eux aussi g n riques laissant variable le choix du type de leurs parties r elle et imaginaire include lt complex gt using namespace std complex lt double gt z1 1 1 3 4 z2 1 0 2z3 z3 zZ1 z2 cout lt lt z3 lt lt endl double a z3 real b z3 imag double m abs z3 module double th arg z3 argument Les couples sont aussi offerts par la STL pair lt int string gt P 2 hop P first 3 P second hop Enfin un certain nombre de structures de donn es sont fournies et s utilisent suivant un m me sch ma Voyons l exemple des listes include lt list gt using namespace std list lt int gt 1 4 f l push_front 2 l 2 l pus
272. tte dans une fonction void BougeRaquette int amp x int sens puis appeler cette fonction dans la boucle principale pour chacune des deux ra quettes Evidemment faire en sorte que les raquettes ne puissent sortir de la fe n tre 4 Rebonds sur les raquettes S inspirer de la gestion des rebonds de la balle Ici il faut non seulement v rifier si la balle va atteindre le bas ou le haut de l cran mais aussi si elle est assez proche en abscisse de la raquette correspondante 5 Comptage et affichage du score Modifier la fonction BougeBalle afin de comptabiliser le score des deux joueurs et l afficher dans la console 6 Pour ceux qui ont fini Lors d un rebond sur la raquette modifier l inclinaison de la trajectoire de la balle en fonction de la vitesse de la raquette ou de l endroit de frappe Vous devriez avoir obtenu un programme ressemblant celui de la figure A 2 198 A Travaux Pratiques A 3 Tableaux aa Tp3_Anal b bash x y Os La combinaison que vous devez trouver fait 5 chiffres de long Ces chiffres sont compris entre O et 3 Vous avez droit a 10 essais Essai 1 0 Combinaison impossible Recommencez Essai 1 123123 Combinaison impossible Recommencez Essai 1 00000 00000 0 0 Essai 2 11111 11111 2 0 Essai 3 22222 22222 2 0 Essai 4 11223 11223 3 2 Essai 5 11232 11232 2 3 Essai 6 13221 13221 3 2 Essai 7 31221 31221 5 0 VOUS AVEZ GAGNE
273. ttoyer en quittant Erreurs et warnings cliquer Indenter Ne pas laisser de warning Utiliser le debuggeur Faire des fonctions 52 4 Les tableaux Chapitre 4 Les tableaux Tout en continuant a utiliser les fonctions pour les assimiler nous allons rajouter les ta bleaux qui sinon nous manqueraient rapidement Nous n irons pas trop vite et ne verrons pour l instant que les tableaux une dimension et de taille fixe Nous tudierons dans un autre chapitre les tableaux de taille variable et les questions de m moire pile et tas 4 1 Premiers tableaux De m me qu on a tout de suite ressenti le besoin d avoir des boucles pour faire plusieurs fois de suite la m me chose il a t rapidement utile de faire plusieurs fois la m me chose mais sur des variables diff rentes D o les tableaux Ainsi le pro gramme suivant int x1 y1 ul v1 Balle int x2 y2 u2 v2 Balle int x3 y3 u3 v3 Balle int x4 y4 u4 v4 Balle AUNKE BougeBalle x1 y1 ul v1 BougeBalle x2 y2 u2 v2 BougeBalle x3 y3 u3 v3 BougeBalle x4 y4 u4 v4 pourra avantageusement tre remplac par int x 4 y 4 u 4 v 41 Balles lui int i 0 i lt 4 i BougeBalle x i y i u il v i dans lequel int x 4 d finit un tableau de 4 variables de type int x 0 x 1 x 2 et x 3 En pratique le compilateur r serve quelque part en m moire de quoi stocker les 4 variables en question et g re de q
274. u fichier Balle cpp Il ne devrait plus rester dans Gravitation cpp d autre fonction que main D clarer dans Balle h les fonctions d finies dans Balle cpp Ajouter les include n cessaires dans ce dernier fichier et dans Gra vitation cpp et faire les adaptations n cessaires par exemple si des fonctions utilisent largeur ou hauteur comme ces constantes ne sont d finies que dans Gravitation cpp il faut les passer en argument A 5 4 Retour la physique Des soleils par milliers Placer 10 soleils al atoirement et en tenir compte l affichage dans le calcul du d placement de l ast roide Diminuer le pas de temps de calcul Afin d viter les erreurs dues la discr tisation du temps diminuer le pas de temps dt pour le fixer 0 01 voire 0 001 si la machine est assez puissante R gler la fr quence d affichage en cons quence inversement proportionnelle dt Lancer plusieurs fois le programme Chocs lastiques simples Faire rebondir l ast ro de Faire subir des chocs lastiques l ast roide chaque fois qu il s approche trop 209 A 5 Fichiers s par s A Travaux Pratiques 12 13 14 15 16 17 d un soleil de fa on ce qu il ne rentre plus dedans fonction ChocSimple et r tablir dt une valeur plus lev e par exemple 0 1 modifier la fr quence d affichage en cons quent Pour savoir si deux corps sont sur le point d entrer en collision utiliser l
275. ucteur de copie Se d clare obj obj const obj amp o Est utilis videmment par obj a obj b a b partir de a Mais aussi par obj a obj b a b partir de a synonyme de b a ne pas confondre avec obj a b b a ceci n est pas un constructeur Et aussi pour construire les param tres des fonctions et leur valeur de retour Notre programme exemple est enfin complet En rajoutant obj obj const obj o cout lt lt copy 144 10 Constructeurs et Destructeurs 10 10 Affectation il affiche 0 obj 1 obj 2 obj 3 obj 4 copy 5 obj 6 copy Nous avons enfin autant d appels 7 aux constructeurs qu au destructeur Il reste malgr tout savoir une chose sur ce constructeur dont nous comprendrons l importance par la suite Lorsqu il n est pas programm explicitement le constructeur par copie re copie tous les champs de l objet copier dans l objet construit Remarquez aussi que lorsqu on d finit soi m me un constructeur le constructeur vide par d faut n existe plus mais le constructeur de copie par d faut existe toujours 10 10 Affectation Il reste en fait une derni re chose qu il est possible de reprogrammer pour un objet l affectation Si l affectation n est pas reprogramm e alors elle se fait naturellement par recopie des champs Pour la reprogrammer on a recours l op rateur Ainsi a b se lit a op
276. ui est un r el dans le cas d un mouvement plan a e 1 2 1 2 3 l nergie cin tique E M4V4 MBUZ Ce qui fait 4 quations pour 4 inconnues 206 A Travaux Pratiques A 4 Structures R solution du choc On se place dans le r f rentiel du centre de masse On a alors tout instant 1 P 0 par d finition de ce r f rentiel d o m AU A mpg pB 2 M Pa Tp x ma7 a d o en notant AT ap M AT xma a gt MA 2 3 2E ma 1 F4 u4 La constance de E nous informe que dans ce rep re la norme des vitesses est conserv e et la constance du moment cin tique que les vitesses varient parall lement AP Si l on veut que les vitesses varient effectivement il ne nous reste plus qu une possibilit mutliplier par 1 la composante des 7 selon AF Ce qui fournit un algo rithme simple de rebond D cider de l imminence d un choc On ne peut pas se contenter lors de l volution pas pas des coordonn es des disques de d cider qu un choc aura lieu entre t et t dt rien qu en estimant la distance entre les deux disques candidats la collision l instant t ni m me en prenant en plus en consid ration cette distance l instant t dt car si la vitesse est trop lev e un disque peut d j avoir travers l autre et en tre ressorti en t dt La solution consiste expliciter le minimum de la distance entre les disques en fonction du temps variant entre t ett d
277. une fonction trace ou set qui marche pour diff rentes tailles de tableaux 2D comme on l aurait fait en 1D OK void set double A int n double x for int i 0 i lt n i ATi x double A est refus void set double A double m double n double x for int i 0 i lt m i for int j 0 j lt n j ATi ljl x 104 NI O1 ND NI O1 B ND 8 Allocation dynamique 8 1 Tableaux bidimensionnels B 0 1 B 2 2 B 4 3 B 1 4 B 3 5 B 5 6 FIGURE 8 1 La matrice B de l exemple pr c dent stock e en 1D 8 1 3 Solution En pratique des que l on doit manipuler des tableaux de dimension 2 ou plus de diff rentes tailles on les m morise dans des tableaux 1D en stockant par exemple les colonnes les unes apr s les autres pour profiter des avantages des tableaux 1D Ainsi on stockera une matrice A de m lignes de n colonnes dans un tableau T de taille mn en pla ant l l ment A i j en T i mj La Fig 8 1 montre le tableau B de l exemple pr c dent stock comme tableau 1D On peut alors crire void set double A int m int n for int 0 i lt m i for int j 0 j lt n j A i mxj i j double F 2x3 set F 2 3 double G 3x5 set G 3 5 ou par exemple ce produit matrice vecteur dans lequel les vecteurs et les matrices sont stock s dans des tableaux 1D y Ax void produit double A int m int n double x doubl
278. une liste template lt typename T gt void remplace list lt T gt amp 1 T a Tb for list lt T gt iterator it l begin it 1 end 1it if xit a xit b affiche l remplace 1 2 1 maintenant 1 1 5 3 1 4 Enfin on peut appeler des algorithmes comme le tri de la liste l sort affiche l Sur le m me principe que les listes vous trouverez dans la STL Les piles ou stack Last In First Out Les files ou queue First In First Out Les ensembles ou set pas deux fois le m me l ment Les vecteurs ou vector tableaux de taille variable Les tas ou heap arbres binaires de recherche Les tables ou map table de correspondance cl valeur Et quelques autres encore Le reste de ce chapitre regroupe quelques notions utiles mais non fondamentales Elles vous serviront probablement plus pour comprendre des programmes d j crits que dans vos propres programmes 177 12 2 Op rateurs binaires 12 Fonctions et classes param tr es templates 12 2 Op rateurs binaires Parmi les erreurs classiques il y a videmment celle qui consiste remplacer if i 0 par if i 0 NON qui range 0 dans i puis consid re 0 comme un bool en c est dire false Une autre erreur fr quente consiste crire if i 0 amp j 2 NON au lieu de if i 0 amp amp j 2 Cette erreur n est possible que parce que amp existe Il s agit de op rateur bina
279. uoi faire en sorte que x i d signe la bonne variable Un autre exemple pour mieux comprendre qui additionne des double deux par deux en m morisant les r sultats 4 1 Premiers tableaux 4 Les tableaux double x 100 y 100 z 100 ici les x i et y i prennent des valeurs for int i 0 i lt 100 i z i x i ylil ici on utilise les zli l Il y deux choses essentielles retenir 1 D abord les indices d un tableau t de taille n vont de 0 n 1 Tout acc s t n peut provoquer une erreur grave pendant l ex cution du programme C EST UNE DES ERREURS LES PLUS FR QUENTES EN C Soit on va lire ou crire dans un endroit utilis pour une autre variable soit on acc de une zone m moire ill gale et le programme peut planter a Dans l exemple ci dessus si on rempla ait la boucle pour que i aille de 1 100 x 100 irait certainement chercher y 0 la place De m me z 100 irait peut tre chercher la variable i de la boucle ce qui risquerait de faire ensuite des choses tranges i valant n importe quoi b Ci dessus z i avec n importe quoi pour i irait crire en dehors de la zone r serv e aux donn es ce qui stopperait le programme plus ou moins d licatement Dans le dernier exemple on utilise x 0 x 99 L habitude est de faire une boucle avec i lt 100 comme test plut t que i lt 99 ce qui est plus lisible Mais attention ne pas mettre lt 100 2
280. ur l instant 216 A Travaux Pratiques A 7 Premiers objets et dessins de fractales A 7 4 Le flocon de neige 9 Courbe de Koch Cette courbe fractale s obtient en partant d un segment et en rempla ant le deuxi me tiers de chaque segment par deux segments formant la pointe d un triangle qui lat ral crire une fonction r cursive pour dessiner une courbe de Koch IO CR a FIGURE A 11 Construction de la courbe de Koch 10 Flocon de neige Il s obtient en construisant une courbe de Koch partir de chacun des c t s d un triangle quilat ral 217 A 8 Tron A Travaux Pratiques FIGURE A 12 Jeu de Tron A 8 Tron Dans ce TP nous allons programmer le jeu TRON Il s agit d un jeu 2 joueurs dans lequel chaque joueur pilote un mobile qui se d place vitesse constante et laisse derri re lui une trace infranchissable Le premier joueur qui percute sa propre trace ou celle de son adversaire a perdu Ce TP est assez ambitieux et s approche d un mini projet Il nous occupera plusieurs s ances A 8 1 Serpent Nous allons proc der en deux temps D abord programmer un jeu de Serpent un joueur Le programme serpent exe vous donne une id e du r sultat recherch Dans ce jeu le joueur pilote un Serpent qui s allonge petit petit d un l ment tous les x tours avec la convention que la longueur totale est born e nmax l ments Il s agit de ne pas se rentrer deda
281. urn int main objl a obj2 b a x 3 le champ x de a est int b x 3 5 celui de b est double int i a f m thode f de a donc obj1 f int j a g 2 m thode g de a donc obj1 g double y b f m thode f de b donc obj2 f 119 NI O1 B ND 9 3 Visibilit 9 Premiers objets 9 3 Visibilit Il y a une r gle que nous n avons pas vue sur les espaces de nom mais que nous pouvons facilement comprendre quand on est dans un espace de nom on peut utiliser toutes les variables et fonctions de cet espace sans pr ciser l espace en question Ainsi ceux qui ont programm cout et endl ont d fini l espace std puis se sont plac s l int rieur de cet espace pour programmer sans avoir mettre std partout devant cout cin endl et les autres C est suivant cette m me logique que dans ses m thodes un objet acc de directement ses champs et ses autres m thodes c est dire sans rien mettre devant a Vous verrez peut tre parfois tra ner le mot cl this qui est utile certains moment en C et que les programmeurs venant de Java mettent partout en se trompant d ailleurs sur son type Vous n en n aurez en g n ral pas besoin Par exemple la fonction 0b31 f ci dessus pourrait s crire int objl f m thode f de obj1 d finition int i g 3 m thode g de l objet dont la m thode f est en train de Ss ex cu
282. urn c void affiche int a cout lt lt a lt lt endl D claration int plus int a int b Retour int signe double x 1f x lt 0 return 1 1f x gt 0 return 1 return 0 void afficher int int y y lt 0 X if x lt 0 return if x gt w y gt h return DrawPoint x y RED Appel f int a du sas int int int i f 2 3j g R f rences void swap intg a inte b int tmp a a b b tmp int x 3 y 2 swap Xx y Surcharge int hasard int n int hasard int a int b double hasard Op rateurs vect operator vect A vect B vect C A B Pile des appels It ratif R cursif R f rences constantes pour un passage rapide void f const obj amp x void g const objg x f x OK Valeurs par d faut void f int a int b 0 void g ELLE 7 E270 ELO 21747 ELO ZO void f int a int b l Inline appel rapide inline double sqr double x PETUEA 24H double y sqr z 3 R f rence en retour int dy Var globale inte El 4 return 1 4 f 3 1 3 Tableaux D finition double x 5 y 5 for int 1 0 1 lt 5 1 ylil 2 x 1 const int n 5 int ifn j 2xn Initialisation int t 4 1 2 3 4 string s 2 1 ab o Affectation int s 31 1 2 3 t 31 int 1 0 1 lt 3 1 tlil s
283. utant la vitesse de la Balle multipli e par un certain pas de temps d fini en variable globale dt 1 pour l instant Gravitation 5 volution par acc l ration Cr er et utiliser une fonction qui modifie la vitesse d une Balle de fa on lui faire subir une attraction constante a 0 et a 0 0005 Indice proc der comme pr c demment c est dire ajouter 0 0005 x dt vy 6 Ajouter un soleil On souhaite ne plus avoir une gravit uniforme Ajouter un champ d crivant la masse la structure Balle Cr er un soleil de type Balle jaune fixe ie de vitesse nulle au milieu de la fen tre de masse 10 et de rayon 4 pixels la masse de la plan te qui bouge tant de 1 L afficher 203 A 4 Structures A Travaux Pratiques 10 11 12 13 Acc l ration gravitationnelle Cr er et utiliser la place de la gravitation uniforme une fonction qui prend en argument la plan te et le soleil et qui fait voluer la position de la plan te Rappel de physique l acc l ration prendre en compte est G ms r3 7 avec ici G 1 Vous aurez sans doute besoin de la fonction double sqrt double x qui retourne la racine carr e de x Ne pas oublier le facteur dt Faire tourner et observer Essayez diverses initialisations de la plan te par exemple x largeur 2 y hauteur 3 vs 1 v 0 Notez que l expression de l acc l ration devient tr s grande lorsque r s approche de 0 on prendra
284. vantageusement regroup s en une structure Ce sera plus simple et plus clair 5 2 2 Utilisation Les structures se manipulent comme les autres types La d finition l affectation l initialisation le passage en param tre le retour d une fonction tout est semblable au comportement des types de base Seule nouveaut on utilise des accolades pour pr ciser les valeurs des champs en cas d initialisation On peut videmment faire des tableaux de structures et m me d finir un champ de type tableau Ainsi les lignes suivantes se comprennent facilement Point a 12 3 3 4 b a c Initialisations c a Affectations Cercle C 12 13 10 4 Red Initialisation double distance Point a Point b Passage par valeur return sqrt a x b x a x b x a y b y a y b y void agrandir Cercle amp C double echelle Par r f rence C rayon C rayonxechelle Modifie le rayon Point milieu Point a Point b retour Point M M x a x tb x 2 M y a y b y 2 return M Point P 10 Tableau de structures for int i 0 i lt 10 i P i x i P i y f i 2 D ailleurs nous avions bien promis que seuls les tableaux avaient des particularit s passage par r f rence pas de retour possible et pas d affectation 3 Comme pour un tableau 72 5 Les structures 5 3 R cr ation TP K Imagine yox X Imagine FIGURE 5 1 Corps c lest
285. void affiche string s Matrice operatorx Matrice B E pour emp cher une utilisation d pendante de l impl mentation 9 7 2 Structures vs Classes Notez que finalement une structure est une classe o tout est public Les anciens programmeurs C pensent souvent tort que les structures du C sont les m mes qu en C c est dire qu elles ne sont pas des objets et qu elles n ont pas de m thode 9 7 3 Accesseurs Les m thodes get et set qui permettent d acc der en lecture get ou en criture set notre classe sont appel es accesseurs Maintenant que nos champs sont tous pri v s l utilisateur n a plus la possibilit de retrouver les dimensions d une matrice On rajoutera donc deux accesseurs en lecture vers ces dimensions int Matrice nbLin return m int Matrice nbCol return n int main for int i 0 i lt A nbLin i for int j 0 j lt A nbCol j A set i j 0 mais pas en criture ce qui est coh rent avec le fait que changer m en cours de route rendrait fausses les fonctions utilisant t i m j 6 sans compter qu ils les d clarent souvent comme en C avec d inutiles typedef Mais bon ceci ne devrait pas vous concerner 127 9 8 TP 9 Premiers objets AA A AAAA f AA DADA DADA ha qu ES Imagine de FIGURE 9 1 Fractales 9 8 TP Vous devriez maintenant pouvoir faire le TP
286. x int y NativeBitmap nb 1 Remplacer dans le serpent l affichage de la t te par l affichage d une image On pourra utiliser les images moto_blue bmp et moto_red bmp fournies 2 Utiliser l image explosion bmp lors de la mort d un des joueurs 220 B Imagine Annexe B Imagine Imagine est un ensemble de bibliotheques permettant de faire simplement du graphisme et de l alg bre lin aire Elles s appuient pour cela sur les projets Ot gra phisme 2D et 3D et Eigen algebre lin aire Ceux ci proposent une richesse de pos sibilit s bien plus importantes que Imagine mais en contrepartie Imagine est plus simple utiliser Imagine est un logiciel libre vous pouvez donc l utiliser et le distribuer votre guise et gratuitement mais si vous le distribuez sous une forme modifi e vous de vez offrir selon les m mes termes les sources de vos modifications Une documentation compl te est disponible sur la page Web d Imagine d taillant l insallation et l uti lisation Pour utiliser un module par exemple Images un fichier source doit l inclure include lt Imagine Images h gt pour une compilation correcte et votre fichier CMakeLists txt doit comporter ImagineUseModule MonProgramme Images pour que l dition de liens link r ussisse Tout est englob dans un namespace Imagine donc si vous voulez viter de pr fixer les noms par Imagine vous devez utiliser dans votre co
287. x 4 3 Sp cificit s des tableaux cout lt lt a lt lt endl v rification affecte2 a 0 a sera bien mis 0 cout lt lt a lt lt endl v rification int t 4 remplit t 0 Met les tli 0 affiche t V rifie que les t i valent 0 et aussi Somme de deux tableaux qui ne compile m me pas Pour retourner un tableau int sommel int x 4 int y 4 4 on peut imaginer mettre le 4 ici ou ailleurs rien n y fait int z 4 for int i 0 i lt 4 i z i x il y il return z En pratique on fera donc comme ca Somme de deux tableaux qui marche void somme2 int x 4 int y 4 int z 4 for int i 0 i lt 4 i z il x il y il OK z est pass par r f rence int a 4 b 4 remplissage de a et b int c 4 c sommel a b ERREUR somme2 a b c OK Enfin et c est utilis tout le temps Une fonction n est pas tenue de travailler sur une taille de tableau unique mais il est impossible de demander un tableau sa taille On utilise la syntaxe int t dans les param tres pour un tableau dont on ne pr cise pas la taille Comme il faut bien parcourir le tableau dans la fonction et qu on ne peut retrouver sa taille on la passe en param tre en plus du tableau Une fonction qui ne marche pas void affichel int t for int i 0 i lt TAILLE t i TAILLE t n existe pas cout lt lt t i lt lt endl Comment on fait en pra
288. y if d 0 return M me centre Rep re 02 x y double Vx ul u2 Vy v1 v2 double V sqrt Vxx Vx Vyx Vy if V 0 return M me vitesse Rep re suivant V 02 i1 j double ix Vx V iy Vy V jx iy jy ix Hauteur d attaque double H 0201xxjx 0201yxjy Angle double th acos H d c cos th s sin th Vitesse apr s choc dans 02 1 j double vli Vxcxc vlj Vxcxs v2i Vxsxs v2j vl Dans rep re d origine O x y ul vlixix vij xjx u2 vi vlixiy vijxjy v2 u2 v2ixix v2j jx v2 v2i xiy v2j jy AAA ATAN AAA ARA ALEA ATA Deplacement d une balle void BougeBalle double x double y double u double v int i Rebond sur les bords gauche et droit if x il u i gt width ball_size II x i u i lt ball_size u i uli Rebond sur les bords haut et bas et comptage du score if y il v il lt ball_size II y il v il gt height ball_size v il v i for int j 0 j lt nb_balls j 62 117 4 Les tableaux 4 4 R cr ations if j i continue if abs x il u il x j lt 2x ball_size amp amp abs y il v il y j lt 2 ball_size ChocBailes xlil ylil ulil vlil x jl ylil uljl vlil Mise a jour de la position x i ulil ylil vlil 11 1 11 1 1 11 1 1 1 111 1111 Fonction principale int main Ouverture de la fenetre openWindow width height Position et vitesse des balles double xb nb_balls yb nb_balls ub nb_balls vb
289. ypename T typename S gt class hop Nettoyer en quittant Erreurs et warnings cliquer Indenter Ne pas laisser de warning Utiliser le debuggeur Faire des fonctions Tableaux pas pour transcrire une formule math matique Faire des structures Faire des fichiers s par s Le h doit suffire l utilisa teur qui ne doit pas regarder le cpp Ne pas abuser du r cursif Ne pas oublier delete Compiler r guli rement include lt cassert gt assert x 0 y 1 x Faire des objets Ne pas toujours faire des ob jets Penser interface impl men tation utilisation Clavier Debug F5 Step over F10 Step inside F11 Indent Ctrl A Ctrl I Step out Maj F11 Gest t ches Ctrl Maj Ech 231 C Fiche de r f rence finale Fiche de r f rence 5 5 Divers i J 3 j i n Modulo include lt cstdlib gt i rand n exemples set i 1 i 1 lt lt n reset i 1 i amp 1 lt lt n test i 1 if i amp l lt lt n flip i 1 1 lt lt n Erreurs fr quentes Pas de d finition de fonction dans une fonction int t s s est int non intx int n se int t new s new NON class vec int X y public int q r 4 NON 2e i a MAX Se ee Tien ee Lee T if i 2 NON vec v vec 1 2 NON
290. z i j interdit int 3 2 i j OK if 3 gt 1 int k 3 j k OK i k interdit Types int i 3 double x 12 3 char c A string s hop bool t true float y 1 2f unsigned int 3 4 signed char d 128 unsigned char d 25 complex lt double gt z 2 3 Variables globales int Hy const int m 12 void f n 10 int i m OK OK Conversion int i int x j float x float i Tests Comparaison ls lt gt lt gt N gation Combinaisons if i 0 if i 0 else j l j 1 j 2 break case 2 case 3 F break default er Boucles do while ok int i l while i lt 100 i i 1 for int for int i 1 3 10 J gt 1 i i 2 j j 3 i 1 i lt 10 i Fonctions D finition int plus int a int b int c a b et rn void affiche int a cout lt lt a lt lt endl D claration int plus int a int b Retour int signe double x if x lt 0 return 1 1f x gt 0 return 1 return 0 void afficher int x int y if x lt 0 y lt 0 return if x gt w y gt h return DrawPoint x y RED Appel int f int a INE JU ce int i f 2 j g R f rences void swap inte a int amp b int tmp a a b b tmp int x 3 y 2 swap x y
Download Pdf Manuals
Related Search
Related Contents
JVC HR-XVC34U User's Manual Panasonic KX-TD7696 Operating Instructions 組付・取扱説明書 Holmes HM1761 User's Manual BASE ESPECIALISTA STOEM - web USER MAUNAL SRP-350 - BIXOLON Manual - REPOX v2.0.16 Copyright © All rights reserved.
Failed to retrieve file