Cours C++ ISBS. Odyssée Merveille. 16 septembre 2015



Documents pareils
INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Introduction au langage C

Le langage C. Séance n 4

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

TP1 : Initiation à Java et Eclipse

Algorithmique et Programmation, IMA

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

as Architecture des Systèmes d Information

Notions fondamentales du langage C# Version 1.0

Programmer en JAVA. par Tama

Plan du cours. Historique du langage Nouveautés de Java 7

Bases de programmation. Cours 5. Structurer les données

Cours d Algorithmique et de Langage C v 3.0

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

TP 1. Prise en main du langage Python


Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Premiers Pas en Programmation Objet : les Classes et les Objets

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Rappels Entrées -Sorties

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

TP1. Outils Java Eléments de correction

Langage Java. Classe de première SI

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

TP, première séquence d exercices.

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Programmation système I Les entrées/sorties

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Présentation du langage et premières fonctions

Les chaînes de caractères

TP1 : Initiation à Java et Eclipse

Cours 1: Java et les objets

Introduction à l algorithmique et à la programmation M1102 CM n 3

Arguments d un programme

Claude Delannoy. 3 e édition C++

USTL - Licence ST-A 1ère année Codage de l information TP 1 :

Quelques éléments de compilation en C et makefiles

Traduction des Langages : Le Compilateur Micro Java

Programmation C. Apprendre à développer des programmes simples dans le langage C

Programme Compte bancaire (code)

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

UE C avancé cours 1: introduction et révisions

Programmation en C/C++

Bases Java - Eclipse / Netbeans

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Le prototype de la fonction main()

Une introduction à Java

Cours d initiation à la programmation en C++ Johann Cuenin

Cours Langage C/C++ Programmation modulaire

Introduction à Eclipse

La programmation orientée objet et le langage C++

TP : Gestion d une image au format PGM

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Warren PAULUS Robin GODEFROID. C++ - Interface Graphique avec Visual Studio 2010

Programmation en langage C

Programmation en Java IUT GEII (MC-II1) 1

UE Programmation Impérative Licence 2ème Année

Notes du cours 4M056 Programmation en C et C++ Vincent Lemaire et Damien Simon

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

Conventions d écriture et outils de mise au point

TD3: tableaux avancées, première classe et chaînes

Polycopié Cours Programmation Orientée Objet sous Java Programme : Filière SMI S5

L informatique en BCPST

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

HMI target Visu / PLC HMI. Pour réaliser une interface homme machine avec PLC control

Java Licence Professionnelle CISII,

Environnements de développement (intégrés)

Analyse de sécurité de logiciels système par typage statique

1.6- Génération de nombres aléatoires

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Structurer ses données : les tableaux. Introduction à la programmation

Programmation stochastique

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Initiation à la programmation en Python

Initiation. àl algorithmique et à la programmation. en C

Utilisation d objets : String et ArrayList

STAGE IREM 0- Premiers pas en Python

Programmation VBA/Excel. Programmation VBA. Pierre BONNET. Masters SMaRT & GSI - Supervision Industrielle P. Bonnet

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Tp 1 correction. Structures de données (IF2)

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Programmation Objet Java Correction

Installation et compilation de gnurbs sous Windows

Chapitre 10 Arithmétique réelle

Sélection du contrôleur

Introduction à MATLAB R

Initiation à JAVA et à la programmation objet.

Cours Programmation Système

ALGORITHMIQUE ET PROGRAMMATION En C

Installation et prise en main

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Transcription:

Cours C++ ISBS Odyssée Merveille 16 septembre 2015

Sommaire 1 Introduction 2 Premiers pas en C++ 3 Programation Orientée Objet 4 Les pointeurs et références 5 L interface graphique Cours C++ ISBS 1 / 80

1 Introduction 2 Premiers pas en C++ 3 Programation Orientée Objet 4 Les pointeurs et références 5 L interface graphique Cours C++ ISBS 1 / 80

Différence Python / C++ Python Langage de haut niveau Langage interprété Pas de gestion de mémoire Plus lent C++ Langage de plus bas niveau Langage compilé Gestion de la mémoire Plus rapide Autres langages de haut niveau : Java, Ruby, C#... Autres langages de bas niveau : C, Objective-C... Cours C++ ISBS 2 / 80

Différence Python / C++ Un processeur exécute du code machine (01101010 00010100) Une traduction est nécessaire Langage compilé :.cpp Traduction.exe 010011 110 Exécution "Hello World" Langage interprété :.py Traduction + Exécution "Hello World" Cours C++ ISBS 3 / 80

Compilation test.cpp test.i 1 Pré-traitement Suppresion des commentaires Inclusion des.h... 2 Compilation Passage en code assembleur test.s code assembleur 3 Assemblage Passage en code machine test.o code machine test.exe code machine 4 Edition de liens Création de l'exécutable à partir des fichiers objets et bibliothèques Cours C++ ISBS 4 / 80

Compilateur : g++ Compilation en ligne de commande : 1 g++ t e s t. cpp o t e s t Exécution : 1. \ t e s t Quelques options utiles : -Wall : Affiche les warnings et erreurs n empêchant pas la compilation -O1 -O2 -O3 : Optimise la vitesse d exécution du programme -s : Optimise la taille du programme -I : Ajoute un répertoire où le pré-compilateur va chercher les fichiers d include (.h,.hpp) -L : Ajoute un répertoire où l éditeur de liens va chercher les bibliothèques nécessaires au programme Cours C++ ISBS 5 / 80

