Académique Documents
Professionnel Documents
Culture Documents
C++
2 Avantages
• Augmentation de la productivité
• Programmes plus souples, de meilleure qualité et facile à maintenir,
quelque soit la taille du projet.
main : l’entête main signifie que c’est un programme principal. Le programme principal n’est rien d’autre
qu’une fonction à laquelle on impose le nom main. Les programmes C++ commençent par exécuter la
fonction main.
#include : directives qui seront prises en compte avant la compilation par un programme qu’on appelle
préprocesseur parfois appelé précompilateur.
iostream : représente les flux d’entrée et de sortie. IO signifie Input et Output. Iostream contient les
déclaration relatives aux flux, en particulier cout et cin et aux opérateurs << et >>.
#include iostream : cette directive demande d’introduire avant compilation des instructions situées dans
le fichier iostream.
Using namespace: l’instruction using permet d’indiquer qu’on se place dans l’espace de noms std et
permet de régler les problèmes que peuvent poser l’utilisation des mêmes noms par différentes
bibliothèques
cout: c’est l’abréviation de character output stream.
Return 0: la fonction main est appelé par le système donc le zéro retourné par la fonction n’est pas
utilisé. Par contre sur certains systèmes comme Unix/Linux, le zéro indique que le programme s’est
terminé avec succès.
Création d’un programme C++(1/2)
q Les étapes
1. Edition d’un fichier source (avec comme extension .cpp) à l’aide d’un
éditeur de programme. Cette phase s’appelle édition de programme.
2. Traduction du programme source (proc.cpp) en langage machine (binaire)
qui aura pour extension .o (proc.o). Cette phase s’appelle compilation
3. Liaison des fichiers objets (.o) qui peuvent être des fichiers de la
bibliothèque standard, des fichiers utilisateurs implémentant des fonctions
utilisées dans proc.o. Cette phase s’appelle édition de liens.
4. Création de l’exécutable du programme. C’est l’exécutable qui permet de
lancer le programme.
La particularité d’un Environnement de développement intégré (IDE en anglais) est de gérer de
manière transparente ces étapes.
qLes erreurs
1. Les erreurs détectés par le compilateur sont des erreurs de
compilation.
2. Celles que trouvent l’éditeur de liens sont des erreurs de liaisons ou
d’éditions de liens.
3. Les erreurs qui passent inaperçues sont des erreurs d’exécution ou
de logique. Les erreurs d’exécution sont plus difficiles à corriger par
rapport aux erreurs de liaisons qui elles-mêmes sont plus difficiles à
corriger que les erreurs de compilation.
int main(){
cout << " *Recette pour réaliser du Riz*" << endl;
cout << "" << endl;
cout << "Premierement il faut préparer le matériel adequat: \nLe riz - La marmite - huile - sel -
eau" << endl;
cout << "Commencer par rincez abondamment le riz pour enlever toutes sortes de saleté." <<
endl;
cout << "Ensuite, mettre la marmite au feu avec un peu d'huile à l'intérieur." << endl;
cout << "Ajouter le riz et du sel, puis remuer pendant au moins 10 minutes." << endl;
cout << "Ajouter de 1 cm au dessus du riz" << endl;
cout << "Laissez l'eau tarir et remuer la marmite afin de faire passé le riz du dessus vers le
dessous" << endl;
cout << "Mettre le rechaud à feu doux pour la suite." << endl;
cout << "Attender environs 15 minutes et c'est bon!" << endl;
cout << "" << endl;
cout << " BON APPETIT" << endl;
return 0;
}
Qu’est ce qu’une variable ?
Les variables (1/2)
#include <iostream>
using namespace std;
int main() {
cout << "Entrer ton prénom et ton age" << endl;
string bye = "A bientôt" ;
string prenom ;
int age ;
cin >> prenom ;
cin >> age ;
cout << "Hello" << prenom << "(" << age << ")" << endl;
cout << bye ;
return 0;
}
//Le cin est sensible au type entré.
//Tester cin >> age en entrant une chaine de caractères.
Déclaration et affectation (1/3)
q Toute variable doit être déclarée avant d’être uFlisée.
q Forme de la déclaraFon : <type> <variable>
ü <type> : nom de type ou une classe
ü < variable> : une ou plusieurs variables séparées par une
virgule. Exemple : int a, b, c ; //déclaraNon de trois enNers.
q Il est possible d’a9ribuer une valeur à une variable
(ini1alisa1on) lors de sa déclara1on. Exemple : int a, b =-1, c ;
q Forme de l’affecta=on : <variable> = <valeur> (Exemple : int a = 2);
La valeur peut être une expression évaluée.
q Exemple : L’expression i+=1 équivaut à i = i+1;
L’expression x+=y équivaut à x = x+y;
Déclaration et affectation (2/3)
q Notation parenthésée : int i(5) équivaut à int i = 5;
q Il est possible de déclarer des constantes, c’est-à-dire des
variables dont on ne peut pas modifier les valeurs. Par Exemple : const
double PI = 3.14159265358979323846 ;
q Depuis C++11, il existe un mot-clé constexpr qui sert à désigner
une variable constante dont la valeur est connue lors de la
compilation :
Exemple : const int n = 6 ; constexpr int p = 3 * n + 2 ; // p sera calculé à la compilation
q Le mot clé auto introduit par C++ permet de définir
automatiquement le type d’une variable, soit à partir d’une
expression d’initialisation, soit à partir d’une autre expression.
Exemple : auto n = 12 ; // 12 est de type int, donc n sera de type int
q Le mot clé decltype permet de déclarer qu’une variable est de
même type qu’une autre variable.
Exemple 1 : long n1 = 10 ; decltype (n1) n2 = 20 ; // n2 sera du type de n1, donc long
Exemple 2 (à partir d’une expression) : int n ; decltype (2*n+1) p ; // p sera du type de
l’expression 2*n+1, donc int
Déclaration et affectation (3/3)
Notez qu’il existe des styles de programmation assez opposés, entre
lesquels nous ne chercherons pas à trancher ici, à savoir :
1. déclarer systématiquement toutes les variables en début de la
fonction concernée ;
2. placer la déclaration d’une variable le plus près possible de son
utilisation.
Conversion de types
q Une expression d’affection peut provoquer une conversion de
types
Exemple 1: int i = 3, float x; x=i ; x a la valeur 3.0 (C’est une conversion d’un
entier vers un réel).
Exemple 2: int i; float x = 5.6 ; i =x; i a la valeur 5. (C’est une conversion d’un
réel vers un entier et seule la partie entière est conservée).
qOpérateurs arithmé<ques
Opérateur Action
+ Addition
- Soustraction
* Multiplication
/ Division
% Modulo (reste de la division entière)
Les opérateurs (2/3)
qOpérateurs logiques
Opérateur Action
& Et Logique (test1 & test 2 est vrai si test1 est vrai et test2 est vrai)
| Ou Logique
^ Ou exclusif
&& Et logique (test1 && test 2, Idem test1 & test 2, mais test2 n’est évalué
que si test1 est vrai)
|| Ou Logique
qExercices
1. Ecrire un programme qui calcule la somme entre des nombres.
2. Ecrire un programme qui calcule la moyenne entre des nombres.
3. Ecrire un programme qui calcule le périmètre et la surface d’un
cercle.
Les Structures de contrôle
q Permettent la modification de l’ordre d’exécution des
instructions dans votre code
q Deux types de structures sont disponibles :
ü Les instructions de décision
Elles aiguillent l’exécution du code en fonction des valeurs que
pourra prendre une expression de test
ü Les instructions de boucle
Elles font exécuter une portion de code un certain nombre de
fois
v Jusqu’à ce qu’une condition soit remplie
v Tant qu’une condition est remplie
Instruction if (1/2)
if (expression) if (expression)
instruction_1 instruction_1
else
instruction_2
while (expression)
InstrucNon ;
q Une fonc>on :
o Rend le traitement disFnct d’un point de vue logique ;
o Rend le texte du programme plus clair en nommant le
traitement ;
o Permet d’être uFlisée à plusieurs endroits dans un programme
;
o Facilite les tests.
Les fonctions (2/2)
q Exemple :
float fexple (float z, int coef, int n)
{ float val ; // declaration d’une variable "locale" à fexple
val = z * z + coef * z + n ;
return val ;
}
int main(){
cout << "Saisir un premier nombre" << endl;
int a;
cin >> a;
cout << "Saisir un deuxieme nombre " << endl;
int b;
cin >> b;
int moyenne = (a + b) / 2;
cout << "La moyenne de " << a << " et " << b << " = " << moyenne << endl;
perimettreAireCercle();
return 0;
}
Périmetre et Surface du Cercle
#include <iostream>
#include <math.h>
using namespace std;
Cele foncmon ne retourne rien !!!
Cette fonction fait plusieurs choses
void perimetreAireCercle(){
différentes !!! : surface et périmètre…
cout << "Entrer la valeur du rayon" << endl;
double rayon;
cin >> rayon;
double perimetre = 2 * M_PI * rayon;
double surface = M_PI * pow(rayon, 2);
cout << "Le perimetre du cercle et sa surface de rayon " << rayon << " est:"
<< endl;
cout << "Perimetre du cercle: " << perimetre << std::endl;
cout << "Surface du cercle: " << surface << endl;
}
int main(){
cout << "Saisir un premier nombre" << endl; L’affichage s’effectue dans la fonction.
int a;
cin >> a;
cout << "Saisir un deuxieme nombre " << endl;
int b;
cin >> b;
int moyenne = (a + b) / 2;
cout << "La moyenne de " << a << " et " << b << " = " << moyenne << endl;
perimetreAireCercle();
return 0;
}
Ce code est à réorganiser !!!
Périmetre et Surface du Cercle
#include <iostream>
#include <math.h>
using namespace std;
int main(){
cout << "Saisir un premier nombre" << endl;
int a;
cin >> a;
cout << "Saisir un deuxieme nombre " << endl;
int b;
cin >> b;
int moyenne = (a + b) / 2;
cout << "La moyenne de " << a << " et " << b << " = " << moyenne << endl;
perimetreAireCercle();
return 0;
}
void perimetreAireCercle();
int main(){
cout << "Saisir un premier nombre" << endl;
int a;
cin >> a;
cout << "Saisir un deuxieme nombre " << endl;
int b;
cin >> b;
int moyenne = (a + b) / 2;
cout << "La moyenne de " << a << " et " << b << " = " << moyenne << endl;
perimetreAireCercle();
return 0;
}
void perimetreAireCercle(){
cout << "Entrer la valeur du rayon" << endl;
double rayon;
cin >> rayon;
double perimetre = 2 * M_PI * rayon;
double surface = M_PI * pow(rayon, 2);
cout << "Le perimetre du cercle et sa surface de rayon " << rayon << " est:"
<< endl;
cout << "Perimetre du cercle: " << perimetre << std::endl;
}
Périmetre et Surface du Cercle
include <iostream>
#include <math.h>
int main() {
float rayon;
cout<<"Entrer le rayon : "<<endl;
cin>>rayon;
cout<<endl;
cout<<"Perimetre du cercle de rayon : " <<rayon<< " = "<<perimetreCercle(rayon)<<endl;
cout<<"Surface de cercle de rayon " <<rayon <<" = " <<surfaceCercle(rayon)<<endl;
cout<<endl;
return 0;
}
Périmetre et Surface du Cercle
include <iostream>
#include <math.h>
int main() {
float rayon;
cout<<"Entrer le rayon : "<<endl;
cin>>rayon;
cout<<endl;
cout<<"Perimetre du cercle de rayon : " <<rayon<< " = "<<perimetreCercle(rayon)<<endl;
modifierRayon(rayon)
cout<<"Perimetre du cercle de rayon : " <<rayon<< " = "<<perimetreCercle(rayon)<<endl
cout<<endl;
return 0;
}
int main() {
float rayon;
cout<<"Entrer le rayon : "<<endl;
cin>>rayon;
cout<<endl;
cout<<"Perimetre du cercle de rayon : " <<rayon<< " = "<<perimetreCercle(rayon)<<endl;
modifierRayon(rayon)
cout<<"Perimetre du cercle de rayon : " <<rayon<< " = "<<perimetreCercle(rayon)<<endl
cout<<endl;
return 0;
}
Périmetre et Surface du Cercle
include <iostream>
#include <math.h>
#include <iostream>
using namespace std;
void f (initializer_list<float> val) // val est une liste de float
{ cout << val.size() << " Valeurs : " ;
for (float v : val) cout << v << " " ;
cout << endl ;
}
int main()
{ f({1.5, 2.3}) ; // liste de 2 valeurs de type float
f({}) ; // liste vide (attention f {} serait considéré comme f sans
arguments)
f ({1.25, 5, 9, 3.4, 7 }) ; // liste de 5 valeurs convertibles en float
}
Entrainement…
q Exercice 1
ü Ecrire un programme qui prend deux chaines de caractères et
les compare en disant si elles sont identiques ou pas.
q Exercice 2
ü Ecrire un programme qui prend en argument le nom d’un
fichier et confirme ou pas qu’il est de type C++.
q Exercice 3
ü Ecrire un programme qui prend en argument un numéro de
téléphone et affiche le nom de l’opérateur auquel il appartient
(Libertis, Airtel ou Gabon Telecom Fixe).
q Exercice 4
ü Ecrire un programme qui permet à un utilisateur de deviner un
mot. Il a le droit de demander au programme une lettre à une
position donnée à (trois reprises maximum) pour deviner le
mot.
Entrainement…
q Exercice 1
ü Ecrire un programme qui prend deux chaines de caractères et
les compare en disant si elles sont identiques ou pas.
q Exercice 2
ü Ecrire un programme qui prend en argument le nom d’un
fichier et confirme ou pas qu’il est de type C++ (extension .cpp).
q Exercice 3
ü Ecrire un programme qui prend en argument un numéro de
téléphone et affiche le nom de l’opérateur auquel il appartient
(Libertis, Airtel ou Gabon Telecom Fixe).
q Exercice 4
ü Ecrire un programme qui permet à un utilisateur de deviner un
mot. Il a le droit de demander au programme une lettre à une
position donnée à (trois reprises maximum) pour deviner le
mot. (attention à l’absence de contrôle d’indice, exemple : ch = « Bonjour »; ch[29]
???).
Le type string (1/2)
q Déclaration et initialisation
string ch1 ; // ch1 est une chaîne initialement vide
string ch2 = "bonjour" ; // initialisation copie
ou :
string ch2("bonjour") ; // initialisation directe
Depuis C++ 11 :
string ch2 = {"bonjour"} ; // initialisation copie
string ch2 {"bonjour"} ; // initialisation directe
string ch4 { 'b', 'o', 'n', 'j', 'o', 'u', 'r' } ; // initialisation directe
string ch4 = { 'b', 'o', 'n', 'j', 'o', 'u', 'r' } ; // initialisation copie
q Concaténation
string ch2 = "monsieur" ;
string ch = "bonjour " + ch2 ; // ch contient bonjour monsieur
ad n
20
30
ad n
Les pointeurs natifs (3/3)
int main()
{ .....
int *adi = new int (10) ; // alloue un emplacement pour un int
..... // initialisé à 10 et place son adresse
dans adi
// utilisation de cet entier référencé par *adi
.....
delete adi ; // libère l'emplacement alloué
// mais adi existe toujours ; il est conseillé de faire :
adi = nullptr ; // ou adi = 0 avant C++11
}
La gestion dynamique (3/4)
int main()
{ .....
{ unique_ptr<int> upi (new int (10)) ; // alloue un emplacement pour un
int
..... // initialisé à 10 et place son adresse dans upi
..... // utilisation de *upi, lvalue représentant l’entier référencé par upi
}
// ici, l’entier référencé par upi est détruit, ainsi que upi
}
Les pointeurs intelligents (2/2)
return 0;
}
point::point (int abs, int ord) point::point (int abs, int ord) : x(abs), y(ord) { }
{ x = abs ; y = ord ;
}
Organisation du code d’une classe
q 3 sortes d’instructions regroupées lors des utilisations
des classes précédentes :
ü la déclaration de la classe ;
ü la définition de la classe ;
ü l’utilisation de la classe.
Déclaration
q les seules instructions de déclaration de la classe dans
un fichier en-tête (extension .h) qu’il suffira d’inclure
(par #include) pour compiler l’application.
void point::affiche ()
{ cout << "Je suis en " << x << " " << y << endl ; }
Autoréférence : le mot-clé this
int main()
{ point a ; // appel constructeur 1
a.affiche () ;
point b (5) ; // appel constructeur 2
b.affiche ("Point b - ") ;
point c (3, 12)
…
}
Surcharge opérateur (1/2)
class point {
public:
point (int x=0,int y=0);
point(const point& p);
void affiche () const ;
point& operator=(const point&);
bool operator==(const point&);
virtual ~point();
friend ostream& operator << (ostream& out, const point& p);
private :
int x;
int y;
};
};
Surcharge opérateur (2/2)
//Définition
point& point::operator=(const point& p){
// TODO Auto-generated destructor stub
if (&p != this){
x = p.x ;
y = p.y;
}
return *this;
}
class X struct X
{ public : { int x ;
int x ; private :
private : double v ;
double v ; };
};
Les énumérations
qenum couleur {vert, jaune, bleu} ;
enum couleur {vert, jaune, bleu} ;
couleur c1, c2;
c1 = vert ;
c2 = jaune ;
#ifndef GA_ESGISIIRT3_POINT_H
#define GA_ESGISIIRT3_POINT_H
class point {
};#endif //GA_ESGISIIRT3
Données
q Déclaration des données de l’objet qui sont privées
(encapsulation).
q Un point sur un plan se caractérise par son abscisse x et son
ordonné y.
ifndef GA_ESGISIIRT3_POINT_H
#define GA_ESGISIIRT3_POINT_H
class point {
private:
int x,y;
};#endif //GA_ESGISIIRT3
Constructeur/destructeur
q Déclaration des trois constructeurs (défaut, initialisation et copie)
q Déclaration destructeur en virtuel
q Le constructeur alloue de la mémoire et le destructeur la libère.
ifndef GA_ESGISIIRT3_POINT_H
#define GA_ESGISIIRT3_POINT_H
class point {
public:
point() ; // constructeur par défaut
point(int abs, int ord) ; constructeur par initialisation
point(const point& p) ; // contructeur par copie
virtual ~point(); //declaration du destructeur
private:
int x,y;
};#endif //GA_ESGISIIRT3
Initialisation du constructeur
q Initialisation du constructeur dans l’entête
ifndef GA_ESGISIIRT3_POINT_H
#define GA_ESGISIIRT3_POINT_H
class point {
public:
point(): x(0), y(0) {} ;
Point(int abs, int ord): x(abs), y(ord) {} ;
Point(const point& p) ;
virtual ~point(); //declaration du destructeur
private:
int x,y;
};#endif //GA_ESGISIIRT3
Ajout des méthodes affiche et deplace
q Manupilation des données à travers deux méthodes
q Le mot clé const => pas de modification de l’état (données) de
l’objet.
ifndef GA_ESGISIIRT3_POINT_H
#define GA_ESGISIIRT3_POINT_H-
class point {
public:
point(): x(0), y(0) {} ;
point(int abs, int ord): x(abs), y(ord) {} ;
point(const point& p) ;
void affiche () const;
void deplace(int dx, int dy);
virtual ~point();
private:
int x,y;
};#endif //GA_ESGISIIRT3
Définition de la classe point
q Définition dans le fichier point.cpp
q L’opérateur :: est qualifié « d’opérateur de portée »;
include <iostream>
#include ”point.h"
point::point(const point& p){
x = p.x ;
y = p.y ;
}
int main() {
point p ;
point p2 (5,6) ;
Point p3 (p2) ;
p.affiche() ;
p2.affiche() ;
p3.affiche();
p3.deplace(5,2);
p3.affiche();
p.deplace();
p.affiche();
return 0;
}
Argument par défaut
q Il est possible d’utiliser des arguments par défaut.
q Dans cet exemple, le constructeur par initialisation joue le même
rôle que le constructeur par défaut.
ifndef GA_ESGISIIRT3_POINT_H
#define GA_ESGISIIRT3_POINT_H
class point {
public:
point(): x(0), y(0) {} ;
point(int abs=0, int ord=0);
point(const point& p) ;
void affiche () const;
void deplace(int dx, int dy);
virtual ~point();
private:
int x,y;
};#endif //GA_ESGISIIRT3
Utilisation de la classe point
q L’utilisation de la classe point reste la même:
include <iostream>
#include ”point.h"
using namespace std;
int main() {
point p ;
point p2 (5,6) ;
return 0;
}
Surcharge des opérateurs (1/2)
q Déclaration :
ifndef GA_ESGISIIRT3_POINT_H
#define GA_ESGISIIRT3_POINT_H-
class point {
public:
point(): x(0), y(0) {} ;
point(int abs, int ord): x(abs), y(ord) {} ;
Point(const point& p) ;
void affiche () const;
void deplace(int dx, int dy);
bool operator==(const point& p);
point & operator=(const point& p);
virtual ~point();
private:
int x,y;
};#endif //GA_ESGISIIRT3
Surcharge des opérateurs (2/2)
q Définition
#include <iostream>
#include ”point.h"
int main() {
point p ;
point pointA(15,40);
p.afficher();
cout << pointA ;
if(pointB == pointA){
cout << "Ils sont égaux" << endl;
}else{
cout << "Ils sont différents" << endl;
}
return 0;
}
Entrainement…
q Exercice 1
ü Ecrire une classe Cercle.
q Exercice 2
ü Ecrire une classe Date
q Exercice 3
ü Ecrire une classe Fraction
q Exercice 4
ü Ecrire une classe Pile
q Exercice 5
ü Ecrire une classe PointColore
Classe générique (Template/Patron)
//Définition & Déclaration dans le fichier point.h (le header)
template <typename T> class point
{ public :
point (T abs=0, T ord=0) ;
void affiche () const ;
private :
Tx;Ty;
};
point (T abs=0, T ord=0)
{ x = abs ; y = ord ;
}
//Utilisation
point <int> ai (3, 5) ;
point <double> ad (3.5, 2.3) ;
Héritage (1/2)
class X
{ public :
..... // partie publique
protected : // accessible pour une classe dérivée
..... // partie protégée
private :
..... // partie privée
};
Héritage (2/2)
class pointcol : public point // pointcol derive de point
{ public :
pointcol (int abs=0, int ord=0, short cl=1) ;
void colore (short cl) { couleur = cl ; }
void affiche () const ; //redefinition de la fonction affiche
short couleur;
};
pointcol::pointcol (int abs=0, int ord=0, short cl=1)
: point(abs, ord), couleur(cl)
{ cout << "++ constr. pointcol : " << abs << " " << ord << " " << cl <<
"\n" ; }
.
Destructeur virtuel (1/3)
qPar défaut, certains environnements de développement à
la création d’une classe mettent automatiquement le
destructeur en virtuel.
qLe mot clé virtual nous indique que la classe est
polymorphe, c’est-à-dire que le destructeur peut être
redéfinie dans une classe fille.
.
Le Template Vector
qIl se rapproche le plus des tableaux C++.
qAvantages par rapport aux tableaux classiques :
1. Il détecte quand on dépasse sa capacité et
s’agrandit automatiquement ;
2. Il dispose de fonctions membres permettant son
utilisation plus simple et plus claire.
q Principal inconvénient :
ü les réallocations grèvent les performances et
peuvent ralentir les vecteurs.
ü Ils ne sont pas adaptés s’ils doivent beaucoup
changer de taille.
Les vecteurs (1/4)
q Déclaration et initialisation :
ü vector<int> v(10) ; // 10 éléments initialisés à 0.
ü vector<double> v (n, 0.5) ; // n éléments de type double initialisés à 0.5
ü vector<string> vx (3, "xxx") ; //3 éléments de type string initialisés à
"xxx »
ü vector<double> v {1, 2.5, 8, 3.2} // initialisation directe
q La partie se termine lorsque tous les mots ont été soumis aux deux
joueurs ;
q Lorsqu’un mot est trouvé, le joueur qui a deviné le plus de lettres
dans le mot à deviner gagne un point.
Références
q Delannoy, Claude. Programmer en C++ moderne. Eyrolles.
q Bjarne Straustrup. Programmation, principes et pratiques avec C++. Pearson.
q Chrisrtine Eberhardt. Tout sur le C++. Dunod.
q Aurélien Géron et Fatmé Rawbi. Pour mieux développeer avec C++. Dunod.
q O. Marguin — Cours informatique 2003/2004 – C++ : les bases.
(http://math.univ-lyon1.fr/~omarguin/programmation/C++Polycop1.pdf)
Pour avoir les accents en mode console
#include <windows.h>
Dans le main : SetConsoleOutputCP(CP_UTF8);