Vous êtes sur la page 1sur 193

Cours de C++

Franois Laroussinie c
Dept. dInformatique, ENS de Cachan

2 novembre 2005

Premi`re partie I e Introduction

Introduction

Introduction

Algorithme et programmation

Algorithme: mthode pour rsoudre un probl`me e e e Pour un probl`me donn, il peut y avoir plusieurs e e algorithmes. . . ou aucun ! NB: pour la plupart des probl`mes intressants, il nexiste pas e e dalgorithme (ni aujourdhui, ni demain !) Dans les probl`mes qui restent, la grande majorit ont des e e algorithmes beaucoup trop durs pour tre utiliss ! e e On cherche des algorithmes simples, ecaces, lgants. . . ee Programme: . . . sadresse ` une machine ! a

Introduction

Le langage C++

Dbut en 1983. e Amlioration du langage C: e Abstraction de donnes e Programmation oriente objet e Programmation gnrique e e tr`s utilis ! e e

Introduction

Programmer

Une fois trouv lalgorithme, programmer en C++ comporte 3 e phases: 1. Editer le programme avec votre diteur de texte favori. . . e

Introduction

Programmer

Une fois trouv lalgorithme, programmer en C++ comporte 3 e phases: 1. Editer le programme avec votre diteur de texte favori. . . e 2. Compiler le programme (avec g++)

Introduction

Programmer

Une fois trouv lalgorithme, programmer en C++ comporte 3 e phases: 1. Editer le programme avec votre diteur de texte favori. . . e 2. Compiler le programme (avec g++) 3. Excuter le programme e

Introduction

Programmer

Une fois trouv lalgorithme, programmer en C++ comporte 3 e phases: 1. Editer le programme avec votre diteur de texte favori. . . e 2. Compiler le programme (avec g++) 3. Excuter le programme e ... 4. TESTER et DEBUGGER : retour au point 1 ! Ca peut durer assez longtemps...

Introduction

Un exemple
Linvitable hello world: e
#i n c l u d e <i o s t r e a m > u s i n g namespace s t d ; i n t main ( ) { c o u t << h e l l o w o r l d ! << e n d l ; }

Dmo... e

Deuxi`me partie II e Structures de base du C++

Plan

Plan
2 3 4 5 6 7 8 9 10 11 12 13

Types, variables... Expressions Instructions Entres - Sorties e Exemples Evaluation des expressions Structure gnrale dun programme C++ e e Procdures et fonctions e Rcursivit e e Complments sur les fonctions e Porte, visibilit, dure de vie des variables e e e Complments e

Plan

Programmation

Les briques de base du langage: Ce qui permet de stocker des donnes: types, variables, e tableaux, etc. Les expressions qui permettent de manipuler les donnes. e Les instructions pour construire les algorithmes.

Types, variables...

Plan
2 3 4 5 6 7 8 9 10 11 12 13

Types, variables... Expressions Instructions Entres - Sorties e Exemples Evaluation des expressions Structure gnrale dun programme C++ e e Procdures et fonctions e Rcursivit e e Complments sur les fonctions e Porte, visibilit, dure de vie des variables e e e Complments e

Types, variables...

Types lmentaires ee

int : entiers (au min 16 bits, pour des valeurs 32767) (dautres formats existent: long int (min 32 bits), short int, unsigned int) . . . (float), double et long double : nombres ` virgule a ottante (en gnral 15 chires sign. pour double). e e Par ex. 23.3 ou 2.456e12 ou 23.56e 4 char : caract`res (a,b,. . . A,. . . ,:,. . . ). e bool : boolens (true ou false). e (Et: 0 false ; tout entier non nul quivaut ` false) e a (Et aussi: des types particuliers pour les tailles de tableaux, de cha nes de caract`res, dobjets etc. size t, ::size type) e

Types, variables...

Dnition de variable e
Syntaxe : type v ; int p ; double x ; Toute variable doit tre dnie avant dtre utilise ! e e e e Une dnition peut appara nimporte o` dans un e tre u programme. Une variable est dnie jusqu` la n de la premi`re instruction e a e e e compose (marque par }) qui contient sa dnition. e (Une variable dnie en dehors de toute fonction et de tout e espace de nom est une variable globale).

Types, variables...

Dnition de variable e

Une variable peut tre initialise lors de sa dclaration, deux e e e notations sont possibles : int p=34 ; double x=12.34 ; int p (34) ; double x (12.34) ;

Une variable dun type lmentaire qui nest pas initialise, na pas ee e de valeur dnie: elle peut contenir nimporte quoi. e

Types, variables...

Constantes symboliques

Syntaxe : const type nom = val; Par exemple: const int Taille = 100 ; Il ne sera pas possible de modier Taille dans le reste du programme (erreur ` la compilation). . . a

Types, variables...

Cha nes de caract`res e


Il existe une classe string, ce nest un pas un type lmentaire. ee Pour lutiliser, il faut placer tte du chier : e # include <string> string t ; dnit t comme une variable... e string s(25,a) ; string mot = "bonjour" ; s.size() reprsente la longueur de s e s[i] est le i-`me caract`re de s ( i = 0,1,. . . s.size()-1) e e s+t est une nouvelle cha correspondant ` la concatnation ne a e de s et t. NB: il existe une autre sorte de cha de caract`res en C/C++ ne e

Types, variables...

Tableaux
Pour utiliser la classe vector, il faut placer en tte du chier : e # include <vector> Un tableau est typ: e vector<int> Tab(100,5) ; vector<int> Tab(50) ; vector<double> T ; Structure gnrale: vector< type > Nom(n,v ) ; e e vector< type > Nom1 = Nom2 ; les valeurs de Nom2 sont alors recopies dans Nom1. e T.size() correspond ` la taille de T. a NB: size() renvoie en fait un entier non sign, son type e exact est vector<type>::size type

Types, variables...

Tableaux

T[i] dsigne le i-`me lment avec i = 0, . . . T.size()-1. e e ee vector<vector<int> > T dnit un tableau ` deux e a dimensions. Pour linitialiser, on peut utiliser linstruction suivante : vector<vector<int> > T2(100,vector<int>(50,1)) ; . . . on initialise chacune des 100 cases de T1 avec un tableau de taille 50 rempli de 1.

Expressions

Plan
2 3 4 5 6 7 8 9 10 11 12 13

Types, variables... Expressions Instructions Entres - Sorties e Exemples Evaluation des expressions Structure gnrale dun programme C++ e e Procdures et fonctions e Rcursivit e e Complments sur les fonctions e Porte, visibilit, dure de vie des variables e e e Complments e

Expressions

Aectation