1 Introduction 2 Premiers pas en C++ 3 Programation Orientée Objet 4 Les pointeurs et références 5 L interface graphique Cours C++ ISBS 5 / 80

Différence Python / C++ Ecrire un programme faisant la somme des entiers de 1 à 99 Cours C++ ISBS 6 / 80

Différence Python / C++ Ecrire un programme faisant la somme des entiers de 1 à 99 Python 1 a = 0 f o r i i n x r a n g e ( 1, 1 0 0 ) : 3 a = a + 1 Cours C++ ISBS 7 / 80

Différence Python / C++ Ecrire un programme faisant la somme des entiers de 1 à 99 Python 1 a = 0 f o r i i n x r a n g e ( 1, 1 0 0 ) : 3 a = a + 1 C++ 1 i n t main ( ) { 3 i n t a = 0 ; f o r ( i n t i = 1 ; i < 100 ; ++i ) 5 { a = a + 1 ; 7 } r e t u r n 0 ; 9 } Cours C++ ISBS 8 / 80

Variables et Types A la différence de langages comme Python, en C++ il faut déclarer explicitement le type de toutes les variables. 1 i n t a = 1 ; f l o a t b = 0. 5 ; Cours C++ ISBS 9 / 80

Variables et Types Types principaux de données en C++ : Nom Taille en Signification octets bool 1 booléen : False (0) et True (1) char (int8) 1 1 caractère : 1 lettre ou un nombre entre -128 et 127 unsigned char 1 caractère : 1 lettre ou un nombre entre 0 et 1 (uint8) 255 short (int16) 2 Entier court entre -32 768 et 32 767 unsigned short (uint16) 2 Entier court entre 0 et 65 535 long (int32) 4 Entier entre -2 147 483 648 et 2 147 483 647 float (float32) 4 Flottant (nombre à virgule) de environ 10 38 à 10 38 double 8 Flottant de environ 10 308 à 10 308 Cours C++ ISBS 10 / 80

Variables et Types Rappel En informatique, l information est codée en base 2 (binaire). L unité de codage est le bit. Un bit peut prendre 2 valeurs, 0 ou 1. Un octet (=8 bits) peut donc coder 2 8 = 256 valeurs. Il est important de bien choisir le type de ses variables : Pour ne pas perdre de la mémoire inutilement Pour éviter les erreurs! cf crash Ariane 5. Cours C++ ISBS 11 / 80

Standard Library : SL La SL est une bibliothèque de C++ qui ajoute plusieurs fonctions et classes basiques comme les string, les input / output, les vecteurs... Pour utiliser une fonction de la SL, il faut l inclure et la faire précéder de std : : #i n c l u d e <i o s t r e a m > 2 s t d : : cout<<" H e l l o World "<<s t d : : e n d l ; Il est possible de se passer de std : : en indiquant au début du code : u s i n g namespace s t d ; Cours C++ ISBS 12 / 80

Commentaires Il existe plusieurs manières de commenter du code en C++. 1 // Commenter une l i g n e 1 / Commenter p l u s i e u r s l i g n e s : une l i g n e 3 une a u t r e l i g n e \ Cours C++ ISBS 13 / 80

Fonctions Template générique d une fonction en C++ : 1 t y p e _ s o r t i e nom_fonction ( type_arg1 arg1, type_arg2 arg2... ) { 3 r e t u r n s o r t i e ; } Exemple d une fonction calculant la somme de 2 entiers. i n t somme ( i n t a, i n t b ) 2 { i n t r e s u l t = a + b ; 4 r e t u r n r e s u l t ; } Cours C++ ISBS 14 / 80

Fonction main Tout programme en C++ doit contenir une et une seule fonction appelée main. Lorsque un programme est exécuté, c est la fonction main qui est appelée en premier. 1 i n t main ( ) { 3 r e t u r n 0 ; } Par convention la fonction main renvoie toujours un entier. 0 si tout s est bien passé 1 si il y a eu un problème lors de l exécution. Cours C++ ISBS 15 / 80

Exercice 1 : Hello World Ecrire et compiler en ligne de commande un programme qui affiche "Hello World" dans le terminal. Cours C++ ISBS 16 / 80

Structures de contrôle Boucle for : f o r ( i n t i = 0 ; i < 1 0 ; ++i ) { 2 do something } Condition if : i f ( a!= 10) { 2 t e s t 1 } 4 e l s e i f ( a!= 20) { t e s t 2 6 } e l s e { 8 t e s t 3 } Cours C++ ISBS 17 / 80

Structures de contrôle Boucle while : 1 i n t a = 0 ; w h i l e ( a < 10) { 3 a = a + 1 ; } Condition switch : s w i t c h ( a ) { 2 c a s e 0 : { t e s t 1 4 b r e a k ; } 6 c a s e 1 0 : { t e s t 2 8 b r e a k ; } 10 d e f a u l t : { t e s t 3 12 b r e a k ; } 14 } Cours C++ ISBS 18 / 80

