Documente Academic
Documente Profesional
Documente Cultură
2 novembre 2005
Introduction
Introduction
Algorithme et programmation
Algorithme: m ethode pour r esoudre un probl` eme Pour un probl` eme donn e, il peut y avoir plusieurs algorithmes. . . ou aucun ! NB: pour la plupart des probl` emes int eressants, il nexiste pas dalgorithme (ni aujourdhui, ni demain !) Dans les probl` emes qui restent, la grande majorit e ont des algorithmes beaucoup trop durs pour etre utilis es ! On cherche des algorithmes simples, ecaces, el egants. . . Programme: . . . sadresse ` a une machine !
Introduction
Le langage C++
D ebut en 1983. Am elioration du langage C: Abstraction de donn ees Programmation orient ee objet Programmation g en erique tr` es utilis e!
Introduction
Programmer
Une fois trouv e lalgorithme, programmer en C++ comporte 3 phases: 1. Editer le programme avec votre editeur de texte favori. . .
Introduction
Programmer
Une fois trouv e lalgorithme, programmer en C++ comporte 3 phases: 1. Editer le programme avec votre editeur de texte favori. . . 2. Compiler le programme (avec g++)
Introduction
Programmer
Une fois trouv e lalgorithme, programmer en C++ comporte 3 phases: 1. Editer le programme avec votre editeur de texte favori. . . 2. Compiler le programme (avec g++) 3. Ex ecuter le programme
Introduction
Programmer
Une fois trouv e lalgorithme, programmer en C++ comporte 3 phases: 1. Editer le programme avec votre editeur de texte favori. . . 2. Compiler le programme (avec g++) 3. Ex ecuter le programme ... 4. TESTER et DEBUGGER : retour au point 1 ! C a peut durer assez longtemps...
Introduction
Un exemple
Lin evitable hello world:
#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 ; }
D emo...
Plan
Plan
2 3 4 5 6 7 8 9 10 11 12 13
Types, variables... Expressions Instructions Entr ees - Sorties Exemples Evaluation des expressions Structure g en erale dun programme C++ Proc edures et fonctions R ecursivit e Compl ements sur les fonctions Port ee, visibilit e, dur ee de vie des variables Compl ements
Plan
Programmation
Les briques de base du langage: Ce qui permet de stocker des donn ees: types, variables, tableaux, etc. Les expressions qui permettent de manipuler les donn ees. 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 Entr ees - Sorties Exemples Evaluation des expressions Structure g en erale dun programme C++ Proc edures et fonctions R ecursivit e Compl ements sur les fonctions Port ee, visibilit e, dur ee de vie des variables Compl ements
Types, variables...
Types el ementaires
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 ` a virgule ottante (en g en eral 15 chires sign. pour double). Par ex. 23.3 ou 2.456e 12 ou 23.56e 4 char : caract` eres (a,b,. . . A,. . . ,:,. . . ). bool : bool eens (true ou false). (Et: 0 false ; tout entier non nul equivaut ` a false) (Et aussi: des types particuliers pour les tailles de tableaux, de cha nes de caract` eres, dobjets etc. size t, ::size type)
Types, variables...
D enition de variable
Syntaxe : type v ; int p ; double x ; Toute variable doit etre d enie avant d etre utilis ee ! Une d enition peut appara tre nimporte o` u dans un programme. Une variable est d enie jusqu` a la n de la premi` ere instruction ee par }) qui contient sa d enition. compos ee (marqu (Une variable d enie en dehors de toute fonction et de tout espace de nom est une variable globale).
Types, variables...
D enition de variable
Une variable peut etre initialis ee lors de sa d eclaration, deux notations sont possibles : int p=34 ; double x=12.34 ; int p (34) ; double x (12.34) ;
Une variable dun type el ementaire qui nest pas initialis ee, na pas de valeur d enie: elle peut contenir nimporte quoi.
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 ` a la compilation). . .
Types, variables...
Types, variables...
Tableaux
Pour utiliser la classe vector, il faut placer en t ete du chier : # include <vector> Un tableau est typ e: vector<int> Tab(100,5) ; vector<int> Tab(50) ; vector<double> T ; Structure g en erale: vector< type > Nom(n,v ) ; vector< type > Nom1 = Nom2 ; les valeurs de Nom2 sont alors recopi ees dans Nom1. T.size() correspond ` a la taille de T. NB: size() renvoie en fait un entier non sign e, son type exact est vector<type>::size type
Types, variables...
Tableaux
T[i] d esigne le i-` eme el ement avec i = 0, . . . T.size()-1. vector<vector<int> > T d enit un tableau ` a deux 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 Entr ees - Sorties Exemples Evaluation des expressions Structure g en erale dun programme C++ Proc edures et fonctions R ecursivit e Compl ements sur les fonctions Port ee, visibilit e, dur ee de vie des variables Compl ements
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 ` a la variable v et retourne la valeur aect ee ` a v comme r esultat. Par exemple, i = (j = 0) aecte 0 ` a j puis ` a i et retourne 0 !!
Expressions
Op erateurs classiques
Op erateurs arithm etiques: *, +, -, / (division enti` ere et r eelle), % (modulo) Op erateurs de comparaison < (inf erieur), <= (inf erieur ou egal), == ( egal), > (sup erieur), >= (sup erieur ou egal) et != (di erent) Op erateurs bool eens && repr esente lop erateur ET, || repr esente le OU, et ! repr esente le NON. Par exemple, ((x<12) && ((y>0) || !(z>4)))
Expressions
++var incr emente la variable var et retourne la nouvelle valeur. (++i equivaut ` a i=i+1) var ++ incr emente la variable var et retourne lancienne valeur. (i++ equivaut ` a (i=i+1)-1) En dehors dune expression, i++ et ++i sont donc equivalentes.
Expressions
Lexpression --var d ecr emente la variable var et retourne la nouvelle valeur. Lexpression var -- d ecr emente la variable var et retourne lancienne valeur.
Instructions
Plan
2 3 4 5 6 7 8 9 10 11 12 13
Types, variables... Expressions Instructions Entr ees - Sorties Exemples Evaluation des expressions Structure g en erale dun programme C++ Proc edures et fonctions R ecursivit e Compl ements sur les fonctions Port ee, visibilit e, dur ee de vie des variables Compl ements
Instructions
Instructions usuelles
d enition de variables, fonctions, types etc. expr ; { liste dinstructions } : instruction compos ee. 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 ) ;
Plan
2 3 4 5 6 7 8 9 10 11 12 13
Types, variables... Expressions Instructions Entr ees - Sorties Exemples Evaluation des expressions Structure g en erale dun programme C++ Proc edures et fonctions R ecursivit e Compl ements sur les fonctions Port ee, visibilit e, dur ee de vie des variables Compl ements
Acher ` a l ecran
Pour utiliser les entr ees/sorties, il faut ajouter: # 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 ;
Acher ` a l ecran
Syntaxe : cout < < expr1 < < . . . < < exprn ; cout (ou std::cout) d esigne le ot de sortie standard. < < est un op erateur binaire:
le premier op erande est cout (de type ot de sortie) le second op erande est lexpression ` a acher le r esultat est de type ot de sortie
< < est associatif de gauche ` a droite < < est surcharg e (ou sur-d eni): on utilise le m eme op erateur pour acher des caract` eres, des entiers, des r eels ou des cha nes de caract` eres etc.
Lire au clavier
Syntaxe : cin > > var1 > > . . . > > varn ; Cette instruction lit (au clavier) des valeurs et les aecte ` a var1 puis var2 . . . cin est le ot dentr ee standard, et > > est un op erateur similaire ` a < <. Les caract` eres tap es au clavier sont enregistr es dans un buer dans lequel les cin viennent puiser des valeurs. Les espaces, les tabulations et les ns de lignes sont des s eparateurs.
Exemples
Plan
2 3 4 5 6 7 8 9 10 11 12 13
Types, variables... Expressions Instructions Entr ees - Sorties Exemples Evaluation des expressions Structure g en erale dun programme C++ Proc edures et fonctions R ecursivit e Compl ements sur les fonctions Port ee, visibilit e, dur ee de vie des variables Compl ements
Exemples
Exemples...
Plan
2 3 4 5 6 7 8 9 10 11 12 13
Types, variables... Expressions Instructions Entr ees - Sorties Exemples Evaluation des expressions Structure g en erale dun programme C++ Proc edures et fonctions R ecursivit e Compl ements sur les fonctions Port ee, visibilit e, dur ee de vie des variables Compl ements
Dans e1 && e2, la sous-expression e2 nest evalu ee que si e1 a et e evalu ee ` a true. if (i >=0 && T[i] > 20) blabla Dans e1 || e2, la sous-expression e2 nest evalu ee que si e1 a et e evalu ee ` a false. if (i<0 || T[i] > 20) blabla
Plan
2 3 4 5 6 7 8 9 10 11 12 13
Types, variables... Expressions Instructions Entr ees - Sorties Exemples Evaluation des expressions Structure g en erale dun programme C++ Proc edures et fonctions R ecursivit e Compl ements sur les fonctions Port ee, visibilit e, dur ee de vie des variables Compl ements
Un programme C++ est r eparti dans un ou plusieurs chiers. Chacun peut contenir des d enitions/d eclarations de fonctions, des d enitions de types et des d enitions de variables globales. Il existe une seule fonction main: cest la fonction qui sera ex ecut ee apr` es la compilation. Le prol de main est : int main() ou int main( int argc, char ** argv ) pour passer des arguments. Exemple de programme complet. . .
Plan
2 3 4 5 6 7 8 9 10 11 12 13
Types, variables... Expressions Instructions Entr ees - Sorties Exemples Evaluation des expressions Structure g en erale dun programme C++ Proc edures et fonctions R ecursivit e Compl ements sur les fonctions Port ee, visibilit e, dur ee de vie des variables Compl ements
D enition de fonction
type nom( liste des param` etres) { corps } type est le type du r esultat de la fonction. (void si il sagit dune proc edure) La liste des param` etres (param` etres formels): type1 p1, ..., typen pn Le corps d ecrit les instructions ` a eectuer. Le corps utilise ses propres variables locales, les eventuelles variables globales et les param` etres formels. Si une fonction renvoie un r esultat, il doit y avoir (au moins) une instruction return expr ; Dans le cas dune proc edure, on peut utiliser: return ;
Exemple
nom(liste des arguments) La liste des arguments (param` etres r eels) est expr1 , expr2 , . . . exprn o` u chaque expri est compatible avec le type typei du param` etre formel pi. Exemple : int k=34, t=5, m ; m = max(k,2*t+5) ;
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 ; }
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
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
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
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
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
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
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
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
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
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
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
void AfficherTab(vector<int> T) { for (int i=0 ; i< T.size() ; i++) cout << T[i] << " " ; }
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 ; }
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 ; }
Un identicateur XXX peut etre utilis e` a la ligne l de la d enition dune fonction F ssi: XXX est une variable d enie dans une instruction compos ee contenant l . XXX est un param` etre de F . (XXX est une variable globale, i.e. d enie hors de toute fonction.)
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 ; }
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
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
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
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
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
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
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
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
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
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
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
Par d efaut, les param` etres dune fonction sont initialis es par une copie des valeurs des param` etres r eels. Modier la valeur des param` etres formels dans le corps de la fonction ne change pas la valeur des param` etres r eels.
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 ; }
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
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
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
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
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
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
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
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
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
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
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 ; }
Pour modier la valeur dun param` etre r eel dans une fonction, il faut passer ce param` etre par r ef erence. Une r ef erence sur une variable est un synonyme de cette variable, cest-` a-dire une autre mani` ere de d esigner le m eme emplacement de la m emoire. On utilise le symbole & pour la d eclaration dune r ef erence: Dans la liste des param` etres de la d enition dune fonction, type & pi d eclare le param` etre pi comme etant une r ef erence sur le i eme param` etre r eel vi .
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 ; }
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
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
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
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
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
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
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
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
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
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
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
Il faut que les param` etres r eels soient compatibles avec un passage par r ef erence. . . permut(x,5) nest pas possible ! Usage bizarre des r ef erences dans la liste des param` etres: const type & p Id ee: le passage par r ef erence est plus ecace que le passage par valeur car il evite la recopie des arguments car seule ladresse m emoire de largument est communiqu ee ` a la fonction.
Exercice . . .
Exercice . . .
Algorithmes de tri Comment trier un tableau dentiers ? rechercher le plus grand el ement et le placer ` a la n du tableau recherche le deuxi` eme plus grand et le placer en avant-derni` ere position etc.
Exercice . . .
Algorithmes de tri Comment trier un tableau dentiers Tab ? Pour IndFin = Tab.size()-1 ... 1 faire rechercher lindice IMAX du plus grand el ement de Tab entre les indices 0 ` a IndFin. Permuter les el ements plac es en IMAX et IndFin.
Exercice . . .
Algorithmes de tri Comment trier un tableau dentiers Tab ? Pour IndFin = Tab.size()-1 ... 1 faire rechercher lindice IMAX du plus grand el ement de Tab entre les indices 0 ` a IndFin. Permuter les el ements plac es en IMAX et IndFin. A la premi` ere etape, on s electionne le plus grand el ement et on le place ` a la n du tableau ; puis on trouve le deuxi` eme plus grand et on le place ` a lavant-derni` ere place etc.
Fonction de s election
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 ; }
Fonction de s election
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 ; }
Fonction de s election
Fonction de s election
Tri in situ avec passage par r ef erence 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]) ; } }
R ecursivit e
Plan
2 3 4 5 6 7 8 9 10 11 12 13
Types, variables... Expressions Instructions Entr ees - Sorties Exemples Evaluation des expressions Structure g en erale dun programme C++ Proc edures et fonctions R ecursivit e Compl ements sur les fonctions Port ee, visibilit e, dur ee de vie des variables Compl ements
R ecursivit e
Fonctions r ecursives
R ecursivit e
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) ; } }
Plan
2 3 4 5 6 7 8 9 10 11 12 13
Types, variables... Expressions Instructions Entr ees - Sorties Exemples Evaluation des expressions Structure g en erale dun programme C++ Proc edures et fonctions R ecursivit e Compl ements sur les fonctions Port ee, visibilit e, dur ee de vie des variables Compl ements
On peut attribuer des valeurs par d efaut aux param` etres dune fonction. int max(int a,int b =0) { if (a>b) return a ; else return b ; }
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) ; }
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)
Fonctions inline
Pour de petites fonctions, il peut etre plus ecace (= rapide) d eviter un appel de fonction et ` a la place, expanser le corps de la fonction en lieu et place de chaque appel. Cest possible avec le mot cl e inline. inline int max(int a,int b =0) { if (a>b) return a ; else return b ; }
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
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) ; }
Plan
2 3 4 5 6 7 8 9 10 11 12 13
Types, variables... Expressions Instructions Entr ees - Sorties Exemples Evaluation des expressions Structure g en erale dun programme C++ Proc edures et fonctions R ecursivit e Compl ements sur les fonctions Port ee, visibilit e, dur ee de vie des variables Compl ements
La port ee dun identicateur correspond aux parties du programme o` u cet identicateur peut etre utilis e sans provoquer derreur ` a la compilation. La port ee dune variable globale ou dune fonction globale est egale au programme. enition jusqu` a la n de La port ee dune variable locale va de sa d la premi` ere instruction compos ee ({...}) qui contient sa d enition. Deux variables peuvent avoir le m eme nom mais dans ce cas, elle doivent avoir deux port es di erentes.
Port ee
{ int i=3 ; { int i=5 ; cout << i ; // affiche 5 } cout << i ; // affiche 3 } Les deux variables ont des port ees di erentes ! Exemple. . .
Visibilit e
La visibilit e dune variable dit quand elle est accessible La visibilit e est inclue dans la port ee... La dur ee de vie dune variable correspond ` a la p eriode depuis cr eation ` a sa destruction. Dur ee de vie et port ee co ncident pour toutes les variables que nous avons evoqu ees jusquici. mais . . .
Variables static
Lespace m emoire dune variable locale d eclar ee static est allou e une seule fois et nest d etruit qu` a la n du programme ! void Test(int v) { static int compteur=0 ; compteur++ ; cout << compteur << "-eme appel de Test"<< endl ; cout << " v = " << v << endl ; } Sa dur ee de vie est celle du programme.
Hanoi (suite)
Obj: compter le nombre dappels ` a la proc edure Hanoi. 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) ; } }
Espace de noms
Un programme important utilise de nombreuses biblioth` eques, fonctions etc. Pour eviter les probl` emes de conit de noms, on utilise des espaces de noms (namespace) : on associe un nom ` a un ensemble de variables, types, fonctions. leur nom complet est: leur nom despace suivi de :: et de leur nom. Ex. la fonction int fct(){...} d enie dans le domaine A aura pour nom complet A::fct() Les noms complets de cout et cin sont std::cout et std::cin. Pour eviter d ecrire les noms complets , on utilise: using namespace std ;
namespace toto { int N = 10 ; int Test() { cout << "test... " ; } } Les objets N et Test ont pour nom toto::N et toto::Test
Compl ements
Plan
2 3 4 5 6 7 8 9 10 11 12 13
Types, variables... Expressions Instructions Entr ees - Sorties Exemples Evaluation des expressions Structure g en erale dun programme C++ Proc edures et fonctions R ecursivit e Compl ements sur les fonctions Port ee, visibilit e, dur ee de vie des variables Compl ements
Compl ements
Compl ements - 1
Instructions suppl ementaires: break provoque larr et de la premi` ere instruction do, for, switch ou while englobant. continue provoque (dans une instruction do, for, ou while) larr et de lit eration courante et le passage au d ebut de lit eration suivante. switch (exp ) { case cste1 : liste dinstructions1 ... case csten : liste dinstructionsn default: liste dinstructions }
Compl ements
Compl ements - 2
(exp ) ? exp1 : exp2 vaut exp1 si exp est evalu ee ` a vrai et exp2 sinon. m = (i < j) ? i : j var op = expr d esigne lexpression var = var op expr (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 ;
Compl ements
Compl ements - 2
(exp ) ? exp1 : exp2 vaut exp1 si exp est evalu ee ` a vrai et exp2 sinon. m = (i < j) ? i : j var op = expr d esigne lexpression var = var op expr (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
Introduction
Plan
14
Introduction Regroupement de donn ees Classes C++ Champs et m ethodes Constructeurs et destructeurs Fonctions amies Conversions entre types Surcharge dop erateurs
15
16
17
Introduction
Introduction
Un algorithme nutilise pas que des objets de type int, double ou bool... etats et transitions lorsquon parle de graphes. Piquet et pions pour Hanoi Fractions Piles Un programme doit coller ` a lalgorithme !
Introduction
De nouveaux types
Il faut pouvoir d enir de nouveaux types de donn ees. D enir des variables de ce types, les manipuler dans les fonctions etc.
Introduction
De nouveaux types
Il faut pouvoir d enir de nouveaux types de donn ees. D enir des variables de ce types, les manipuler dans les fonctions etc. Un type de donn ees = regroupement de donn ees + des op erations Comme les types de base !
Plan
14
Introduction Regroupement de donn ees Classes C++ Champs et m ethodes Constructeurs et destructeurs Fonctions amies Conversions entre types Surcharge dop erateurs
15
16
17
Exemple: une base de donn ees pour les notes des etudiants.
Exemple: une base de donn ees pour les notes des etudiants. Chaque che d etudiant contient : un nom et un pr enom un num ero dinscription un ensemble de notes Une base de donn ees pour une promo = un ensemble de ches
Fiche d etudiants. . .
Fiche d etudiants. . .
fiche est un type comme les autres: fiche F ; d enit une variable F de type che. Une che contient plusieurs parties (champs), on y acc` ede par leur nom pr ec ed e dun point . : F.Nom d esigne le champ (de type string) Nom de la che F. F.Notes[i] d esigne le champ (de type double) Notes[i] de la che F. etc.
v . Prenom <<
demo 1-2-3
Les struct
On utilise le type d eni pat un struct comme nimporte quel autre type: dans les fonctions (param` etre ou r esultat), les variables, les tableaux etc. Les aectations (param` etres de fonction, variable, etc.) se font champ ` a champ.
Classes C++
Plan
14
Introduction Regroupement de donn ees Classes C++ Champs et m ethodes Constructeurs et destructeurs Fonctions amies Conversions entre types Surcharge dop erateurs
15
16
17
Classes C++
Lorsquon d enit un type de donn ees, on fournit des fonctions de manipulation et impose leur usage: les d etails dimpl ementation nont pas ` a etre connus par lutilisateur. eger certaines donn ees. On veut donc orir une interface et prot Les classes permettent de regrouper des donn ees associer des fonctions aux objets de la classe restreindre lacc` es ` a certaines donn ees
Classes C++
Fichier d etudiants
On veut construire des bases de donn ees pour stocker les ches d etudiants de chaque promo. Pour chaque promo, on veut disposer des fonctions suivantes: saisir les noms, pr enoms et num eros des etudiants : (initialisation de la base) saisir des notes pour un etudiant acher les notes dun etudiant acher la moyenne dun etudiant acher la moyenne pour un cours acher la moyenne g en erale
Classes C++
Fichier d etudiants
On veut construire des bases de donn ees pour stocker les ches d etudiants de chaque promo. Pour chaque promo, on veut disposer des fonctions suivantes: saisir les noms, pr enoms et num eros des etudiants : (initialisation de la base) saisir des notes pour un etudiant acher les notes dun etudiant acher la moyenne dun etudiant acher la moyenne pour un cours acher la moyenne g en erale Et cest tout !
Classes C++
Fichier d etudiants
Chaque promo doit contenir les donn ees suivantes: le nombre d etudiants le nombre de cours la liste des cours la che de chaque etudiant
Classes C++
Fichier d etudiants
On int` egre donc les donn ees suivantes dans une promo:
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++
On va utiliser une autre approche que celle pr esent ee dans la partie A. On va prot eger certains aspects du type Promo: la structure interne, le nom des champs... On va d enir des fonctions particuli` eres (fonctions membre, m ethodes) qui seules pourront acc eder ` a la partie cach ee du type Promo. Ces m ethodes seront linterface de la classe. On les d enit dans la classe.
Classes C++
Classes C++
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
M ethodes particuli` eres appel ees automatiquement ` a chaque d enition dun objet de la classe. Pour passer des arguments ` a un constructeur, il sut de faire suivre le nom de la variable par la liste des arguments : MaClasse A(i,f) ; Lorsquaucun argument nest donn e, le constructeur sans argument est appel e. Si aucun constructeur nest d eni explicitement, le compilateur cr ee un constructeur sans argument MaClasse::MaClasse() qui se contente dappeler les constructeurs (sans argument) de chaque champ de lobjet.
Classes C++
Constructeur copieur
MaClasse (const MaClasse &) : utilis e pour le passage des param` etres et les initialisations. Si une fonction a un param` etre A du type MaClasse, un appel de cette fonction avec une variable V de MaClasse conduit ` a linitialisation de A avec V via le constructeur copieur. Lorsquon d enit une variable V et quon linitialise ` a une valeur E, par linstruction MaClasse V=E ;, on utilise le constructeur copieur. Di erence avec : MaClasse V ; V=E ; Le constructeur copieur cr e e par d efaut fait une initialisation champ ` a champ avec les champs de largument.
Classes C++
Constructeur / destructeur
Il existe aussi des destructeurs : on peut d enir un (et un seul) destructeur qui est appel e automatiquement lorsquune variable locale est d etruite (surtout utiles pour les structures de donn ees dynamiques) Pour comprendre tous ces m ecanismes dappel... il faut les essayer !! cf. Constructeurs.cc
Classes C++
Fonctions amies
Si une fonction F est amie (friend) dune classe C1, alors F peut acc eder aux champs priv es de C1. Si une classe C2 comme est amie de C1, toutes les fonctions membres de C2 peuvent acc eder aux champs priv es de C1. Ces d eclarations se font dans la d enition de C1 :
c l a s s C1 { ... f r i e n d t y p e de F F ( paramde F ) ; f r i e n d c l a s s C2 ; ... };
Classes C++
Plan
14
Introduction Regroupement de donn ees Classes C++ Champs et m ethodes Constructeurs et destructeurs Fonctions amies Conversions entre types Surcharge dop erateurs
15
16
17
Lop erateur << ne peut etre surcharg e que de mani` ere globale. 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 ; } //
Pointeurs
Plan
18
Pointeurs Pointeurs et tableaux new et delete structures de donn ees dynamiques Retour sur les classes
19
20
21
22
Pointeurs
Pointeurs
Une variable permet de d esigner par un nom un emplacement dans la m emoire. Il est aussi possible de d esigner directement les cases m emoire par leur adresse. Un pointeur permet de stocker ces adresses m emoire.
Pointeurs
Pointeurs, *, &
Un pointeur est typ e : on distingue les pointeurs sur un int, sur un double, sur une fraction etc. D enir un pointeur: type * nom ; nom est un pointeur sur type , i.e. pouvant recevoir une adresse d esignant un objet de type type . &V repr esente ladresse m emoire dune variable V. *P d esigne lobjet point e par le pointeur P.
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 r ef erences
Au lieu du passage par r ef erence, il est possible de passer (par valeur) les adresses des arguments dune fonction et de modier les donn ees contenues ` a ces adresses via lop erateur *. Fonction permut :
v o i d permut ( i n t pa , i n t pb ) { i n t aux = ( pa ) ; ( pa ) = ( pb ) ; ( pb ) = aux ; }
Pointeurs et tableaux
Plan
18
Pointeurs Pointeurs et tableaux new et delete structures de donn ees dynamiques Retour sur les classes
19
20
21
22
Pointeurs et tableaux
Tableaux ` a la C
type nom[taille ] ; d enit un tableau d el ements de type type et de taille taille (indices de 0 ` a taille 1). L el ement dindice i est d esign e par nom[i ]. Dans int Tab[10], Tab d esigne ladresse de la premi` ere case du tableau (i.e. &Tab[0]) et le type de Tab est const int *. Quest-ce que Tab[i] ?
Pointeurs et tableaux
Tableaux ` a la C
type nom[taille ] ; d enit un tableau d el ements de type type et de taille taille (indices de 0 ` a taille 1). L el ement dindice i est d esign e par nom[i ]. Dans int Tab[10], Tab d esigne ladresse de la premi` ere case 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;
// //
Pointeurs et tableaux
Pointeurs et tableaux
Passer un tableau C en param` etre dune fonction revient ` a passer ladresse de la premi` ere case passage par r ef erence. Pour d eclarer un param` etre T de type tableau dentiers, on ecrit: int T[]. La taille doit etre pass ee avec un autre param` etre. void Tri(int T[],int taille) autres cha nes de caract` eres : tableaux (simples) de caract` eres se terminant par le caract` ere sp ecial \0. char T[8] = "exemple" ; d enit et initialise le tableau T avec T[0]= e, T[1]=x, . . . , T[7]=\0.
new et delete
Plan
18
Pointeurs Pointeurs et tableaux new et delete structures de donn ees dynamiques Retour sur les classes
19
20
21
22
new et delete
new et delete
obj : allouer et d esallouer de la m emoire sans d ependre la dur ee de vie des variables. new type ; alloue un espace m emoire pour contenir un objet de type type et retourne ladresse ce cette zone m emoire. P = new type [N ] ; alloue un espace m emoire capable de contenir N objets de type type ... delete P ; d esalloue lespace m emoire dadresse P . (ou delete [ ] P ;) Une zone allou ee par new nest d esallou ee que par lappel de delete. . .
new et delete
Plan
18
Pointeurs Pointeurs et tableaux new et delete structures de donn ees dynamiques Retour sur les classes
19
20
21
22
Le champ suivant contient ladresse du prochain el ement de la liste (ou 0). On utilise ladresse du premier el ement de la liste... Parcours de liste, inversion, longueur. . . Listes doublement cha n ees, circulaires, . . .
Plan
18
Pointeurs Pointeurs et tableaux new et delete structures de donn ees dynamiques Retour sur les classes
19
20
21
22
Classes et pointeurs
p->champ raccourci pour (*p).champ p->fct() raccourci pour (*p).fct() Lorsquon alloue de la m emoire pour stocker un objet de type T, un constructeur est appel e:
soit celui sans argument (dans le cas dun new T), soit un avec argument si des arguments sont pr esents ( new T(a1,...,aN) ;).
Dans la d enition des fonctions membre, on peut acc eder ` a ladresse de lobjet courant: pointeur this.
Compl ements
H eritage Programmation orient ee objet G en ericit e (classes, fonctions) GDB Exceptions ...