Académique Documents
Professionnel Documents
Culture Documents
Cours 1
S. El Abdellaoui
Mohamed
El Nabil
Abdellaoui SaïdSaidi 2020/ 2021
Planification
Bases du langage
C++
S? S1
Programmation
P.O.O
graphique
S7 S2
C++
Surcharge des S6 S3
Héritage
opérateurs
S5 S4
Héritage multiple Polymorphisme
&
Collection
Mohamed
El Nabil
Abdellaoui SaïdSaidi 2
Partie I
INTRODUCTION
Mohamed
El Nabil
Abdellaoui SaïdSaidi 3
Introduction
Traitement Données
Objet Influencent
Mohamed
El Nabil
Abdellaoui SaïdSaidi 4
Introduction
Les deux pilier de la programmation orientée objet sont
Encapsulation désigne le principe de regrouper des données avec les méthodes dans
une seule entité, et aussi et limitant l'accès à certains composants de l'objet.
Données
de
Fonctionnalités l’objet
Question
Réponse
Objet 2 Objet 1
Mohamed
El Nabil
Abdellaoui SaïdSaidi 5
Introduction
Les deux pilier de la programmation orientée objet sont
Abstraction est le processus qui consiste à représenter des objets qui appartiennent au
monde réel dans le monde du programmation. Il s'agit aussi du processus consistant à
cacher les détails de mise en œuvre internes à l'utilisateur et à ne fournir que les
fonctionnalités nécessaires aux utilisateurs.
Mohamed
El Nabil
Abdellaoui SaïdSaidi 6
Partie II
GÉNÉRALITÉS
Mohamed
El Nabil
Abdellaoui SaïdSaidi 7
Introduction
Mohamed
El Nabil
Abdellaoui SaïdSaidi 8
Introduction
#include <iostream>
using namespace std;
// Méthodes!! Géométrie
double surface (double largeur, double hauteur){
return (largeur × hauteur); }
main () { + largeur : double
// Déclarations!! + hauteur : double
double largeur = 3.0;
double hauteur = 4.0 ;
// Affichage !! +surface (): double
cout << " Surface du rectangle :"<< surface (largeur, hauteur);
}
Mohamed
El Nabil
Abdellaoui SaïdSaidi 9
Introduction & Historique
Créé en 1980
Langage évolué et structuré :
Mohamed
El Nabil
Abdellaoui SaïdSaidi 10
Structure d’un programme C++
Les étapes permettant l’édition, la mise au point, l’exécution d'un programme C++
Programme
Bibliothèque Exécutable
Editeur de liens
(*.exe)
Bibliothèque
Mohamed
El Nabil
Abdellaoui SaïdSaidi 11
Avantages
Le langage C++ prétendre être un langage C amélioré.
Il possède des fonctionnalités supplémentaires, et notamment
la surcharge de fonctions
l'allocation dynamique
Les apports spécifiques de C++ sont
Mohamed
El Nabil
Abdellaoui SaïdSaidi 12
1er programme
Exemples :
#include <iostream>
//Inclusion de la bibliothèque standard pour les E/S
using namespace std;
main () {
Bonjour tout le monde
//Affichage à l’écran --------------------------------
cout << "Bonjour tout le monde"; Process exited with return value 0
} Press any key to continue . . .
#include <iostream>
//Inclusion de la bibliothèque standard pour les E/S
using namespace std;
main () {
Bonjour tout le monde !
//Affichage à l’écran Aurevoir !
cout << " Bonjour tout le monde ! " <<endl; --------------------------------
cout << " Aurevoir ! "; Process exited with return value 0
} Press any key to continue . . .
Mohamed
El Nabil
Abdellaoui SaïdSaidi 13
2éme programme
Exemple :
#include <iostream>
//Inclusion de la bibliothèque standard pour les E/S
using namespace std;
main () {
//Déclaration des variables
int annee_creation;
int NousSommesEn;
int difference;
Mohamed
El Nabil
Abdellaoui SaïdSaidi 14
Syntaxe : Saisie et affichage des données
Entrées/sorties fournies à travers la librairie iostream :
attaché à l'entrée standard : cin (Saisir)
attaché à la sortie erreur standard cerr (erreur)
attaché à la sortie standard; : cout (affichage)
Deux opérateurs sont surchargés de manière appropriée pour les flots:
l'opérateur d' insertion << (écriture)
l'opérateur d' extraction >> (lecture)
Exemple :
#include <iostream>
using namespace std;
int i;
main() {
cout << "Un entier : ";
N’oubliez cin >> i;
pas d’inclure cout << "Le carre de " << i <<" est " << i*i << endl;
la bibliothèque }
iostream
Exercice 1 de TD 1:
Mohamed
El Nabil
Abdellaoui SaïdSaidi 15
Exercice applicatif de TD
Mohamed
El Nabil
Abdellaoui SaïdSaidi 16
Solution ordinaire
#include <iostream>
//Inclusion de la bibliothèque standard pour les E/S
using namespace std;
main () {
//Déclaration des variables
int age;
int NousSommesEn (2020);
int difference;
// Demande de l’age
cout << "Entrez votre age:" ;
cin>> age;
Mohamed
El Nabil
Abdellaoui SaïdSaidi 17
Solution parfaite
#include <iostream>
//Inclusion de la bibliothèque standard pour les E/S
using namespace std;
main () {
//Déclaration des variables Récupération
int age; de l’année
int NousSommesEn (…………); actuelle du système
int difference;
// Demande de l’age
cout << "Entrez votre age:" ;
cin>> age;
Mohamed
El Nabil
Abdellaoui SaïdSaidi 18
Partie III
BASES DU LANGAGE
C++
Mohamed
El Nabil
Abdellaoui SaïdSaidi 19
Syntaxe
Vous devez commenter votre code ! Cela aide les lecteurs a comprendre le
code.
Mohamed
El Nabil
Abdellaoui SaïdSaidi 20
Variables et Fonctions
Opèrent sur
Traitement Données
( Fonctions ) ( Variables )
Influencent
Mohamed
El Nabil
Abdellaoui SaïdSaidi 21
Variables
Définition d’une variable :
Nom :
Unique pour chaque variable
Commence toujours par une lettre
Différenciation minuscule-majuscule
Type :
Conditionne le format de la variable en mémoire
Peut être soit un type standard ou un type utilisateur
Valeur :
Peut évoluer pendant l'exécution
Initialisation grâce à l'opérateur d'affectation
Mohamed
El Nabil
Abdellaoui SaïdSaidi 22
Variables
Les types élémentaires :
Mohamed
El Nabil
Abdellaoui SaïdSaidi 23
Variables
#include <iostream>
using namespace std; Variables globales :
Mohamed
El Nabil
Abdellaoui SaïdSaidi 24
Méthodes
1. Modificateurs (optionnels)
2. Type de retour
3. Nom
Mohamed
El Nabil
Abdellaoui SaïdSaidi 25
Méthodes
Une fonction pourra appeler d'autres fonctions et ainsi de suite et elle peut même appeler
elle-même ( fonctions récursives )
Syntaxe :
type identificateur(paramètres);
Exemple :
Mohamed
El Nabil
Abdellaoui SaïdSaidi 26
Méthodes
Problématique :
Nb
#include <iostream> a
Mohamed
El Nabil
Abdellaoui SaïdSaidi 27
Méthodes
Définition
void echange(float& a, float& b) {
float t = a; a = b; b = t;
}
Exemple :
float x = 2, y = 3;
echange (x, y);
cout << x <<","<< y; //Affiche 3,2
Mohamed
El Nabil
Abdellaoui SaïdSaidi 28
Méthodes
Problématique :
a Nb
#include <iostream>
using namespace std; 4
// méthode
int ajouteDeux(int& a) { a+=2;
Res
return a; }
main () { 6
// calcul périmètre
int Nb(4), Res;
res = ajouteDeux(Nb);
cout << " Le nombre original vaut : "<< Nb << endl;
cout << " Le resultat vaut : " << Res << endl;
Le nombre original vaut : 4
} Le resultat vaut : 6 :
Mohamed
El Nabil
Abdellaoui SaïdSaidi 29
Méthodes
Mohamed
El Nabil
Abdellaoui SaïdSaidi 30
Méthodes
Arguments par défaut :
Les derniers arguments d'une fonction/méthode peuvent prendre des "valeurs par défaut''.
Déclaration
float f(char, int = 10, char* = "Tout");
Appels
f(c, n, "rien")
f(c, n) // <-> f(c, n, "Tout")
f(c) // <-> f(c,10, "Tout")
f() // erreur
Seuls les derniers arguments peuvent avoir des valeurs par défaut.
Mohamed
El Nabil
Abdellaoui SaïdSaidi 31
Méthodes
Surcharge :
Un même identificateur peut désigner plusieurs fonctions, si elles diffèrent par la liste
des types de leurs arguments.
void main() {
float x, y, z;
float T[] ={11.1, 22.2, 33.3, 44.4, 7.7, 8.8 };
x = max (1.86, 3.14);
y = max (1.86, 3.14, 37.2);
z = max (6, T);
cout << x <<" "<< y <<" "<< z;
Mohamed
El Nabil
Abdellaoui SaïdSaidi 32
Les opérateurs
Affectation : =
Opérateurs arithmétiques
Addition: + Soustraction: -
Multiplication: * Division: / (division entière dans le cas de int)
Modulo: % (reste de la division entière)
Opérateurs arithmétiques unaires (un seul opérande)
Moins unaire: - Incrémentation: ++ Decrémentation: --
Opérateurs logiques
Négation: !
ET logique: &&
OU logique: ||
Opérateurs de relation ( ils rendent 1 si la condition est vrai et 0 sinon)
< , > , <= , >= , == , !=
Mohamed
El Nabil
Abdellaoui SaïdSaidi 33
Instructions de contrôle (1/5)
Contrôler le déroulement de l’enchaînement des instructions à l’intérieur d’un
programme, ces instructions peuvent être des instructions conditionnelles ou
itératives
Instructions conditionnelles : if ….else
Prototype:
if ( condition 1 ) {
instruction 1
} Expression
else if ( condition 2) { logique
instruction 2
}
else {
instruction 3
}
Vrai (!=0) Faux (==0)
Mohamed
El Nabil
Abdellaoui SaïdSaidi 34
Instructions de contrôle (2/5)
Instructions de branchement : Switch
switch (expression)
{
case constante_1 : [ suite_d'instructions_1 ]; break;
case constante_2 : [ suite_d'instructions_2 ]; break;
..............
case constante_n : [ suite_d'instructions_n ]; break;
default : suite_d'instructions ;
}
Exemple :
int a;
switch (a)
{
case 7 : a=2; break;
//si a égal à 7 j’affecte 2 à a
case 4 : a=3; break;
default : a=0; //si a égal à 4 j’affecte 3 à a
} //sinon j’affecte 0 à a
Mohamed
El Nabil
Abdellaoui SaïdSaidi 35
Instructions de contrôle (3/5)
Instructions itératives
while ( condition )
{
instruction
}
Mohamed
El Nabil
Abdellaoui SaïdSaidi 36
Instructions de contrôle (4/5)
do {
instructions
} while( condition ) ;
Attention
Mohamed
El Nabil
Abdellaoui SaïdSaidi 37
Initialisation d’un tableau
• A la déclaration
int Toto[10] = {1, 2, 6, 5, 2, 1, 9, 8, 1, 5};
// toutes les éléments ont une valeur
int Toto[10] = {1, 2, 6, 5}; // les éléments non définit sont initialisé à 0
// au moins un élément doit être définit
Mohamed
El Nabil
Abdellaoui SaïdSaidi 38
Restriction
On ne peut pas affecter une série de valeurs en dehors de la déclaration.
Mohamed
El Nabil
Abdellaoui SaïdSaidi 39
Exercice récapitulatif
Il y aura au maximum 10 entiers. Lorsqu'on rajoute un entier, il sera rajouté à la fin de la liste.
Mohamed
El Nabil
Abdellaoui SaïdSaidi 40
Exercice récapitulatif (Solution)
Mohamed
El Nabil
Abdellaoui SaïdSaidi 41
Exercice récapitulatif (Solution)
Mohamed
El Nabil
Abdellaoui SaïdSaidi 42
Les chaines du caractères
Une chaines du caractères peut être constituer en deux façons :
Mohamed
El Nabil
Abdellaoui SaïdSaidi 43
Les tableaux des caractères
Un tableau de caractères constitue une chaîne de caractères. Exemple avec des caractères de bits:
La variable chaine peut stocker jusqu'à 20 caractères, et contient les caractères suivants :
'B','O','N','J','O','U','R','\0'
Le dernier caractère est nul pour indiquer la fin de la chaîne de caractères. Il est donc important
de prévoir son stockage dans le tableau. Dans cet exemple, 8 caractères sont donc nécessaires.
Dans ce cas, la variable ne pourra stocker que des chaînes de taille inférieure ou égale à celle
d'initialisation.
Mohamed
El Nabil
Abdellaoui SaïdSaidi 44
Exercice
45
Allocation dynamique
delete Type
Exemple :
int* a = new int;
// malloc(sizeof(int))
Mohamed
El Nabil
Abdellaoui SaïdSaidi 46
Les pointeurs
…
Mohamed
El Nabil
Abdellaoui SaïdSaidi 47
La notion d’adresse
Adresses valeurs
@65775417 123
@65775416 3.2132
@65775415 ‘M’
@65775414 ‘i’
@65775413 ‘a
@65775412 ‘m’
Mohamed
El Nabil
Abdellaoui SaïdSaidi 48
Qu’est ce qu’un pointeur ?
A
Int *Pointeur = @A;
Pointeur 2
Exemple
Mohamed
El Nabil
Abdellaoui SaïdSaidi 49
Opérateur concernant les pointeurs
Comment accéder à la variable contenue dans un pointeur ?
Comment récupérer l’adresse d’une variable ?
Soit a une variable et p un pointeur:
Utilisons a Utilisons pA
Mohamed
El Nabil
Abdellaoui SaïdSaidi 50
Exemple de déclaration et d’utilisation
pi=&i;
/* Initialise le pointeur avec l’adresse de cette variable
*pi = *pi+1;
/* Effectue un calcul sur la variable pointée par pi,
c’est-à-dire sur i lui-même, puisque pi contient
l’adresse de i. */
/* À ce stade, i ne vaut plus 0, mais 1. */
Mohamed
El Nabil
Abdellaoui SaïdSaidi 51
Exemples applicatifs
#include <iostream>
using namespace std;
int main() {
int a, b, c;
int *x, *y;
a = 98;
x = &a;
c = *x + 5;
y = &b;
*y = a + 10;
return 0;
}
Mohamed
El Nabil
Abdellaoui SaïdSaidi 52
Initialisation des pointeurs (1/5)
Il faut s’assurer que les pointeur que l’on manipule sont bien initialisé!
int * Var; // pour le compilateur Var pointe sur quelque chose (n’importe quoi)
int * Var = NULL; // le compilateur sait que Var ne pointe sur rien
Mohamed
El Nabil
Abdellaoui SaïdSaidi 53
Initialisation des pointeurs (2/5)
Affectation à une variable existante.
int i = 2;
int * P; @65775417
P = &i;
@65775416
@65775415 2 i = *P
@65775414 ?
@65775413 XXXXX
65775415 P
@65775412
Mohamed
El Nabil
Abdellaoui SaïdSaidi 54
Initialisation des pointeurs (3/5)
int i,j; // i, j variables de type int
int * pi, *pj; // pi et pj, variables de type « pointeurs vers int »
pi=&i; // le pointeur est initialisé à &i, il pointe à l’adresse &i, donc sur i
*pi=2; // accès à l’élément pointé, i est mis à 2
(*pi)++; // incrémente i qui passe à 3
int i=2, j , k ;
int * p1, * p2;
p1 = &i; // p1 contient l’adresse de i
*p1 = i; // inutile! Car pi=&i donc automatiquement *pi=i
p2 = k; // attention l’adresse p2 prend une valeur non défini(p2 pointe n’importe ou)
*p2 = 3; // on écrit quelque chose à un endroit inconnu ! Plantage!
Mohamed
El Nabil
Abdellaoui SaïdSaidi 55
Initialisation des pointeurs (3/5)
int i,j; // i, j variables de type int
int * pi, *pj; // pi et pj, variables de type « pointeurs vers int »
pi=&i; // le pointeur est initialisé à &i, il pointe à l’adresse &i, donc sur i
*pi=2; // accès à l’élément pointé, i est mis à 2
(*pi)++; // incrémente i qui passe à 3
int i=2, j , k ;
int * p1, * p2;
p1 = &i; // p1 contient l’adresse de i
*p1 = i; // inutile! Car pi=&i donc automatiquement *pi=i
p2 = k; // attention l’adresse p2 prend une valeur non défini(p2 pointe n’importe ou)
*p2 = 3; // on écrit quelque chose à un endroit inconnu ! Plantage!
Mohamed
El Nabil
Abdellaoui SaïdSaidi 56
Initialisation des pointeurs (4/5)
Allocation dynamique.
On réserve la place pour la variable pointée.
Syntaxe: Nom_Variable = new type ;
int * P;
@65775417
P = new int ;
@65775416
@65775415 *P
@65775414
?
@65775413 XXXXX
65775415 P
@65775412
Mohamed
El Nabil
Abdellaoui SaïdSaidi 57
Initialisation des pointeurs (5/5)
Allocation dynamique
Il faut penser à libérer la mémoire après utilisation !
Syntaxe: delete Nom_Variable ;
Même si on déclare un pointeur dans une fonction (local), il doit être libéré !
double * D;
D = new double ;
*D = 12.34;
delete D ; // libération de l’espace occupé par le double
Mohamed
El Nabil
Abdellaoui SaïdSaidi 58
Arithmétique des pointeurs
Les opérateur ++, --, +, = ….. Sont définis pour les pointeurs, mais attention, ils
s’appliquent aux adresses.
int * P;
…. //allocation
@65775417 123
P ++ ;
P = P – 2 ; @65775416 12
int * Q = P + 3; @65775415 156
Q
@65775414 3
@65775413 9
@65775412 456
P
Mohamed
El Nabil
Abdellaoui SaïdSaidi 59
Initialisation des pointeurs (5/5)
#include <iostream>
//Inclusion de la bibliothèque standard pour les E/S
using namespace std;
main () {
int premiers[] = {2,3,5,7,11,13,17};
int* ptr = premiers; // pointe le premier élément du tableau
cout << hex << ptr << endl; // affiche l'adresse pointée (Exp. 01C23004)
cout << *ptr << endl; // affiche "2"
cout << *(ptr+5) << endl; // affiche "13"
Mohamed
El Nabil
Abdellaoui SaïdSaidi 60
Les tableaux dynamiques (1/3)
Un tableau est en fait un pointeur!
int tableau[3];
int * P = tableau ;
tableau [2] = 5 ;
*(tableau+1) = 4;
P[0]=1; // *(P+0) = 1 @65775417
@65775416
@65775415 5
P @65775414 4
@65775413 1
tableau
@65775412
Mohamed
El Nabil
Abdellaoui SaïdSaidi 61
Les tableaux dynamiques (2/3)
int tab[3];
int * Ptab, x; // Ptab pointeur sur un int
Ptab = & tab [0]; // Ptab pointe sur le début du tableau
// équivalent à Ptab = tab
x = *Ptab; // équivalent à x = tab[0]
*(Ptab+ i) = 3; // équivalent à tab[i]=3,
*(tab + i) = 3 ,
Ptab[i]=3
int n = 3;
int tab[n]; // INTERDIT
int * Ptab = new int [n]; // OK
….
delete [ ] Ptab; // désallocation du pointeur
Mohamed
El Nabil
Abdellaoui SaïdSaidi 62
Les tableaux dynamiques (3/3)
Un tableau est un pointeur constant !
int * tab1 = new int [3]; //déclaration d’un pointeur avec allocation pour 3 éléments
int * tab2 = new int [3]; ;
Tab2 = tab1 ; //attention Tab2 pointe maintenant au même endroit que Tab1
char * chaine;
chaine = "coucou";
Mohamed
El Nabil
Abdellaoui SaïdSaidi 63
Affectation de pointeur
Mohamed
El Nabil
Abdellaoui SaïdSaidi 64