Exercice 2 : Devine un nombre Ecrire un programme qui fait deviner à l utilisateur un nombre entre 1 et 100. Tirer une valeur aléatoire : La fonction rand() renvoie un nombre aléatoire entre 0 et RAND_MAX. Elle appartient à la stdlib <cstdlib>. Elle doit être initialisée au début du programme par exemple avec : 1 s r a n d ( time (NULL) ) ; Demander à l utilisateur d entrer quelque chose : 1 s t d : : c i n >>v a l u e ; A l exécution, après avoir lu cette ligne, le programme s arrête jusqu à ce que l utilisateur entre une valeur. Cette valeur sera stockée dans value. value doit être déclarée au préalable. Cours C++ ISBS 19 / 80

Tableaux Il existe 2 types de tableaux : Tableaux statiques Tableaux dynamiques : les vecteurs Tableaux statiques : 1 i n t mon_tableau [ 3 ] ; 3 mon_tableau [ 0 ] = 5 ; mon_tableau [ 1 ] = 1 0 ; 5 mon_tableau [ 2 ] = 1 5 ; Cours C++ ISBS 20 / 80

Tableaux Les vecteurs : 1 #i n c l u d e <v e c t o r > 3 s t d : : v e c t o r <i n t > mon_tableau ( 3 ) ; mon_tableau [ 0 ] = 5 ; 5 mon_tableau [ 1 ] = 1 0 ; mon_tableau [ 2 ] = 1 5 ; Méthodes utiles : mon_tableau. push_back ( 2 0 ) ; // A j o u t e l a v a l e u r 20 a l a s u i t e 2 mon_tableau. pop_back ( ) ; // R e t i r e l a d e r n i e r e v a l e u r mon_tableau. s i z e ( ) ; // R e n v o i e l a t a i l l e du v e c t e u r Cours C++ ISBS 21 / 80

Chaines de caractères et string On peut stocker du texte de deux manières en C++ : sous forme de chaine de caractère (tableau de caractères) 1 c h a r c [ ] = "ma p h r a s e " sous forme de string 1 #i n c l u d e <s t r i n g > s t d : : s t r i n g s = "ma p h r a s e " Cours C++ ISBS 22 / 80

Exécutable demandant des paramètres en entrée On veut créer un exécutable appelé Test_arguments qui prend en entré une chaine de caractères et un entier. i n t main ( i n t argc, c h a r a r g v [ ] ) 2 { c h a r a = a r g v [ 1 ] ; 4 i n t b = a t o i ( a r g v [ 2 ] ) ; 6 s t d : : cout<<"nom de l e x e c u t a b l e : "<<a r g v [0]<< s t d : : e n d l ; s t d : : cout<<" P r e m i e r argument : "<<a<<s t d : : e n d l ; 8 s t d : : cout<<" Deuxieme argument : "<<b<<s t d : : e n d l ; r e t u r n 0 ; 10 } On lance l éxécutable avec la ligne de commande :. / Test_arguments t o t o 10 Et on obtient : Nom de l executable : Test_arguments Premier argument : toto Deuxieme argument : 10 Cours C++ ISBS 23 / 80

Exercice 3 : Moyenne Ecrire un programme qui prend en argument 5 nombres et affiche leur moyenne. On rappel que : argv[0] : Contient le nom de l exécutable argv[i] : Contient le i eme paramètre sous forme de char* atoi() : Converti un char* en int atof() : Converti un char* en float Cours C++ ISBS 24 / 80

Séparation d un projet en plusieurs fichiers Lorsqu un projet contient de nombreuses fonctions, il vaut mieux séparer le projet en plusieurs fichiers afin de Organiser son code Gagner du temps lors de la compilation Dans un projet d un seul fichier, chaque changement nécessite de recompiler l ensemble du projet. Si le projet est séparé en plusieurs fichiers, le compilateur ne recompilera que le fichier ayant subi des modifications. Cours C++ ISBS 25 / 80

Séparation d un projet en plusieurs fichiers Séparation de la fonction somme en un fichier header (.h) et un fichier source (.cpp) somme.h 1 #i f n d e f SOMME_H // Header #d e f i n e SOMME_H // guard 3 i n t somme ( i n t a, i n t b ) ; // p r o t o t y p e de l a f o n c t i o n 5 #e n d i f // Header guard somme.cpp 1 i n t somme ( i n t a, i n t b ) { 3 i n t r e s u l t = a + b ; // code de r e t u r n r e s u l t ; // l a f o n c t i o n 5 } Cours C++ ISBS 26 / 80

Séparation d un projet en plusieurs fichiers Pour utiliser la fonction somme, dans le main par exemple, il faut inclure son header : #i n c l u d e <i o s t r e a m > 2 #i n c l u d e "somme. h " 4 i n t main ( ) { 6 i n t a = 1 0 ; i n t b = 2 0 ; 8 i n t sum = somme ( a, b ) ; 10 r e t u r n sum ; } Cours C++ ISBS 27 / 80

Exercice 4 : Filtre Gaussien Créer un programme qui applique un filtre Gaussien à l image lena.png et enregistre le résultat. Lire une image.png avec stb image : Mettre les fichiers stb_image.h et stb_image_write.h dans le dossier courant et rajouter avant le main() : #d e f i n e STB_IMAGE_IMPLEMENTATION 2 #d e f i n e STB_IMAGE_WRITE_IMPLEMENTATION 4 #i n c l u d e " stb_image. h " #i n c l u d e " s t b _image_write. h " La lecture renvoie un tableau contenant l image ainsi que la taille de l image (width height) et le nombre de composante (1 pour niveau de gris, 3 pour RGB...) : 1 i n t width, h e i g h t, comp ; u n s i g n e d c h a r data = s t b i _ l o a d ( " image. png ", &width, &h e i g h t, &comp, 1) ; Cours C++ ISBS 28 / 80