En C/C++, laectation est une expression: Soient v une variable (au sens large) et expr une expression. v = expr aecte la valeur de expr ` la variable v et retourne la a valeur aecte ` v comme rsultat. e a e Par exemple, i = (j = 0) aecte 0 ` j puis ` i et retourne 0 !! a a

Expressions

Oprateurs classiques e

Oprateurs arithmtiques: e e *, +, -, / (division enti`re et relle), % (modulo) e e Oprateurs de comparaison e < (infrieur), <= (infrieur ou gal), == (gal), > (suprieur), e e e e e >= (suprieur ou gal) et != (dirent) e e e Oprateurs boolens e e && reprsente loprateur ET, || reprsente le OU, et ! e e e reprsente le NON. e Par exemple, ((x<12) && ((y>0) || !(z>4)))

Expressions

Pr et Post incrment e e

++var incrmente la variable var et retourne la nouvelle valeur. e (++i quivaut ` i=i+1) e a var ++ incrmente la variable var et retourne lancienne valeur. e (i++ quivaut ` (i=i+1)-1) e a En dehors dune expression, i++ et ++i sont donc quivalentes. e

Expressions

Pr et Post dcrment e e e

Lexpression --var dcrmente la variable var et retourne la e e nouvelle valeur. Lexpression var -- dcrmente la variable var et retourne e e lancienne valeur.

Instructions

Plan
2 3 4 5 6 7 8 9 10 11 12 13

Types, variables... Expressions Instructions Entres - Sorties e Exemples Evaluation des expressions Structure gnrale dun programme C++ e e Procdures et fonctions e Rcursivit e e Complments sur les fonctions e Porte, visibilit, dure de vie des variables e e e Complments e

Instructions

Instructions usuelles
dnition de variables, fonctions, types etc. e expr ; { liste dinstructions } : instruction compose. e if (expr ) instr if (expr ) instr1 else instr2 if (v == 3) i =i+4 ; if ((v==3) && (i<5)) { i=i+4 ; v=v*2 ;} else v=i ; r = r*3 ;

Instructions

La boucle FOR
for (expr1 ;expr2 ;expr3 ) instr
 ) ( ' & # &  "  !  %    $   # 

Ex: for(i=0 ;i<235 ;i=i+1) cout << T[i] ; for(i=0,j=1 ;i<235 ;i=i+1,j=j+3) cout << T[i][j] ;

Instructions

La boucle WHILE
while (expr ) instr

 

Instructions

La boucle DO
do instr while (expr ) ;

Entres - Sorties e

Plan
2 3 4 5 6 7 8 9 10 11 12 13

Types, variables... Expressions Instructions Entres - Sorties e Exemples Evaluation des expressions Structure gnrale dun programme C++ e e Procdures et fonctions e Rcursivit e e Complments sur les fonctions e Porte, visibilit, dure de vie des variables e e e Complments e

Entres - Sorties e

Acher ` lcran a e

Pour utiliser les entres/sorties, il faut ajouter: e # include <iostream> Syntaxe : cout < < expr1 < < . . . < < exprn ; Cette instruction ache expr1 puis expr2 . . . Acher un saut de ligne se fait au moyen de cout < < endl. int i=45 ; cout << "la valeur de i est " << i << endl ;

Entres - Sorties e

Acher ` lcran a e
Syntaxe : cout < < expr1 < < . . . < < exprn ; cout (ou std::cout) dsigne le ot de sortie standard. e < < est un oprateur binaire: e
le premier oprande est cout (de type ot de sortie) e le second oprande est lexpression ` acher e a le rsultat est de type ot de sortie e

< < est associatif de gauche ` droite a < < est surcharg (ou sur-dni): on utilise le mme oprateur e e e e pour acher des caract`res, des entiers, des rels ou des e e cha nes de caract`res etc. e

Entres - Sorties e

Lire au clavier

Syntaxe : cin > > var1 > > . . . > > varn ; Cette instruction lit (au clavier) des valeurs et les aecte ` var1 a puis var2 . . . cin est le ot dentre standard, et > > est un oprateur similaire ` e e a < <. Les caract`res taps au clavier sont enregistrs dans un buer dans e e e lequel les cin viennent puiser des valeurs. Les espaces, les tabulations et les ns de lignes sont des sparateurs. e

Exemples

Plan
2 3 4 5 6 7 8 9 10 11 12 13

Types, variables... Expressions Instructions Entres - Sorties e Exemples Evaluation des expressions Structure gnrale dun programme C++ e e Procdures et fonctions e Rcursivit e e Complments sur les fonctions e Porte, visibilit, dure de vie des variables e e e Complments e

Exemples

Exemples...

chaine.cc tab.cc es.cc

Evaluation des expressions

Plan
2 3 4 5 6 7 8 9 10 11 12 13

Types, variables... Expressions Instructions Entres - Sorties e Exemples Evaluation des expressions Structure gnrale dun programme C++ e e Procdures et fonctions e Rcursivit e e Complments sur les fonctions e Porte, visibilit, dure de vie des variables e e e Complments e

Evaluation des expressions

Evaluation des expressions


Priorit des oprateurs : e e x[y] ++x x*y x+y x >> y x < y x == y x && y x || y x = y x op= y x? y : z x++ --x x/y x-y x << y x > y x != y x >= y x <= y !x x% y x--x

Evaluation des expressions

Evaluation des expressions boolennes e

Dans e1 && e2, la sous-expression e2 nest value que si e1 e e a t value ` true. eee e a if (i >=0 && T[i] > 20) blabla Dans e1 || e2, la sous-expression e2 nest value que si e1 e e a t value ` false. eee e a if (i<0 || T[i] > 20) blabla

Evaluation des expressions

Evaluation des expressions arithmtiques e


Si une (sous-)expression mlange plusieurs types, cest le type le e plus large qui est utilis. e int i=3,j=2,m ; double r=3.4 ; m = (i/j)*r ; Dabord lexpression (i/j) est value: / dsigne ici la e e e division enti`re, cela donne donc 1. e Pour valuer le produit 1*r, il faut convertir 1 en double e (1.0) et faire le produit sur les doubles, cela donne 3.4 Pour laectation, comme m est entier, 3.4 est converti en int. Finalement on a m = 3.

Evaluation des expressions

Evaluation des expressions arithmtiques e


Pour viter les erreurs, il est possible de convertir explicitement e des donnes dun certain type en un autre. e Par exemple: int i=3,j=2,m ; double r=3.4 ; m = (double(i)/j)*r ; Donne...

Evaluation des expressions

Evaluation des expressions arithmtiques e


Pour viter les erreurs, il est possible de convertir explicitement e des donnes dun certain type en un autre. e Par exemple: int i=3,j=2,m ; double r=3.4 ; m = (double(i)/j)*r ; Donne... 5 !

Evaluation des expressions

Evaluation des expressions arithmtiques e


Pour viter les erreurs, il est possible de convertir explicitement e des donnes dun certain type en un autre. e Par exemple: int i=3,j=2,m ; double r=3.4 ; m = (double(i)/j)*r ; Donne... 5 ! Lvaluation dune expression arithmtique ne se fait pas toujours e e de gauche ` droite ! a Ex: (i/j)*(r/3) (dmo) e

Structure gnrale dun programme C++ e e

Plan
2 3 4 5 6 7 8 9 10 11 12 13

Types, variables... Expressions Instructions Entres - Sorties e Exemples Evaluation des expressions Structure gnrale dun programme C++ e e Procdures et fonctions e Rcursivit e e Complments sur les fonctions e Porte, visibilit, dure de vie des variables e e e Complments e

Structure gnrale dun programme C++ e e

Structure gnrale dun programme e e

Un programme C++ est rparti dans un ou plusieurs chiers. e Chacun peut contenir des dnitions/dclarations de fonctions, des e e dnitions de types et des dnitions de variables globales. e e Il existe une seule fonction main: cest la fonction qui sera excute apr`s la compilation. e e e Le prol de main est : int main() ou int main( int argc, char ** argv ) pour passer des arguments. Exemple de programme complet. . .

Structure gnrale dun programme C++ e e

Structure gnrale dun programme e e


Un programme complet: #include <iostream> void test(int j) { cout << j << endl ; } int main() { int i =20 ; cout << "bonjour" << endl ; test(i) ; }

Procdures et fonctions e

Plan
2 3 4 5 6 7 8 9 10 11 12 13

Types, variables... Expressions Instructions Entres - Sorties e Exemples Evaluation des expressions Structure gnrale dun programme C++ e e Procdures et fonctions e Rcursivit e e Complments sur les fonctions e Porte, visibilit, dure de vie des variables e e e Complments e

Procdures et fonctions e

Dnition de fonction e
type nom( liste des param`tres) { corps } e type est le type du rsultat de la fonction. e (void si il sagit dune procdure) e La liste des param`tres (param`tres formels): e e type1 p1, ..., typen pn Le corps dcrit les instructions ` eectuer. e a Le corps utilise ses propres variables locales, les ventuelles e variables globales et les param`tres formels. e Si une fonction renvoie un rsultat, il doit y avoir (au moins) e une instruction return expr ; Dans le cas dune procdure, on peut utiliser: return ; e