Exercice 4 : Filtre Gaussien Ecrire une image.png avec stb image : Ecriture du tableau result de taille width height et de 1 composante. s t b i _ w r i t e _ p n g ( " s o r t i e. png ", width, h e i g h t, 1, r e s u l t, s i z e o f ( u n s i g n e d c h a r ) width 1) ; Noyau Gaussien 3x3 : 1 16 1 2 1 2 4 2 1 2 1 Cours C++ ISBS 29 / 80

Compilation avec Cmake Si un projet contient de nombreux fichiers et dépendances, la compilation en ligne de commande peut être très lourde : 1 g++ I. / i n c l u d e L. / l i b main. cpp c l a s s e 1. cpp ma_fonction. cpp ma_ fonction2. cpp o mon_ executable Une solution est d utiliser Cmake. Cmake est un système de construction logicielle multiplatforme. Il permet d automatiser la compilation à partir d un fichier descriptif du projet à compiler : le CMakeLists.txt Cours C++ ISBS 30 / 80

Compilation avec Cmake CMakeLists type : 1 cmake_minimum_required ( VERSION 2. 6 ) p r o j e c t ( T u t o r i a l ) 3 a d d _ e x e c u t a b l e ( nom_executable f i c h i e r 1. cpp f i c h i e r 2. cpp... ) Une fois le CMakeLists créé. La compilation se fait en 2 étapes : Pré-compiler avec Ccmake. Génère les fichiers de pré-compilations nécessaires à la compilation (CMakeFiles, Makefile...). Ces fichiers contiennent les informations relatives aux librairies et fichiers utilisés dans le projet, aux options de compilations etc. Compiler avec make. Compile le programme et génère un exécutable. Cours C++ ISBS 31 / 80

Compilation avec Cmake Généralement on créé un dossier build à coté des sources du projet. Ce dossier est destiné à recevoir les fichiers de pré-compilation générés par Cmake. Exemple type d arborescence : my_project src CMakeLists.txt main.cpp build Cours C++ ISBS 32 / 80

Compilation avec Cmake Une fois dans le dossier build : Pré-compiler avec Ccmake. Se placer dans le dossier où l exécutable doit être créé puis taper : ccmake <chemin du CMakeLists. t x t > Avec l arborescence précédente ça donne : 1 ccmake.. / s r c 1 make Une interface s ouvre, taper "c" 2 fois pour configurer puis "g" pour générer les fichiers de pré-compilation. Cette étape n est à refaire que si des fichiers ou libraires ont été ajoutées / retirées au projet. Compiler avec make. Cours C++ ISBS 33 / 80

Variables utiles pour CMakeLists.txt Un des intérêts de CMake est de pouvoir partager ses projets sans trop d efforts. Le CMakeLists.txt doit pour cela être le plus générique possible. On utilise donc des variables permettant d éviter de mettre des chemins comme /home/thibaut/cours_isbs ${PROJECT_SOURCE_DIR} : Chemin vers les sources du projet ${PROJECT_NAME} : Nom du projet défini dans project() Exemple : 1 cmake_minimum_required ( VERSION 2. 6 ) p r o j e c t ( Exemple ) 3 s e t ( SOURCES_FILES 5 ${PROJECT_SOURCE_DIR}/ main. cpp ${PROJECT_SOURCE_DIR}/ m o n _ f i c h i e r 1. cpp 7 ${PROJECT_SOURCE_DIR}/ m o n _ f i c h i e r 2. cpp ) 9 a d d _ e x e c u t a b l e ( ${PROJECT_NAME} ${SOURCES_FILES}) Cours C++ ISBS 34 / 80

Exercice 5 : Compilation avec CMake Ecrire le CMakeLists.txt correspondant au projet Test_CMake. Tester ensuite la compilation et l exécution. Cours C++ ISBS 35 / 80

IDE : Environnement de développement intégré Un IDE est un environnement de développement réunissant plusieurs outils/fonctionnalités afin de faciliter la programmation. Il existe de nombreux IDE : Visual Studio (Windows) Eclipse CodeBlocks Geany Qt Creator (C++) Cours C++ ISBS 36 / 80

Qt Creator Qt Creator est un IDE multi-platforme pour le C++. Il permet d importer des projets directement via le CMakeLists.txt. Cours C++ ISBS 37 / 80

Qt Creator Cours C++ ISBS 38 / 80

Qt Creator Cours C++ ISBS 39 / 80

Qt Creator Cours C++ ISBS 40 / 80

1 Introduction 2 Premiers pas en C++ 3 Programation Orientée Objet 4 Les pointeurs et références 5 L interface graphique Cours C++ ISBS 40 / 80

Qu est que la POO? Un objet est une structure qui possède ses propres variables appellées attributs et ses propres fonctions appellées méthodes. En C++, on peut créer ses propres objets en définissant une classe. Cela permet de mieux organiser son code. On peut aussi utiliser des classes déjà codées. Par exemple les vecteurs (vector) sont des objets C++ dont on se sert très souvent sans avoir à recoder la classe. Cours C++ ISBS 41 / 80

Ma première classe Nous voulons coder la classe Personnage qui a 2 attributs : un nom un nombre de points de vie Ensuite nous voulons une méthode get_stat() qui affiche les caractéristiques du Personnage (la valeur de ses attributs). Deux fichiers doivent être créé pour définir cette classe : Personnage.h et Personnage.cpp Personnage.h contient ce qui définit la classe les attributs le constructeur les prototype des méthodes Personnage.cpp contient essentiellement le "code" des méthodes. Cours C++ ISBS 42 / 80

Ma première classe Personnage.h : c l a s s Personnage 2 { s t d : : s t r i n g nom ; // A t t r i b u t 4 i n t v i e ; // A t t r i b u t 6 Personnage ( s t d : : s t r i n g nom, i n t v i e ) ; } Personnage.cpp : 1 #i n c l u d e " Personnage. h " 3 // C o n s t r u c t e u r Personnage : : Personnage ( s t d : : s t r i n g nomperso, i n t v i e P e r s o ) : nom( nomperso ), v i e ( v i e P e r s o ) { } ; Cours C++ ISBS 43 / 80

Méthodes Les méthodes sont des fonctions applicables sur les objets des classes. Définition à la suite du.cpp : v o i d Personnage : : g e t _ s t a t ( ) { 2 s t d : : cout<<" Joueur : "<<nom<<s t d : : e n d l ; s t d : : cout<<" Vie : "<<v i e <<s t d : : e n d l ; 4 } Rajouter le prototype de la méthode dans le.h : c l a s s Personnage 2 { s t d : : s t r i n g nom ; 4 i n t v i e ; 6 Personnage ( s t d : : s t r i n g nom, i n t v i e ) ; v o i d g e t _ s t a t ( ) ; 8 } ; Cours C++ ISBS 44 / 80

Méthodes Création d un objet et appel de la méthode : i n t main ( ) { 2 Personnage Joueur ( "Tom", 2 0 ) ; Joueur. g e t _ s t a t ( ) ; 4 r e t u r n 0 ; } Exécution du programme : 1 Joueur : Tom Vie : 20 Cours C++ ISBS 45 / 80

Retour sur la compilation test.cpp test.i 1 Pré-traitement Suppresion des commentaires Inclusion des.h... 2 Compilation Passage en code assembleur test.s code assembleur 3 Assemblage Passage en code machine test.o code machine test.exe code machine 4 Edition de liens Création de l'exécutable à partir des fichiers objets et bibliothèques Cours C++ ISBS 46 / 80

Retour sur la compilation Exemple pour la classe Personnage : main.cpp Personnage.h Personnage.cpp Inclusion du.h et passage en code machine main.o Personnage.o Edition de liens projet.exe Cours C++ ISBS 47 / 80

Encapsulation Chaque attribut et méthode d une classe peut avoir son propre droit d accès. Il en existe 3 différents : Public : L attribut ou la méthode peut être appelé depuis l extérieur de l objet Private : L attribut ou la méthode ne peut pas être appelé depuis l extérieur de l objet Protected : L attribut ou la méthode ne peut pas être appelé depuis l extérieur de l objet sauf depuis ses classes héritées. En pratique on met toujours les attributs en private (ou protected) et les méthodes en public. C est le principe d encapsulation Cours C++ ISBS 48 / 80

Encapsulation Définition dans le.h : c l a s s Personnage 2 { p u b l i c : 4 Personnage ( s t d : : s t r i n g nom, i n t v i e ) ; v o i d g e t _ s t a t ( ) ; 6 p r o t e c t e d : 8 s t d : : s t r i n g nom ; i n t v i e ; 10 } Cours C++ ISBS 49 / 80

Encapsulation L intérêt des droits est de pouvoir contrôler le changement des attributs : 1 v o i d Personnage : : change_vie ( i n t new_vie ) { i f ( new_vie > 0) { 3 v i e = new_vie ; } 5 e l s e { v i e = 0 ; 7 } } i n t main ( ) { 2 Personnage Joueur ( "Tom", 20, 10) ; Joueur. v i e = 5 0 ; // E r r e u r de c o m p i l a t i o n 4 Joueur. change_vie ( 5 0 ) // Pas d e r r e u r } Cours C++ ISBS 50 / 80

Exercice 6 : Compte Bancaire Créer un programme qui permet de faire des dépôts et retraits sur un compte bancaire ainsi que de connaître son solde. Cours C++ ISBS 51 / 80

Héritage On appelle classe héritée une classe qui est un "sous ensemble" de la classe parente. Par exemple, on souhaite créer la classe Magicien. Un Magicien est un Personnage qui a un nomber de point de vie et un nom. Mais il possède un attribut en plus : la mana. L héritage permet de créer cette classe sans avoir à réécrire tout le code de la classe Personnage. L ensemble des méthodes de la classe Personnage pourra s appliquer sur les objets Magicien mais l inverse n est pas vrai! Cours C++ ISBS 52 / 80

Héritage Magicien.h #i n c l u d e " Personnage. h " 2 c l a s s M a g i c i e n : p u b l i c Personnage { 4 p u b l i c : M a g i c i e n ( s t d : : s t r i n g nom, i n t v i e, i n t mana ) ; 6 i n t get_mana ( ) ; p r o t e c t e d : 8 i n t mana ; } ; Magicien.cpp 1 #i n c l u d e " Personnage. h " #i n c l u d e " M a g i c i e n. h " 3 M a g i c i e n : : M a g i c i e n ( s t d : : s t r i n g nommage, i n t viemage, i n t manamage ) : Personnage (nommage, viemage ), mana ( manamage ) {} 5 i n t M a g i c i e n : : get_mana ( ) { 7 r e t u r n mana ; } Cours C++ ISBS 53 / 80

Héritage Rajout d une méthode dans Magicien.cpp : v o i d M a g i c i e n : : g e t _ s t a t ( ) 2 { Personnage : : g e t _ s t a t ( ) ; 4 s t d : : cout<<"mana : "<<mana<<s t d : : e n d l ; } Création d un Magicien et appel de la méthode : 1 i n t main ( ) { M a g i c i e n Mage ( "Emma", 3 0, 2 0 ) ; 3 Mage. g e t _ s t a t ( ) ; } Résultat : Joueur : Emma 2 Vie : 30 Mana : 20 Cours C++ ISBS 54 / 80

1 Introduction 2 Premiers pas en C++ 3 Programation Orientée Objet 4 Les pointeurs et références 5 L interface graphique Cours C++ ISBS 54 / 80

Les références Une référence est un synonyme d une autre variable. variable mémoire a #4... #32 2 b référence Cours C++ ISBS 55 / 80

Les références Définition d une référence : 1 i n t a =2; i n t &b=a ; // b e s t une r e f e r e n c e de a 3 s t d : : cout<<" a = "<<a<<s t d : : e n d l ; 5 s t d : : cout<<" b = "<<b<<s t d : : e n d l ; s t d : : cout<<"&a = "<<&a<<s t d : : e n d l ; 7 s t d : : cout<<"&b = "<<&b<<s t d : : e n d l ; On obtient : 1 a = 2 b = 2 3 &a = 0 x 7 f f f 4 5 2 2 8 2 1 c &b = 0 x 7 f f f 4 5 2 2 8 2 1 c Cours C++ ISBS 56 / 80

Passage par référence Le passage par référence permet de modifier un ou plusieurs arguments d une fonction sans créer de copie dans la mémoire. 1 v o i d f o n c t i o n ( i n t a ) { a =5; 3 } 5 v o i d r e f e r e n c e ( i n t &a ) { a =5; 7 } 1 i n t main { 3 i n t a =2; f o n c t i o n ( a ) ; // Retourne a=2 5 r e f e r e n c e ( a ) ; // Retourne a=5 r e t u r n 0 ; 7 } Cours C++ ISBS 57 / 80

Les pointeurs Un pointeur est une variable qui contient l adresse d une autre variable. variable pointée mémoire pointeur a #4... #32 *a 2 #4 pointe vers Cours C++ ISBS 58 / 80

Les pointeurs Définition d un pointeur : 1 i n t a =2; i n t b=&a ; // b e s t un p o i n t e u r s u r a 3 s t d : : cout<<" a= "<<a<<s t d : : e n d l ; 5 s t d : : cout<<"&a= "<<&a<<s t d : : e n d l ; s t d : : cout<<" b= "<<b<<s t d : : e n d l ; 7 s t d : : cout<<" b= "<< b<<s t d : : e n d l ; s t d : : cout<<"&b= "<<&b<<s t d : : e n d l ; On obtient : a= 2 2 &a= 0 x 7 f f f 3 6 0 d 4 b 2 c b= 0 x 7 f f f 3 6 0 d 4 b 2 c 4 b= 2 &b=0x 7 f f f a e 2 d a 1 d 8 Le symbole & devant une variable signifie "adresse de" Le symbole * devant un pointeur signifie "valeur pointée par" Cours C++ ISBS 59 / 80

Passage par pointeur 1 v o i d f o n c t i o n ( i n t a ) { a =3; 3 } 5 v o i d p o i n t e u r ( i n t a ) { a=5; 7 } 9 v o i d r e f e r e n c e ( i n t &a ) { a =7; 11 } 1 i n t main { 3 i n t a =2; f o n c t i o n ( a ) ; // R e n v o i e a=2 5 p o i n t e u r (&a ) ; // R e n v o i e a=5 r e f e r e n c e ( a ) ; // R e n v o i e a=7 7 r e t u r n 0 ; } Cours C++ ISBS 60 / 80

Tableau statique et pointeurs Un tableau est un ensemble de cases contigues dans la mémoire contenant des éléments de même type. i n t tab [ ] = { 0, 5, 1 0 } ; La variable tab contient en réalité l adresse de la première case du tableau. Cela ressemble à un pointeur mais la différence est qu on ne peut pas réassigner une autre valeur à tab comme pour un pointeur. Cours C++ ISBS 61 / 80

Les équivalences Ainsi on a de nombreuses équivalences permettant de parcourir un tableau : A #24 #25 #26 #27 #28 14 12 7 1 2 On a les équivalences suivantes : A[0] = *A = 14 &A[0] =A = #24 &A[1] = A+1 = #25 A[1] = *(A+1) = 12 Cours C++ ISBS 62 / 80

Retour sur les chaines de charactères Lorsqu un programme demande des paramètres en entrée, le main doit prendre 2 arguments en entrée : 1 i n t main ( i n t argc, c h a r a r g v [ ] ) { r e t u r n 0 ; 3 } Un char* est un tableau de caractères on peut aussi l écrire char[]. Ainsi, char* argv[] est un tableau contenant des tableaux de caractères. On peut aussi l écrire sous forme de double pointeur : char** argv. Cours C++ ISBS 63 / 80

Exercice sur les pointeurs et références Faire les questions de l exercice 7 Cours C++ ISBS 64 / 80

1 Introduction 2 Premiers pas en C++ 3 Programation Orientée Objet 4 Les pointeurs et références 5 L interface graphique Cours C++ ISBS 64 / 80

SDL 1 Introduction 2 Premiers pas en C++ 3 Programation Orientée Objet 4 Les pointeurs et références 5 L interface graphique SDL Qt Cours C++ ISBS 65 / 80

SDL SDL : Simple DirectMedia Layer Bibiothèque de bas niveau permettant de gérer l image, le son, les évènements clavier / souris... A ne pas confondre avec la Standard Library (std : :). Cours C++ ISBS 66 / 80

SDL Créer une fenêtre Créer une fenetre vide : 1 #i n c l u d e <SDL/SDL. h> 3 i n t main ( i n t argc, c h a r a r g v [ ] ) { 5 SDL_ Init ( SDL_INIT_VIDEO ) ; 7 SDL_Surface window ; window=sdl_setvideomode ( 8 0 0, 6 0 0, 3 2,SDL_SWSURFACE) ; 9 SDL_WM_SetCaption ( " T i t r e de l a f e n e t r e ", NULL) ; 11 // Coder i c i 13 SDL_Quit ( ) ; 15 r e t u r n 0 ; } Cours C++ ISBS 67 / 80

SDL Création d un fond uni // C r e a t i o n de l a f e n e t r e " window " 2 SDL_Rect mon_ rectangle ; 4 mon_ rectangle. x =0; mon_ rectangle. y =0; 6 mon_ rectangle. w=800; mon_ rectangle. h=600; 8 S D L_FillRect ( window, &mon_rectangle, 0 x101010 ) ; 10 SDL_Flip ( s c r e e n ) ; // Update l a f e n e t r e Cours C++ ISBS 68 / 80

SDL Affichage d une image 1 // C r e a t i o n de l a f e n e t r e " window " 3 SDL_Surface image=sdl_loadbmp( " mon_image. bmp" ) ; 5 // G e s t i o n de l a t r a n s p a r e n c e SDL_SetColorKey ( image, SDL_SRCCOLORKEY, 0 x f f f f f f ) ; 7 SDL_Rect p o s i t i o n _ i m a g e ; 9 p o s i t i o n _ i m a g e. x =0; p o s i t i o n _ i m a g e. y =0; 11 S D L _ B l i t S u r f a c e ( image, NULL, window, &p o s i t i o n _ i m a g e ) ; 13 SDL_Flip ( window ) ; // Update l a f e n e t r e Par défaut, le compilateur va chercher les images dans le dossier où se trouve l exécutable. (par exemple le./obj) Cours C++ ISBS 69 / 80

SDL Structure générale Le while permet de conserver la fenêtre ouverte et l updater en permanence. // C r e a t i o n de l a f e n e t r e " window " 2 i n t c o n t i n u e r =1; 4 w h i l e ( c o n t i n u e r ) { 6 // R a j o u t e r une image... 8 // R e c u p e r e r un evenement... 10 SDL_Flip ( window ) ; // Update l a f e n e t r e 12 } Cours C++ ISBS 70 / 80

SDL Exemple : Keydown Event 1 i n t c o n t i n u e r =1; SDL_Event e v e n t ; 3 w h i l e ( c o n t i n u e r ) { 5 SDL_WaitEvent(& e v e n t ) ; s w i t c h ( e v e n t. t y p e ) { 7 c a s e SDL_KEYDOWN: { s w i t c h ( e v e n t. key. keysym. sym ) { 9 c a s e SDLK_ESCAPE : { c o n t i n u e r =0; 11 b r e a k ; } 13 b r e a k ; } 15 } } 17 } SDL_Quit ( ) ; Autres SDLKey : www.libsdl.org/release/sdl-1.2.15/docs/html/sdlkey.html Cours C++ ISBS 71 / 80

SDL Exemple : MouseButton Event i n t c o n t i n u e r =1; 2 SDL_Event e v e n t ; 4 w h i l e ( c o n t i n u e r ) { SDL_WaitEvent(& e v e n t ) ; 6 s w i t c h ( e v e n t. t y p e ) { 8 c a s e SDL_MOUSEBUTTONUP: { i n t coord_x=e v e n t. b u t t o n. x ; 10 i n t coord_y=e v e n t. b u t t o n. y ; s t d : : cout<<" Coordonnees du c l i c : "<<coord_x<<" ; "<< coord_y<<s t d : : e n d l ; 12 b r e a k ; } 14 } } 16 SDL_Quit ( ) ; Cours C++ ISBS 72 / 80

SDL Exemple : Afficher du texte Affiche du texte dans la fenêtre window à la position 100 150 : TTF_Init ( ) ; 2 SDL_Surface t e x t e=null ; SDL_Rect p o s i t i o n ; 4 TTF_Font p o l i c e = NULL ; SDL_Color c o u l e u r N o i r e = {0, 0, 0 } ; 6 p o l i c e = TTF_OpenFont ( " / u s r / s h a r e / f o n t s / t r u e t y p e / d e j a v u / DejaVuSans. t t f ", 20) ; 8 t e x t e = TTF_RenderText_Blended ( p o l i c e, t e x t, c o u l e u r N o i r e ) ; p o s i t i o n. x =100; 10 p o s i t i o n. y =150; 12 S D L _ B l i t S u r f a c e ( t e x t e, NULL, window, &p o s i t i o n ) ; // window : SDL_Surface TTF_CloseFont ( p o l i c e ) ; 14 SDL_FreeSurface ( t e x t e ) ; Cours C++ ISBS 73 / 80

SDL Modification du CMakeLists.txt cmake_minimum_required (VERSION 2. 8. 1 1 ) 2 p r o j e c t (SDL) 4 f i n d _ p a c k a g e (SDL REQUIRED) f i n d _ p a c k a g e ( SDL_image REQUIRED) 6 f i n d _ p a c k a g e ( SDL_ttf REQUIRED) 8 s e t ( SOURCES_FILES ${PROJECT_SOURCE_DIR}/ main. cpp ) 10 i n c l u d e _ d i r e c t o r i e s ( ${SDL_INCLUDE_DIRS} ${ SDL_IMAGE_INCLUDE_DIRS} ${SDLTTF_INCLUDE_DIRS}) 12 message ( ${SDLTTF_LIBRARY}) 14 a d d _ e x e c u t a b l e ( ${PROJECT_NAME} ${SOURCES_FILES}) 16 t a r g e t _ l i n k _ l i b r a r i e s ( ${PROJECT_NAME} ${SDL_LIBRARY} ${ SDL_IMAGE_LIBRARY} ${SDLTTF_LIBRARY}) Cours C++ ISBS 74 / 80

Qt 1 Introduction 2 Premiers pas en C++ 3 Programation Orientée Objet 4 Les pointeurs et références 5 L interface graphique SDL Qt Cours C++ ISBS 75 / 80

Qt Qt Bibliothèque orientée objet en C++ multiplatforme permettant de développer des interfaces graphiques. Exemples de logiciels utilisant Qt : Google Earth Texmaker VLC media player Cours C++ ISBS 76 / 80

Qt Mon premier bouton #i n c l u d e <Q A p p l i c a t i o n > 2 #i n c l u d e <QPushButton> 4 i n t main ( i n t argc, c h a r a r g v [ ] ) { Q A p p l i c a t i o n app ( argc, a r g v ) ; 6 QWidget f e n e t r e ; 8 f e n e t r e. s e t F i x e d S i z e ( 3 0 0, 1 5 0 ) ; 10 QPushButton bouton ( " Bouton ", &f e n e t r e ) ; bouton. setgeometry ( 6 0, 5 0, 1 0 0, 7 0 ) ; 12 f e n e t r e. show ( ) ; 14 r e t u r n app. e x e c ( ) ; 16 } Cours C++ ISBS 77 / 80

Qt Fenetres Fenetre.h : #i n c l u d e <Q A p p l i c a t i o n > 2 #i n c l u d e <QPushButton> #i n c l u d e <QVBoxLayout> 4 #i n c l u d e <QLabel> #i n c l u d e <QMainWindow> 6 c l a s s MaFenetre : p u b l i c QMainWindow{ 8 Q_OBJECT 10 p u b l i c : 12 MaFenetre ( ) ; 14 p r i v a t e : 16 QLabel l a b e l ; QPushButton bouton ; 18 } ; Cours C++ ISBS 78 / 80

Qt Fenetres Fenetre.cpp : 1 MaFenetre : : MaFenetre ( ) { 3 QWidget z o n e C e n t r a l e = new QWidget ; s e t C e n t r a l W i d g e t ( z o n e C e n t r a l e ) ; 5 // Layout 7 QVBoxLayout l a y o u t = new QVBoxLayout ; z o n e C e n t r a l e >s e t L a y o u t ( l a y o u t ) ; 9 // L a b e l 11 l a b e l=new QLabel ; l a b e l >s e t T e x t ( "Mon l a b e l " ) ; 13 l a b e l >s e t A l i g n m e n t ( Qt : : A l i g n C e n t e r ) ; l a y o u t >addwidget ( l a b e l ) ; 15 // Bouton 1 17 bouton=new QPushButton ; bouton >s e t T e x t ( " Bouton " ) ; 19 l a y o u t >addwidget ( bouton ) ; } Cours C++ ISBS 79 / 80

Qt CMakeLists.txt Exemple de CMakeLists.txt pour Qt : cmake_minimum_required (VERSION 2. 8. 1 1 ) 2 p r o j e c t ( F e n e t r e ) 4 s e t (CMAKE_AUTOMOC ON) s e t (CMAKE_INCLUDE_CURRENT_DIR ON) 6 f i n d _ p a c k a g e ( Qt5Widgets ) 8 a d d _ d e f i n i t i o n s ( ${Qt5Widgets_DEFINITIONS }) 10 Set ( SOURCES_FILES ${PROJECT_SOURCE_DIR}/ main. cpp ) 12 QT5_WRAP_CPP(HEADERS_MOC ${HEADERS_FILES}) 14 i n c l u d e _ d i r e c t o r i e s ( ${Qt5Widgets_INCLUDES }) 16 a d d _ e x e c u t a b l e ( ${PROJECT_NAME} ${SOURCES_FILES}) t a r g e t _ l i n k _ l i b r a r i e s ( ${PROJECT_NAME} ${QT_LIBRARIES }) 18 qt5_use_modules ( ${PROJECT_NAME} Widgets ) Cours C++ ISBS 80 / 80