Procdures et fonctions e

Exemple

int max(int a,int b) { int res=b ; if (a>b) res = a ; return res ; }

Procdures et fonctions e

Appel dune fonction

nom(liste des arguments) La liste des arguments (param`tres rels) est expr1 , expr2 , . . . exprn e e o` chaque expri est compatible avec le type typei du param`tre u e formel pi. Exemple : int k=34, t=5, m ; m = max(k,2*t+5) ;

Procdures et fonctions e

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; }

Procdures et fonctions e

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } x y

Procdures et fonctions e

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } x 5 y

Procdures et fonctions e

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } x 5 y 10

Procdures et fonctions e

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } x 5 y 10 z

Procdures et fonctions e

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } x 5 y 10 z a 10 b 5

Procdures et fonctions e

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } res 5 x 5 y 10 z a 10 b 5

Procdures et fonctions e

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } res 10 x 5 y 10 z a 10 b 5

Procdures et fonctions e

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } res 10 x 5 y 10 z a 10 b 5

Procdures et fonctions e

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } x 5 y 10 z 10

Procdures et fonctions e

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } x 5 y 10 z 10 z = 10

Procdures et fonctions e

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } Fin

Procdures et fonctions e

Acher le contenu dun tableau dentiers

void AfficherTab(vector<int> T) { for (int i=0 ; i< T.size() ; i++) cout << T[i] << " " ; }

Procdures et fonctions e

Saisie dun tableau dentiers

Procdures et fonctions e

Saisie dun tableau dentiers


vector<int> SaisieTab() { int taille ; cout << " Entrer une taille : " ; cin >> taille ; vector<int> res(taille,0) ; for (int i=0 ; i< taille ; i++) { cout << " val = " ; cin >> res[i] ; } return res ; }

Procdures et fonctions e

Recherche du plus grand lment ee

Procdures et fonctions e

Recherche du plus grand lment ee

int Recherche(vector<int> T) { if (T.size()==0) { cout << Erreur ! Tableau vide ! << endl ; return -1 ; } int res=T[0] ; for (int i=1 ; i<T.size() ;i++) if (T[i] > res) res=T[i] ; return res ; }

Procdures et fonctions e

Recherche de lindice du plus grand lment ee

Procdures et fonctions e

Recherche de lindice du plus grand lment ee

int RechercheInd(vector<int> T) { if (T.size()==0) { cout << Erreur ! Tableau vide ! << endl ; return -1 ; } int res=0 ; for (int i=1 ; i<T.size() ;i++) if (T[i] > T[res]) res=i ; return res ; }

Procdures et fonctions e

Porte des identicateurs e

Un identicateur XXX peut tre utilis ` la ligne l de la dnition e ea e dune fonction F ssi: XXX est une variable dnie dans une instruction compose e e contenant l. XXX est un param`tre de F . e (XXX est une variable globale, i.e. dnie hors de toute e fonction.)

Procdures et fonctions e

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; }

Procdures et fonctions e

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } x y

Procdures et fonctions e

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } x 5 y

Procdures et fonctions e

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } x 5 y 10

Procdures et fonctions e

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } x 5 y 10 z

Procdures et fonctions e

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } a 10 b 5

Procdures et fonctions e

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } res 5 a 10 b 5

Procdures et fonctions e

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } res 10 a 10 b 5

Procdures et fonctions e

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } res 10 a 10 b 5

Procdures et fonctions e

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } x 5 y 10 z 10

Procdures et fonctions e

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } x 5 y 10 z 10 z = 10

Procdures et fonctions e

Exemple
int max(int a,int b) {int res=b ; if (a>b) res = a ; return res ; } ... int main() { int x,y ; x=5 ; y=10 ; int z = max(y,x) ; cout<<" z = "<<z ; } Fin

Procdures et fonctions e

Passage de param`tres par valeur e

Par dfaut, les param`tres dune fonction sont initialiss par une e e e copie des valeurs des param`tres rels. e e Modier la valeur des param`tres formels dans le corps de la e fonction ne change pas la valeur des param`tres rels. e e

Procdures et fonctions e

Essai de permutation
void permut(int a,int b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; }

Procdures et fonctions e

Essai de permutation
void permut(int a,int b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } y x

Procdures et fonctions e

Essai de permutation
void permut(int a,int b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } y x 5

Procdures et fonctions e

Essai de permutation
void permut(int a,int b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } y 10 x 5

Procdures et fonctions e

Essai de permutation
void permut(int a,int b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } y 10 x 5

Procdures et fonctions e

Essai de permutation
void permut(int a,int b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } y 10 a 10 b 5 x 5

Procdures et fonctions e

Essai de permutation
void permut(int a,int b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } y 10 a 10 b 5 aux 5 x 5

Procdures et fonctions e

Essai de permutation
void permut(int a,int b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } y 10 a 10 b 10 aux 5 x 5

Procdures et fonctions e

Essai de permutation
void permut(int a,int b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } y 10 a 5 b 10 aux 5 x 5

Procdures et fonctions e

Essai de permutation
void permut(int a,int b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } y 10 x 5

Procdures et fonctions e

Essai de permutation
void permut(int a,int b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } x=5 y 10 x 5

Procdures et fonctions e

Essai de permutation
void permut(int a,int b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; }

Procdures et fonctions e

Passage des param`tres par rfrence e ee

Pour modier la valeur dun param`tre rel dans une fonction, il e e faut passer ce param`tre par rfrence. e ee Une rfrence sur une variable est un synonyme de cette variable, ee cest-`-dire une autre mani`re de dsigner le mme emplacement a e e e de la mmoire. e On utilise le symbole & pour la dclaration dune rfrence: e ee Dans la liste des param`tres de la dnition dune fonction, type & e e pi dclare le param`tre pi comme tant une rfrence sur le i eme e e e ee param`tre rel vi . e e

Procdures et fonctions e

Permutation
void permut(int & a,int & b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; }

Procdures et fonctions e

Permutation
void permut(int & a,int & b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } x y

Procdures et fonctions e

Permutation
void permut(int & a,int & b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } x 5 y

Procdures et fonctions e

Permutation
void permut(int & a,int & b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } x 5 y 10

Procdures et fonctions e

Permutation
void permut(int & a,int & b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } x 5 y 10

Procdures et fonctions e

Permutation
void permut(int & a,int & b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } b x 5 a y 10

Procdures et fonctions e

Permutation
void permut(int & a,int & b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } aux 5 b x 5 a y 10

Procdures et fonctions e

Permutation
void permut(int & a,int & b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } aux 5 b x 10 a y 10

Procdures et fonctions e

Permutation
void permut(int & a,int & b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } aux 5 b x 10 a y 5

Procdures et fonctions e

Permutation
void permut(int & a,int & b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } x 10 y 5

Procdures et fonctions e

Permutation
void permut(int & a,int & b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } x 10 y 5

x = 10

Procdures et fonctions e

Permutation
void permut(int & a,int & b) {int aux = b ; b = a; a = aux ; } ... int main() { int x,y ; x=5 ; y=10 ; permut(y,x) ; cout<<" x = "<<x ; } Fin

Procdures et fonctions e

Passage par rfrence ee

Il faut que les param`tres rels soient compatibles avec un e e passage par rfrence. . . ee permut(x,5) nest pas possible ! Usage bizarre des rfrences dans la liste des param`tres: ee e const type & p Ide: le passage par rfrence est plus ecace que le passage e ee par valeur car il vite la recopie des arguments car seule e ladresse mmoire de largument est communique ` la e e a fonction.

Procdures et fonctions e

Exercice . . .

Algorithmes de tri Comment trier un tableau dentiers ?

Procdures et fonctions e

Exercice . . .

Algorithmes de tri Comment trier un tableau dentiers ? rechercher le plus grand lment et le placer ` la n du tableau ee a recherche le deuxi`me plus grand et le placer en e avant-derni`re position e etc.

Procdures et fonctions e

Exercice . . .
Algorithmes de tri Comment trier un tableau dentiers Tab ? Pour IndFin = Tab.size()-1 ... 1 faire rechercher lindice IMAX du plus grand lment de Tab entre ee les indices 0 ` IndFin. a Permuter les lments placs en IMAX et IndFin. ee e

Procdures et fonctions e

Exercice . . .
Algorithmes de tri Comment trier un tableau dentiers Tab ? Pour IndFin = Tab.size()-1 ... 1 faire rechercher lindice IMAX du plus grand lment de Tab entre ee les indices 0 ` IndFin. a Permuter les lments placs en IMAX et IndFin. ee e A la premi`re tape, on slectionne le plus grand lment et on le e e e ee place ` la n du tableau ; puis on trouve le deuxi`me plus grand et a e on le place ` lavant-derni`re place etc. a e

Procdures et fonctions e

Fonction de slection e
int RechercheInd(vector<int> T, int imax) { if (T.size() < imax-1) { cout << "Erreur ! Tableau trop petit ! " << endl ; return -1 ; } int res=0 ; for (int i=1 ; i<= imax ;i++) if (T[i] > T[res]) res=i ; return res ; }

Procdures et fonctions e

Fonction de slection e
vector<int> Trier(vector<int> T) { vector<int> Taux = T ; int aux ; for (int i=Taux.size()-1 ; i>0 ; i--) { aux = RechercheInd(Taux,i) ; Permuter(Taux[aux],Taux[i]) ; } return Taux ; }

Procdures et fonctions e

Fonction de slection e

Tri in situ avec passage par rfrence ee void Trier(vector<int> & T)

Procdures et fonctions e

Fonction de slection e

Tri in situ avec passage par rfrence ee void Trier(vector<int> & T) { int aux ; for (int i=T.size()-1 ; i>0 ; i--) { aux = RechercheInd(Taux,i) ; Permuter(T[aux],T[i]) ; } }

Rcursivit e e

Plan
2 3 4 5 6 7 8 9 10 11 12 13

Types, variables... Expressions Instructions Entres - Sorties e Exemples Evaluation des expressions Structure gnrale dun programme C++ e e Procdures et fonctions e Rcursivit e e Complments sur les fonctions e Porte, visibilit, dure de vie des variables e e e Complments e

Rcursivit e e

Fonctions rcursives e

La factorielle... int fact(int n) { assert(n>=0) ; if (n==0) return 1 ; return n*fact(n-1) ; }

Rcursivit e e

Les tours de Hanoi

void Hanoi(int nb,int p1, int p2) { if (nb > 0) { int p3 = 6-p1-p2 ; Hanoi(nb-1,p1,p3) ; cout << "On bouge le Pion " << nb << " vers " << p2 ; Hanoi(nb-1,p3,p2) ; } }

Complments sur les fonctions e

Plan
2 3 4 5 6 7 8 9 10 11 12 13

Types, variables... Expressions Instructions Entres - Sorties e Exemples Evaluation des expressions Structure gnrale dun programme C++ e e Procdures et fonctions e Rcursivit e e Complments sur les fonctions e Porte, visibilit, dure de vie des variables e e e Complments e

Complments sur les fonctions e

Valeurs par dfaut des param`tres e e

On peut attribuer des valeurs par dfaut aux param`tres dune e e fonction. int max(int a,int b =0) { if (a>b) return a ; else return b ; }

Complments sur les fonctions e

Recherche dichotomique
int RechDicho(vector<double> Tab,int bg, int bd,double x) { if (bg > bd) return -1 ; int M = (bg+bd)/2 ; if (Tab[M]==x) return M ; if (Tab[M] > x) return RechDicho(Tab,bg,M-1,x) ; else return RechDicho(Tab,M+1,bd,x) ; } int Recherche(vector<double> Tab,double x) { int taille = Tab.size() ; if (taille == 0) return -1 ; return RechDicho(Tab,0,taille-1,x) ; }

Complments sur les fonctions e

Recherche dichotomique
int Recherche(vector<double> Tab, double x, int bg =-1, int bd =-1) { if((bg==-1)&&(bd ==-1)) return Recherche(Tab,x,0,Tab.size()-1) ; if (bg > bd) return -1 ; int M = (bg+bd)/2 ; if (Tab[M]==x) return M ; if (Tab[M] > x) return Recherche(Tab,x,bg,M-1) ; else return Recherche(Tab,x,M+1,bd) ; } Appel directement avec: Recherche(T,10.3)

Complments sur les fonctions e

Fonctions inline

Pour de petites fonctions, il peut tre plus ecace (= rapide) e dviter un appel de fonction et ` la place, expanser le corps de la e a fonction en lieu et place de chaque appel. Cest possible avec le mot cl inline. e inline int max(int a,int b =0) { if (a>b) return a ; else return b ; }

Complments sur les fonctions e

Le tri fusion

Principe: Pour trier un tableau T entre les indices a et b: On trie entre a et On trie entre
a+b 2 a+b 2

et b

On construit un tableau tri ` partir des sous-parties tries. ea e

Porte, visibilit, dure de vie des variables e e e

void Tri fusion(vector<int> & T,int bg =-1, int bd =-1) { if ((bg==-1) && (bd==-1)) { bg=0 ; bd=int(T.size()) -1 ; } int k ; if (bg < bd) { k = (bg+bd)/2 ; Tri fusion(T,bg,k) ; Tri fusion(T,k+1,bd) ; Fusion(T,bg,k,bd) ; }

Porte, visibilit, dure de vie des variables e e e

Plan
2 3 4 5 6 7 8 9 10 11 12 13

Types, variables... Expressions Instructions Entres - Sorties e Exemples Evaluation des expressions Structure gnrale dun programme C++ e e Procdures et fonctions e Rcursivit e e Complments sur les fonctions e Porte, visibilit, dure de vie des variables e e e Complments e

Porte, visibilit, dure de vie des variables e e e

Porte dun identicateur e

La porte dun identicateur correspond aux parties du programme e o` cet identicateur peut tre utilis sans provoquer derreur ` la u e e a compilation. La porte dune variable globale ou dune fonction globale est gale e e au programme. e a La porte dune variable locale va de sa dnition jusqu` la n de e la premi`re instruction compose ({...}) qui contient sa dnition. e e e Deux variables peuvent avoir le mme nom mais dans ce cas, elle e doivent avoir deux ports direntes. e e

Porte, visibilit, dure de vie des variables e e e

Porte e
{ int i=3 ; { int i=5 ; cout << i ; // affiche 5 } cout << i ; // affiche 3 } Les deux variables ont des portes direntes ! e e Exemple. . .

Porte, visibilit, dure de vie des variables e e e

Visibilit e

La visibilit dune variable dit quand elle est accessible e La visibilit est inclue dans la porte... e e La dure de vie dune variable correspond ` la priode depuis e a e cration ` sa destruction. e a Dure de vie et porte co e e ncident pour toutes les variables que nous avons voques jusquici. e e mais . . .

Porte, visibilit, dure de vie des variables e e e

Variables static
Lespace mmoire dune variable locale dclare static est allou e e e e une seule fois et nest dtruit qu` la n du programme ! e a void Test(int v) { static int compteur=0 ; compteur++ ; cout << compteur << "-eme appel de Test"<< endl ; cout << " v = " << v << endl ; } Sa dure de vie est celle du programme. e

Porte, visibilit, dure de vie des variables e e e

Hanoi (suite)
Obj: compter le nombre dappels ` la procdure Hanoi. a e void Hanoi(int nb,int p1, int p2, int affichage=0) { static int NB = 0 ; NB++ ; if (affichage == 1) { cout << NB << " appels de Hanoi " return ; } if (nb > 0) { int p3 = 6-p1-p2 ; Hanoi(nb-1,p1,p3) ; cout << "On bouge le Pion " << nb << " vers le piquet " << p2 << endl ; Hanoi(nb-1,p3,p2) ; } }

Porte, visibilit, dure de vie des variables e e e

Espace de noms
Un programme important utilise de nombreuses biblioth`ques, e fonctions etc. Pour viter les probl`mes de conit de noms, on e e utilise des espaces de noms (namespace) : on associe un nom ` un ensemble de variables, types, a fonctions. leur nom complet est: leur nom despace suivi de :: et de leur nom. Ex. la fonction int fct(){...} dnie dans le domaine A e aura pour nom complet A::fct() Les noms complets de cout et cin sont std::cout et std::cin. Pour viter dcrire les noms complets , on utilise: e e using namespace std ;

Porte, visibilit, dure de vie des variables e e e

Crer un espace de nom e

namespace toto { int N = 10 ; int Test() { cout << "test... " ; } } Les objets N et Test ont pour nom toto::N et toto::Test

Complments e

Plan
2 3 4 5 6 7 8 9 10 11 12 13

Types, variables... Expressions Instructions Entres - Sorties e Exemples Evaluation des expressions Structure gnrale dun programme C++ e e Procdures et fonctions e Rcursivit e e Complments sur les fonctions e Porte, visibilit, dure de vie des variables e e e Complments e

Complments e

Complments - 1 e
Instructions supplmentaires: e break provoque larrt de la premi`re instruction do, for, e e switch ou while englobant. continue provoque (dans une instruction do, for, ou while) larrt de litration courante et le passage au dbut de e e e litration suivante. e switch (exp) { case cste1 : liste dinstructions1 ... case csten : liste dinstructionsn default: liste dinstructions }

Complments e

Complments - 2 e

(exp) ? exp1 : exp2 vaut exp1 si exp est value ` vrai et e e a exp2 sinon. m = (i < j) ? i : j var op = expr dsigne lexpression var = var op expr e (op {+,-,*,/,%}) int i=2,j=34 ; int i=2,j=34 ; i += 2 ; i = i+2 ; j *= 10 ; j = j*10 ; j *= (i++) ; j = j*i ; i = i+1 ;

Complments e

Complments - 2 e

(exp) ? exp1 : exp2 vaut exp1 si exp est value ` vrai et e e a exp2 sinon. m = (i < j) ? i : j var op = expr dsigne lexpression var = var op expr e (op {+,-,*,/,%}) int i=2,j=34 ; int i=2,j=34 ; i += 2 ; i = i+2 ; j *= 10 ; j = j*10 ; j *= (i++) ; j = j*i ; i = i+1 ; A la n, on a: i==5 et j==1360

Troisi`me partie III e Classes C++

Introduction

Plan
14

Introduction Regroupement de donnes e Classes C++ Champs et mthodes e Constructeurs et destructeurs Fonctions amies Conversions entre types Surcharge doprateurs e

15

16

17

Introduction

Introduction

Un algorithme nutilise pas que des objets de type int, double ou bool... tats et transitions lorsquon parle de graphes. e Piquet et pions pour Hanoi Fractions Piles Un programme doit coller ` lalgorithme ! a

Introduction

De nouveaux types

Il faut pouvoir dnir de nouveaux types de donnes. e e Dnir des variables de ce types, les manipuler dans les fonctions e etc.

Introduction

De nouveaux types

Il faut pouvoir dnir de nouveaux types de donnes. e e Dnir des variables de ce types, les manipuler dans les fonctions e etc. Un type de donnes = regroupement de donnes + des oprations e e e Comme les types de base !

Regroupement de donnes e

Plan
14

Introduction Regroupement de donnes e Classes C++ Champs et mthodes e Constructeurs et destructeurs Fonctions amies Conversions entre types Surcharge doprateurs e

15

16

17

Regroupement de donnes e

Regroupement de donnes e

Exemple: une base de donnes pour les notes des tudiants. e e

Regroupement de donnes e

Regroupement de donnes e

Exemple: une base de donnes pour les notes des tudiants. e e Chaque che dtudiant contient : e un nom et un prnom e un numro dinscription e un ensemble de notes Une base de donnes pour une promo = un ensemble de ches e

Regroupement de donnes e

Fiche dtudiants. . . e

Dnir le type che: e


struct FicheEtudiant { s t r i n g Nom ; s t r i n g Prenom ; i n t Numero ; v e c t o r <d o u b l e > N o t e s ; };

Ce nest pas ordonn... e

Regroupement de donnes e

Fiche dtudiants. . . e

Autre dnition quivalente pour le type che: e e

struct FicheEtudiant { s t r i n g Nom, Prenom ; i n t Numero ; v e c t o r <d o u b l e > N o t e s ; };

Regroupement de donnes e

Utilisation des ches

fiche est un type comme les autres: fiche F ; dnit une variable F de type che. e Une che contient plusieurs parties (champs), on y acc`de par leur e nom prcd dun point . : e e e F.Nom dsigne le champ (de type string) Nom de la che F. e F.Notes[i] dsigne le champ (de type double) Notes[i] de la e che F. etc.

Regroupement de donnes e

Utilisation des ches

Dnir les champs dune che: e


FicheEtudiant F; F . Nom = T a k i s ; F . Prenom = Jean ; F . Numero = 1 2 3 4 ; F . Notes [ 2 ] = 12.3 ;

Regroupement de donnes e

Utilisation des ches

Une fonction acher...


void Afficher ( FicheEtudiant v) { c o u t << No : << v . Numero << << f o r ( i n t i =0; i < v . N o t e s . s i z e ( ) ; i ++) c o u t << v . N o t e s [ i ] << ; c o u t << e n d l ; }

v . Prenom <<

demo 1-2-3

Regroupement de donnes e

Les struct

On utilise le type dni pat un struct comme nimporte quel e autre type: dans les fonctions (param`tre ou rsultat), les variables, e e les tableaux etc. Les aectations (param`tres de fonction, variable, etc.) se font e champ ` champ. a

Classes C++

Plan
14

Introduction Regroupement de donnes e Classes C++ Champs et mthodes e Constructeurs et destructeurs Fonctions amies Conversions entre types Surcharge doprateurs e

15

16

17

Classes C++

Les classes C++

Lorsquon dnit un type de donnes, on fournit des fonctions de e e manipulation et impose leur usage: les dtails dimplmentation e e nont pas ` tre connus par lutilisateur. ae e e On veut donc orir une interface et protger certaines donnes. Les classes permettent de regrouper des donnes e associer des fonctions aux objets de la classe restreindre lacc`s ` certaines donnes e a e

Classes C++

Fichier dtudiants e
On veut construire des bases de donnes pour stocker les ches e dtudiants de chaque promo. e Pour chaque promo, on veut disposer des fonctions suivantes: saisir les noms, prnoms et numros des tudiants : e e e (initialisation de la base) saisir des notes pour un tudiant e acher les notes dun tudiant e acher la moyenne dun tudiant e acher la moyenne pour un cours acher la moyenne gnrale e e

Classes C++

Fichier dtudiants e
On veut construire des bases de donnes pour stocker les ches e dtudiants de chaque promo. e Pour chaque promo, on veut disposer des fonctions suivantes: saisir les noms, prnoms et numros des tudiants : e e e (initialisation de la base) saisir des notes pour un tudiant e acher les notes dun tudiant e acher la moyenne dun tudiant e acher la moyenne pour un cours acher la moyenne gnrale e e Et cest tout !

Classes C++

Fichier dtudiants e

Chaque promo doit contenir les donnes suivantes: e le nombre dtudiants e le nombre de cours la liste des cours la che de chaque tudiant e

Classes C++

Fichier dtudiants e
On int`gre donc les donnes suivantes dans une promo: e e
c l a s s Promo { private : i n t Nbc ; i n t Nbe ; v e c t o r <s t r i n g > C o u r s ; v e c t o r <F i c h e E t u d i a n t > E t u d i a n t s ; ... };

Classes C++

Comment dnir les fonctions associes e e

On va utiliser une autre approche que celle prsente dans la partie e e A. On va protger certains aspects du type Promo: la structure e interne, le nom des champs... On va dnir des fonctions particuli`res (fonctions membre, e e mthodes) qui seules pourront accder ` la partie cache du e e a e type Promo. Ces mthodes seront linterface de la classe. e On les dnit dans la classe. e

Classes C++

Mthode - fonction membre e


Ces fonctions sappliquent toujours ` un objet de la classe, plus a ventuellement ` dautres param`tres. e a e Cet objet joue un rle particulier: on dit que lon appelle la o mthode sur lui. e Le mcanisme dappel de ces fonctions tient compte de cette e dirence et spare cet objet des autres param`tres: e e e Plutt que de faire Test(o,p1,...,pk), on fait: o o.Test(p1,...,pk) On appelle Test comme un champ... Vision: o reoit le message ou l ordre Test. c

Classes C++

Mthode - fonction membre e


Les mthodes sont dclares dans la classe. e e e Le nom complet de la mthode Test de la classe Toto est e Toto::Test Les mthodes peuvent accder aux champs des objets de la e e classe: ce sont les seules ` pouvoir le faire (ou presque) ! a Lobjet sur lequel elle sont appeles, nappara explicitement e t dans la dnition des mthodes. e e Par dfaut, les champs apparaissant dans la dnition dune e e mthode sont ceux de lobjet sur lequel la fonction sera e appele. e

Classes C++

Initialisation
c l a s s Promo { private : i n t Nbc ; i n t Nbe ; v e c t o r <s t r i n g > C o u r s ; v e c t o r <F i c h e E t u d i a n t > E t u d i a n t s ; public : void I n i t i a l i s a t i o n ( ) ; void SaisieNotes ( int n ) ; void AfficheNotesE ( i n t n ) ; d o u b l e MoyenneE ( i n t n ) ; d o u b l e MoyenneC ( i n t c ) ; d o u b l e MoyenneG ( ) ; };

Classes C++

Initialisation
v o i d Promo : : I n i t i a l i s a t i o n ( ) { c o u t << Nb d e t u d i a n t s : ; c i n >> Nbe ; c o u t << Nb de c o u r s : ; c i n >> Nbc ; C o u r s = v e c t o r <s t r i n g >(Nbc ) ; E t u d i a n t s = v e c t o r <F i c h e E t u d i a n t >(Nbe ) ; f o r ( i n t i =0; i < Nbc ; i ++) { c o u t << C o u r s << i << : ; c i n >> C o u r s [ i ] ; } f o r ( i n t i =0; i <Nbe ; i ++) { c o u t << Nom : ; c i n >> E t u d i a n t s [ i ] . Nom ; c o u t << Prenom : ; c i n >> E t u d i a n t s [ i ] . Prenom ; c o u t << Numero : ; c i n >> E t u d i a n t s [ i ] . Numero ; E t u d i a n t s [ i ] . N o t e s = v e c t o r <d o u b l e >(Nbc ) ; } }

Classes C++

Constructeurs

Mthodes particuli`res appeles automatiquement ` chaque e e e a dnition dun objet de la classe. e Pour passer des arguments ` un constructeur, il sut de faire a suivre le nom de la variable par la liste des arguments : MaClasse A(i,f) ; Lorsquaucun argument nest donn, le constructeur sans e argument est appel. e Si aucun constructeur nest dni explicitement, le e compilateur cre un constructeur sans argument e MaClasse::MaClasse() qui se contente dappeler les constructeurs (sans argument) de chaque champ de lobjet.

Classes C++

Constructeur copieur
MaClasse (const MaClasse &) : utilis pour le passage des param`tres et les initialisations. e e Si une fonction a un param`tre A du type MaClasse, un appel e de cette fonction avec une variable V de MaClasse conduit ` a linitialisation de A avec V via le constructeur copieur. Lorsquon dnit une variable V et quon linitialise ` une e a valeur E, par linstruction MaClasse V=E ;, on utilise le constructeur copieur. Dirence avec : MaClasse V ; e V=E ; Le constructeur copieur cr par dfaut fait une initialisation ee e champ ` champ avec les champs de largument. a

Classes C++

Constructeur / destructeur

Il existe aussi des destructeurs : on peut dnir un (et un seul) e destructeur qui est appel automatiquement lorsquune variable e locale est dtruite e (surtout utiles pour les structures de donnes dynamiques) e Pour comprendre tous ces mcanismes dappel... e il faut les essayer !! cf. Constructeurs.cc

Classes C++

Fonctions amies
Si une fonction F est amie (friend) dune classe C1, alors F peut accder aux champs privs de C1. e e Si une classe C2 comme est amie de C1, toutes les fonctions membres de C2 peuvent accder aux champs privs de C1. e e Ces dclarations se font dans la dnition de C1 : e e
c l a s s C1 { ... f r i e n d t y p e deF F ( paramdeF ) ; f r i e n d c l a s s C2 ; ... };

Classes C++

Conversions entre types


Comme pour les types simples, on peut dnir des conversions e entre les classes. Un constructeur de T1 qui prend un unique param`tre de type e T2 dnit implicitement une conversion de T2 dans T1. e (pas de composition: ne marche que pour des conversions en une tape) e Une fonction membre operator T1() dans la classe T2 dnit aussi une conversion de T2 dans T1. e (vite de modier la dnition de T1) e e Par exemple :
class fraction { public : ... fraction ( int v) {num=v ; den =1;} d o u b l e ( ) { r e t u r n d o u b l e (num) / den ; } };

Surcharge doprateurs e

Plan
14

Introduction Regroupement de donnes e Classes C++ Champs et mthodes e Constructeurs et destructeurs Fonctions amies Conversions entre types Surcharge doprateurs e

15

16

17

Surcharge doprateurs e

Surcharge doprateurs e
Il est possible de surcharger les oprateurs de C++ (+, -, [ ], =, e ==, . . . ): les arits et les priorits ne changent pas. e e Deux points de vue: fonction globale: A op B est vue comme lapplication dune fonction op ` deux arguments A de type TA et B de a type TB.
f r a c t i o n o p e r a t o r ( f r a c t i o n f , f r a c t i o n g ) { r e t u r n f r a c t i o n ( f . Numerateur ( ) g . Numerateur ( ) , f . Denominateur ( ) g . Denominateur ( ) ) ; } f r a c t i o n o p e r a t o r ( f r a c t i o n f ) { r e t u r n f r a c t i o n ( f . Numerateur ( ) , f . Denominateur ( ) ) ; }

Surcharge doprateurs e

Surcharge doprateurs e
fonction membre: A op B est vue comme lapplication dune fonction op ` un argument B de type TB sur lobjet A a de type TA.
class fraction { private : i n t num , den ; public : ... f r a c t i o n o p e r a t o r (); f r a c t i o n o p e r a t o r ( f r a c t i o n h ) ; }; f r a c t i o n f r a c t i o n : : o p e r a t o r () { r e t u r n f r a c t i o n (num , den ) ; } f r a c t i o n f r a c t i o n : : o p e r a t o r ( f r a c t i o n h ) { r e t u r n f r a c t i o n (numh . num , den h . den ) ; }

Surcharge doprateurs e

Surcharge de cout <<

Loprateur << ne peut tre surcharg que de mani`re globale. e e e e Prol pour un type T: ostream & << (ostream & , T ) Exemple:
// o s t r e a m & o p e r a t o r <<(o s t r e a m & os , f r a c t i o n f ) { o s << f . Numerateur ( ) << / << f . D e n o m i n a t e u r ( ) ; r e t u r n os ; } //

Quatri`me partie IV e Structures de donnes dynamiques e

Pointeurs

Plan

18

Pointeurs Pointeurs et tableaux new et delete structures de donnes dynamiques e Retour sur les classes

19

20

21

22

Pointeurs

Pointeurs

Une variable permet de dsigner par un nom un emplacement e dans la mmoire. e Il est aussi possible de dsigner directement les cases mmoire par e e leur adresse. Un pointeur permet de stocker ces adresses mmoire. e

Pointeurs

Pointeurs, *, &
Un pointeur est typ : on distingue les pointeurs sur un int, e sur un double, sur une fraction etc. Dnir un pointeur: e type * nom ; nom est un pointeur sur type, i.e. pouvant recevoir une adresse dsignant un objet de type type. e &V reprsente ladresse mmoire dune variable V. e e *P dsigne lobjet point par le pointeur P. e e
i n t i , pi , k ; i =3; p i = &i ; // p i p o i n t e s u r i k = ( p i )+5; // i d e n t i q u e ` : a k=i +5 ( p i ) = k +2; // i d e n t i q u e ` : a i = k+2 ( p i )++; // i c i , i =11 , k=8

Pointeurs

Pointeurs et rfrences ee

Au lieu du passage par rfrence, il est possible de passer (par ee valeur) les adresses des arguments dune fonction et de modier les donnes contenues ` ces adresses via loprateur *. e a e Fonction permut :
v o i d permut ( i n t pa , i n t pb ) { i n t aux = ( pa ) ; ( pa ) = ( pb ) ; ( pb ) = aux ; }

Pour changer les valeurs de i et j, on crit permut(&i,&j) ; e e (seule solution en C)

Pointeurs et tableaux

Plan

18

Pointeurs Pointeurs et tableaux new et delete structures de donnes dynamiques e Retour sur les classes

19

20

21

22

Pointeurs et tableaux

Tableaux ` la C a
type nom[taille] ; dnit un tableau dlments de type type et de taille taille e ee (indices de 0 ` taille 1). Llment dindice i est dsign par a ee e e nom[i]. Dans int Tab[10], Tab dsigne ladresse de la premi`re case e e du tableau (i.e. &Tab[0]) et le type de Tab est const int *. Quest-ce que Tab[i] ?

Pointeurs et tableaux

Tableaux ` la C a
type nom[taille] ; dnit un tableau dlments de type type et de taille taille e ee (indices de 0 ` taille 1). Llment dindice i est dsign par a ee e e nom[i]. Dans int Tab[10], Tab dsigne ladresse de la premi`re case e e du tableau (i.e. &Tab[0]) et le type de Tab est const int *. Quest-ce que Tab[i] ? cest (*(Tab+i)).
int T[10]; int p; p = &T [ 4 ] ; p [ 0 ] = 100; p [ 1 ] = 200;

// //

q u i v a u t ` T [ 4 ] = 100 e a q u i v a u t ` T [ 5 ] = 100 e a

Pointeurs et tableaux

Pointeurs et tableaux
Passer un tableau C en param`tre dune fonction revient ` e a passer ladresse de la premi`re case passage par rfrence. e ee Pour dclarer un param`tre T de type tableau dentiers, on e e crit: int T[]. e La taille doit tre passe avec un autre param`tre. e e e void Tri(int T[],int taille) autres cha nes de caract`res : tableaux (simples) de caract`res e e se terminant par le caract`re spcial \0. e e char T[8] = "exemple" ; dnit et initialise le tableau T avec T[0]= e, T[1]=x, e . . . , T[7]=\0.

new et delete

Plan

18

Pointeurs Pointeurs et tableaux new et delete structures de donnes dynamiques e Retour sur les classes

19

20

21

22

new et delete

new et delete

obj : allouer et dsallouer de la mmoire sans dpendre la dure de e e e e vie des variables. new type ; alloue un espace mmoire pour contenir un objet e de type type et retourne ladresse ce cette zone mmoire. e P = new type[N] ; alloue un espace mmoire capable de e contenir N objets de type type ... delete P ; dsalloue lespace mmoire dadresse P. e e (ou delete [ ] P ;) Une zone alloue par new nest dsalloue que par lappel de e e e delete. . .

new et delete

Un peu de cinma ... e

structures de donnes dynamiques e

Plan

18

Pointeurs Pointeurs et tableaux new et delete structures de donnes dynamiques e Retour sur les classes

19

20

21

22

structures de donnes dynamiques e

Structures de donnes dynamiques e


Une structure de donnes dynamique volue au cours du temps. e e Exemple de la pile: utiliser un tableau oblige ` borner la taille de la a pile. On prf`re allouer de lespace mmoire en fonction des besoins : ee e ajouter un lment ` la pile correspondra ` allouer (avec new) ee a a de la mmoire, et e supprimer reviendra ` dsallouer (avec delete) la case a e contenant lobjet. Le contenu de la pile sera donc clat dans la mmoire e e e Pour ne pas perdre dlments, on indique ` chaque lment o` se ee a ee u trouve le prochain lment. ee Cela correspond ` la notion de liste cha ee a n

structures de donnes dynamiques e

Listes cha ees n


Un maillon dune liste cha ee: n
c l a s s element { public : int val ; element s u i v a n t ; };

Le champ suivant contient ladresse du prochain lment de la liste ee (ou 0). On utilise ladresse du premier lment de la liste... ee Parcours de liste, inversion, longueur. . . Listes doublement cha ees, circulaires, . . . n

Retour sur les classes

Plan

18

Pointeurs Pointeurs et tableaux new et delete structures de donnes dynamiques e Retour sur les classes

19

20

21

22

Retour sur les classes

Classes et pointeurs

p->champ raccourci pour (*p).champ p->fct() raccourci pour (*p).fct() Lorsquon alloue de la mmoire pour stocker un objet de type e T, un constructeur est appel : e
soit celui sans argument (dans le cas dun new T), soit un avec argument si des arguments sont prsents ( new e T(a1,...,aN) ;).

Dans la dnition des fonctions membre, on peut accder ` e e a ladresse de lobjet courant: pointeur this.

Cinqui`me partie V e Complments e

Complments e

Hritage e Programmation oriente objet e Gnricit (classes, fonctions) e e e GDB Exceptions ...