1
++- 1 M BENJELLOUN 2015 UMONS
Mohammed BENJELLOUN
Service drsquoInformatique
Faculteacute Polytechnique de Mons
MohammedBenjellounumonsacbe
2015
++- 2 M BENJELLOUN 2015 UMONS
Objectifs
Ecirctre capable de construire des bons programmes
Des programmes corrects efficaces robustes relativement faciles agrave comprendre agrave modifier et agrave maintenir
Qualiteacutes attendues dun programme
Clarteacute Simpliciteacute Efficaciteacute Modulariteacute Extensibiliteacute
Programmer de maniegravere modulaire
Lors des seacuteances dexercices ougrave la preacutesence est obligatoire comme aux TPs un compleacutement de matiegravere sera abordeacute On ne peut donc consideacuterer le syllabu et ce document comme complets
Preacute-requis Aucun
2
++- 3 M BENJELLOUN 2015 UMONS
Architecture claire
Algorithmes
Structures de donneacutees
Reacuteutilisabiliteacute
Tests de robustesse
Documentation
ldquoComment organiser au mieux lrsquoinformation dans un programme rdquo
Qualiteacute drsquoun programme
Non
Oui
Menu
Deacutebut programme
Bon Choix
Saisie()
Affichage()
(1) (2) (3)
(1) OK
Oui
Non
hellip
hellip
(4)
Fin
Tri()
Affichage()
++- 4 M BENJELLOUN 2015 UMONS
Moodle
Cest en forgeant que lon devient forgeron et cest en programmant que euh Peut-ecirctre hellip
Codes sources
C++ Programmes
Transp
Eacutenonceacute des TPs
Preacuteparez les TPs
Syllabuspdf
Document
lsquorsquoEnvironnement logicielrsquorsquo
Videacuteos
120 tests formatifs sur C++
Note relative agrave lrsquoorganisation de lrsquoexamen pratique
hellip
Utilisation du deacutebuggeur
httpsmoodleumonsacbe
3
++- 5 M BENJELLOUN 2015 UMONS
Le langage C++ Quest-ce que crsquoest Dougrave vient-il Pourquoi utiliser C++ Que peut-on faire avec et agrave quoi ccedila sert De quoi ai-je besoin pour programmer en C++
Caracteacuteristiques du C++ bull Langage structureacute tacircches dun programme en blocs bull Programmes efficaces geacutenegravere un code compact et rapidehellip bull Modulaire deacutecoupe en modules bull Objets meilleure qualiteacute de programmation
++- 6 M BENJELLOUN 2015 UMONS
Les entreacutees sorties cin et cout
bull cout le flux standard de sortie habituellement associeacute agrave leacutecran
Syntaxe cout ltlt expression ltlt expression hellip
bull cin le flux standard drsquoentreacutee habituellement associeacute au clavier
Syntaxe cin gtgt valeur gtgt valeur gtgt valeur hellip
include ltiostreamgt
using namespace std
void main()
cout ltlt Salut a vous tous ltlt endl
cout ltlt oui tous
endl signifie un saut de ligne
7
Pour commencer Tout programme doit avoir un point drsquoentreacutee nommeacute main()
4
++- 7 M BENJELLOUN 2015 UMONS
Directives du preacuteprocesseur
Une directive preacuteprocesseur est une directive de compilation (preacuteceacutedeacutees par un )
Gestion des Entreacutees-Sorties standard ltiostreamgt
Fonctions matheacutematiques ltcmathgt
Traitement de chaicircnes de caractegraveres ltstringgt
Controcircler les paramegravetres daffichage ltiomanipgt
include ltcmathgt
++- 8 M BENJELLOUN 2015 UMONS
cout ltltQuil est agreable dutiliser
ltltcout ent C++nlorsquon lutilise ltltendl ltlt ttproprement
Reacutesultat
Quil est agreable dutiliser cout en C++
lorsquon lutilise
proprement
Caractegraveres
Signification
CODE ASCII
(hexadeacutecimal)
n ou endl Geacutenegravere une nouvelle ligne (newline) 0x0A
t Tabulation horizontale 0x09
v Tabulation verticale 0x0B
b Retour drsquoun caractegravere en arriegravere (backspace) 0x08
r Retour chariot (return) 0x0D
f Saut de page (form feed) 0x0C
t
t t
5
++- 9 M BENJELLOUN 2015 UMONS
setw(int) impose la largeur daffichage agrave int caractegraveres Texte et nombres sont aligneacutes agrave droite
setprecision(int) impose le nombre de caractegraveres du nombre afficheacute
setfill(char) remplace les espaces preacuteceacutedant le nombre par le caractegravere char
include ltiostreamgt
include ltiomanipgt
using namespace std
void main()
const double Pi = 314159265359
cout ltlt Pi ltlt endl
cout ltlt setprecision(9) ltlt Pi ltlt endl
cout ltlt setprecision(2) ltlt Pi ltlt endl
cout ltlt setw(10) ltlt setprecision(2) ltlt Pi ltlt endl
cout ltlt setw(15) ltlt setfill() ltlt setprecision(9) ltlt Pi ltlt endl
314159 314159265 31 31 314159265
Formatage de la preacutesentation eacutecran
++- 10 M BENJELLOUN 2015 UMONS
Identificateurs
Les identificateurs nomment les objets C++ (fonctions variables )
Le C++ distingue les minuscules des majuscules
Exemple ab Ab AB
sont des identificateurs valides et tous diffeacuterents
Identificateurs valides
xx y1 somme_5 _position Noms Programme_1
Identificateurs invalides
3eme commence par un chiffre
xy caractegravere non autoriseacute ()
no-commande caractegravere non autoriseacute (-)
taux change caractegravere non autoriseacute (espace)
6
++- 11 M BENJELLOUN 2015 UMONS
Un identificateur ne peut pas ecirctre un mot reacuteserveacute du langage
Les mots reacuteserveacutes du langage C++
doivent ecirctre eacutecrits en minuscules
++- 12 M BENJELLOUN 2015 UMONS
Variables deacuteclarations
Syntaxe Type identificateur1 id2hellip
char c1 c2 c3
int i j var_ent
float f variable
Exemple
initialisations
int i=9 ou int i
i=9
char c1= A ou char c1
c1= A
Constantes deacuteclarations + initialisations
Syntaxe const Type identificateur1=Val1 identificateur2=Val2 helliphellip
const char c = A
const int i=5 var_ent=8
Exemple const int i
i= 5
Lrsquoinitialisation des constantes est obligatoire lors de leur deacuteclaration
7
++- 13 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std int Somme(int x int y)
void main(void)
int Som
Som = Somme(79) appel de la fonction
if ( Som gt 10 )
cout ltlt Som gt 10 ltlt Somltlt endl
else
cout ltlt Som lt= 10 ltlt Som
int Somme(int x int y) Deacutefinition de
la fonction
int S
S= x+y
return S
Directives du preacuteprocesseur accegraves avant la compilation
Programme
principal
Deacuteclarations
Traitements Donneacutees Structures de controcircle Commentaires
Structure dun programme C++ exemple
++- 14 M BENJELLOUN 2015 UMONS
Les opeacuterateurs arithmeacutetiques
Le C++ propose les opeacuterateurs suivants
+ addition - soustraction multiplication division modulo (reste de la division entiegravere )
ne peut ecirctre utiliseacute quavec des entiers
72 702 720 7020
3
35
hellip void main() int i = 6 j = 4 k float f = 60 g = 40 h k = i j k= 64 = 1 h = f g h = 6040 = 15 h = i j h = 64 = 1000
Modulo C=AB C 42 = 0 52 = 1 83= 2 C=A2 Si C=0 alors A est pair sinon (=1) A est impair
8
++- 15 M BENJELLOUN 2015 UMONS
Comparaisons lt plus petit
lt= plus petit ou eacutegal
gt plus grand
gt= plus grand ou eacutegal
== eacutegal
= diffeacuterent
Les opeacuterateurs logiques
ampamp et
|| ou (non exclusif)
non
Contractions dopeacuterateurs
+= -= = = =
amp= |= ^= ltlt= gtgt=
a += 15
a = a + 15
i = j + 5
i = i (j + 5)
Le reacutesultat dune expression logique est un
booleacuteen Il vaut true si elle est vraie et false sinon
Reacuteciproquement toute valeur non nulle est consideacutereacutee
comme vraie et la valeur nulle comme fausse
Increacutement et deacutecreacutement
Pour
++ increacutement i++ ou ++i
est eacutequivalent agrave i += 1 ou i = i + 1
- - deacutecreacutement
int i = 5 j = 4
char lettre = B
i++ i vaudra 6
--j j vaudra 3
++i i vaudra 7
lettre++ lettre vaudra C
lettre -- lettre vaudra B
++- 16 M BENJELLOUN 2015 UMONS
Nous consideacuterons un circuit eacutelectrique Quand lrsquointerrupteur lsquoIntrsquo est dans la position de la Fig (X=1) le geacuteneacuterateur de tension lsquoGrsquo allume lrsquoampoule lsquoXrsquo (X=true ou X = 1) Quand lrsquointerrupteur srsquoouvre lsquoXrsquo srsquoeacuteteint (X=false ou X = 0) Afin de simuler le clignotement drsquoune ampoule (X) compleacutetez le code de sorte que lrsquoexeacutecution du programme fournisse les reacutesultats ci-dessous (en rouge)
include ltiostreamgt using namespace std void main() bool x = 1 cout ltlt Test X = ltlt x ltlt endl cout ltlt --------------------------ltlt endl for (int i=0 i lt 6 i++ ) x= 1-x x = x ou x=x2 cout ltlt X = ltlt x ltlt endl
Test X = 1 -------------- X = 0 X = 1 X = 0 X = 1 X = 0 X = 1
9
++- 17 M BENJELLOUN 2015 UMONS
Les structures de controcircle
Alternative if-else
Iteacuterations for while do-while
Rupture de Controcircle break continue return hellip
Choix Multiple switch-case
Bloc 1
drsquoinstructions
Bloc 2
drsquoinstructions
oui non
Suite du programme
oui non
Suite du
programme Bloc
drsquoinstructions
Condition
vraie
oui
non
Bloc
drsquoinstructions
programme
Condition vraie
Suite du programme
programme
Condition
vraie
if-else while
do-while
++- 18 M BENJELLOUN 2015 UMONS
Les deacutecisions - if hellip else
if (Condition vraie)
BLOC 1 DINSTRUCTIONS
else
BLOC 2 DINSTRUCTIONS
Bloc 1
drsquoinstructions
Bloc 2
drsquoinstructions
oui non
Suite du programme
programme
Condition
vraie
if (Condition vraie)
instruction 1
instruction 2
else
instruction 3
instruction 4
Bloc 1
drsquoinstructions
oui non
Suite du programme
Condition
vraie
if (Condition vraie)
instruction 1
instruction 2
instruction 3 hellip
instruction N
if (Condition vraie)
instruction 1
if ( temperature gt 700)
cout ltlt Alarme ltltendl
if (Condition vraie)
instruction A
else
instruction B
if (altb) min=a
else min=b
if (i) if (i = 0)
10
++- 19 M BENJELLOUN 2015 UMONS
if ( ltexpr1gt )
ltbloc1gt
else if (ltexpr2gt)
ltbloc2gt
else if (ltexpr3gt)
ltbloc3gt
else if (ltexprNgt)
ltblocNgt
else ltblocN+1gt
if ( ltexpr1gt )
ltbloc1gt
else if (ltexpr2gt)
ltbloc2gt
else if (ltexpr3gt)
ltbloc3gt
else if (ltexprNgt)
ltblocNgt
else ltblocN+1gt
if emboicircteacutes
else est associeacute avec le if le plus proche
if(i gt= 0)
if(i gt 1000) coutltlt i gt 1000
else coutltlt i lt 0 n
if(i gt= 0)
if(i gt 1000) coutltlt i gt 1000
else coutltlt i lt 0 n
++- 20 M BENJELLOUN 2015 UMONS
for( )
Les iteacuterations ndash for
for( initialisation (Condition vraie) iteacuteration )
liste dinstructions
int i j
float K
for(i = 0 j = 2 k = 75 (i lt 20) ampamp(j==2) i++ k-=02)
int ij
for (i = 0 i lt3 i++)
coutltlt i = ltlt i ltlt endl
cout ltltendlltltendl
for(j = 5 j gt 0 j- -)
coutltlt j = ltlt j ltlt endl
i = 0
i = 1
i = 2
j = 5
j = 4
j = 3
j = 2
j = 1
boucle infinie
11
++- 21 M BENJELLOUN 2015 UMONS
La boucle TANT QUE FAIRE
Boucle preacute-testeacutee
Il sagit de linstruction while
tant que (expression vraie)
faire BLOC DINSTRUCTIONS
Organigramme
while (Condition vraie)
bloc dinstructions
Le test se fait dabord le bloc
dinstructions nest pas forceacutement exeacutecuteacute
Syntaxe
tant que pas jusqursquoagrave ce que
oui non
Suite du
programme
Condition
vraie
Bloc 1
drsquoinstructions
++- 22 M BENJELLOUN 2015 UMONS
i=1
while(ilt5)
coutltltInterieur ltlti ltlt endl
i++
coutltltExterieur ltlti ltlt endl
Exemples
Interieur 1
hellip
hellip
int j = 5
coutltltstartn
while(j == 0)
coutltltj = ltltj--ltltendl
coutltltendn
start
end
i=1
while(ilt5)
coutltltInterieur ltlti ltlt endl
i++
iteacuteration
12
++- 23 M BENJELLOUN 2015 UMONS
do while = REPETER hellip tant que
do
bloc dinstructions
while (Condition vraie) Condition
vraie
oui non
Bloc
drsquoinstructions
programme
int j = 5
do
coutltltj = ltltj--ltltendl
while(j gt 0)
cout ltltstopn
Suite du programme
(garantit lrsquoexeacutecution au moins une fois)
int j = 5
do
coutltltj = ltltj ltltendl
j--
while(j gt 0)
cout ltltstopn
j = 5
j = 4
j = 3
j = 2
j = 1
stop
++- 24 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void main()
for (char lettre = A lettre lt= M lettre++)
coutltltlettre
coutltltendl
for (float pourcent = 00 pourcent lt 05 pourcent += 01)
coutltltpourcentltltendl
for (int i=2 i lt= 3 i++)
cout ltlt Table de ltlt i ltlt ltlt endl
for (int j=0 j lt= 3 j++)
cout ltlt ltlt i ltlt ltlt j ltlt = ltlt ij ltlt endl
ABCDEFGHIJKLM
0
01
02
03
04 Table de 2 2 0 = 0 2 1 = 2 2 2 = 4 2 3 = 6 Table de 3 3 0 = 0 hellip
13
++- 25 M BENJELLOUN 2015 UMONS
include hellip
void main()
bool sortir = false
char rep
coutltltAvant la boucleltltendl
while(sortir)
coutltltDans la boucleltltendl
coutltltVoulez vous quitter (ON)ltltendl
cingtgtrep
if(rep==O)
sortir=true
coutltltApres la boucleltltendl
include hellip
void main()
bool sortir = false
char rep
coutltltAvant la boucleltltendl
do
coutltltDans la boucleltltendl
coutltltVoulez vous quitter (ON)ltltendl
cingtgtrep
if(rep==O)
sortir=true
while(sortir)
coutltltApres la boucleltltendl
++- 26 M BENJELLOUN 2015 UMONS
int i j=1
char a
for (i = -10 i lt= 10 i++)
while(j=0)
cin gtgt a if(a==x)
break
Pour rompre le deacuteroulement seacutequentiel dune suite dinstructions
Instructions deacutechappement
return (expression) permet de sortir de la fonction qui la contient
exit (expression) La fonction est interrompue lsquoexpressionrsquo un entier
indiquant le code de terminaison du processus
for (i = -10 i lt= 10 i++)
if (i == 0)
continue pour eacuteviter la division par zeacutero
cout ltlt 1 i
while (Condition vraie)
continue
break
8
14
++- 27 M BENJELLOUN 2015 UMONS
switch = AU CAS OU FAIRE
hellip
switch(variable de type char ou int) au cas ougrave la variable vaut
case valeur1 variable=valeur1 exeacutecutez ce bloc dinstructions
break
case valeur2 variable=valeur2 exeacutecutez ce bloc dinstructions
break
etc
default aucune des valeurs preacuteceacutedentes exeacutecutez ce bloc
dinstructions pas de break ici
Le bloc default nest pas obligatoire valeur1 valeur2 hellip doivent ecirctre des expressions
constantes Lrsquoinstruction switch correspond agrave une cascade drsquoinstructions if else
++- 28 M BENJELLOUN 2015 UMONS
hellip
void main( )
const float PI= 314159 float rayon = 35 float diametre circonference surface int choix
cout ltlt 1 Calculer la circonferencen cout ltlt 2 Calculer la surfacen cout ltlt 3 Calculer le diametren cout ltlt Votre choix cin gtgt choix
switch (choix) case 1 circonference = 2PIrayon break case 2 surface = PIrayonrayon break case 3 diametre = 2rayon break default cout ltlt Mauvais choixhellipn
char choix
switch(choix)
case 1 hellip
switch(i)
case 2 j
float f
switch(f)
case 2
switch instruction commode pour les menus
15
++- 29 M BENJELLOUN 2015 UMONS
Tableaux et Strings
Un tableau est une collection de variables de mecircme type appeleacutees eacuteleacutements
Type Nom_Tableau[dim]
int tab[4] deacuteclare un tableau de 4 valeurs entiegraveres tab[0] tab[1] tab[2] tab[3]
const int SIZE = 5
int A[SIZE] A est un vecteur de 5 entiers
float B[5]
int A[SIZE] = 10 20 30 40 50
int premier[] = 1 2 3 5 7 11 13
char Tab_Char[4] = A C F G
int Tab[50] = 0
int i = 10
int a[i]
int primes[]
Deacuteclaration
Initialisation
Interdiction
Constante
++- 30 M BENJELLOUN 2015 UMONS
Accegraves aux eacuteleacutements drsquoun tableau
Les eacuteleacutements sont numeacuteroteacutes de 0 agrave dim-1
Il nrsquoy a pas de veacuterification des bornes
void main()
int a[6]
int i = 7
a[0] = 9
a[5] = -10
a[i2] = 2
a[6] = 0
a[-1] = 5
0
a
1
2
3
4
5
9
2
-10
void main(void)
const int dim=6
int i
int A[dim] = 1 2 3 4 5 6
for (i=0iltdimi++)
A[i] = 2i
coutltltA[ltltiltlt]=ltltA[i]
A[0]=0 A[1]=2 A[2]=4 A[3]=6 A[4]=8 A[5]=10
16
++- 31 M BENJELLOUN 2015 UMONS
Chaicircnes de caractegraveres ou String
char Nom[dim] Initialisation
Pour terminer la chaicircne on place en fin de chaicircne le caractegravere nul 0 de code ASCII 0
Ce caractegravere est soit ajouteacute automatiquement par le compilateur soit introduit par le programmeur selon les fonctions utiliseacutees
char S[] = Hello0 H
e
l
l
o
0
S[0] S[1] S[2] S[3] S[4] S[5] char S[6] = Hello
char S[5] = Hello H e l l o
char S[] = Le main L e m a i n 0
bull Un tableau de char agrave une dimension char Nom[dim]
bull Un type speacutecial string string Nom Il faut inclure ltstringgt
++- 32 M BENJELLOUN 2015 UMONS
string Nom Il faut inclure ltstringgt
string Nom est eacutequivalente agrave string Nom = Donc par deacutefaut la chaicircne est vide
Il existe de nombreuses faccedilons drsquoinitialiser Ident par exemple
string s1 = Bonjour a vous
string s2 = s1 s2 contient Bonjour a vous
string s3(4 x) eacutequivaut agrave string s3 = xxxx
string s4(s1 4 8) s4 contient our a voldquo S1 de 4 + 8
B o n j o u r a v o u s 0 1 2 3 4 5 6 7 8 9 10 11 12 13
include ltstringgt hellip string ST = Salut char H[6] = Hello for (int i=0 ilt5 i++) cout ltlt ST[i] ltlt affichera S a l u t
for (int i=0 ilt5 i++) cout ltlt H[i] ltlt affichera H e l l o
17
++- 33 M BENJELLOUN 2015 UMONS
Pourquoi utiliser string Nom plutocirct que char Nom[dim]
char S1[6] = Salut S2[6] = Hello S3[12]
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Interdit
string S1 = Salut S2 = Hello S3
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Autoriseacute
S1= Hello
S1= Hooo
S3= HoooHello
false
++- 34 M BENJELLOUN 2015 UMONS
include ltiostreamgt
include ltstringgt traitement de string
using namespace std espace de nommage std pour importer les
symboles de la bibliothegraveque standard C++
void main(void)
string nom1 nom2 nom3
int len size
cout ltlt Donnez Nom1 cin gtgt nom1
cout ltlt Donnez Nom2 cin gtgt nom2
len = nom1length() nombre de caractegraveres dans nom1
size = nom2size() nombre de caractegraveres dans nom2
cout ltlt Nom1 ltltnom1 ltlt Dim Nom1 = ltlt len ltlt endl
cout ltlt Nom2 ltltnom2 ltlt Dim Nom2 = ltlt size ltlt endl
nom3 = nom2+ +nom1
cout ltlt Nom3 = ltlt nom3 ltlt endl
if(nom1gtnom2) cout ltlt nom1 gt nom2 ltlt endl
else if (nom1==nom2) cout ltlt nom1 = nom2 ltlt endl
else cout ltlt nom1 lt nom2 ltlt endl
nom1=nom2
cout ltlt nom1 = ltlt nom1 ltlt nom2 ltlt nom2 ltlt endl
Donnez Nom1 salut
Donnez Nom2 hello
Nom1 salut Dim Nom1 = 5
Nom2 hello Dim Nom2 = 5
Nom3 = hello salut
nom1 gt nom2
nom1 = hello nom2 hello
Donnez Nom1 csou
Donnez Nom2 pi
Nom1csou Dim Nom1 = 4
Nom2pi Dim Nom2 = 2
Nom3 = pi csou
nom1 lt nom2
nom1 = pi nom2 pi
18
++- 35 M BENJELLOUN 2015 UMONS
Algorithmes de tri
Nom de lrsquoalgorithme Complexiteacute
Tri agrave bulles Tri par seacutelection Tri par insertion Tri de Shell (shell sort) Ameacutelioration du tri par insertion Tri fusion (merge sort) Tri rapide (quick sort) Tri par tas (heap sort)
O(N2) O(N2) O(N2)
O(N log2 N)
O(N log N) O(N log N) O(N log N)
++- 36 M BENJELLOUN 2015 UMONS
Tri agrave bulles bubble sort
reacutepeacuteter permutation = FALSE commencer au deacutebut du drapeau Pour i variant de 0 agrave N ndash 2 faire si cellule [i] gt cellule [i+1] alors deacutebut permuter cellules permutation = TRUE fin jusquagrave ce que (not permutation)
Complexiteacute O(Nsup2) Proportionnel agrave Nsup2 permutations
void TriaBulles(int x[] int N) int i perm=1 tmp while (perm==1) perm =0 for (i=0iltN-1i++) if(x[i] gt x[i+1]) tmp = x[i] x[i] = x[i+1] x[i+1] = tmp perm = 1
Algorithmes de tri
19
++- 37 M BENJELLOUN 2015 UMONS
void tri_par_selection(int t[] int n) int i j min tmp for (i = 0 i lt n - 1 i++) min = i for(j = i+1 j lt n j++) if(t[j] lt t[min]) min = j if(min = i) tmp = t[i] t[i] = t[min] t[min] = tmp
Le tri par seacutelection consiste en la recherche du plus grand eacuteleacutement (le plus petit) que lon va replacer en derniegravere position (en premiegravere) puis on recherche le second plus grand eacuteleacutement (le second plus petit) que lon va replacer eacutegalement agrave sa position finale et ainsi de suite
Algorithmes de tri
++- 38 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement dans un tableau
Recherche lineacuteaire Recherche dichotomique (binary search)
0
9
1
3
2
6
3
2
4
1
5
12
6
0
Est une meacutethode efficace pour retrouver un eacuteleacutement dans un tableau trieacute
A chaque eacutetape de la recherche dichotomique lrsquointervalle de recherche est diviseacute par deux
On utilise degraves lors deux index de recherche la borne infeacuterieure et la borne supeacuterieure
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup mid
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup
On initialise les bornes inf et sup agrave la premiegravere et derniegravere valeur des index du tableau tab
respectivement
Le milieu est donneacute par
mid = (inf+sup) 2 (0+6)2 =3
Supposons que lrsquoon recherche la valeur i=6 On
compare cette valeur avec tab[mid]=8 Comme
tab[mid]gti on change mid en sup
mid = (inf+sup) 2 (0+3)2 =1
inf=1 et sup=3
hellip
20
++- 39 M BENJELLOUN 2015 UMONS
44 Eacutecrire un programme qui supprime le premier et le dernier eacuteleacutement drsquoun vecteur
vecteur initial Tab 0 1 2 3 4 5 6
sup bords 1 2 3 4 5
sup bords 2 3 4
45 Eacutecrire un programme qui supprime le milieu du tableau et ajoute son double au deacutebut
vecteur initial Tab 1 2 3 4 5
sup Aj 6 1 2 4 5
sup Aj 4 6 1 4 5
46 Codez un programme de tri agrave bulles dun vecteur de strings
47 Codez un programme de recherche dichotomique dun nombre dans un vecteur de
strings rangeacutes par ordre croissant
++- 40 M BENJELLOUN 2015 UMONS
Matrices Rangeacutees ligne par ligne
Consideacutereacutees comme des vecteurs de lignes
Accegraves aux composantes par double crochets
int a[10][5]
a[1][0] = 7
int x[2][2] = 123 4 2 lignes et 2 colonnes
1 2
3 4 include hellip
void main()
int i j tab[5][4]
for (i = 0 i lt5 i++) Saisie
for (j = 0 j lt 4 j++) tab[i][j] = i
for (i = 0 i lt5 i++) Affichage
for (j = 0 j lt 4 j++) coutltlt tab[i][j] ltlt
cout ltlt endl
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
21
++- 41 M BENJELLOUN 2015 UMONS
Affichage de la table de multiplication
++- 42 M BENJELLOUN 2015 UMONS
Fonctions en C++
Encapsule un traitement particulier formant un tout
Peut impleacutementer la notion de module en logique
Augmente la lisibiliteacute drsquoun programme
Reacutealise un objectif preacutecis
Ameacuteliore le deacutebogage et la maintenance drsquoun programme
Son utilisation se deacutecompose en trois phases
Deacutefinition de la fonction
Deacuteclaration de la fonction
Appel de la fonction
Deacuteclarer une fonction
Appeler une fonction
Regravegles de visibiliteacute des variables
Passage des paramegravetres par valeur
Fonction renvoyant une valeur au programme
Passage des paramegravetres par valeur et par adresse
Passage des tableaux aux fonctions
22
++- 43 M BENJELLOUN 2015 UMONS
Type nom_fonction(liste_param_typeacutes)
deacuteclaration de variables locales
hellip Corps de la fonction
hellip
return (valeur)
Deacutefinition drsquoune fonction
Une fonction renvoie une valeur ou rien
liste_param_typeacutes = 0 void ou plusieurs
int Somme(int x int y)
int S Variable locale agrave Somme
S= x+y
return S
void fonction1()
coutltltn fonction1 n
void fonction2() coutltltn fonction2 n
Limbrication de fonctions
nest pas autoriseacutee
Deacutefinition
++- 44 M BENJELLOUN 2015 UMONS
Fonctions pourquoi
include ltiostreamgt
using namespace std
void main()
int i j SomCar1=0 SomCar2=0 SomCar3=0
for (i = 0 i lt5 i++)
SomCar1 = SomCar1 + ii
for (i = 0 i lt10 i++)
SomCar2 = SomCar2 + ii
for (j = 0 j lt 7 j++)
SomCar3 = SomCar3 + jj
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
include ltiostreamgt
using namespace std
int Fnct_SomCar(int N)
int i S=0
for (i = 0 i ltN i++)
S = S + ii S+=ii
return S
void main()
int SomCar1 SomCar2 SomCar3
SomCar1 = Fnct_SomCar(5)
SomCar2 = Fnct_SomCar(10)
SomCar3 = Fnct_SomCar(7)
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
23
++- 45 M BENJELLOUN 2015 UMONS
hellip
int Somme(int x int y)
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
int Somme(int x int y)
int S
S= x+y
return S
hellip
int Somme(int x int y)
int S
S= x+y
return S
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
Deacuteclaration et appel drsquoune fonction
++- 46 M BENJELLOUN 2015 UMONS
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
int addition() float tmp tmp = calcule(253) + calcule(572) return (int)tmp float calcule(float C float D) return ( (C + D ) 2)
float calcule(float float)
int addition()
float calcule(float A float B) return ( (A + B ) 2)
int addition() Appel drsquoune fonction dans une fonction
float tmp tmp = calcule(253) + calcule(572) return (int)tmp
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
Deacuteclaration et appel drsquoune fonction
24
++- 47 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void Addition(int v float f)
void main()
int v = 5
float f= 45
Addition(v f) Appel de la fonction
cout ltlt n Main v et f ltlt v ltlt et ltltf
void Addition(int v float f)
cout ltlt Addition v + f = ltlt v+f ltlt endl
f = f + v
cout ltlt Addition f = ltlt f
Addition v+f = 95
Addition f = 95
Main v et f = 5 et 45
v= 5 et f=45
5+ 45
f = 95
Les paramegravetres sont copieacutes La fonction travaille sur des copies de v et de f
++- 48 M BENJELLOUN 2015 UMONS
Fonction Renvoyant une valeur au programme
include ltiostreamgt
using namespace std
int change(int X)
void main(void)
int var = 5
int valeur
valeur = return_Val (var)
cout ltltmain var = ltlt var ltlt endl
cout ltltmain valeur = ltlt valeur
int return_Val (int v)
v = 100
cout ltlt return_Val v = ltlt v ltlt endl
return (v+1)
return_Val v = 100 main var = 5 main valeur = 101
Une fonction se termine et lsquorend la mainrsquo agrave
la fonction appelante lorsque son exeacutecution
rencontre lrsquoinstruction return expression
ou return
25
++- 49 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5 valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5
int valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
cout ltlt return_Val v = ltlt vltltendl
Qursquoaffiche ce programme agrave lrsquoeacutecran Qursquoaffiche ce programme agrave lrsquoeacutecran
++- 50 M BENJELLOUN 2015 UMONS
Fonctions et reacutecursiviteacute
Tours de Hanoiuml Suite de Fibonacci
un = un-1 + un-2
u0=u1=1
Puissance entiegravere
Une fonction est dite reacutecursive lorsqursquoelle srsquoappelle elle-mecircme
int factorielle (int n )
if ( n lt 0) return (ndash1) code derreur
else if ( n == 0 ) return 1 0 = 1
else
return n factorielle( n-1 ) n = n(n-1)
a x an-1 si n gt 0
1 si n = 0
an-1 =
26
++- 51 M BENJELLOUN 2015 UMONS
Passer des tableaux aux fonctions
Les tableaux peuvent ecirctre passeacutes comme paramegravetres dune fonction
Ils ne peuvent pas ecirctre retourneacutes comme reacutesultat dune fonction
La longueur du tableau ne doit pas ecirctre deacutefinie agrave la deacuteclaration de la fonction
Un tableau peut ecirctre modifieacute dans une fonction Il est passeacute par reacutefeacuterence (adresse) et
non par valeur
include hellip
void Modif(int a[])
a[0] = 5
a[1] = 6
void main(void)
int p[2] = 1 2
cout ltlt p[0] ltlt ltlt p[1]
Modif(p)
cout ltlt p[0] ltlt ltlt p[1]
1 2
5 6
include hellip
void Modif(int x[] int n)
void main(void)
int i
int p[6] = 1 2 3 5 7 11
Modif(p 6)
for (i=0ilt6i++)
coutltlt p[i]
void Modif(int a[] int n)
int i
for(i = 0 i ltn i++)
a[i] = 5
++- 52 M BENJELLOUN 2015 UMONS
void Saisie_Mat( int tab[][4] int m int n)
int i j
for (i = 0 i ltm i++)
for (j = 0 j lt n j++)
tab[i][j] = i
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
Matrice Exemple
void Affiche_Mat( int tab[][4] int m int n)
for (int i = 0 i ltm i++)
for (int j = 0 j lt n j++)
cout ltlt tab[i][j] ltlt
cout ltlt endl
include ltiostreamgt
using namespace std
void main()
int T[5][5]
Saisie_Mat( T 4 4 )
Affiche_Mat( T 4 4 )
27
++- 53 M BENJELLOUN 2015 UMONS
include hellip
int LaSomme( )
int A[Nmax] N int S = 0
for (int i=0ilt N i++)
cout ltltEntrez A[ltltiltlt]=
cin gtgtA[i]
S= S+ A[i]
return S
void main()
const int Nmax = 7
int i A[Nmax] S=0 N=3
S = LaSomme( )
cout ltlt Affichage ltlt endl
Affichage(A N)
cout ltlt n La somme est = ltlt S
Qursquoaffiche ce programme agrave lrsquoeacutecran
void Affichage( int A[] int N)
for (int i=0i lt N i++)
cout ltlt A[ltltiltlt]=
ltltA[i] ltltendl
++- 54 M BENJELLOUN 2015 UMONS
include hellip
void Saisie_T( int tab[] )
int N i
N= 3
for (i = 0 i ltN i++) tab[i] = i
void Affiche_T(int tab[] int N )
int i
for (i = 0 i ltN i++) cout ltlt tab[i]
void main()
int T[20] n
Saisie_T( T )
Affiche_T(T n )
tab[0] = 0
tab[1] = 1
tab[2] = 2
Qursquoaffiche ce programme agrave lrsquoeacutecran
28
++- 55 M BENJELLOUN 2015 UMONS
include hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 = 7
return hellip
Comment retourner v1 et v2
++- 56 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltlt a = ltlt a ltlt endl ltlt b = ltlt b
void echange(int xint y)
int tmp
tmp = x
x = y
y =tmp
void main()
int a = 1 b = 5
cout ltlt Avant ltltendl
affiche(ab)
echange(ab)
cout ltlt nApregraves ltltendl
affiche(ab)
Avant
a = 1
b = 5
Apregraves
PASSAGE DES PARAMETRES
Transmission des arguments
Comment eacutechanger a et b
a = 1
b = 5
PAR VALEUR
29
++- 57 M BENJELLOUN 2015 UMONS
Le pointeur prend comme
valeurs des adresses de
donneacutees en meacutemoire
Types de base hellip donneacutee
8
donneacutee
35 hellip
Adr i Adr j
Meacutemoire
12FF80 12FF84
Ladresse de leacuteleacutement i est ampi i=8 et ampi= 12FF80
int i=8 j=35
Et les pointeurs
hellip p=12FF84 hellip 35 hellip
12FF84 12FF80
int p p est le contenu pointeacute par p 35
p est lrsquoadresse 12FF84
++- 58 M BENJELLOUN 2015 UMONS
Deacuteclaration de Pointeurs Le symbole est utiliseacute entre le type et le nom du pointeur
Deacuteclaration drsquoun entier int i int p Deacuteclaration drsquoun pointeur vers un entier
Exemples de deacuteclarations de pointeurs
int pi pi est un pointeur vers un int pi deacutesigne le contenu de ladresse
float pf pf est un pointeur vers un float
char c d pc c et d sont des char pc est un pointeur vers un char
int C = 4
int p
p = ampC p reccediloit ladresse de c donc pointe sur c
cout ltlt p = ltltpltltendl
cout ltlt p = ltltp ltltendl
cout ltlt (ampC) ltlt(ampC)
p = 4
p = 0x12FF7C
(ampC) = 4
Ladresse de C est ampC
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
2
++- 3 M BENJELLOUN 2015 UMONS
Architecture claire
Algorithmes
Structures de donneacutees
Reacuteutilisabiliteacute
Tests de robustesse
Documentation
ldquoComment organiser au mieux lrsquoinformation dans un programme rdquo
Qualiteacute drsquoun programme
Non
Oui
Menu
Deacutebut programme
Bon Choix
Saisie()
Affichage()
(1) (2) (3)
(1) OK
Oui
Non
hellip
hellip
(4)
Fin
Tri()
Affichage()
++- 4 M BENJELLOUN 2015 UMONS
Moodle
Cest en forgeant que lon devient forgeron et cest en programmant que euh Peut-ecirctre hellip
Codes sources
C++ Programmes
Transp
Eacutenonceacute des TPs
Preacuteparez les TPs
Syllabuspdf
Document
lsquorsquoEnvironnement logicielrsquorsquo
Videacuteos
120 tests formatifs sur C++
Note relative agrave lrsquoorganisation de lrsquoexamen pratique
hellip
Utilisation du deacutebuggeur
httpsmoodleumonsacbe
3
++- 5 M BENJELLOUN 2015 UMONS
Le langage C++ Quest-ce que crsquoest Dougrave vient-il Pourquoi utiliser C++ Que peut-on faire avec et agrave quoi ccedila sert De quoi ai-je besoin pour programmer en C++
Caracteacuteristiques du C++ bull Langage structureacute tacircches dun programme en blocs bull Programmes efficaces geacutenegravere un code compact et rapidehellip bull Modulaire deacutecoupe en modules bull Objets meilleure qualiteacute de programmation
++- 6 M BENJELLOUN 2015 UMONS
Les entreacutees sorties cin et cout
bull cout le flux standard de sortie habituellement associeacute agrave leacutecran
Syntaxe cout ltlt expression ltlt expression hellip
bull cin le flux standard drsquoentreacutee habituellement associeacute au clavier
Syntaxe cin gtgt valeur gtgt valeur gtgt valeur hellip
include ltiostreamgt
using namespace std
void main()
cout ltlt Salut a vous tous ltlt endl
cout ltlt oui tous
endl signifie un saut de ligne
7
Pour commencer Tout programme doit avoir un point drsquoentreacutee nommeacute main()
4
++- 7 M BENJELLOUN 2015 UMONS
Directives du preacuteprocesseur
Une directive preacuteprocesseur est une directive de compilation (preacuteceacutedeacutees par un )
Gestion des Entreacutees-Sorties standard ltiostreamgt
Fonctions matheacutematiques ltcmathgt
Traitement de chaicircnes de caractegraveres ltstringgt
Controcircler les paramegravetres daffichage ltiomanipgt
include ltcmathgt
++- 8 M BENJELLOUN 2015 UMONS
cout ltltQuil est agreable dutiliser
ltltcout ent C++nlorsquon lutilise ltltendl ltlt ttproprement
Reacutesultat
Quil est agreable dutiliser cout en C++
lorsquon lutilise
proprement
Caractegraveres
Signification
CODE ASCII
(hexadeacutecimal)
n ou endl Geacutenegravere une nouvelle ligne (newline) 0x0A
t Tabulation horizontale 0x09
v Tabulation verticale 0x0B
b Retour drsquoun caractegravere en arriegravere (backspace) 0x08
r Retour chariot (return) 0x0D
f Saut de page (form feed) 0x0C
t
t t
5
++- 9 M BENJELLOUN 2015 UMONS
setw(int) impose la largeur daffichage agrave int caractegraveres Texte et nombres sont aligneacutes agrave droite
setprecision(int) impose le nombre de caractegraveres du nombre afficheacute
setfill(char) remplace les espaces preacuteceacutedant le nombre par le caractegravere char
include ltiostreamgt
include ltiomanipgt
using namespace std
void main()
const double Pi = 314159265359
cout ltlt Pi ltlt endl
cout ltlt setprecision(9) ltlt Pi ltlt endl
cout ltlt setprecision(2) ltlt Pi ltlt endl
cout ltlt setw(10) ltlt setprecision(2) ltlt Pi ltlt endl
cout ltlt setw(15) ltlt setfill() ltlt setprecision(9) ltlt Pi ltlt endl
314159 314159265 31 31 314159265
Formatage de la preacutesentation eacutecran
++- 10 M BENJELLOUN 2015 UMONS
Identificateurs
Les identificateurs nomment les objets C++ (fonctions variables )
Le C++ distingue les minuscules des majuscules
Exemple ab Ab AB
sont des identificateurs valides et tous diffeacuterents
Identificateurs valides
xx y1 somme_5 _position Noms Programme_1
Identificateurs invalides
3eme commence par un chiffre
xy caractegravere non autoriseacute ()
no-commande caractegravere non autoriseacute (-)
taux change caractegravere non autoriseacute (espace)
6
++- 11 M BENJELLOUN 2015 UMONS
Un identificateur ne peut pas ecirctre un mot reacuteserveacute du langage
Les mots reacuteserveacutes du langage C++
doivent ecirctre eacutecrits en minuscules
++- 12 M BENJELLOUN 2015 UMONS
Variables deacuteclarations
Syntaxe Type identificateur1 id2hellip
char c1 c2 c3
int i j var_ent
float f variable
Exemple
initialisations
int i=9 ou int i
i=9
char c1= A ou char c1
c1= A
Constantes deacuteclarations + initialisations
Syntaxe const Type identificateur1=Val1 identificateur2=Val2 helliphellip
const char c = A
const int i=5 var_ent=8
Exemple const int i
i= 5
Lrsquoinitialisation des constantes est obligatoire lors de leur deacuteclaration
7
++- 13 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std int Somme(int x int y)
void main(void)
int Som
Som = Somme(79) appel de la fonction
if ( Som gt 10 )
cout ltlt Som gt 10 ltlt Somltlt endl
else
cout ltlt Som lt= 10 ltlt Som
int Somme(int x int y) Deacutefinition de
la fonction
int S
S= x+y
return S
Directives du preacuteprocesseur accegraves avant la compilation
Programme
principal
Deacuteclarations
Traitements Donneacutees Structures de controcircle Commentaires
Structure dun programme C++ exemple
++- 14 M BENJELLOUN 2015 UMONS
Les opeacuterateurs arithmeacutetiques
Le C++ propose les opeacuterateurs suivants
+ addition - soustraction multiplication division modulo (reste de la division entiegravere )
ne peut ecirctre utiliseacute quavec des entiers
72 702 720 7020
3
35
hellip void main() int i = 6 j = 4 k float f = 60 g = 40 h k = i j k= 64 = 1 h = f g h = 6040 = 15 h = i j h = 64 = 1000
Modulo C=AB C 42 = 0 52 = 1 83= 2 C=A2 Si C=0 alors A est pair sinon (=1) A est impair
8
++- 15 M BENJELLOUN 2015 UMONS
Comparaisons lt plus petit
lt= plus petit ou eacutegal
gt plus grand
gt= plus grand ou eacutegal
== eacutegal
= diffeacuterent
Les opeacuterateurs logiques
ampamp et
|| ou (non exclusif)
non
Contractions dopeacuterateurs
+= -= = = =
amp= |= ^= ltlt= gtgt=
a += 15
a = a + 15
i = j + 5
i = i (j + 5)
Le reacutesultat dune expression logique est un
booleacuteen Il vaut true si elle est vraie et false sinon
Reacuteciproquement toute valeur non nulle est consideacutereacutee
comme vraie et la valeur nulle comme fausse
Increacutement et deacutecreacutement
Pour
++ increacutement i++ ou ++i
est eacutequivalent agrave i += 1 ou i = i + 1
- - deacutecreacutement
int i = 5 j = 4
char lettre = B
i++ i vaudra 6
--j j vaudra 3
++i i vaudra 7
lettre++ lettre vaudra C
lettre -- lettre vaudra B
++- 16 M BENJELLOUN 2015 UMONS
Nous consideacuterons un circuit eacutelectrique Quand lrsquointerrupteur lsquoIntrsquo est dans la position de la Fig (X=1) le geacuteneacuterateur de tension lsquoGrsquo allume lrsquoampoule lsquoXrsquo (X=true ou X = 1) Quand lrsquointerrupteur srsquoouvre lsquoXrsquo srsquoeacuteteint (X=false ou X = 0) Afin de simuler le clignotement drsquoune ampoule (X) compleacutetez le code de sorte que lrsquoexeacutecution du programme fournisse les reacutesultats ci-dessous (en rouge)
include ltiostreamgt using namespace std void main() bool x = 1 cout ltlt Test X = ltlt x ltlt endl cout ltlt --------------------------ltlt endl for (int i=0 i lt 6 i++ ) x= 1-x x = x ou x=x2 cout ltlt X = ltlt x ltlt endl
Test X = 1 -------------- X = 0 X = 1 X = 0 X = 1 X = 0 X = 1
9
++- 17 M BENJELLOUN 2015 UMONS
Les structures de controcircle
Alternative if-else
Iteacuterations for while do-while
Rupture de Controcircle break continue return hellip
Choix Multiple switch-case
Bloc 1
drsquoinstructions
Bloc 2
drsquoinstructions
oui non
Suite du programme
oui non
Suite du
programme Bloc
drsquoinstructions
Condition
vraie
oui
non
Bloc
drsquoinstructions
programme
Condition vraie
Suite du programme
programme
Condition
vraie
if-else while
do-while
++- 18 M BENJELLOUN 2015 UMONS
Les deacutecisions - if hellip else
if (Condition vraie)
BLOC 1 DINSTRUCTIONS
else
BLOC 2 DINSTRUCTIONS
Bloc 1
drsquoinstructions
Bloc 2
drsquoinstructions
oui non
Suite du programme
programme
Condition
vraie
if (Condition vraie)
instruction 1
instruction 2
else
instruction 3
instruction 4
Bloc 1
drsquoinstructions
oui non
Suite du programme
Condition
vraie
if (Condition vraie)
instruction 1
instruction 2
instruction 3 hellip
instruction N
if (Condition vraie)
instruction 1
if ( temperature gt 700)
cout ltlt Alarme ltltendl
if (Condition vraie)
instruction A
else
instruction B
if (altb) min=a
else min=b
if (i) if (i = 0)
10
++- 19 M BENJELLOUN 2015 UMONS
if ( ltexpr1gt )
ltbloc1gt
else if (ltexpr2gt)
ltbloc2gt
else if (ltexpr3gt)
ltbloc3gt
else if (ltexprNgt)
ltblocNgt
else ltblocN+1gt
if ( ltexpr1gt )
ltbloc1gt
else if (ltexpr2gt)
ltbloc2gt
else if (ltexpr3gt)
ltbloc3gt
else if (ltexprNgt)
ltblocNgt
else ltblocN+1gt
if emboicircteacutes
else est associeacute avec le if le plus proche
if(i gt= 0)
if(i gt 1000) coutltlt i gt 1000
else coutltlt i lt 0 n
if(i gt= 0)
if(i gt 1000) coutltlt i gt 1000
else coutltlt i lt 0 n
++- 20 M BENJELLOUN 2015 UMONS
for( )
Les iteacuterations ndash for
for( initialisation (Condition vraie) iteacuteration )
liste dinstructions
int i j
float K
for(i = 0 j = 2 k = 75 (i lt 20) ampamp(j==2) i++ k-=02)
int ij
for (i = 0 i lt3 i++)
coutltlt i = ltlt i ltlt endl
cout ltltendlltltendl
for(j = 5 j gt 0 j- -)
coutltlt j = ltlt j ltlt endl
i = 0
i = 1
i = 2
j = 5
j = 4
j = 3
j = 2
j = 1
boucle infinie
11
++- 21 M BENJELLOUN 2015 UMONS
La boucle TANT QUE FAIRE
Boucle preacute-testeacutee
Il sagit de linstruction while
tant que (expression vraie)
faire BLOC DINSTRUCTIONS
Organigramme
while (Condition vraie)
bloc dinstructions
Le test se fait dabord le bloc
dinstructions nest pas forceacutement exeacutecuteacute
Syntaxe
tant que pas jusqursquoagrave ce que
oui non
Suite du
programme
Condition
vraie
Bloc 1
drsquoinstructions
++- 22 M BENJELLOUN 2015 UMONS
i=1
while(ilt5)
coutltltInterieur ltlti ltlt endl
i++
coutltltExterieur ltlti ltlt endl
Exemples
Interieur 1
hellip
hellip
int j = 5
coutltltstartn
while(j == 0)
coutltltj = ltltj--ltltendl
coutltltendn
start
end
i=1
while(ilt5)
coutltltInterieur ltlti ltlt endl
i++
iteacuteration
12
++- 23 M BENJELLOUN 2015 UMONS
do while = REPETER hellip tant que
do
bloc dinstructions
while (Condition vraie) Condition
vraie
oui non
Bloc
drsquoinstructions
programme
int j = 5
do
coutltltj = ltltj--ltltendl
while(j gt 0)
cout ltltstopn
Suite du programme
(garantit lrsquoexeacutecution au moins une fois)
int j = 5
do
coutltltj = ltltj ltltendl
j--
while(j gt 0)
cout ltltstopn
j = 5
j = 4
j = 3
j = 2
j = 1
stop
++- 24 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void main()
for (char lettre = A lettre lt= M lettre++)
coutltltlettre
coutltltendl
for (float pourcent = 00 pourcent lt 05 pourcent += 01)
coutltltpourcentltltendl
for (int i=2 i lt= 3 i++)
cout ltlt Table de ltlt i ltlt ltlt endl
for (int j=0 j lt= 3 j++)
cout ltlt ltlt i ltlt ltlt j ltlt = ltlt ij ltlt endl
ABCDEFGHIJKLM
0
01
02
03
04 Table de 2 2 0 = 0 2 1 = 2 2 2 = 4 2 3 = 6 Table de 3 3 0 = 0 hellip
13
++- 25 M BENJELLOUN 2015 UMONS
include hellip
void main()
bool sortir = false
char rep
coutltltAvant la boucleltltendl
while(sortir)
coutltltDans la boucleltltendl
coutltltVoulez vous quitter (ON)ltltendl
cingtgtrep
if(rep==O)
sortir=true
coutltltApres la boucleltltendl
include hellip
void main()
bool sortir = false
char rep
coutltltAvant la boucleltltendl
do
coutltltDans la boucleltltendl
coutltltVoulez vous quitter (ON)ltltendl
cingtgtrep
if(rep==O)
sortir=true
while(sortir)
coutltltApres la boucleltltendl
++- 26 M BENJELLOUN 2015 UMONS
int i j=1
char a
for (i = -10 i lt= 10 i++)
while(j=0)
cin gtgt a if(a==x)
break
Pour rompre le deacuteroulement seacutequentiel dune suite dinstructions
Instructions deacutechappement
return (expression) permet de sortir de la fonction qui la contient
exit (expression) La fonction est interrompue lsquoexpressionrsquo un entier
indiquant le code de terminaison du processus
for (i = -10 i lt= 10 i++)
if (i == 0)
continue pour eacuteviter la division par zeacutero
cout ltlt 1 i
while (Condition vraie)
continue
break
8
14
++- 27 M BENJELLOUN 2015 UMONS
switch = AU CAS OU FAIRE
hellip
switch(variable de type char ou int) au cas ougrave la variable vaut
case valeur1 variable=valeur1 exeacutecutez ce bloc dinstructions
break
case valeur2 variable=valeur2 exeacutecutez ce bloc dinstructions
break
etc
default aucune des valeurs preacuteceacutedentes exeacutecutez ce bloc
dinstructions pas de break ici
Le bloc default nest pas obligatoire valeur1 valeur2 hellip doivent ecirctre des expressions
constantes Lrsquoinstruction switch correspond agrave une cascade drsquoinstructions if else
++- 28 M BENJELLOUN 2015 UMONS
hellip
void main( )
const float PI= 314159 float rayon = 35 float diametre circonference surface int choix
cout ltlt 1 Calculer la circonferencen cout ltlt 2 Calculer la surfacen cout ltlt 3 Calculer le diametren cout ltlt Votre choix cin gtgt choix
switch (choix) case 1 circonference = 2PIrayon break case 2 surface = PIrayonrayon break case 3 diametre = 2rayon break default cout ltlt Mauvais choixhellipn
char choix
switch(choix)
case 1 hellip
switch(i)
case 2 j
float f
switch(f)
case 2
switch instruction commode pour les menus
15
++- 29 M BENJELLOUN 2015 UMONS
Tableaux et Strings
Un tableau est une collection de variables de mecircme type appeleacutees eacuteleacutements
Type Nom_Tableau[dim]
int tab[4] deacuteclare un tableau de 4 valeurs entiegraveres tab[0] tab[1] tab[2] tab[3]
const int SIZE = 5
int A[SIZE] A est un vecteur de 5 entiers
float B[5]
int A[SIZE] = 10 20 30 40 50
int premier[] = 1 2 3 5 7 11 13
char Tab_Char[4] = A C F G
int Tab[50] = 0
int i = 10
int a[i]
int primes[]
Deacuteclaration
Initialisation
Interdiction
Constante
++- 30 M BENJELLOUN 2015 UMONS
Accegraves aux eacuteleacutements drsquoun tableau
Les eacuteleacutements sont numeacuteroteacutes de 0 agrave dim-1
Il nrsquoy a pas de veacuterification des bornes
void main()
int a[6]
int i = 7
a[0] = 9
a[5] = -10
a[i2] = 2
a[6] = 0
a[-1] = 5
0
a
1
2
3
4
5
9
2
-10
void main(void)
const int dim=6
int i
int A[dim] = 1 2 3 4 5 6
for (i=0iltdimi++)
A[i] = 2i
coutltltA[ltltiltlt]=ltltA[i]
A[0]=0 A[1]=2 A[2]=4 A[3]=6 A[4]=8 A[5]=10
16
++- 31 M BENJELLOUN 2015 UMONS
Chaicircnes de caractegraveres ou String
char Nom[dim] Initialisation
Pour terminer la chaicircne on place en fin de chaicircne le caractegravere nul 0 de code ASCII 0
Ce caractegravere est soit ajouteacute automatiquement par le compilateur soit introduit par le programmeur selon les fonctions utiliseacutees
char S[] = Hello0 H
e
l
l
o
0
S[0] S[1] S[2] S[3] S[4] S[5] char S[6] = Hello
char S[5] = Hello H e l l o
char S[] = Le main L e m a i n 0
bull Un tableau de char agrave une dimension char Nom[dim]
bull Un type speacutecial string string Nom Il faut inclure ltstringgt
++- 32 M BENJELLOUN 2015 UMONS
string Nom Il faut inclure ltstringgt
string Nom est eacutequivalente agrave string Nom = Donc par deacutefaut la chaicircne est vide
Il existe de nombreuses faccedilons drsquoinitialiser Ident par exemple
string s1 = Bonjour a vous
string s2 = s1 s2 contient Bonjour a vous
string s3(4 x) eacutequivaut agrave string s3 = xxxx
string s4(s1 4 8) s4 contient our a voldquo S1 de 4 + 8
B o n j o u r a v o u s 0 1 2 3 4 5 6 7 8 9 10 11 12 13
include ltstringgt hellip string ST = Salut char H[6] = Hello for (int i=0 ilt5 i++) cout ltlt ST[i] ltlt affichera S a l u t
for (int i=0 ilt5 i++) cout ltlt H[i] ltlt affichera H e l l o
17
++- 33 M BENJELLOUN 2015 UMONS
Pourquoi utiliser string Nom plutocirct que char Nom[dim]
char S1[6] = Salut S2[6] = Hello S3[12]
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Interdit
string S1 = Salut S2 = Hello S3
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Autoriseacute
S1= Hello
S1= Hooo
S3= HoooHello
false
++- 34 M BENJELLOUN 2015 UMONS
include ltiostreamgt
include ltstringgt traitement de string
using namespace std espace de nommage std pour importer les
symboles de la bibliothegraveque standard C++
void main(void)
string nom1 nom2 nom3
int len size
cout ltlt Donnez Nom1 cin gtgt nom1
cout ltlt Donnez Nom2 cin gtgt nom2
len = nom1length() nombre de caractegraveres dans nom1
size = nom2size() nombre de caractegraveres dans nom2
cout ltlt Nom1 ltltnom1 ltlt Dim Nom1 = ltlt len ltlt endl
cout ltlt Nom2 ltltnom2 ltlt Dim Nom2 = ltlt size ltlt endl
nom3 = nom2+ +nom1
cout ltlt Nom3 = ltlt nom3 ltlt endl
if(nom1gtnom2) cout ltlt nom1 gt nom2 ltlt endl
else if (nom1==nom2) cout ltlt nom1 = nom2 ltlt endl
else cout ltlt nom1 lt nom2 ltlt endl
nom1=nom2
cout ltlt nom1 = ltlt nom1 ltlt nom2 ltlt nom2 ltlt endl
Donnez Nom1 salut
Donnez Nom2 hello
Nom1 salut Dim Nom1 = 5
Nom2 hello Dim Nom2 = 5
Nom3 = hello salut
nom1 gt nom2
nom1 = hello nom2 hello
Donnez Nom1 csou
Donnez Nom2 pi
Nom1csou Dim Nom1 = 4
Nom2pi Dim Nom2 = 2
Nom3 = pi csou
nom1 lt nom2
nom1 = pi nom2 pi
18
++- 35 M BENJELLOUN 2015 UMONS
Algorithmes de tri
Nom de lrsquoalgorithme Complexiteacute
Tri agrave bulles Tri par seacutelection Tri par insertion Tri de Shell (shell sort) Ameacutelioration du tri par insertion Tri fusion (merge sort) Tri rapide (quick sort) Tri par tas (heap sort)
O(N2) O(N2) O(N2)
O(N log2 N)
O(N log N) O(N log N) O(N log N)
++- 36 M BENJELLOUN 2015 UMONS
Tri agrave bulles bubble sort
reacutepeacuteter permutation = FALSE commencer au deacutebut du drapeau Pour i variant de 0 agrave N ndash 2 faire si cellule [i] gt cellule [i+1] alors deacutebut permuter cellules permutation = TRUE fin jusquagrave ce que (not permutation)
Complexiteacute O(Nsup2) Proportionnel agrave Nsup2 permutations
void TriaBulles(int x[] int N) int i perm=1 tmp while (perm==1) perm =0 for (i=0iltN-1i++) if(x[i] gt x[i+1]) tmp = x[i] x[i] = x[i+1] x[i+1] = tmp perm = 1
Algorithmes de tri
19
++- 37 M BENJELLOUN 2015 UMONS
void tri_par_selection(int t[] int n) int i j min tmp for (i = 0 i lt n - 1 i++) min = i for(j = i+1 j lt n j++) if(t[j] lt t[min]) min = j if(min = i) tmp = t[i] t[i] = t[min] t[min] = tmp
Le tri par seacutelection consiste en la recherche du plus grand eacuteleacutement (le plus petit) que lon va replacer en derniegravere position (en premiegravere) puis on recherche le second plus grand eacuteleacutement (le second plus petit) que lon va replacer eacutegalement agrave sa position finale et ainsi de suite
Algorithmes de tri
++- 38 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement dans un tableau
Recherche lineacuteaire Recherche dichotomique (binary search)
0
9
1
3
2
6
3
2
4
1
5
12
6
0
Est une meacutethode efficace pour retrouver un eacuteleacutement dans un tableau trieacute
A chaque eacutetape de la recherche dichotomique lrsquointervalle de recherche est diviseacute par deux
On utilise degraves lors deux index de recherche la borne infeacuterieure et la borne supeacuterieure
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup mid
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup
On initialise les bornes inf et sup agrave la premiegravere et derniegravere valeur des index du tableau tab
respectivement
Le milieu est donneacute par
mid = (inf+sup) 2 (0+6)2 =3
Supposons que lrsquoon recherche la valeur i=6 On
compare cette valeur avec tab[mid]=8 Comme
tab[mid]gti on change mid en sup
mid = (inf+sup) 2 (0+3)2 =1
inf=1 et sup=3
hellip
20
++- 39 M BENJELLOUN 2015 UMONS
44 Eacutecrire un programme qui supprime le premier et le dernier eacuteleacutement drsquoun vecteur
vecteur initial Tab 0 1 2 3 4 5 6
sup bords 1 2 3 4 5
sup bords 2 3 4
45 Eacutecrire un programme qui supprime le milieu du tableau et ajoute son double au deacutebut
vecteur initial Tab 1 2 3 4 5
sup Aj 6 1 2 4 5
sup Aj 4 6 1 4 5
46 Codez un programme de tri agrave bulles dun vecteur de strings
47 Codez un programme de recherche dichotomique dun nombre dans un vecteur de
strings rangeacutes par ordre croissant
++- 40 M BENJELLOUN 2015 UMONS
Matrices Rangeacutees ligne par ligne
Consideacutereacutees comme des vecteurs de lignes
Accegraves aux composantes par double crochets
int a[10][5]
a[1][0] = 7
int x[2][2] = 123 4 2 lignes et 2 colonnes
1 2
3 4 include hellip
void main()
int i j tab[5][4]
for (i = 0 i lt5 i++) Saisie
for (j = 0 j lt 4 j++) tab[i][j] = i
for (i = 0 i lt5 i++) Affichage
for (j = 0 j lt 4 j++) coutltlt tab[i][j] ltlt
cout ltlt endl
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
21
++- 41 M BENJELLOUN 2015 UMONS
Affichage de la table de multiplication
++- 42 M BENJELLOUN 2015 UMONS
Fonctions en C++
Encapsule un traitement particulier formant un tout
Peut impleacutementer la notion de module en logique
Augmente la lisibiliteacute drsquoun programme
Reacutealise un objectif preacutecis
Ameacuteliore le deacutebogage et la maintenance drsquoun programme
Son utilisation se deacutecompose en trois phases
Deacutefinition de la fonction
Deacuteclaration de la fonction
Appel de la fonction
Deacuteclarer une fonction
Appeler une fonction
Regravegles de visibiliteacute des variables
Passage des paramegravetres par valeur
Fonction renvoyant une valeur au programme
Passage des paramegravetres par valeur et par adresse
Passage des tableaux aux fonctions
22
++- 43 M BENJELLOUN 2015 UMONS
Type nom_fonction(liste_param_typeacutes)
deacuteclaration de variables locales
hellip Corps de la fonction
hellip
return (valeur)
Deacutefinition drsquoune fonction
Une fonction renvoie une valeur ou rien
liste_param_typeacutes = 0 void ou plusieurs
int Somme(int x int y)
int S Variable locale agrave Somme
S= x+y
return S
void fonction1()
coutltltn fonction1 n
void fonction2() coutltltn fonction2 n
Limbrication de fonctions
nest pas autoriseacutee
Deacutefinition
++- 44 M BENJELLOUN 2015 UMONS
Fonctions pourquoi
include ltiostreamgt
using namespace std
void main()
int i j SomCar1=0 SomCar2=0 SomCar3=0
for (i = 0 i lt5 i++)
SomCar1 = SomCar1 + ii
for (i = 0 i lt10 i++)
SomCar2 = SomCar2 + ii
for (j = 0 j lt 7 j++)
SomCar3 = SomCar3 + jj
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
include ltiostreamgt
using namespace std
int Fnct_SomCar(int N)
int i S=0
for (i = 0 i ltN i++)
S = S + ii S+=ii
return S
void main()
int SomCar1 SomCar2 SomCar3
SomCar1 = Fnct_SomCar(5)
SomCar2 = Fnct_SomCar(10)
SomCar3 = Fnct_SomCar(7)
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
23
++- 45 M BENJELLOUN 2015 UMONS
hellip
int Somme(int x int y)
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
int Somme(int x int y)
int S
S= x+y
return S
hellip
int Somme(int x int y)
int S
S= x+y
return S
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
Deacuteclaration et appel drsquoune fonction
++- 46 M BENJELLOUN 2015 UMONS
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
int addition() float tmp tmp = calcule(253) + calcule(572) return (int)tmp float calcule(float C float D) return ( (C + D ) 2)
float calcule(float float)
int addition()
float calcule(float A float B) return ( (A + B ) 2)
int addition() Appel drsquoune fonction dans une fonction
float tmp tmp = calcule(253) + calcule(572) return (int)tmp
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
Deacuteclaration et appel drsquoune fonction
24
++- 47 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void Addition(int v float f)
void main()
int v = 5
float f= 45
Addition(v f) Appel de la fonction
cout ltlt n Main v et f ltlt v ltlt et ltltf
void Addition(int v float f)
cout ltlt Addition v + f = ltlt v+f ltlt endl
f = f + v
cout ltlt Addition f = ltlt f
Addition v+f = 95
Addition f = 95
Main v et f = 5 et 45
v= 5 et f=45
5+ 45
f = 95
Les paramegravetres sont copieacutes La fonction travaille sur des copies de v et de f
++- 48 M BENJELLOUN 2015 UMONS
Fonction Renvoyant une valeur au programme
include ltiostreamgt
using namespace std
int change(int X)
void main(void)
int var = 5
int valeur
valeur = return_Val (var)
cout ltltmain var = ltlt var ltlt endl
cout ltltmain valeur = ltlt valeur
int return_Val (int v)
v = 100
cout ltlt return_Val v = ltlt v ltlt endl
return (v+1)
return_Val v = 100 main var = 5 main valeur = 101
Une fonction se termine et lsquorend la mainrsquo agrave
la fonction appelante lorsque son exeacutecution
rencontre lrsquoinstruction return expression
ou return
25
++- 49 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5 valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5
int valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
cout ltlt return_Val v = ltlt vltltendl
Qursquoaffiche ce programme agrave lrsquoeacutecran Qursquoaffiche ce programme agrave lrsquoeacutecran
++- 50 M BENJELLOUN 2015 UMONS
Fonctions et reacutecursiviteacute
Tours de Hanoiuml Suite de Fibonacci
un = un-1 + un-2
u0=u1=1
Puissance entiegravere
Une fonction est dite reacutecursive lorsqursquoelle srsquoappelle elle-mecircme
int factorielle (int n )
if ( n lt 0) return (ndash1) code derreur
else if ( n == 0 ) return 1 0 = 1
else
return n factorielle( n-1 ) n = n(n-1)
a x an-1 si n gt 0
1 si n = 0
an-1 =
26
++- 51 M BENJELLOUN 2015 UMONS
Passer des tableaux aux fonctions
Les tableaux peuvent ecirctre passeacutes comme paramegravetres dune fonction
Ils ne peuvent pas ecirctre retourneacutes comme reacutesultat dune fonction
La longueur du tableau ne doit pas ecirctre deacutefinie agrave la deacuteclaration de la fonction
Un tableau peut ecirctre modifieacute dans une fonction Il est passeacute par reacutefeacuterence (adresse) et
non par valeur
include hellip
void Modif(int a[])
a[0] = 5
a[1] = 6
void main(void)
int p[2] = 1 2
cout ltlt p[0] ltlt ltlt p[1]
Modif(p)
cout ltlt p[0] ltlt ltlt p[1]
1 2
5 6
include hellip
void Modif(int x[] int n)
void main(void)
int i
int p[6] = 1 2 3 5 7 11
Modif(p 6)
for (i=0ilt6i++)
coutltlt p[i]
void Modif(int a[] int n)
int i
for(i = 0 i ltn i++)
a[i] = 5
++- 52 M BENJELLOUN 2015 UMONS
void Saisie_Mat( int tab[][4] int m int n)
int i j
for (i = 0 i ltm i++)
for (j = 0 j lt n j++)
tab[i][j] = i
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
Matrice Exemple
void Affiche_Mat( int tab[][4] int m int n)
for (int i = 0 i ltm i++)
for (int j = 0 j lt n j++)
cout ltlt tab[i][j] ltlt
cout ltlt endl
include ltiostreamgt
using namespace std
void main()
int T[5][5]
Saisie_Mat( T 4 4 )
Affiche_Mat( T 4 4 )
27
++- 53 M BENJELLOUN 2015 UMONS
include hellip
int LaSomme( )
int A[Nmax] N int S = 0
for (int i=0ilt N i++)
cout ltltEntrez A[ltltiltlt]=
cin gtgtA[i]
S= S+ A[i]
return S
void main()
const int Nmax = 7
int i A[Nmax] S=0 N=3
S = LaSomme( )
cout ltlt Affichage ltlt endl
Affichage(A N)
cout ltlt n La somme est = ltlt S
Qursquoaffiche ce programme agrave lrsquoeacutecran
void Affichage( int A[] int N)
for (int i=0i lt N i++)
cout ltlt A[ltltiltlt]=
ltltA[i] ltltendl
++- 54 M BENJELLOUN 2015 UMONS
include hellip
void Saisie_T( int tab[] )
int N i
N= 3
for (i = 0 i ltN i++) tab[i] = i
void Affiche_T(int tab[] int N )
int i
for (i = 0 i ltN i++) cout ltlt tab[i]
void main()
int T[20] n
Saisie_T( T )
Affiche_T(T n )
tab[0] = 0
tab[1] = 1
tab[2] = 2
Qursquoaffiche ce programme agrave lrsquoeacutecran
28
++- 55 M BENJELLOUN 2015 UMONS
include hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 = 7
return hellip
Comment retourner v1 et v2
++- 56 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltlt a = ltlt a ltlt endl ltlt b = ltlt b
void echange(int xint y)
int tmp
tmp = x
x = y
y =tmp
void main()
int a = 1 b = 5
cout ltlt Avant ltltendl
affiche(ab)
echange(ab)
cout ltlt nApregraves ltltendl
affiche(ab)
Avant
a = 1
b = 5
Apregraves
PASSAGE DES PARAMETRES
Transmission des arguments
Comment eacutechanger a et b
a = 1
b = 5
PAR VALEUR
29
++- 57 M BENJELLOUN 2015 UMONS
Le pointeur prend comme
valeurs des adresses de
donneacutees en meacutemoire
Types de base hellip donneacutee
8
donneacutee
35 hellip
Adr i Adr j
Meacutemoire
12FF80 12FF84
Ladresse de leacuteleacutement i est ampi i=8 et ampi= 12FF80
int i=8 j=35
Et les pointeurs
hellip p=12FF84 hellip 35 hellip
12FF84 12FF80
int p p est le contenu pointeacute par p 35
p est lrsquoadresse 12FF84
++- 58 M BENJELLOUN 2015 UMONS
Deacuteclaration de Pointeurs Le symbole est utiliseacute entre le type et le nom du pointeur
Deacuteclaration drsquoun entier int i int p Deacuteclaration drsquoun pointeur vers un entier
Exemples de deacuteclarations de pointeurs
int pi pi est un pointeur vers un int pi deacutesigne le contenu de ladresse
float pf pf est un pointeur vers un float
char c d pc c et d sont des char pc est un pointeur vers un char
int C = 4
int p
p = ampC p reccediloit ladresse de c donc pointe sur c
cout ltlt p = ltltpltltendl
cout ltlt p = ltltp ltltendl
cout ltlt (ampC) ltlt(ampC)
p = 4
p = 0x12FF7C
(ampC) = 4
Ladresse de C est ampC
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
3
++- 5 M BENJELLOUN 2015 UMONS
Le langage C++ Quest-ce que crsquoest Dougrave vient-il Pourquoi utiliser C++ Que peut-on faire avec et agrave quoi ccedila sert De quoi ai-je besoin pour programmer en C++
Caracteacuteristiques du C++ bull Langage structureacute tacircches dun programme en blocs bull Programmes efficaces geacutenegravere un code compact et rapidehellip bull Modulaire deacutecoupe en modules bull Objets meilleure qualiteacute de programmation
++- 6 M BENJELLOUN 2015 UMONS
Les entreacutees sorties cin et cout
bull cout le flux standard de sortie habituellement associeacute agrave leacutecran
Syntaxe cout ltlt expression ltlt expression hellip
bull cin le flux standard drsquoentreacutee habituellement associeacute au clavier
Syntaxe cin gtgt valeur gtgt valeur gtgt valeur hellip
include ltiostreamgt
using namespace std
void main()
cout ltlt Salut a vous tous ltlt endl
cout ltlt oui tous
endl signifie un saut de ligne
7
Pour commencer Tout programme doit avoir un point drsquoentreacutee nommeacute main()
4
++- 7 M BENJELLOUN 2015 UMONS
Directives du preacuteprocesseur
Une directive preacuteprocesseur est une directive de compilation (preacuteceacutedeacutees par un )
Gestion des Entreacutees-Sorties standard ltiostreamgt
Fonctions matheacutematiques ltcmathgt
Traitement de chaicircnes de caractegraveres ltstringgt
Controcircler les paramegravetres daffichage ltiomanipgt
include ltcmathgt
++- 8 M BENJELLOUN 2015 UMONS
cout ltltQuil est agreable dutiliser
ltltcout ent C++nlorsquon lutilise ltltendl ltlt ttproprement
Reacutesultat
Quil est agreable dutiliser cout en C++
lorsquon lutilise
proprement
Caractegraveres
Signification
CODE ASCII
(hexadeacutecimal)
n ou endl Geacutenegravere une nouvelle ligne (newline) 0x0A
t Tabulation horizontale 0x09
v Tabulation verticale 0x0B
b Retour drsquoun caractegravere en arriegravere (backspace) 0x08
r Retour chariot (return) 0x0D
f Saut de page (form feed) 0x0C
t
t t
5
++- 9 M BENJELLOUN 2015 UMONS
setw(int) impose la largeur daffichage agrave int caractegraveres Texte et nombres sont aligneacutes agrave droite
setprecision(int) impose le nombre de caractegraveres du nombre afficheacute
setfill(char) remplace les espaces preacuteceacutedant le nombre par le caractegravere char
include ltiostreamgt
include ltiomanipgt
using namespace std
void main()
const double Pi = 314159265359
cout ltlt Pi ltlt endl
cout ltlt setprecision(9) ltlt Pi ltlt endl
cout ltlt setprecision(2) ltlt Pi ltlt endl
cout ltlt setw(10) ltlt setprecision(2) ltlt Pi ltlt endl
cout ltlt setw(15) ltlt setfill() ltlt setprecision(9) ltlt Pi ltlt endl
314159 314159265 31 31 314159265
Formatage de la preacutesentation eacutecran
++- 10 M BENJELLOUN 2015 UMONS
Identificateurs
Les identificateurs nomment les objets C++ (fonctions variables )
Le C++ distingue les minuscules des majuscules
Exemple ab Ab AB
sont des identificateurs valides et tous diffeacuterents
Identificateurs valides
xx y1 somme_5 _position Noms Programme_1
Identificateurs invalides
3eme commence par un chiffre
xy caractegravere non autoriseacute ()
no-commande caractegravere non autoriseacute (-)
taux change caractegravere non autoriseacute (espace)
6
++- 11 M BENJELLOUN 2015 UMONS
Un identificateur ne peut pas ecirctre un mot reacuteserveacute du langage
Les mots reacuteserveacutes du langage C++
doivent ecirctre eacutecrits en minuscules
++- 12 M BENJELLOUN 2015 UMONS
Variables deacuteclarations
Syntaxe Type identificateur1 id2hellip
char c1 c2 c3
int i j var_ent
float f variable
Exemple
initialisations
int i=9 ou int i
i=9
char c1= A ou char c1
c1= A
Constantes deacuteclarations + initialisations
Syntaxe const Type identificateur1=Val1 identificateur2=Val2 helliphellip
const char c = A
const int i=5 var_ent=8
Exemple const int i
i= 5
Lrsquoinitialisation des constantes est obligatoire lors de leur deacuteclaration
7
++- 13 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std int Somme(int x int y)
void main(void)
int Som
Som = Somme(79) appel de la fonction
if ( Som gt 10 )
cout ltlt Som gt 10 ltlt Somltlt endl
else
cout ltlt Som lt= 10 ltlt Som
int Somme(int x int y) Deacutefinition de
la fonction
int S
S= x+y
return S
Directives du preacuteprocesseur accegraves avant la compilation
Programme
principal
Deacuteclarations
Traitements Donneacutees Structures de controcircle Commentaires
Structure dun programme C++ exemple
++- 14 M BENJELLOUN 2015 UMONS
Les opeacuterateurs arithmeacutetiques
Le C++ propose les opeacuterateurs suivants
+ addition - soustraction multiplication division modulo (reste de la division entiegravere )
ne peut ecirctre utiliseacute quavec des entiers
72 702 720 7020
3
35
hellip void main() int i = 6 j = 4 k float f = 60 g = 40 h k = i j k= 64 = 1 h = f g h = 6040 = 15 h = i j h = 64 = 1000
Modulo C=AB C 42 = 0 52 = 1 83= 2 C=A2 Si C=0 alors A est pair sinon (=1) A est impair
8
++- 15 M BENJELLOUN 2015 UMONS
Comparaisons lt plus petit
lt= plus petit ou eacutegal
gt plus grand
gt= plus grand ou eacutegal
== eacutegal
= diffeacuterent
Les opeacuterateurs logiques
ampamp et
|| ou (non exclusif)
non
Contractions dopeacuterateurs
+= -= = = =
amp= |= ^= ltlt= gtgt=
a += 15
a = a + 15
i = j + 5
i = i (j + 5)
Le reacutesultat dune expression logique est un
booleacuteen Il vaut true si elle est vraie et false sinon
Reacuteciproquement toute valeur non nulle est consideacutereacutee
comme vraie et la valeur nulle comme fausse
Increacutement et deacutecreacutement
Pour
++ increacutement i++ ou ++i
est eacutequivalent agrave i += 1 ou i = i + 1
- - deacutecreacutement
int i = 5 j = 4
char lettre = B
i++ i vaudra 6
--j j vaudra 3
++i i vaudra 7
lettre++ lettre vaudra C
lettre -- lettre vaudra B
++- 16 M BENJELLOUN 2015 UMONS
Nous consideacuterons un circuit eacutelectrique Quand lrsquointerrupteur lsquoIntrsquo est dans la position de la Fig (X=1) le geacuteneacuterateur de tension lsquoGrsquo allume lrsquoampoule lsquoXrsquo (X=true ou X = 1) Quand lrsquointerrupteur srsquoouvre lsquoXrsquo srsquoeacuteteint (X=false ou X = 0) Afin de simuler le clignotement drsquoune ampoule (X) compleacutetez le code de sorte que lrsquoexeacutecution du programme fournisse les reacutesultats ci-dessous (en rouge)
include ltiostreamgt using namespace std void main() bool x = 1 cout ltlt Test X = ltlt x ltlt endl cout ltlt --------------------------ltlt endl for (int i=0 i lt 6 i++ ) x= 1-x x = x ou x=x2 cout ltlt X = ltlt x ltlt endl
Test X = 1 -------------- X = 0 X = 1 X = 0 X = 1 X = 0 X = 1
9
++- 17 M BENJELLOUN 2015 UMONS
Les structures de controcircle
Alternative if-else
Iteacuterations for while do-while
Rupture de Controcircle break continue return hellip
Choix Multiple switch-case
Bloc 1
drsquoinstructions
Bloc 2
drsquoinstructions
oui non
Suite du programme
oui non
Suite du
programme Bloc
drsquoinstructions
Condition
vraie
oui
non
Bloc
drsquoinstructions
programme
Condition vraie
Suite du programme
programme
Condition
vraie
if-else while
do-while
++- 18 M BENJELLOUN 2015 UMONS
Les deacutecisions - if hellip else
if (Condition vraie)
BLOC 1 DINSTRUCTIONS
else
BLOC 2 DINSTRUCTIONS
Bloc 1
drsquoinstructions
Bloc 2
drsquoinstructions
oui non
Suite du programme
programme
Condition
vraie
if (Condition vraie)
instruction 1
instruction 2
else
instruction 3
instruction 4
Bloc 1
drsquoinstructions
oui non
Suite du programme
Condition
vraie
if (Condition vraie)
instruction 1
instruction 2
instruction 3 hellip
instruction N
if (Condition vraie)
instruction 1
if ( temperature gt 700)
cout ltlt Alarme ltltendl
if (Condition vraie)
instruction A
else
instruction B
if (altb) min=a
else min=b
if (i) if (i = 0)
10
++- 19 M BENJELLOUN 2015 UMONS
if ( ltexpr1gt )
ltbloc1gt
else if (ltexpr2gt)
ltbloc2gt
else if (ltexpr3gt)
ltbloc3gt
else if (ltexprNgt)
ltblocNgt
else ltblocN+1gt
if ( ltexpr1gt )
ltbloc1gt
else if (ltexpr2gt)
ltbloc2gt
else if (ltexpr3gt)
ltbloc3gt
else if (ltexprNgt)
ltblocNgt
else ltblocN+1gt
if emboicircteacutes
else est associeacute avec le if le plus proche
if(i gt= 0)
if(i gt 1000) coutltlt i gt 1000
else coutltlt i lt 0 n
if(i gt= 0)
if(i gt 1000) coutltlt i gt 1000
else coutltlt i lt 0 n
++- 20 M BENJELLOUN 2015 UMONS
for( )
Les iteacuterations ndash for
for( initialisation (Condition vraie) iteacuteration )
liste dinstructions
int i j
float K
for(i = 0 j = 2 k = 75 (i lt 20) ampamp(j==2) i++ k-=02)
int ij
for (i = 0 i lt3 i++)
coutltlt i = ltlt i ltlt endl
cout ltltendlltltendl
for(j = 5 j gt 0 j- -)
coutltlt j = ltlt j ltlt endl
i = 0
i = 1
i = 2
j = 5
j = 4
j = 3
j = 2
j = 1
boucle infinie
11
++- 21 M BENJELLOUN 2015 UMONS
La boucle TANT QUE FAIRE
Boucle preacute-testeacutee
Il sagit de linstruction while
tant que (expression vraie)
faire BLOC DINSTRUCTIONS
Organigramme
while (Condition vraie)
bloc dinstructions
Le test se fait dabord le bloc
dinstructions nest pas forceacutement exeacutecuteacute
Syntaxe
tant que pas jusqursquoagrave ce que
oui non
Suite du
programme
Condition
vraie
Bloc 1
drsquoinstructions
++- 22 M BENJELLOUN 2015 UMONS
i=1
while(ilt5)
coutltltInterieur ltlti ltlt endl
i++
coutltltExterieur ltlti ltlt endl
Exemples
Interieur 1
hellip
hellip
int j = 5
coutltltstartn
while(j == 0)
coutltltj = ltltj--ltltendl
coutltltendn
start
end
i=1
while(ilt5)
coutltltInterieur ltlti ltlt endl
i++
iteacuteration
12
++- 23 M BENJELLOUN 2015 UMONS
do while = REPETER hellip tant que
do
bloc dinstructions
while (Condition vraie) Condition
vraie
oui non
Bloc
drsquoinstructions
programme
int j = 5
do
coutltltj = ltltj--ltltendl
while(j gt 0)
cout ltltstopn
Suite du programme
(garantit lrsquoexeacutecution au moins une fois)
int j = 5
do
coutltltj = ltltj ltltendl
j--
while(j gt 0)
cout ltltstopn
j = 5
j = 4
j = 3
j = 2
j = 1
stop
++- 24 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void main()
for (char lettre = A lettre lt= M lettre++)
coutltltlettre
coutltltendl
for (float pourcent = 00 pourcent lt 05 pourcent += 01)
coutltltpourcentltltendl
for (int i=2 i lt= 3 i++)
cout ltlt Table de ltlt i ltlt ltlt endl
for (int j=0 j lt= 3 j++)
cout ltlt ltlt i ltlt ltlt j ltlt = ltlt ij ltlt endl
ABCDEFGHIJKLM
0
01
02
03
04 Table de 2 2 0 = 0 2 1 = 2 2 2 = 4 2 3 = 6 Table de 3 3 0 = 0 hellip
13
++- 25 M BENJELLOUN 2015 UMONS
include hellip
void main()
bool sortir = false
char rep
coutltltAvant la boucleltltendl
while(sortir)
coutltltDans la boucleltltendl
coutltltVoulez vous quitter (ON)ltltendl
cingtgtrep
if(rep==O)
sortir=true
coutltltApres la boucleltltendl
include hellip
void main()
bool sortir = false
char rep
coutltltAvant la boucleltltendl
do
coutltltDans la boucleltltendl
coutltltVoulez vous quitter (ON)ltltendl
cingtgtrep
if(rep==O)
sortir=true
while(sortir)
coutltltApres la boucleltltendl
++- 26 M BENJELLOUN 2015 UMONS
int i j=1
char a
for (i = -10 i lt= 10 i++)
while(j=0)
cin gtgt a if(a==x)
break
Pour rompre le deacuteroulement seacutequentiel dune suite dinstructions
Instructions deacutechappement
return (expression) permet de sortir de la fonction qui la contient
exit (expression) La fonction est interrompue lsquoexpressionrsquo un entier
indiquant le code de terminaison du processus
for (i = -10 i lt= 10 i++)
if (i == 0)
continue pour eacuteviter la division par zeacutero
cout ltlt 1 i
while (Condition vraie)
continue
break
8
14
++- 27 M BENJELLOUN 2015 UMONS
switch = AU CAS OU FAIRE
hellip
switch(variable de type char ou int) au cas ougrave la variable vaut
case valeur1 variable=valeur1 exeacutecutez ce bloc dinstructions
break
case valeur2 variable=valeur2 exeacutecutez ce bloc dinstructions
break
etc
default aucune des valeurs preacuteceacutedentes exeacutecutez ce bloc
dinstructions pas de break ici
Le bloc default nest pas obligatoire valeur1 valeur2 hellip doivent ecirctre des expressions
constantes Lrsquoinstruction switch correspond agrave une cascade drsquoinstructions if else
++- 28 M BENJELLOUN 2015 UMONS
hellip
void main( )
const float PI= 314159 float rayon = 35 float diametre circonference surface int choix
cout ltlt 1 Calculer la circonferencen cout ltlt 2 Calculer la surfacen cout ltlt 3 Calculer le diametren cout ltlt Votre choix cin gtgt choix
switch (choix) case 1 circonference = 2PIrayon break case 2 surface = PIrayonrayon break case 3 diametre = 2rayon break default cout ltlt Mauvais choixhellipn
char choix
switch(choix)
case 1 hellip
switch(i)
case 2 j
float f
switch(f)
case 2
switch instruction commode pour les menus
15
++- 29 M BENJELLOUN 2015 UMONS
Tableaux et Strings
Un tableau est une collection de variables de mecircme type appeleacutees eacuteleacutements
Type Nom_Tableau[dim]
int tab[4] deacuteclare un tableau de 4 valeurs entiegraveres tab[0] tab[1] tab[2] tab[3]
const int SIZE = 5
int A[SIZE] A est un vecteur de 5 entiers
float B[5]
int A[SIZE] = 10 20 30 40 50
int premier[] = 1 2 3 5 7 11 13
char Tab_Char[4] = A C F G
int Tab[50] = 0
int i = 10
int a[i]
int primes[]
Deacuteclaration
Initialisation
Interdiction
Constante
++- 30 M BENJELLOUN 2015 UMONS
Accegraves aux eacuteleacutements drsquoun tableau
Les eacuteleacutements sont numeacuteroteacutes de 0 agrave dim-1
Il nrsquoy a pas de veacuterification des bornes
void main()
int a[6]
int i = 7
a[0] = 9
a[5] = -10
a[i2] = 2
a[6] = 0
a[-1] = 5
0
a
1
2
3
4
5
9
2
-10
void main(void)
const int dim=6
int i
int A[dim] = 1 2 3 4 5 6
for (i=0iltdimi++)
A[i] = 2i
coutltltA[ltltiltlt]=ltltA[i]
A[0]=0 A[1]=2 A[2]=4 A[3]=6 A[4]=8 A[5]=10
16
++- 31 M BENJELLOUN 2015 UMONS
Chaicircnes de caractegraveres ou String
char Nom[dim] Initialisation
Pour terminer la chaicircne on place en fin de chaicircne le caractegravere nul 0 de code ASCII 0
Ce caractegravere est soit ajouteacute automatiquement par le compilateur soit introduit par le programmeur selon les fonctions utiliseacutees
char S[] = Hello0 H
e
l
l
o
0
S[0] S[1] S[2] S[3] S[4] S[5] char S[6] = Hello
char S[5] = Hello H e l l o
char S[] = Le main L e m a i n 0
bull Un tableau de char agrave une dimension char Nom[dim]
bull Un type speacutecial string string Nom Il faut inclure ltstringgt
++- 32 M BENJELLOUN 2015 UMONS
string Nom Il faut inclure ltstringgt
string Nom est eacutequivalente agrave string Nom = Donc par deacutefaut la chaicircne est vide
Il existe de nombreuses faccedilons drsquoinitialiser Ident par exemple
string s1 = Bonjour a vous
string s2 = s1 s2 contient Bonjour a vous
string s3(4 x) eacutequivaut agrave string s3 = xxxx
string s4(s1 4 8) s4 contient our a voldquo S1 de 4 + 8
B o n j o u r a v o u s 0 1 2 3 4 5 6 7 8 9 10 11 12 13
include ltstringgt hellip string ST = Salut char H[6] = Hello for (int i=0 ilt5 i++) cout ltlt ST[i] ltlt affichera S a l u t
for (int i=0 ilt5 i++) cout ltlt H[i] ltlt affichera H e l l o
17
++- 33 M BENJELLOUN 2015 UMONS
Pourquoi utiliser string Nom plutocirct que char Nom[dim]
char S1[6] = Salut S2[6] = Hello S3[12]
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Interdit
string S1 = Salut S2 = Hello S3
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Autoriseacute
S1= Hello
S1= Hooo
S3= HoooHello
false
++- 34 M BENJELLOUN 2015 UMONS
include ltiostreamgt
include ltstringgt traitement de string
using namespace std espace de nommage std pour importer les
symboles de la bibliothegraveque standard C++
void main(void)
string nom1 nom2 nom3
int len size
cout ltlt Donnez Nom1 cin gtgt nom1
cout ltlt Donnez Nom2 cin gtgt nom2
len = nom1length() nombre de caractegraveres dans nom1
size = nom2size() nombre de caractegraveres dans nom2
cout ltlt Nom1 ltltnom1 ltlt Dim Nom1 = ltlt len ltlt endl
cout ltlt Nom2 ltltnom2 ltlt Dim Nom2 = ltlt size ltlt endl
nom3 = nom2+ +nom1
cout ltlt Nom3 = ltlt nom3 ltlt endl
if(nom1gtnom2) cout ltlt nom1 gt nom2 ltlt endl
else if (nom1==nom2) cout ltlt nom1 = nom2 ltlt endl
else cout ltlt nom1 lt nom2 ltlt endl
nom1=nom2
cout ltlt nom1 = ltlt nom1 ltlt nom2 ltlt nom2 ltlt endl
Donnez Nom1 salut
Donnez Nom2 hello
Nom1 salut Dim Nom1 = 5
Nom2 hello Dim Nom2 = 5
Nom3 = hello salut
nom1 gt nom2
nom1 = hello nom2 hello
Donnez Nom1 csou
Donnez Nom2 pi
Nom1csou Dim Nom1 = 4
Nom2pi Dim Nom2 = 2
Nom3 = pi csou
nom1 lt nom2
nom1 = pi nom2 pi
18
++- 35 M BENJELLOUN 2015 UMONS
Algorithmes de tri
Nom de lrsquoalgorithme Complexiteacute
Tri agrave bulles Tri par seacutelection Tri par insertion Tri de Shell (shell sort) Ameacutelioration du tri par insertion Tri fusion (merge sort) Tri rapide (quick sort) Tri par tas (heap sort)
O(N2) O(N2) O(N2)
O(N log2 N)
O(N log N) O(N log N) O(N log N)
++- 36 M BENJELLOUN 2015 UMONS
Tri agrave bulles bubble sort
reacutepeacuteter permutation = FALSE commencer au deacutebut du drapeau Pour i variant de 0 agrave N ndash 2 faire si cellule [i] gt cellule [i+1] alors deacutebut permuter cellules permutation = TRUE fin jusquagrave ce que (not permutation)
Complexiteacute O(Nsup2) Proportionnel agrave Nsup2 permutations
void TriaBulles(int x[] int N) int i perm=1 tmp while (perm==1) perm =0 for (i=0iltN-1i++) if(x[i] gt x[i+1]) tmp = x[i] x[i] = x[i+1] x[i+1] = tmp perm = 1
Algorithmes de tri
19
++- 37 M BENJELLOUN 2015 UMONS
void tri_par_selection(int t[] int n) int i j min tmp for (i = 0 i lt n - 1 i++) min = i for(j = i+1 j lt n j++) if(t[j] lt t[min]) min = j if(min = i) tmp = t[i] t[i] = t[min] t[min] = tmp
Le tri par seacutelection consiste en la recherche du plus grand eacuteleacutement (le plus petit) que lon va replacer en derniegravere position (en premiegravere) puis on recherche le second plus grand eacuteleacutement (le second plus petit) que lon va replacer eacutegalement agrave sa position finale et ainsi de suite
Algorithmes de tri
++- 38 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement dans un tableau
Recherche lineacuteaire Recherche dichotomique (binary search)
0
9
1
3
2
6
3
2
4
1
5
12
6
0
Est une meacutethode efficace pour retrouver un eacuteleacutement dans un tableau trieacute
A chaque eacutetape de la recherche dichotomique lrsquointervalle de recherche est diviseacute par deux
On utilise degraves lors deux index de recherche la borne infeacuterieure et la borne supeacuterieure
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup mid
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup
On initialise les bornes inf et sup agrave la premiegravere et derniegravere valeur des index du tableau tab
respectivement
Le milieu est donneacute par
mid = (inf+sup) 2 (0+6)2 =3
Supposons que lrsquoon recherche la valeur i=6 On
compare cette valeur avec tab[mid]=8 Comme
tab[mid]gti on change mid en sup
mid = (inf+sup) 2 (0+3)2 =1
inf=1 et sup=3
hellip
20
++- 39 M BENJELLOUN 2015 UMONS
44 Eacutecrire un programme qui supprime le premier et le dernier eacuteleacutement drsquoun vecteur
vecteur initial Tab 0 1 2 3 4 5 6
sup bords 1 2 3 4 5
sup bords 2 3 4
45 Eacutecrire un programme qui supprime le milieu du tableau et ajoute son double au deacutebut
vecteur initial Tab 1 2 3 4 5
sup Aj 6 1 2 4 5
sup Aj 4 6 1 4 5
46 Codez un programme de tri agrave bulles dun vecteur de strings
47 Codez un programme de recherche dichotomique dun nombre dans un vecteur de
strings rangeacutes par ordre croissant
++- 40 M BENJELLOUN 2015 UMONS
Matrices Rangeacutees ligne par ligne
Consideacutereacutees comme des vecteurs de lignes
Accegraves aux composantes par double crochets
int a[10][5]
a[1][0] = 7
int x[2][2] = 123 4 2 lignes et 2 colonnes
1 2
3 4 include hellip
void main()
int i j tab[5][4]
for (i = 0 i lt5 i++) Saisie
for (j = 0 j lt 4 j++) tab[i][j] = i
for (i = 0 i lt5 i++) Affichage
for (j = 0 j lt 4 j++) coutltlt tab[i][j] ltlt
cout ltlt endl
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
21
++- 41 M BENJELLOUN 2015 UMONS
Affichage de la table de multiplication
++- 42 M BENJELLOUN 2015 UMONS
Fonctions en C++
Encapsule un traitement particulier formant un tout
Peut impleacutementer la notion de module en logique
Augmente la lisibiliteacute drsquoun programme
Reacutealise un objectif preacutecis
Ameacuteliore le deacutebogage et la maintenance drsquoun programme
Son utilisation se deacutecompose en trois phases
Deacutefinition de la fonction
Deacuteclaration de la fonction
Appel de la fonction
Deacuteclarer une fonction
Appeler une fonction
Regravegles de visibiliteacute des variables
Passage des paramegravetres par valeur
Fonction renvoyant une valeur au programme
Passage des paramegravetres par valeur et par adresse
Passage des tableaux aux fonctions
22
++- 43 M BENJELLOUN 2015 UMONS
Type nom_fonction(liste_param_typeacutes)
deacuteclaration de variables locales
hellip Corps de la fonction
hellip
return (valeur)
Deacutefinition drsquoune fonction
Une fonction renvoie une valeur ou rien
liste_param_typeacutes = 0 void ou plusieurs
int Somme(int x int y)
int S Variable locale agrave Somme
S= x+y
return S
void fonction1()
coutltltn fonction1 n
void fonction2() coutltltn fonction2 n
Limbrication de fonctions
nest pas autoriseacutee
Deacutefinition
++- 44 M BENJELLOUN 2015 UMONS
Fonctions pourquoi
include ltiostreamgt
using namespace std
void main()
int i j SomCar1=0 SomCar2=0 SomCar3=0
for (i = 0 i lt5 i++)
SomCar1 = SomCar1 + ii
for (i = 0 i lt10 i++)
SomCar2 = SomCar2 + ii
for (j = 0 j lt 7 j++)
SomCar3 = SomCar3 + jj
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
include ltiostreamgt
using namespace std
int Fnct_SomCar(int N)
int i S=0
for (i = 0 i ltN i++)
S = S + ii S+=ii
return S
void main()
int SomCar1 SomCar2 SomCar3
SomCar1 = Fnct_SomCar(5)
SomCar2 = Fnct_SomCar(10)
SomCar3 = Fnct_SomCar(7)
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
23
++- 45 M BENJELLOUN 2015 UMONS
hellip
int Somme(int x int y)
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
int Somme(int x int y)
int S
S= x+y
return S
hellip
int Somme(int x int y)
int S
S= x+y
return S
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
Deacuteclaration et appel drsquoune fonction
++- 46 M BENJELLOUN 2015 UMONS
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
int addition() float tmp tmp = calcule(253) + calcule(572) return (int)tmp float calcule(float C float D) return ( (C + D ) 2)
float calcule(float float)
int addition()
float calcule(float A float B) return ( (A + B ) 2)
int addition() Appel drsquoune fonction dans une fonction
float tmp tmp = calcule(253) + calcule(572) return (int)tmp
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
Deacuteclaration et appel drsquoune fonction
24
++- 47 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void Addition(int v float f)
void main()
int v = 5
float f= 45
Addition(v f) Appel de la fonction
cout ltlt n Main v et f ltlt v ltlt et ltltf
void Addition(int v float f)
cout ltlt Addition v + f = ltlt v+f ltlt endl
f = f + v
cout ltlt Addition f = ltlt f
Addition v+f = 95
Addition f = 95
Main v et f = 5 et 45
v= 5 et f=45
5+ 45
f = 95
Les paramegravetres sont copieacutes La fonction travaille sur des copies de v et de f
++- 48 M BENJELLOUN 2015 UMONS
Fonction Renvoyant une valeur au programme
include ltiostreamgt
using namespace std
int change(int X)
void main(void)
int var = 5
int valeur
valeur = return_Val (var)
cout ltltmain var = ltlt var ltlt endl
cout ltltmain valeur = ltlt valeur
int return_Val (int v)
v = 100
cout ltlt return_Val v = ltlt v ltlt endl
return (v+1)
return_Val v = 100 main var = 5 main valeur = 101
Une fonction se termine et lsquorend la mainrsquo agrave
la fonction appelante lorsque son exeacutecution
rencontre lrsquoinstruction return expression
ou return
25
++- 49 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5 valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5
int valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
cout ltlt return_Val v = ltlt vltltendl
Qursquoaffiche ce programme agrave lrsquoeacutecran Qursquoaffiche ce programme agrave lrsquoeacutecran
++- 50 M BENJELLOUN 2015 UMONS
Fonctions et reacutecursiviteacute
Tours de Hanoiuml Suite de Fibonacci
un = un-1 + un-2
u0=u1=1
Puissance entiegravere
Une fonction est dite reacutecursive lorsqursquoelle srsquoappelle elle-mecircme
int factorielle (int n )
if ( n lt 0) return (ndash1) code derreur
else if ( n == 0 ) return 1 0 = 1
else
return n factorielle( n-1 ) n = n(n-1)
a x an-1 si n gt 0
1 si n = 0
an-1 =
26
++- 51 M BENJELLOUN 2015 UMONS
Passer des tableaux aux fonctions
Les tableaux peuvent ecirctre passeacutes comme paramegravetres dune fonction
Ils ne peuvent pas ecirctre retourneacutes comme reacutesultat dune fonction
La longueur du tableau ne doit pas ecirctre deacutefinie agrave la deacuteclaration de la fonction
Un tableau peut ecirctre modifieacute dans une fonction Il est passeacute par reacutefeacuterence (adresse) et
non par valeur
include hellip
void Modif(int a[])
a[0] = 5
a[1] = 6
void main(void)
int p[2] = 1 2
cout ltlt p[0] ltlt ltlt p[1]
Modif(p)
cout ltlt p[0] ltlt ltlt p[1]
1 2
5 6
include hellip
void Modif(int x[] int n)
void main(void)
int i
int p[6] = 1 2 3 5 7 11
Modif(p 6)
for (i=0ilt6i++)
coutltlt p[i]
void Modif(int a[] int n)
int i
for(i = 0 i ltn i++)
a[i] = 5
++- 52 M BENJELLOUN 2015 UMONS
void Saisie_Mat( int tab[][4] int m int n)
int i j
for (i = 0 i ltm i++)
for (j = 0 j lt n j++)
tab[i][j] = i
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
Matrice Exemple
void Affiche_Mat( int tab[][4] int m int n)
for (int i = 0 i ltm i++)
for (int j = 0 j lt n j++)
cout ltlt tab[i][j] ltlt
cout ltlt endl
include ltiostreamgt
using namespace std
void main()
int T[5][5]
Saisie_Mat( T 4 4 )
Affiche_Mat( T 4 4 )
27
++- 53 M BENJELLOUN 2015 UMONS
include hellip
int LaSomme( )
int A[Nmax] N int S = 0
for (int i=0ilt N i++)
cout ltltEntrez A[ltltiltlt]=
cin gtgtA[i]
S= S+ A[i]
return S
void main()
const int Nmax = 7
int i A[Nmax] S=0 N=3
S = LaSomme( )
cout ltlt Affichage ltlt endl
Affichage(A N)
cout ltlt n La somme est = ltlt S
Qursquoaffiche ce programme agrave lrsquoeacutecran
void Affichage( int A[] int N)
for (int i=0i lt N i++)
cout ltlt A[ltltiltlt]=
ltltA[i] ltltendl
++- 54 M BENJELLOUN 2015 UMONS
include hellip
void Saisie_T( int tab[] )
int N i
N= 3
for (i = 0 i ltN i++) tab[i] = i
void Affiche_T(int tab[] int N )
int i
for (i = 0 i ltN i++) cout ltlt tab[i]
void main()
int T[20] n
Saisie_T( T )
Affiche_T(T n )
tab[0] = 0
tab[1] = 1
tab[2] = 2
Qursquoaffiche ce programme agrave lrsquoeacutecran
28
++- 55 M BENJELLOUN 2015 UMONS
include hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 = 7
return hellip
Comment retourner v1 et v2
++- 56 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltlt a = ltlt a ltlt endl ltlt b = ltlt b
void echange(int xint y)
int tmp
tmp = x
x = y
y =tmp
void main()
int a = 1 b = 5
cout ltlt Avant ltltendl
affiche(ab)
echange(ab)
cout ltlt nApregraves ltltendl
affiche(ab)
Avant
a = 1
b = 5
Apregraves
PASSAGE DES PARAMETRES
Transmission des arguments
Comment eacutechanger a et b
a = 1
b = 5
PAR VALEUR
29
++- 57 M BENJELLOUN 2015 UMONS
Le pointeur prend comme
valeurs des adresses de
donneacutees en meacutemoire
Types de base hellip donneacutee
8
donneacutee
35 hellip
Adr i Adr j
Meacutemoire
12FF80 12FF84
Ladresse de leacuteleacutement i est ampi i=8 et ampi= 12FF80
int i=8 j=35
Et les pointeurs
hellip p=12FF84 hellip 35 hellip
12FF84 12FF80
int p p est le contenu pointeacute par p 35
p est lrsquoadresse 12FF84
++- 58 M BENJELLOUN 2015 UMONS
Deacuteclaration de Pointeurs Le symbole est utiliseacute entre le type et le nom du pointeur
Deacuteclaration drsquoun entier int i int p Deacuteclaration drsquoun pointeur vers un entier
Exemples de deacuteclarations de pointeurs
int pi pi est un pointeur vers un int pi deacutesigne le contenu de ladresse
float pf pf est un pointeur vers un float
char c d pc c et d sont des char pc est un pointeur vers un char
int C = 4
int p
p = ampC p reccediloit ladresse de c donc pointe sur c
cout ltlt p = ltltpltltendl
cout ltlt p = ltltp ltltendl
cout ltlt (ampC) ltlt(ampC)
p = 4
p = 0x12FF7C
(ampC) = 4
Ladresse de C est ampC
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
4
++- 7 M BENJELLOUN 2015 UMONS
Directives du preacuteprocesseur
Une directive preacuteprocesseur est une directive de compilation (preacuteceacutedeacutees par un )
Gestion des Entreacutees-Sorties standard ltiostreamgt
Fonctions matheacutematiques ltcmathgt
Traitement de chaicircnes de caractegraveres ltstringgt
Controcircler les paramegravetres daffichage ltiomanipgt
include ltcmathgt
++- 8 M BENJELLOUN 2015 UMONS
cout ltltQuil est agreable dutiliser
ltltcout ent C++nlorsquon lutilise ltltendl ltlt ttproprement
Reacutesultat
Quil est agreable dutiliser cout en C++
lorsquon lutilise
proprement
Caractegraveres
Signification
CODE ASCII
(hexadeacutecimal)
n ou endl Geacutenegravere une nouvelle ligne (newline) 0x0A
t Tabulation horizontale 0x09
v Tabulation verticale 0x0B
b Retour drsquoun caractegravere en arriegravere (backspace) 0x08
r Retour chariot (return) 0x0D
f Saut de page (form feed) 0x0C
t
t t
5
++- 9 M BENJELLOUN 2015 UMONS
setw(int) impose la largeur daffichage agrave int caractegraveres Texte et nombres sont aligneacutes agrave droite
setprecision(int) impose le nombre de caractegraveres du nombre afficheacute
setfill(char) remplace les espaces preacuteceacutedant le nombre par le caractegravere char
include ltiostreamgt
include ltiomanipgt
using namespace std
void main()
const double Pi = 314159265359
cout ltlt Pi ltlt endl
cout ltlt setprecision(9) ltlt Pi ltlt endl
cout ltlt setprecision(2) ltlt Pi ltlt endl
cout ltlt setw(10) ltlt setprecision(2) ltlt Pi ltlt endl
cout ltlt setw(15) ltlt setfill() ltlt setprecision(9) ltlt Pi ltlt endl
314159 314159265 31 31 314159265
Formatage de la preacutesentation eacutecran
++- 10 M BENJELLOUN 2015 UMONS
Identificateurs
Les identificateurs nomment les objets C++ (fonctions variables )
Le C++ distingue les minuscules des majuscules
Exemple ab Ab AB
sont des identificateurs valides et tous diffeacuterents
Identificateurs valides
xx y1 somme_5 _position Noms Programme_1
Identificateurs invalides
3eme commence par un chiffre
xy caractegravere non autoriseacute ()
no-commande caractegravere non autoriseacute (-)
taux change caractegravere non autoriseacute (espace)
6
++- 11 M BENJELLOUN 2015 UMONS
Un identificateur ne peut pas ecirctre un mot reacuteserveacute du langage
Les mots reacuteserveacutes du langage C++
doivent ecirctre eacutecrits en minuscules
++- 12 M BENJELLOUN 2015 UMONS
Variables deacuteclarations
Syntaxe Type identificateur1 id2hellip
char c1 c2 c3
int i j var_ent
float f variable
Exemple
initialisations
int i=9 ou int i
i=9
char c1= A ou char c1
c1= A
Constantes deacuteclarations + initialisations
Syntaxe const Type identificateur1=Val1 identificateur2=Val2 helliphellip
const char c = A
const int i=5 var_ent=8
Exemple const int i
i= 5
Lrsquoinitialisation des constantes est obligatoire lors de leur deacuteclaration
7
++- 13 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std int Somme(int x int y)
void main(void)
int Som
Som = Somme(79) appel de la fonction
if ( Som gt 10 )
cout ltlt Som gt 10 ltlt Somltlt endl
else
cout ltlt Som lt= 10 ltlt Som
int Somme(int x int y) Deacutefinition de
la fonction
int S
S= x+y
return S
Directives du preacuteprocesseur accegraves avant la compilation
Programme
principal
Deacuteclarations
Traitements Donneacutees Structures de controcircle Commentaires
Structure dun programme C++ exemple
++- 14 M BENJELLOUN 2015 UMONS
Les opeacuterateurs arithmeacutetiques
Le C++ propose les opeacuterateurs suivants
+ addition - soustraction multiplication division modulo (reste de la division entiegravere )
ne peut ecirctre utiliseacute quavec des entiers
72 702 720 7020
3
35
hellip void main() int i = 6 j = 4 k float f = 60 g = 40 h k = i j k= 64 = 1 h = f g h = 6040 = 15 h = i j h = 64 = 1000
Modulo C=AB C 42 = 0 52 = 1 83= 2 C=A2 Si C=0 alors A est pair sinon (=1) A est impair
8
++- 15 M BENJELLOUN 2015 UMONS
Comparaisons lt plus petit
lt= plus petit ou eacutegal
gt plus grand
gt= plus grand ou eacutegal
== eacutegal
= diffeacuterent
Les opeacuterateurs logiques
ampamp et
|| ou (non exclusif)
non
Contractions dopeacuterateurs
+= -= = = =
amp= |= ^= ltlt= gtgt=
a += 15
a = a + 15
i = j + 5
i = i (j + 5)
Le reacutesultat dune expression logique est un
booleacuteen Il vaut true si elle est vraie et false sinon
Reacuteciproquement toute valeur non nulle est consideacutereacutee
comme vraie et la valeur nulle comme fausse
Increacutement et deacutecreacutement
Pour
++ increacutement i++ ou ++i
est eacutequivalent agrave i += 1 ou i = i + 1
- - deacutecreacutement
int i = 5 j = 4
char lettre = B
i++ i vaudra 6
--j j vaudra 3
++i i vaudra 7
lettre++ lettre vaudra C
lettre -- lettre vaudra B
++- 16 M BENJELLOUN 2015 UMONS
Nous consideacuterons un circuit eacutelectrique Quand lrsquointerrupteur lsquoIntrsquo est dans la position de la Fig (X=1) le geacuteneacuterateur de tension lsquoGrsquo allume lrsquoampoule lsquoXrsquo (X=true ou X = 1) Quand lrsquointerrupteur srsquoouvre lsquoXrsquo srsquoeacuteteint (X=false ou X = 0) Afin de simuler le clignotement drsquoune ampoule (X) compleacutetez le code de sorte que lrsquoexeacutecution du programme fournisse les reacutesultats ci-dessous (en rouge)
include ltiostreamgt using namespace std void main() bool x = 1 cout ltlt Test X = ltlt x ltlt endl cout ltlt --------------------------ltlt endl for (int i=0 i lt 6 i++ ) x= 1-x x = x ou x=x2 cout ltlt X = ltlt x ltlt endl
Test X = 1 -------------- X = 0 X = 1 X = 0 X = 1 X = 0 X = 1
9
++- 17 M BENJELLOUN 2015 UMONS
Les structures de controcircle
Alternative if-else
Iteacuterations for while do-while
Rupture de Controcircle break continue return hellip
Choix Multiple switch-case
Bloc 1
drsquoinstructions
Bloc 2
drsquoinstructions
oui non
Suite du programme
oui non
Suite du
programme Bloc
drsquoinstructions
Condition
vraie
oui
non
Bloc
drsquoinstructions
programme
Condition vraie
Suite du programme
programme
Condition
vraie
if-else while
do-while
++- 18 M BENJELLOUN 2015 UMONS
Les deacutecisions - if hellip else
if (Condition vraie)
BLOC 1 DINSTRUCTIONS
else
BLOC 2 DINSTRUCTIONS
Bloc 1
drsquoinstructions
Bloc 2
drsquoinstructions
oui non
Suite du programme
programme
Condition
vraie
if (Condition vraie)
instruction 1
instruction 2
else
instruction 3
instruction 4
Bloc 1
drsquoinstructions
oui non
Suite du programme
Condition
vraie
if (Condition vraie)
instruction 1
instruction 2
instruction 3 hellip
instruction N
if (Condition vraie)
instruction 1
if ( temperature gt 700)
cout ltlt Alarme ltltendl
if (Condition vraie)
instruction A
else
instruction B
if (altb) min=a
else min=b
if (i) if (i = 0)
10
++- 19 M BENJELLOUN 2015 UMONS
if ( ltexpr1gt )
ltbloc1gt
else if (ltexpr2gt)
ltbloc2gt
else if (ltexpr3gt)
ltbloc3gt
else if (ltexprNgt)
ltblocNgt
else ltblocN+1gt
if ( ltexpr1gt )
ltbloc1gt
else if (ltexpr2gt)
ltbloc2gt
else if (ltexpr3gt)
ltbloc3gt
else if (ltexprNgt)
ltblocNgt
else ltblocN+1gt
if emboicircteacutes
else est associeacute avec le if le plus proche
if(i gt= 0)
if(i gt 1000) coutltlt i gt 1000
else coutltlt i lt 0 n
if(i gt= 0)
if(i gt 1000) coutltlt i gt 1000
else coutltlt i lt 0 n
++- 20 M BENJELLOUN 2015 UMONS
for( )
Les iteacuterations ndash for
for( initialisation (Condition vraie) iteacuteration )
liste dinstructions
int i j
float K
for(i = 0 j = 2 k = 75 (i lt 20) ampamp(j==2) i++ k-=02)
int ij
for (i = 0 i lt3 i++)
coutltlt i = ltlt i ltlt endl
cout ltltendlltltendl
for(j = 5 j gt 0 j- -)
coutltlt j = ltlt j ltlt endl
i = 0
i = 1
i = 2
j = 5
j = 4
j = 3
j = 2
j = 1
boucle infinie
11
++- 21 M BENJELLOUN 2015 UMONS
La boucle TANT QUE FAIRE
Boucle preacute-testeacutee
Il sagit de linstruction while
tant que (expression vraie)
faire BLOC DINSTRUCTIONS
Organigramme
while (Condition vraie)
bloc dinstructions
Le test se fait dabord le bloc
dinstructions nest pas forceacutement exeacutecuteacute
Syntaxe
tant que pas jusqursquoagrave ce que
oui non
Suite du
programme
Condition
vraie
Bloc 1
drsquoinstructions
++- 22 M BENJELLOUN 2015 UMONS
i=1
while(ilt5)
coutltltInterieur ltlti ltlt endl
i++
coutltltExterieur ltlti ltlt endl
Exemples
Interieur 1
hellip
hellip
int j = 5
coutltltstartn
while(j == 0)
coutltltj = ltltj--ltltendl
coutltltendn
start
end
i=1
while(ilt5)
coutltltInterieur ltlti ltlt endl
i++
iteacuteration
12
++- 23 M BENJELLOUN 2015 UMONS
do while = REPETER hellip tant que
do
bloc dinstructions
while (Condition vraie) Condition
vraie
oui non
Bloc
drsquoinstructions
programme
int j = 5
do
coutltltj = ltltj--ltltendl
while(j gt 0)
cout ltltstopn
Suite du programme
(garantit lrsquoexeacutecution au moins une fois)
int j = 5
do
coutltltj = ltltj ltltendl
j--
while(j gt 0)
cout ltltstopn
j = 5
j = 4
j = 3
j = 2
j = 1
stop
++- 24 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void main()
for (char lettre = A lettre lt= M lettre++)
coutltltlettre
coutltltendl
for (float pourcent = 00 pourcent lt 05 pourcent += 01)
coutltltpourcentltltendl
for (int i=2 i lt= 3 i++)
cout ltlt Table de ltlt i ltlt ltlt endl
for (int j=0 j lt= 3 j++)
cout ltlt ltlt i ltlt ltlt j ltlt = ltlt ij ltlt endl
ABCDEFGHIJKLM
0
01
02
03
04 Table de 2 2 0 = 0 2 1 = 2 2 2 = 4 2 3 = 6 Table de 3 3 0 = 0 hellip
13
++- 25 M BENJELLOUN 2015 UMONS
include hellip
void main()
bool sortir = false
char rep
coutltltAvant la boucleltltendl
while(sortir)
coutltltDans la boucleltltendl
coutltltVoulez vous quitter (ON)ltltendl
cingtgtrep
if(rep==O)
sortir=true
coutltltApres la boucleltltendl
include hellip
void main()
bool sortir = false
char rep
coutltltAvant la boucleltltendl
do
coutltltDans la boucleltltendl
coutltltVoulez vous quitter (ON)ltltendl
cingtgtrep
if(rep==O)
sortir=true
while(sortir)
coutltltApres la boucleltltendl
++- 26 M BENJELLOUN 2015 UMONS
int i j=1
char a
for (i = -10 i lt= 10 i++)
while(j=0)
cin gtgt a if(a==x)
break
Pour rompre le deacuteroulement seacutequentiel dune suite dinstructions
Instructions deacutechappement
return (expression) permet de sortir de la fonction qui la contient
exit (expression) La fonction est interrompue lsquoexpressionrsquo un entier
indiquant le code de terminaison du processus
for (i = -10 i lt= 10 i++)
if (i == 0)
continue pour eacuteviter la division par zeacutero
cout ltlt 1 i
while (Condition vraie)
continue
break
8
14
++- 27 M BENJELLOUN 2015 UMONS
switch = AU CAS OU FAIRE
hellip
switch(variable de type char ou int) au cas ougrave la variable vaut
case valeur1 variable=valeur1 exeacutecutez ce bloc dinstructions
break
case valeur2 variable=valeur2 exeacutecutez ce bloc dinstructions
break
etc
default aucune des valeurs preacuteceacutedentes exeacutecutez ce bloc
dinstructions pas de break ici
Le bloc default nest pas obligatoire valeur1 valeur2 hellip doivent ecirctre des expressions
constantes Lrsquoinstruction switch correspond agrave une cascade drsquoinstructions if else
++- 28 M BENJELLOUN 2015 UMONS
hellip
void main( )
const float PI= 314159 float rayon = 35 float diametre circonference surface int choix
cout ltlt 1 Calculer la circonferencen cout ltlt 2 Calculer la surfacen cout ltlt 3 Calculer le diametren cout ltlt Votre choix cin gtgt choix
switch (choix) case 1 circonference = 2PIrayon break case 2 surface = PIrayonrayon break case 3 diametre = 2rayon break default cout ltlt Mauvais choixhellipn
char choix
switch(choix)
case 1 hellip
switch(i)
case 2 j
float f
switch(f)
case 2
switch instruction commode pour les menus
15
++- 29 M BENJELLOUN 2015 UMONS
Tableaux et Strings
Un tableau est une collection de variables de mecircme type appeleacutees eacuteleacutements
Type Nom_Tableau[dim]
int tab[4] deacuteclare un tableau de 4 valeurs entiegraveres tab[0] tab[1] tab[2] tab[3]
const int SIZE = 5
int A[SIZE] A est un vecteur de 5 entiers
float B[5]
int A[SIZE] = 10 20 30 40 50
int premier[] = 1 2 3 5 7 11 13
char Tab_Char[4] = A C F G
int Tab[50] = 0
int i = 10
int a[i]
int primes[]
Deacuteclaration
Initialisation
Interdiction
Constante
++- 30 M BENJELLOUN 2015 UMONS
Accegraves aux eacuteleacutements drsquoun tableau
Les eacuteleacutements sont numeacuteroteacutes de 0 agrave dim-1
Il nrsquoy a pas de veacuterification des bornes
void main()
int a[6]
int i = 7
a[0] = 9
a[5] = -10
a[i2] = 2
a[6] = 0
a[-1] = 5
0
a
1
2
3
4
5
9
2
-10
void main(void)
const int dim=6
int i
int A[dim] = 1 2 3 4 5 6
for (i=0iltdimi++)
A[i] = 2i
coutltltA[ltltiltlt]=ltltA[i]
A[0]=0 A[1]=2 A[2]=4 A[3]=6 A[4]=8 A[5]=10
16
++- 31 M BENJELLOUN 2015 UMONS
Chaicircnes de caractegraveres ou String
char Nom[dim] Initialisation
Pour terminer la chaicircne on place en fin de chaicircne le caractegravere nul 0 de code ASCII 0
Ce caractegravere est soit ajouteacute automatiquement par le compilateur soit introduit par le programmeur selon les fonctions utiliseacutees
char S[] = Hello0 H
e
l
l
o
0
S[0] S[1] S[2] S[3] S[4] S[5] char S[6] = Hello
char S[5] = Hello H e l l o
char S[] = Le main L e m a i n 0
bull Un tableau de char agrave une dimension char Nom[dim]
bull Un type speacutecial string string Nom Il faut inclure ltstringgt
++- 32 M BENJELLOUN 2015 UMONS
string Nom Il faut inclure ltstringgt
string Nom est eacutequivalente agrave string Nom = Donc par deacutefaut la chaicircne est vide
Il existe de nombreuses faccedilons drsquoinitialiser Ident par exemple
string s1 = Bonjour a vous
string s2 = s1 s2 contient Bonjour a vous
string s3(4 x) eacutequivaut agrave string s3 = xxxx
string s4(s1 4 8) s4 contient our a voldquo S1 de 4 + 8
B o n j o u r a v o u s 0 1 2 3 4 5 6 7 8 9 10 11 12 13
include ltstringgt hellip string ST = Salut char H[6] = Hello for (int i=0 ilt5 i++) cout ltlt ST[i] ltlt affichera S a l u t
for (int i=0 ilt5 i++) cout ltlt H[i] ltlt affichera H e l l o
17
++- 33 M BENJELLOUN 2015 UMONS
Pourquoi utiliser string Nom plutocirct que char Nom[dim]
char S1[6] = Salut S2[6] = Hello S3[12]
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Interdit
string S1 = Salut S2 = Hello S3
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Autoriseacute
S1= Hello
S1= Hooo
S3= HoooHello
false
++- 34 M BENJELLOUN 2015 UMONS
include ltiostreamgt
include ltstringgt traitement de string
using namespace std espace de nommage std pour importer les
symboles de la bibliothegraveque standard C++
void main(void)
string nom1 nom2 nom3
int len size
cout ltlt Donnez Nom1 cin gtgt nom1
cout ltlt Donnez Nom2 cin gtgt nom2
len = nom1length() nombre de caractegraveres dans nom1
size = nom2size() nombre de caractegraveres dans nom2
cout ltlt Nom1 ltltnom1 ltlt Dim Nom1 = ltlt len ltlt endl
cout ltlt Nom2 ltltnom2 ltlt Dim Nom2 = ltlt size ltlt endl
nom3 = nom2+ +nom1
cout ltlt Nom3 = ltlt nom3 ltlt endl
if(nom1gtnom2) cout ltlt nom1 gt nom2 ltlt endl
else if (nom1==nom2) cout ltlt nom1 = nom2 ltlt endl
else cout ltlt nom1 lt nom2 ltlt endl
nom1=nom2
cout ltlt nom1 = ltlt nom1 ltlt nom2 ltlt nom2 ltlt endl
Donnez Nom1 salut
Donnez Nom2 hello
Nom1 salut Dim Nom1 = 5
Nom2 hello Dim Nom2 = 5
Nom3 = hello salut
nom1 gt nom2
nom1 = hello nom2 hello
Donnez Nom1 csou
Donnez Nom2 pi
Nom1csou Dim Nom1 = 4
Nom2pi Dim Nom2 = 2
Nom3 = pi csou
nom1 lt nom2
nom1 = pi nom2 pi
18
++- 35 M BENJELLOUN 2015 UMONS
Algorithmes de tri
Nom de lrsquoalgorithme Complexiteacute
Tri agrave bulles Tri par seacutelection Tri par insertion Tri de Shell (shell sort) Ameacutelioration du tri par insertion Tri fusion (merge sort) Tri rapide (quick sort) Tri par tas (heap sort)
O(N2) O(N2) O(N2)
O(N log2 N)
O(N log N) O(N log N) O(N log N)
++- 36 M BENJELLOUN 2015 UMONS
Tri agrave bulles bubble sort
reacutepeacuteter permutation = FALSE commencer au deacutebut du drapeau Pour i variant de 0 agrave N ndash 2 faire si cellule [i] gt cellule [i+1] alors deacutebut permuter cellules permutation = TRUE fin jusquagrave ce que (not permutation)
Complexiteacute O(Nsup2) Proportionnel agrave Nsup2 permutations
void TriaBulles(int x[] int N) int i perm=1 tmp while (perm==1) perm =0 for (i=0iltN-1i++) if(x[i] gt x[i+1]) tmp = x[i] x[i] = x[i+1] x[i+1] = tmp perm = 1
Algorithmes de tri
19
++- 37 M BENJELLOUN 2015 UMONS
void tri_par_selection(int t[] int n) int i j min tmp for (i = 0 i lt n - 1 i++) min = i for(j = i+1 j lt n j++) if(t[j] lt t[min]) min = j if(min = i) tmp = t[i] t[i] = t[min] t[min] = tmp
Le tri par seacutelection consiste en la recherche du plus grand eacuteleacutement (le plus petit) que lon va replacer en derniegravere position (en premiegravere) puis on recherche le second plus grand eacuteleacutement (le second plus petit) que lon va replacer eacutegalement agrave sa position finale et ainsi de suite
Algorithmes de tri
++- 38 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement dans un tableau
Recherche lineacuteaire Recherche dichotomique (binary search)
0
9
1
3
2
6
3
2
4
1
5
12
6
0
Est une meacutethode efficace pour retrouver un eacuteleacutement dans un tableau trieacute
A chaque eacutetape de la recherche dichotomique lrsquointervalle de recherche est diviseacute par deux
On utilise degraves lors deux index de recherche la borne infeacuterieure et la borne supeacuterieure
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup mid
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup
On initialise les bornes inf et sup agrave la premiegravere et derniegravere valeur des index du tableau tab
respectivement
Le milieu est donneacute par
mid = (inf+sup) 2 (0+6)2 =3
Supposons que lrsquoon recherche la valeur i=6 On
compare cette valeur avec tab[mid]=8 Comme
tab[mid]gti on change mid en sup
mid = (inf+sup) 2 (0+3)2 =1
inf=1 et sup=3
hellip
20
++- 39 M BENJELLOUN 2015 UMONS
44 Eacutecrire un programme qui supprime le premier et le dernier eacuteleacutement drsquoun vecteur
vecteur initial Tab 0 1 2 3 4 5 6
sup bords 1 2 3 4 5
sup bords 2 3 4
45 Eacutecrire un programme qui supprime le milieu du tableau et ajoute son double au deacutebut
vecteur initial Tab 1 2 3 4 5
sup Aj 6 1 2 4 5
sup Aj 4 6 1 4 5
46 Codez un programme de tri agrave bulles dun vecteur de strings
47 Codez un programme de recherche dichotomique dun nombre dans un vecteur de
strings rangeacutes par ordre croissant
++- 40 M BENJELLOUN 2015 UMONS
Matrices Rangeacutees ligne par ligne
Consideacutereacutees comme des vecteurs de lignes
Accegraves aux composantes par double crochets
int a[10][5]
a[1][0] = 7
int x[2][2] = 123 4 2 lignes et 2 colonnes
1 2
3 4 include hellip
void main()
int i j tab[5][4]
for (i = 0 i lt5 i++) Saisie
for (j = 0 j lt 4 j++) tab[i][j] = i
for (i = 0 i lt5 i++) Affichage
for (j = 0 j lt 4 j++) coutltlt tab[i][j] ltlt
cout ltlt endl
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
21
++- 41 M BENJELLOUN 2015 UMONS
Affichage de la table de multiplication
++- 42 M BENJELLOUN 2015 UMONS
Fonctions en C++
Encapsule un traitement particulier formant un tout
Peut impleacutementer la notion de module en logique
Augmente la lisibiliteacute drsquoun programme
Reacutealise un objectif preacutecis
Ameacuteliore le deacutebogage et la maintenance drsquoun programme
Son utilisation se deacutecompose en trois phases
Deacutefinition de la fonction
Deacuteclaration de la fonction
Appel de la fonction
Deacuteclarer une fonction
Appeler une fonction
Regravegles de visibiliteacute des variables
Passage des paramegravetres par valeur
Fonction renvoyant une valeur au programme
Passage des paramegravetres par valeur et par adresse
Passage des tableaux aux fonctions
22
++- 43 M BENJELLOUN 2015 UMONS
Type nom_fonction(liste_param_typeacutes)
deacuteclaration de variables locales
hellip Corps de la fonction
hellip
return (valeur)
Deacutefinition drsquoune fonction
Une fonction renvoie une valeur ou rien
liste_param_typeacutes = 0 void ou plusieurs
int Somme(int x int y)
int S Variable locale agrave Somme
S= x+y
return S
void fonction1()
coutltltn fonction1 n
void fonction2() coutltltn fonction2 n
Limbrication de fonctions
nest pas autoriseacutee
Deacutefinition
++- 44 M BENJELLOUN 2015 UMONS
Fonctions pourquoi
include ltiostreamgt
using namespace std
void main()
int i j SomCar1=0 SomCar2=0 SomCar3=0
for (i = 0 i lt5 i++)
SomCar1 = SomCar1 + ii
for (i = 0 i lt10 i++)
SomCar2 = SomCar2 + ii
for (j = 0 j lt 7 j++)
SomCar3 = SomCar3 + jj
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
include ltiostreamgt
using namespace std
int Fnct_SomCar(int N)
int i S=0
for (i = 0 i ltN i++)
S = S + ii S+=ii
return S
void main()
int SomCar1 SomCar2 SomCar3
SomCar1 = Fnct_SomCar(5)
SomCar2 = Fnct_SomCar(10)
SomCar3 = Fnct_SomCar(7)
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
23
++- 45 M BENJELLOUN 2015 UMONS
hellip
int Somme(int x int y)
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
int Somme(int x int y)
int S
S= x+y
return S
hellip
int Somme(int x int y)
int S
S= x+y
return S
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
Deacuteclaration et appel drsquoune fonction
++- 46 M BENJELLOUN 2015 UMONS
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
int addition() float tmp tmp = calcule(253) + calcule(572) return (int)tmp float calcule(float C float D) return ( (C + D ) 2)
float calcule(float float)
int addition()
float calcule(float A float B) return ( (A + B ) 2)
int addition() Appel drsquoune fonction dans une fonction
float tmp tmp = calcule(253) + calcule(572) return (int)tmp
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
Deacuteclaration et appel drsquoune fonction
24
++- 47 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void Addition(int v float f)
void main()
int v = 5
float f= 45
Addition(v f) Appel de la fonction
cout ltlt n Main v et f ltlt v ltlt et ltltf
void Addition(int v float f)
cout ltlt Addition v + f = ltlt v+f ltlt endl
f = f + v
cout ltlt Addition f = ltlt f
Addition v+f = 95
Addition f = 95
Main v et f = 5 et 45
v= 5 et f=45
5+ 45
f = 95
Les paramegravetres sont copieacutes La fonction travaille sur des copies de v et de f
++- 48 M BENJELLOUN 2015 UMONS
Fonction Renvoyant une valeur au programme
include ltiostreamgt
using namespace std
int change(int X)
void main(void)
int var = 5
int valeur
valeur = return_Val (var)
cout ltltmain var = ltlt var ltlt endl
cout ltltmain valeur = ltlt valeur
int return_Val (int v)
v = 100
cout ltlt return_Val v = ltlt v ltlt endl
return (v+1)
return_Val v = 100 main var = 5 main valeur = 101
Une fonction se termine et lsquorend la mainrsquo agrave
la fonction appelante lorsque son exeacutecution
rencontre lrsquoinstruction return expression
ou return
25
++- 49 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5 valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5
int valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
cout ltlt return_Val v = ltlt vltltendl
Qursquoaffiche ce programme agrave lrsquoeacutecran Qursquoaffiche ce programme agrave lrsquoeacutecran
++- 50 M BENJELLOUN 2015 UMONS
Fonctions et reacutecursiviteacute
Tours de Hanoiuml Suite de Fibonacci
un = un-1 + un-2
u0=u1=1
Puissance entiegravere
Une fonction est dite reacutecursive lorsqursquoelle srsquoappelle elle-mecircme
int factorielle (int n )
if ( n lt 0) return (ndash1) code derreur
else if ( n == 0 ) return 1 0 = 1
else
return n factorielle( n-1 ) n = n(n-1)
a x an-1 si n gt 0
1 si n = 0
an-1 =
26
++- 51 M BENJELLOUN 2015 UMONS
Passer des tableaux aux fonctions
Les tableaux peuvent ecirctre passeacutes comme paramegravetres dune fonction
Ils ne peuvent pas ecirctre retourneacutes comme reacutesultat dune fonction
La longueur du tableau ne doit pas ecirctre deacutefinie agrave la deacuteclaration de la fonction
Un tableau peut ecirctre modifieacute dans une fonction Il est passeacute par reacutefeacuterence (adresse) et
non par valeur
include hellip
void Modif(int a[])
a[0] = 5
a[1] = 6
void main(void)
int p[2] = 1 2
cout ltlt p[0] ltlt ltlt p[1]
Modif(p)
cout ltlt p[0] ltlt ltlt p[1]
1 2
5 6
include hellip
void Modif(int x[] int n)
void main(void)
int i
int p[6] = 1 2 3 5 7 11
Modif(p 6)
for (i=0ilt6i++)
coutltlt p[i]
void Modif(int a[] int n)
int i
for(i = 0 i ltn i++)
a[i] = 5
++- 52 M BENJELLOUN 2015 UMONS
void Saisie_Mat( int tab[][4] int m int n)
int i j
for (i = 0 i ltm i++)
for (j = 0 j lt n j++)
tab[i][j] = i
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
Matrice Exemple
void Affiche_Mat( int tab[][4] int m int n)
for (int i = 0 i ltm i++)
for (int j = 0 j lt n j++)
cout ltlt tab[i][j] ltlt
cout ltlt endl
include ltiostreamgt
using namespace std
void main()
int T[5][5]
Saisie_Mat( T 4 4 )
Affiche_Mat( T 4 4 )
27
++- 53 M BENJELLOUN 2015 UMONS
include hellip
int LaSomme( )
int A[Nmax] N int S = 0
for (int i=0ilt N i++)
cout ltltEntrez A[ltltiltlt]=
cin gtgtA[i]
S= S+ A[i]
return S
void main()
const int Nmax = 7
int i A[Nmax] S=0 N=3
S = LaSomme( )
cout ltlt Affichage ltlt endl
Affichage(A N)
cout ltlt n La somme est = ltlt S
Qursquoaffiche ce programme agrave lrsquoeacutecran
void Affichage( int A[] int N)
for (int i=0i lt N i++)
cout ltlt A[ltltiltlt]=
ltltA[i] ltltendl
++- 54 M BENJELLOUN 2015 UMONS
include hellip
void Saisie_T( int tab[] )
int N i
N= 3
for (i = 0 i ltN i++) tab[i] = i
void Affiche_T(int tab[] int N )
int i
for (i = 0 i ltN i++) cout ltlt tab[i]
void main()
int T[20] n
Saisie_T( T )
Affiche_T(T n )
tab[0] = 0
tab[1] = 1
tab[2] = 2
Qursquoaffiche ce programme agrave lrsquoeacutecran
28
++- 55 M BENJELLOUN 2015 UMONS
include hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 = 7
return hellip
Comment retourner v1 et v2
++- 56 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltlt a = ltlt a ltlt endl ltlt b = ltlt b
void echange(int xint y)
int tmp
tmp = x
x = y
y =tmp
void main()
int a = 1 b = 5
cout ltlt Avant ltltendl
affiche(ab)
echange(ab)
cout ltlt nApregraves ltltendl
affiche(ab)
Avant
a = 1
b = 5
Apregraves
PASSAGE DES PARAMETRES
Transmission des arguments
Comment eacutechanger a et b
a = 1
b = 5
PAR VALEUR
29
++- 57 M BENJELLOUN 2015 UMONS
Le pointeur prend comme
valeurs des adresses de
donneacutees en meacutemoire
Types de base hellip donneacutee
8
donneacutee
35 hellip
Adr i Adr j
Meacutemoire
12FF80 12FF84
Ladresse de leacuteleacutement i est ampi i=8 et ampi= 12FF80
int i=8 j=35
Et les pointeurs
hellip p=12FF84 hellip 35 hellip
12FF84 12FF80
int p p est le contenu pointeacute par p 35
p est lrsquoadresse 12FF84
++- 58 M BENJELLOUN 2015 UMONS
Deacuteclaration de Pointeurs Le symbole est utiliseacute entre le type et le nom du pointeur
Deacuteclaration drsquoun entier int i int p Deacuteclaration drsquoun pointeur vers un entier
Exemples de deacuteclarations de pointeurs
int pi pi est un pointeur vers un int pi deacutesigne le contenu de ladresse
float pf pf est un pointeur vers un float
char c d pc c et d sont des char pc est un pointeur vers un char
int C = 4
int p
p = ampC p reccediloit ladresse de c donc pointe sur c
cout ltlt p = ltltpltltendl
cout ltlt p = ltltp ltltendl
cout ltlt (ampC) ltlt(ampC)
p = 4
p = 0x12FF7C
(ampC) = 4
Ladresse de C est ampC
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
5
++- 9 M BENJELLOUN 2015 UMONS
setw(int) impose la largeur daffichage agrave int caractegraveres Texte et nombres sont aligneacutes agrave droite
setprecision(int) impose le nombre de caractegraveres du nombre afficheacute
setfill(char) remplace les espaces preacuteceacutedant le nombre par le caractegravere char
include ltiostreamgt
include ltiomanipgt
using namespace std
void main()
const double Pi = 314159265359
cout ltlt Pi ltlt endl
cout ltlt setprecision(9) ltlt Pi ltlt endl
cout ltlt setprecision(2) ltlt Pi ltlt endl
cout ltlt setw(10) ltlt setprecision(2) ltlt Pi ltlt endl
cout ltlt setw(15) ltlt setfill() ltlt setprecision(9) ltlt Pi ltlt endl
314159 314159265 31 31 314159265
Formatage de la preacutesentation eacutecran
++- 10 M BENJELLOUN 2015 UMONS
Identificateurs
Les identificateurs nomment les objets C++ (fonctions variables )
Le C++ distingue les minuscules des majuscules
Exemple ab Ab AB
sont des identificateurs valides et tous diffeacuterents
Identificateurs valides
xx y1 somme_5 _position Noms Programme_1
Identificateurs invalides
3eme commence par un chiffre
xy caractegravere non autoriseacute ()
no-commande caractegravere non autoriseacute (-)
taux change caractegravere non autoriseacute (espace)
6
++- 11 M BENJELLOUN 2015 UMONS
Un identificateur ne peut pas ecirctre un mot reacuteserveacute du langage
Les mots reacuteserveacutes du langage C++
doivent ecirctre eacutecrits en minuscules
++- 12 M BENJELLOUN 2015 UMONS
Variables deacuteclarations
Syntaxe Type identificateur1 id2hellip
char c1 c2 c3
int i j var_ent
float f variable
Exemple
initialisations
int i=9 ou int i
i=9
char c1= A ou char c1
c1= A
Constantes deacuteclarations + initialisations
Syntaxe const Type identificateur1=Val1 identificateur2=Val2 helliphellip
const char c = A
const int i=5 var_ent=8
Exemple const int i
i= 5
Lrsquoinitialisation des constantes est obligatoire lors de leur deacuteclaration
7
++- 13 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std int Somme(int x int y)
void main(void)
int Som
Som = Somme(79) appel de la fonction
if ( Som gt 10 )
cout ltlt Som gt 10 ltlt Somltlt endl
else
cout ltlt Som lt= 10 ltlt Som
int Somme(int x int y) Deacutefinition de
la fonction
int S
S= x+y
return S
Directives du preacuteprocesseur accegraves avant la compilation
Programme
principal
Deacuteclarations
Traitements Donneacutees Structures de controcircle Commentaires
Structure dun programme C++ exemple
++- 14 M BENJELLOUN 2015 UMONS
Les opeacuterateurs arithmeacutetiques
Le C++ propose les opeacuterateurs suivants
+ addition - soustraction multiplication division modulo (reste de la division entiegravere )
ne peut ecirctre utiliseacute quavec des entiers
72 702 720 7020
3
35
hellip void main() int i = 6 j = 4 k float f = 60 g = 40 h k = i j k= 64 = 1 h = f g h = 6040 = 15 h = i j h = 64 = 1000
Modulo C=AB C 42 = 0 52 = 1 83= 2 C=A2 Si C=0 alors A est pair sinon (=1) A est impair
8
++- 15 M BENJELLOUN 2015 UMONS
Comparaisons lt plus petit
lt= plus petit ou eacutegal
gt plus grand
gt= plus grand ou eacutegal
== eacutegal
= diffeacuterent
Les opeacuterateurs logiques
ampamp et
|| ou (non exclusif)
non
Contractions dopeacuterateurs
+= -= = = =
amp= |= ^= ltlt= gtgt=
a += 15
a = a + 15
i = j + 5
i = i (j + 5)
Le reacutesultat dune expression logique est un
booleacuteen Il vaut true si elle est vraie et false sinon
Reacuteciproquement toute valeur non nulle est consideacutereacutee
comme vraie et la valeur nulle comme fausse
Increacutement et deacutecreacutement
Pour
++ increacutement i++ ou ++i
est eacutequivalent agrave i += 1 ou i = i + 1
- - deacutecreacutement
int i = 5 j = 4
char lettre = B
i++ i vaudra 6
--j j vaudra 3
++i i vaudra 7
lettre++ lettre vaudra C
lettre -- lettre vaudra B
++- 16 M BENJELLOUN 2015 UMONS
Nous consideacuterons un circuit eacutelectrique Quand lrsquointerrupteur lsquoIntrsquo est dans la position de la Fig (X=1) le geacuteneacuterateur de tension lsquoGrsquo allume lrsquoampoule lsquoXrsquo (X=true ou X = 1) Quand lrsquointerrupteur srsquoouvre lsquoXrsquo srsquoeacuteteint (X=false ou X = 0) Afin de simuler le clignotement drsquoune ampoule (X) compleacutetez le code de sorte que lrsquoexeacutecution du programme fournisse les reacutesultats ci-dessous (en rouge)
include ltiostreamgt using namespace std void main() bool x = 1 cout ltlt Test X = ltlt x ltlt endl cout ltlt --------------------------ltlt endl for (int i=0 i lt 6 i++ ) x= 1-x x = x ou x=x2 cout ltlt X = ltlt x ltlt endl
Test X = 1 -------------- X = 0 X = 1 X = 0 X = 1 X = 0 X = 1
9
++- 17 M BENJELLOUN 2015 UMONS
Les structures de controcircle
Alternative if-else
Iteacuterations for while do-while
Rupture de Controcircle break continue return hellip
Choix Multiple switch-case
Bloc 1
drsquoinstructions
Bloc 2
drsquoinstructions
oui non
Suite du programme
oui non
Suite du
programme Bloc
drsquoinstructions
Condition
vraie
oui
non
Bloc
drsquoinstructions
programme
Condition vraie
Suite du programme
programme
Condition
vraie
if-else while
do-while
++- 18 M BENJELLOUN 2015 UMONS
Les deacutecisions - if hellip else
if (Condition vraie)
BLOC 1 DINSTRUCTIONS
else
BLOC 2 DINSTRUCTIONS
Bloc 1
drsquoinstructions
Bloc 2
drsquoinstructions
oui non
Suite du programme
programme
Condition
vraie
if (Condition vraie)
instruction 1
instruction 2
else
instruction 3
instruction 4
Bloc 1
drsquoinstructions
oui non
Suite du programme
Condition
vraie
if (Condition vraie)
instruction 1
instruction 2
instruction 3 hellip
instruction N
if (Condition vraie)
instruction 1
if ( temperature gt 700)
cout ltlt Alarme ltltendl
if (Condition vraie)
instruction A
else
instruction B
if (altb) min=a
else min=b
if (i) if (i = 0)
10
++- 19 M BENJELLOUN 2015 UMONS
if ( ltexpr1gt )
ltbloc1gt
else if (ltexpr2gt)
ltbloc2gt
else if (ltexpr3gt)
ltbloc3gt
else if (ltexprNgt)
ltblocNgt
else ltblocN+1gt
if ( ltexpr1gt )
ltbloc1gt
else if (ltexpr2gt)
ltbloc2gt
else if (ltexpr3gt)
ltbloc3gt
else if (ltexprNgt)
ltblocNgt
else ltblocN+1gt
if emboicircteacutes
else est associeacute avec le if le plus proche
if(i gt= 0)
if(i gt 1000) coutltlt i gt 1000
else coutltlt i lt 0 n
if(i gt= 0)
if(i gt 1000) coutltlt i gt 1000
else coutltlt i lt 0 n
++- 20 M BENJELLOUN 2015 UMONS
for( )
Les iteacuterations ndash for
for( initialisation (Condition vraie) iteacuteration )
liste dinstructions
int i j
float K
for(i = 0 j = 2 k = 75 (i lt 20) ampamp(j==2) i++ k-=02)
int ij
for (i = 0 i lt3 i++)
coutltlt i = ltlt i ltlt endl
cout ltltendlltltendl
for(j = 5 j gt 0 j- -)
coutltlt j = ltlt j ltlt endl
i = 0
i = 1
i = 2
j = 5
j = 4
j = 3
j = 2
j = 1
boucle infinie
11
++- 21 M BENJELLOUN 2015 UMONS
La boucle TANT QUE FAIRE
Boucle preacute-testeacutee
Il sagit de linstruction while
tant que (expression vraie)
faire BLOC DINSTRUCTIONS
Organigramme
while (Condition vraie)
bloc dinstructions
Le test se fait dabord le bloc
dinstructions nest pas forceacutement exeacutecuteacute
Syntaxe
tant que pas jusqursquoagrave ce que
oui non
Suite du
programme
Condition
vraie
Bloc 1
drsquoinstructions
++- 22 M BENJELLOUN 2015 UMONS
i=1
while(ilt5)
coutltltInterieur ltlti ltlt endl
i++
coutltltExterieur ltlti ltlt endl
Exemples
Interieur 1
hellip
hellip
int j = 5
coutltltstartn
while(j == 0)
coutltltj = ltltj--ltltendl
coutltltendn
start
end
i=1
while(ilt5)
coutltltInterieur ltlti ltlt endl
i++
iteacuteration
12
++- 23 M BENJELLOUN 2015 UMONS
do while = REPETER hellip tant que
do
bloc dinstructions
while (Condition vraie) Condition
vraie
oui non
Bloc
drsquoinstructions
programme
int j = 5
do
coutltltj = ltltj--ltltendl
while(j gt 0)
cout ltltstopn
Suite du programme
(garantit lrsquoexeacutecution au moins une fois)
int j = 5
do
coutltltj = ltltj ltltendl
j--
while(j gt 0)
cout ltltstopn
j = 5
j = 4
j = 3
j = 2
j = 1
stop
++- 24 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void main()
for (char lettre = A lettre lt= M lettre++)
coutltltlettre
coutltltendl
for (float pourcent = 00 pourcent lt 05 pourcent += 01)
coutltltpourcentltltendl
for (int i=2 i lt= 3 i++)
cout ltlt Table de ltlt i ltlt ltlt endl
for (int j=0 j lt= 3 j++)
cout ltlt ltlt i ltlt ltlt j ltlt = ltlt ij ltlt endl
ABCDEFGHIJKLM
0
01
02
03
04 Table de 2 2 0 = 0 2 1 = 2 2 2 = 4 2 3 = 6 Table de 3 3 0 = 0 hellip
13
++- 25 M BENJELLOUN 2015 UMONS
include hellip
void main()
bool sortir = false
char rep
coutltltAvant la boucleltltendl
while(sortir)
coutltltDans la boucleltltendl
coutltltVoulez vous quitter (ON)ltltendl
cingtgtrep
if(rep==O)
sortir=true
coutltltApres la boucleltltendl
include hellip
void main()
bool sortir = false
char rep
coutltltAvant la boucleltltendl
do
coutltltDans la boucleltltendl
coutltltVoulez vous quitter (ON)ltltendl
cingtgtrep
if(rep==O)
sortir=true
while(sortir)
coutltltApres la boucleltltendl
++- 26 M BENJELLOUN 2015 UMONS
int i j=1
char a
for (i = -10 i lt= 10 i++)
while(j=0)
cin gtgt a if(a==x)
break
Pour rompre le deacuteroulement seacutequentiel dune suite dinstructions
Instructions deacutechappement
return (expression) permet de sortir de la fonction qui la contient
exit (expression) La fonction est interrompue lsquoexpressionrsquo un entier
indiquant le code de terminaison du processus
for (i = -10 i lt= 10 i++)
if (i == 0)
continue pour eacuteviter la division par zeacutero
cout ltlt 1 i
while (Condition vraie)
continue
break
8
14
++- 27 M BENJELLOUN 2015 UMONS
switch = AU CAS OU FAIRE
hellip
switch(variable de type char ou int) au cas ougrave la variable vaut
case valeur1 variable=valeur1 exeacutecutez ce bloc dinstructions
break
case valeur2 variable=valeur2 exeacutecutez ce bloc dinstructions
break
etc
default aucune des valeurs preacuteceacutedentes exeacutecutez ce bloc
dinstructions pas de break ici
Le bloc default nest pas obligatoire valeur1 valeur2 hellip doivent ecirctre des expressions
constantes Lrsquoinstruction switch correspond agrave une cascade drsquoinstructions if else
++- 28 M BENJELLOUN 2015 UMONS
hellip
void main( )
const float PI= 314159 float rayon = 35 float diametre circonference surface int choix
cout ltlt 1 Calculer la circonferencen cout ltlt 2 Calculer la surfacen cout ltlt 3 Calculer le diametren cout ltlt Votre choix cin gtgt choix
switch (choix) case 1 circonference = 2PIrayon break case 2 surface = PIrayonrayon break case 3 diametre = 2rayon break default cout ltlt Mauvais choixhellipn
char choix
switch(choix)
case 1 hellip
switch(i)
case 2 j
float f
switch(f)
case 2
switch instruction commode pour les menus
15
++- 29 M BENJELLOUN 2015 UMONS
Tableaux et Strings
Un tableau est une collection de variables de mecircme type appeleacutees eacuteleacutements
Type Nom_Tableau[dim]
int tab[4] deacuteclare un tableau de 4 valeurs entiegraveres tab[0] tab[1] tab[2] tab[3]
const int SIZE = 5
int A[SIZE] A est un vecteur de 5 entiers
float B[5]
int A[SIZE] = 10 20 30 40 50
int premier[] = 1 2 3 5 7 11 13
char Tab_Char[4] = A C F G
int Tab[50] = 0
int i = 10
int a[i]
int primes[]
Deacuteclaration
Initialisation
Interdiction
Constante
++- 30 M BENJELLOUN 2015 UMONS
Accegraves aux eacuteleacutements drsquoun tableau
Les eacuteleacutements sont numeacuteroteacutes de 0 agrave dim-1
Il nrsquoy a pas de veacuterification des bornes
void main()
int a[6]
int i = 7
a[0] = 9
a[5] = -10
a[i2] = 2
a[6] = 0
a[-1] = 5
0
a
1
2
3
4
5
9
2
-10
void main(void)
const int dim=6
int i
int A[dim] = 1 2 3 4 5 6
for (i=0iltdimi++)
A[i] = 2i
coutltltA[ltltiltlt]=ltltA[i]
A[0]=0 A[1]=2 A[2]=4 A[3]=6 A[4]=8 A[5]=10
16
++- 31 M BENJELLOUN 2015 UMONS
Chaicircnes de caractegraveres ou String
char Nom[dim] Initialisation
Pour terminer la chaicircne on place en fin de chaicircne le caractegravere nul 0 de code ASCII 0
Ce caractegravere est soit ajouteacute automatiquement par le compilateur soit introduit par le programmeur selon les fonctions utiliseacutees
char S[] = Hello0 H
e
l
l
o
0
S[0] S[1] S[2] S[3] S[4] S[5] char S[6] = Hello
char S[5] = Hello H e l l o
char S[] = Le main L e m a i n 0
bull Un tableau de char agrave une dimension char Nom[dim]
bull Un type speacutecial string string Nom Il faut inclure ltstringgt
++- 32 M BENJELLOUN 2015 UMONS
string Nom Il faut inclure ltstringgt
string Nom est eacutequivalente agrave string Nom = Donc par deacutefaut la chaicircne est vide
Il existe de nombreuses faccedilons drsquoinitialiser Ident par exemple
string s1 = Bonjour a vous
string s2 = s1 s2 contient Bonjour a vous
string s3(4 x) eacutequivaut agrave string s3 = xxxx
string s4(s1 4 8) s4 contient our a voldquo S1 de 4 + 8
B o n j o u r a v o u s 0 1 2 3 4 5 6 7 8 9 10 11 12 13
include ltstringgt hellip string ST = Salut char H[6] = Hello for (int i=0 ilt5 i++) cout ltlt ST[i] ltlt affichera S a l u t
for (int i=0 ilt5 i++) cout ltlt H[i] ltlt affichera H e l l o
17
++- 33 M BENJELLOUN 2015 UMONS
Pourquoi utiliser string Nom plutocirct que char Nom[dim]
char S1[6] = Salut S2[6] = Hello S3[12]
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Interdit
string S1 = Salut S2 = Hello S3
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Autoriseacute
S1= Hello
S1= Hooo
S3= HoooHello
false
++- 34 M BENJELLOUN 2015 UMONS
include ltiostreamgt
include ltstringgt traitement de string
using namespace std espace de nommage std pour importer les
symboles de la bibliothegraveque standard C++
void main(void)
string nom1 nom2 nom3
int len size
cout ltlt Donnez Nom1 cin gtgt nom1
cout ltlt Donnez Nom2 cin gtgt nom2
len = nom1length() nombre de caractegraveres dans nom1
size = nom2size() nombre de caractegraveres dans nom2
cout ltlt Nom1 ltltnom1 ltlt Dim Nom1 = ltlt len ltlt endl
cout ltlt Nom2 ltltnom2 ltlt Dim Nom2 = ltlt size ltlt endl
nom3 = nom2+ +nom1
cout ltlt Nom3 = ltlt nom3 ltlt endl
if(nom1gtnom2) cout ltlt nom1 gt nom2 ltlt endl
else if (nom1==nom2) cout ltlt nom1 = nom2 ltlt endl
else cout ltlt nom1 lt nom2 ltlt endl
nom1=nom2
cout ltlt nom1 = ltlt nom1 ltlt nom2 ltlt nom2 ltlt endl
Donnez Nom1 salut
Donnez Nom2 hello
Nom1 salut Dim Nom1 = 5
Nom2 hello Dim Nom2 = 5
Nom3 = hello salut
nom1 gt nom2
nom1 = hello nom2 hello
Donnez Nom1 csou
Donnez Nom2 pi
Nom1csou Dim Nom1 = 4
Nom2pi Dim Nom2 = 2
Nom3 = pi csou
nom1 lt nom2
nom1 = pi nom2 pi
18
++- 35 M BENJELLOUN 2015 UMONS
Algorithmes de tri
Nom de lrsquoalgorithme Complexiteacute
Tri agrave bulles Tri par seacutelection Tri par insertion Tri de Shell (shell sort) Ameacutelioration du tri par insertion Tri fusion (merge sort) Tri rapide (quick sort) Tri par tas (heap sort)
O(N2) O(N2) O(N2)
O(N log2 N)
O(N log N) O(N log N) O(N log N)
++- 36 M BENJELLOUN 2015 UMONS
Tri agrave bulles bubble sort
reacutepeacuteter permutation = FALSE commencer au deacutebut du drapeau Pour i variant de 0 agrave N ndash 2 faire si cellule [i] gt cellule [i+1] alors deacutebut permuter cellules permutation = TRUE fin jusquagrave ce que (not permutation)
Complexiteacute O(Nsup2) Proportionnel agrave Nsup2 permutations
void TriaBulles(int x[] int N) int i perm=1 tmp while (perm==1) perm =0 for (i=0iltN-1i++) if(x[i] gt x[i+1]) tmp = x[i] x[i] = x[i+1] x[i+1] = tmp perm = 1
Algorithmes de tri
19
++- 37 M BENJELLOUN 2015 UMONS
void tri_par_selection(int t[] int n) int i j min tmp for (i = 0 i lt n - 1 i++) min = i for(j = i+1 j lt n j++) if(t[j] lt t[min]) min = j if(min = i) tmp = t[i] t[i] = t[min] t[min] = tmp
Le tri par seacutelection consiste en la recherche du plus grand eacuteleacutement (le plus petit) que lon va replacer en derniegravere position (en premiegravere) puis on recherche le second plus grand eacuteleacutement (le second plus petit) que lon va replacer eacutegalement agrave sa position finale et ainsi de suite
Algorithmes de tri
++- 38 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement dans un tableau
Recherche lineacuteaire Recherche dichotomique (binary search)
0
9
1
3
2
6
3
2
4
1
5
12
6
0
Est une meacutethode efficace pour retrouver un eacuteleacutement dans un tableau trieacute
A chaque eacutetape de la recherche dichotomique lrsquointervalle de recherche est diviseacute par deux
On utilise degraves lors deux index de recherche la borne infeacuterieure et la borne supeacuterieure
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup mid
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup
On initialise les bornes inf et sup agrave la premiegravere et derniegravere valeur des index du tableau tab
respectivement
Le milieu est donneacute par
mid = (inf+sup) 2 (0+6)2 =3
Supposons que lrsquoon recherche la valeur i=6 On
compare cette valeur avec tab[mid]=8 Comme
tab[mid]gti on change mid en sup
mid = (inf+sup) 2 (0+3)2 =1
inf=1 et sup=3
hellip
20
++- 39 M BENJELLOUN 2015 UMONS
44 Eacutecrire un programme qui supprime le premier et le dernier eacuteleacutement drsquoun vecteur
vecteur initial Tab 0 1 2 3 4 5 6
sup bords 1 2 3 4 5
sup bords 2 3 4
45 Eacutecrire un programme qui supprime le milieu du tableau et ajoute son double au deacutebut
vecteur initial Tab 1 2 3 4 5
sup Aj 6 1 2 4 5
sup Aj 4 6 1 4 5
46 Codez un programme de tri agrave bulles dun vecteur de strings
47 Codez un programme de recherche dichotomique dun nombre dans un vecteur de
strings rangeacutes par ordre croissant
++- 40 M BENJELLOUN 2015 UMONS
Matrices Rangeacutees ligne par ligne
Consideacutereacutees comme des vecteurs de lignes
Accegraves aux composantes par double crochets
int a[10][5]
a[1][0] = 7
int x[2][2] = 123 4 2 lignes et 2 colonnes
1 2
3 4 include hellip
void main()
int i j tab[5][4]
for (i = 0 i lt5 i++) Saisie
for (j = 0 j lt 4 j++) tab[i][j] = i
for (i = 0 i lt5 i++) Affichage
for (j = 0 j lt 4 j++) coutltlt tab[i][j] ltlt
cout ltlt endl
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
21
++- 41 M BENJELLOUN 2015 UMONS
Affichage de la table de multiplication
++- 42 M BENJELLOUN 2015 UMONS
Fonctions en C++
Encapsule un traitement particulier formant un tout
Peut impleacutementer la notion de module en logique
Augmente la lisibiliteacute drsquoun programme
Reacutealise un objectif preacutecis
Ameacuteliore le deacutebogage et la maintenance drsquoun programme
Son utilisation se deacutecompose en trois phases
Deacutefinition de la fonction
Deacuteclaration de la fonction
Appel de la fonction
Deacuteclarer une fonction
Appeler une fonction
Regravegles de visibiliteacute des variables
Passage des paramegravetres par valeur
Fonction renvoyant une valeur au programme
Passage des paramegravetres par valeur et par adresse
Passage des tableaux aux fonctions
22
++- 43 M BENJELLOUN 2015 UMONS
Type nom_fonction(liste_param_typeacutes)
deacuteclaration de variables locales
hellip Corps de la fonction
hellip
return (valeur)
Deacutefinition drsquoune fonction
Une fonction renvoie une valeur ou rien
liste_param_typeacutes = 0 void ou plusieurs
int Somme(int x int y)
int S Variable locale agrave Somme
S= x+y
return S
void fonction1()
coutltltn fonction1 n
void fonction2() coutltltn fonction2 n
Limbrication de fonctions
nest pas autoriseacutee
Deacutefinition
++- 44 M BENJELLOUN 2015 UMONS
Fonctions pourquoi
include ltiostreamgt
using namespace std
void main()
int i j SomCar1=0 SomCar2=0 SomCar3=0
for (i = 0 i lt5 i++)
SomCar1 = SomCar1 + ii
for (i = 0 i lt10 i++)
SomCar2 = SomCar2 + ii
for (j = 0 j lt 7 j++)
SomCar3 = SomCar3 + jj
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
include ltiostreamgt
using namespace std
int Fnct_SomCar(int N)
int i S=0
for (i = 0 i ltN i++)
S = S + ii S+=ii
return S
void main()
int SomCar1 SomCar2 SomCar3
SomCar1 = Fnct_SomCar(5)
SomCar2 = Fnct_SomCar(10)
SomCar3 = Fnct_SomCar(7)
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
23
++- 45 M BENJELLOUN 2015 UMONS
hellip
int Somme(int x int y)
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
int Somme(int x int y)
int S
S= x+y
return S
hellip
int Somme(int x int y)
int S
S= x+y
return S
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
Deacuteclaration et appel drsquoune fonction
++- 46 M BENJELLOUN 2015 UMONS
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
int addition() float tmp tmp = calcule(253) + calcule(572) return (int)tmp float calcule(float C float D) return ( (C + D ) 2)
float calcule(float float)
int addition()
float calcule(float A float B) return ( (A + B ) 2)
int addition() Appel drsquoune fonction dans une fonction
float tmp tmp = calcule(253) + calcule(572) return (int)tmp
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
Deacuteclaration et appel drsquoune fonction
24
++- 47 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void Addition(int v float f)
void main()
int v = 5
float f= 45
Addition(v f) Appel de la fonction
cout ltlt n Main v et f ltlt v ltlt et ltltf
void Addition(int v float f)
cout ltlt Addition v + f = ltlt v+f ltlt endl
f = f + v
cout ltlt Addition f = ltlt f
Addition v+f = 95
Addition f = 95
Main v et f = 5 et 45
v= 5 et f=45
5+ 45
f = 95
Les paramegravetres sont copieacutes La fonction travaille sur des copies de v et de f
++- 48 M BENJELLOUN 2015 UMONS
Fonction Renvoyant une valeur au programme
include ltiostreamgt
using namespace std
int change(int X)
void main(void)
int var = 5
int valeur
valeur = return_Val (var)
cout ltltmain var = ltlt var ltlt endl
cout ltltmain valeur = ltlt valeur
int return_Val (int v)
v = 100
cout ltlt return_Val v = ltlt v ltlt endl
return (v+1)
return_Val v = 100 main var = 5 main valeur = 101
Une fonction se termine et lsquorend la mainrsquo agrave
la fonction appelante lorsque son exeacutecution
rencontre lrsquoinstruction return expression
ou return
25
++- 49 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5 valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5
int valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
cout ltlt return_Val v = ltlt vltltendl
Qursquoaffiche ce programme agrave lrsquoeacutecran Qursquoaffiche ce programme agrave lrsquoeacutecran
++- 50 M BENJELLOUN 2015 UMONS
Fonctions et reacutecursiviteacute
Tours de Hanoiuml Suite de Fibonacci
un = un-1 + un-2
u0=u1=1
Puissance entiegravere
Une fonction est dite reacutecursive lorsqursquoelle srsquoappelle elle-mecircme
int factorielle (int n )
if ( n lt 0) return (ndash1) code derreur
else if ( n == 0 ) return 1 0 = 1
else
return n factorielle( n-1 ) n = n(n-1)
a x an-1 si n gt 0
1 si n = 0
an-1 =
26
++- 51 M BENJELLOUN 2015 UMONS
Passer des tableaux aux fonctions
Les tableaux peuvent ecirctre passeacutes comme paramegravetres dune fonction
Ils ne peuvent pas ecirctre retourneacutes comme reacutesultat dune fonction
La longueur du tableau ne doit pas ecirctre deacutefinie agrave la deacuteclaration de la fonction
Un tableau peut ecirctre modifieacute dans une fonction Il est passeacute par reacutefeacuterence (adresse) et
non par valeur
include hellip
void Modif(int a[])
a[0] = 5
a[1] = 6
void main(void)
int p[2] = 1 2
cout ltlt p[0] ltlt ltlt p[1]
Modif(p)
cout ltlt p[0] ltlt ltlt p[1]
1 2
5 6
include hellip
void Modif(int x[] int n)
void main(void)
int i
int p[6] = 1 2 3 5 7 11
Modif(p 6)
for (i=0ilt6i++)
coutltlt p[i]
void Modif(int a[] int n)
int i
for(i = 0 i ltn i++)
a[i] = 5
++- 52 M BENJELLOUN 2015 UMONS
void Saisie_Mat( int tab[][4] int m int n)
int i j
for (i = 0 i ltm i++)
for (j = 0 j lt n j++)
tab[i][j] = i
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
Matrice Exemple
void Affiche_Mat( int tab[][4] int m int n)
for (int i = 0 i ltm i++)
for (int j = 0 j lt n j++)
cout ltlt tab[i][j] ltlt
cout ltlt endl
include ltiostreamgt
using namespace std
void main()
int T[5][5]
Saisie_Mat( T 4 4 )
Affiche_Mat( T 4 4 )
27
++- 53 M BENJELLOUN 2015 UMONS
include hellip
int LaSomme( )
int A[Nmax] N int S = 0
for (int i=0ilt N i++)
cout ltltEntrez A[ltltiltlt]=
cin gtgtA[i]
S= S+ A[i]
return S
void main()
const int Nmax = 7
int i A[Nmax] S=0 N=3
S = LaSomme( )
cout ltlt Affichage ltlt endl
Affichage(A N)
cout ltlt n La somme est = ltlt S
Qursquoaffiche ce programme agrave lrsquoeacutecran
void Affichage( int A[] int N)
for (int i=0i lt N i++)
cout ltlt A[ltltiltlt]=
ltltA[i] ltltendl
++- 54 M BENJELLOUN 2015 UMONS
include hellip
void Saisie_T( int tab[] )
int N i
N= 3
for (i = 0 i ltN i++) tab[i] = i
void Affiche_T(int tab[] int N )
int i
for (i = 0 i ltN i++) cout ltlt tab[i]
void main()
int T[20] n
Saisie_T( T )
Affiche_T(T n )
tab[0] = 0
tab[1] = 1
tab[2] = 2
Qursquoaffiche ce programme agrave lrsquoeacutecran
28
++- 55 M BENJELLOUN 2015 UMONS
include hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 = 7
return hellip
Comment retourner v1 et v2
++- 56 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltlt a = ltlt a ltlt endl ltlt b = ltlt b
void echange(int xint y)
int tmp
tmp = x
x = y
y =tmp
void main()
int a = 1 b = 5
cout ltlt Avant ltltendl
affiche(ab)
echange(ab)
cout ltlt nApregraves ltltendl
affiche(ab)
Avant
a = 1
b = 5
Apregraves
PASSAGE DES PARAMETRES
Transmission des arguments
Comment eacutechanger a et b
a = 1
b = 5
PAR VALEUR
29
++- 57 M BENJELLOUN 2015 UMONS
Le pointeur prend comme
valeurs des adresses de
donneacutees en meacutemoire
Types de base hellip donneacutee
8
donneacutee
35 hellip
Adr i Adr j
Meacutemoire
12FF80 12FF84
Ladresse de leacuteleacutement i est ampi i=8 et ampi= 12FF80
int i=8 j=35
Et les pointeurs
hellip p=12FF84 hellip 35 hellip
12FF84 12FF80
int p p est le contenu pointeacute par p 35
p est lrsquoadresse 12FF84
++- 58 M BENJELLOUN 2015 UMONS
Deacuteclaration de Pointeurs Le symbole est utiliseacute entre le type et le nom du pointeur
Deacuteclaration drsquoun entier int i int p Deacuteclaration drsquoun pointeur vers un entier
Exemples de deacuteclarations de pointeurs
int pi pi est un pointeur vers un int pi deacutesigne le contenu de ladresse
float pf pf est un pointeur vers un float
char c d pc c et d sont des char pc est un pointeur vers un char
int C = 4
int p
p = ampC p reccediloit ladresse de c donc pointe sur c
cout ltlt p = ltltpltltendl
cout ltlt p = ltltp ltltendl
cout ltlt (ampC) ltlt(ampC)
p = 4
p = 0x12FF7C
(ampC) = 4
Ladresse de C est ampC
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
6
++- 11 M BENJELLOUN 2015 UMONS
Un identificateur ne peut pas ecirctre un mot reacuteserveacute du langage
Les mots reacuteserveacutes du langage C++
doivent ecirctre eacutecrits en minuscules
++- 12 M BENJELLOUN 2015 UMONS
Variables deacuteclarations
Syntaxe Type identificateur1 id2hellip
char c1 c2 c3
int i j var_ent
float f variable
Exemple
initialisations
int i=9 ou int i
i=9
char c1= A ou char c1
c1= A
Constantes deacuteclarations + initialisations
Syntaxe const Type identificateur1=Val1 identificateur2=Val2 helliphellip
const char c = A
const int i=5 var_ent=8
Exemple const int i
i= 5
Lrsquoinitialisation des constantes est obligatoire lors de leur deacuteclaration
7
++- 13 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std int Somme(int x int y)
void main(void)
int Som
Som = Somme(79) appel de la fonction
if ( Som gt 10 )
cout ltlt Som gt 10 ltlt Somltlt endl
else
cout ltlt Som lt= 10 ltlt Som
int Somme(int x int y) Deacutefinition de
la fonction
int S
S= x+y
return S
Directives du preacuteprocesseur accegraves avant la compilation
Programme
principal
Deacuteclarations
Traitements Donneacutees Structures de controcircle Commentaires
Structure dun programme C++ exemple
++- 14 M BENJELLOUN 2015 UMONS
Les opeacuterateurs arithmeacutetiques
Le C++ propose les opeacuterateurs suivants
+ addition - soustraction multiplication division modulo (reste de la division entiegravere )
ne peut ecirctre utiliseacute quavec des entiers
72 702 720 7020
3
35
hellip void main() int i = 6 j = 4 k float f = 60 g = 40 h k = i j k= 64 = 1 h = f g h = 6040 = 15 h = i j h = 64 = 1000
Modulo C=AB C 42 = 0 52 = 1 83= 2 C=A2 Si C=0 alors A est pair sinon (=1) A est impair
8
++- 15 M BENJELLOUN 2015 UMONS
Comparaisons lt plus petit
lt= plus petit ou eacutegal
gt plus grand
gt= plus grand ou eacutegal
== eacutegal
= diffeacuterent
Les opeacuterateurs logiques
ampamp et
|| ou (non exclusif)
non
Contractions dopeacuterateurs
+= -= = = =
amp= |= ^= ltlt= gtgt=
a += 15
a = a + 15
i = j + 5
i = i (j + 5)
Le reacutesultat dune expression logique est un
booleacuteen Il vaut true si elle est vraie et false sinon
Reacuteciproquement toute valeur non nulle est consideacutereacutee
comme vraie et la valeur nulle comme fausse
Increacutement et deacutecreacutement
Pour
++ increacutement i++ ou ++i
est eacutequivalent agrave i += 1 ou i = i + 1
- - deacutecreacutement
int i = 5 j = 4
char lettre = B
i++ i vaudra 6
--j j vaudra 3
++i i vaudra 7
lettre++ lettre vaudra C
lettre -- lettre vaudra B
++- 16 M BENJELLOUN 2015 UMONS
Nous consideacuterons un circuit eacutelectrique Quand lrsquointerrupteur lsquoIntrsquo est dans la position de la Fig (X=1) le geacuteneacuterateur de tension lsquoGrsquo allume lrsquoampoule lsquoXrsquo (X=true ou X = 1) Quand lrsquointerrupteur srsquoouvre lsquoXrsquo srsquoeacuteteint (X=false ou X = 0) Afin de simuler le clignotement drsquoune ampoule (X) compleacutetez le code de sorte que lrsquoexeacutecution du programme fournisse les reacutesultats ci-dessous (en rouge)
include ltiostreamgt using namespace std void main() bool x = 1 cout ltlt Test X = ltlt x ltlt endl cout ltlt --------------------------ltlt endl for (int i=0 i lt 6 i++ ) x= 1-x x = x ou x=x2 cout ltlt X = ltlt x ltlt endl
Test X = 1 -------------- X = 0 X = 1 X = 0 X = 1 X = 0 X = 1
9
++- 17 M BENJELLOUN 2015 UMONS
Les structures de controcircle
Alternative if-else
Iteacuterations for while do-while
Rupture de Controcircle break continue return hellip
Choix Multiple switch-case
Bloc 1
drsquoinstructions
Bloc 2
drsquoinstructions
oui non
Suite du programme
oui non
Suite du
programme Bloc
drsquoinstructions
Condition
vraie
oui
non
Bloc
drsquoinstructions
programme
Condition vraie
Suite du programme
programme
Condition
vraie
if-else while
do-while
++- 18 M BENJELLOUN 2015 UMONS
Les deacutecisions - if hellip else
if (Condition vraie)
BLOC 1 DINSTRUCTIONS
else
BLOC 2 DINSTRUCTIONS
Bloc 1
drsquoinstructions
Bloc 2
drsquoinstructions
oui non
Suite du programme
programme
Condition
vraie
if (Condition vraie)
instruction 1
instruction 2
else
instruction 3
instruction 4
Bloc 1
drsquoinstructions
oui non
Suite du programme
Condition
vraie
if (Condition vraie)
instruction 1
instruction 2
instruction 3 hellip
instruction N
if (Condition vraie)
instruction 1
if ( temperature gt 700)
cout ltlt Alarme ltltendl
if (Condition vraie)
instruction A
else
instruction B
if (altb) min=a
else min=b
if (i) if (i = 0)
10
++- 19 M BENJELLOUN 2015 UMONS
if ( ltexpr1gt )
ltbloc1gt
else if (ltexpr2gt)
ltbloc2gt
else if (ltexpr3gt)
ltbloc3gt
else if (ltexprNgt)
ltblocNgt
else ltblocN+1gt
if ( ltexpr1gt )
ltbloc1gt
else if (ltexpr2gt)
ltbloc2gt
else if (ltexpr3gt)
ltbloc3gt
else if (ltexprNgt)
ltblocNgt
else ltblocN+1gt
if emboicircteacutes
else est associeacute avec le if le plus proche
if(i gt= 0)
if(i gt 1000) coutltlt i gt 1000
else coutltlt i lt 0 n
if(i gt= 0)
if(i gt 1000) coutltlt i gt 1000
else coutltlt i lt 0 n
++- 20 M BENJELLOUN 2015 UMONS
for( )
Les iteacuterations ndash for
for( initialisation (Condition vraie) iteacuteration )
liste dinstructions
int i j
float K
for(i = 0 j = 2 k = 75 (i lt 20) ampamp(j==2) i++ k-=02)
int ij
for (i = 0 i lt3 i++)
coutltlt i = ltlt i ltlt endl
cout ltltendlltltendl
for(j = 5 j gt 0 j- -)
coutltlt j = ltlt j ltlt endl
i = 0
i = 1
i = 2
j = 5
j = 4
j = 3
j = 2
j = 1
boucle infinie
11
++- 21 M BENJELLOUN 2015 UMONS
La boucle TANT QUE FAIRE
Boucle preacute-testeacutee
Il sagit de linstruction while
tant que (expression vraie)
faire BLOC DINSTRUCTIONS
Organigramme
while (Condition vraie)
bloc dinstructions
Le test se fait dabord le bloc
dinstructions nest pas forceacutement exeacutecuteacute
Syntaxe
tant que pas jusqursquoagrave ce que
oui non
Suite du
programme
Condition
vraie
Bloc 1
drsquoinstructions
++- 22 M BENJELLOUN 2015 UMONS
i=1
while(ilt5)
coutltltInterieur ltlti ltlt endl
i++
coutltltExterieur ltlti ltlt endl
Exemples
Interieur 1
hellip
hellip
int j = 5
coutltltstartn
while(j == 0)
coutltltj = ltltj--ltltendl
coutltltendn
start
end
i=1
while(ilt5)
coutltltInterieur ltlti ltlt endl
i++
iteacuteration
12
++- 23 M BENJELLOUN 2015 UMONS
do while = REPETER hellip tant que
do
bloc dinstructions
while (Condition vraie) Condition
vraie
oui non
Bloc
drsquoinstructions
programme
int j = 5
do
coutltltj = ltltj--ltltendl
while(j gt 0)
cout ltltstopn
Suite du programme
(garantit lrsquoexeacutecution au moins une fois)
int j = 5
do
coutltltj = ltltj ltltendl
j--
while(j gt 0)
cout ltltstopn
j = 5
j = 4
j = 3
j = 2
j = 1
stop
++- 24 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void main()
for (char lettre = A lettre lt= M lettre++)
coutltltlettre
coutltltendl
for (float pourcent = 00 pourcent lt 05 pourcent += 01)
coutltltpourcentltltendl
for (int i=2 i lt= 3 i++)
cout ltlt Table de ltlt i ltlt ltlt endl
for (int j=0 j lt= 3 j++)
cout ltlt ltlt i ltlt ltlt j ltlt = ltlt ij ltlt endl
ABCDEFGHIJKLM
0
01
02
03
04 Table de 2 2 0 = 0 2 1 = 2 2 2 = 4 2 3 = 6 Table de 3 3 0 = 0 hellip
13
++- 25 M BENJELLOUN 2015 UMONS
include hellip
void main()
bool sortir = false
char rep
coutltltAvant la boucleltltendl
while(sortir)
coutltltDans la boucleltltendl
coutltltVoulez vous quitter (ON)ltltendl
cingtgtrep
if(rep==O)
sortir=true
coutltltApres la boucleltltendl
include hellip
void main()
bool sortir = false
char rep
coutltltAvant la boucleltltendl
do
coutltltDans la boucleltltendl
coutltltVoulez vous quitter (ON)ltltendl
cingtgtrep
if(rep==O)
sortir=true
while(sortir)
coutltltApres la boucleltltendl
++- 26 M BENJELLOUN 2015 UMONS
int i j=1
char a
for (i = -10 i lt= 10 i++)
while(j=0)
cin gtgt a if(a==x)
break
Pour rompre le deacuteroulement seacutequentiel dune suite dinstructions
Instructions deacutechappement
return (expression) permet de sortir de la fonction qui la contient
exit (expression) La fonction est interrompue lsquoexpressionrsquo un entier
indiquant le code de terminaison du processus
for (i = -10 i lt= 10 i++)
if (i == 0)
continue pour eacuteviter la division par zeacutero
cout ltlt 1 i
while (Condition vraie)
continue
break
8
14
++- 27 M BENJELLOUN 2015 UMONS
switch = AU CAS OU FAIRE
hellip
switch(variable de type char ou int) au cas ougrave la variable vaut
case valeur1 variable=valeur1 exeacutecutez ce bloc dinstructions
break
case valeur2 variable=valeur2 exeacutecutez ce bloc dinstructions
break
etc
default aucune des valeurs preacuteceacutedentes exeacutecutez ce bloc
dinstructions pas de break ici
Le bloc default nest pas obligatoire valeur1 valeur2 hellip doivent ecirctre des expressions
constantes Lrsquoinstruction switch correspond agrave une cascade drsquoinstructions if else
++- 28 M BENJELLOUN 2015 UMONS
hellip
void main( )
const float PI= 314159 float rayon = 35 float diametre circonference surface int choix
cout ltlt 1 Calculer la circonferencen cout ltlt 2 Calculer la surfacen cout ltlt 3 Calculer le diametren cout ltlt Votre choix cin gtgt choix
switch (choix) case 1 circonference = 2PIrayon break case 2 surface = PIrayonrayon break case 3 diametre = 2rayon break default cout ltlt Mauvais choixhellipn
char choix
switch(choix)
case 1 hellip
switch(i)
case 2 j
float f
switch(f)
case 2
switch instruction commode pour les menus
15
++- 29 M BENJELLOUN 2015 UMONS
Tableaux et Strings
Un tableau est une collection de variables de mecircme type appeleacutees eacuteleacutements
Type Nom_Tableau[dim]
int tab[4] deacuteclare un tableau de 4 valeurs entiegraveres tab[0] tab[1] tab[2] tab[3]
const int SIZE = 5
int A[SIZE] A est un vecteur de 5 entiers
float B[5]
int A[SIZE] = 10 20 30 40 50
int premier[] = 1 2 3 5 7 11 13
char Tab_Char[4] = A C F G
int Tab[50] = 0
int i = 10
int a[i]
int primes[]
Deacuteclaration
Initialisation
Interdiction
Constante
++- 30 M BENJELLOUN 2015 UMONS
Accegraves aux eacuteleacutements drsquoun tableau
Les eacuteleacutements sont numeacuteroteacutes de 0 agrave dim-1
Il nrsquoy a pas de veacuterification des bornes
void main()
int a[6]
int i = 7
a[0] = 9
a[5] = -10
a[i2] = 2
a[6] = 0
a[-1] = 5
0
a
1
2
3
4
5
9
2
-10
void main(void)
const int dim=6
int i
int A[dim] = 1 2 3 4 5 6
for (i=0iltdimi++)
A[i] = 2i
coutltltA[ltltiltlt]=ltltA[i]
A[0]=0 A[1]=2 A[2]=4 A[3]=6 A[4]=8 A[5]=10
16
++- 31 M BENJELLOUN 2015 UMONS
Chaicircnes de caractegraveres ou String
char Nom[dim] Initialisation
Pour terminer la chaicircne on place en fin de chaicircne le caractegravere nul 0 de code ASCII 0
Ce caractegravere est soit ajouteacute automatiquement par le compilateur soit introduit par le programmeur selon les fonctions utiliseacutees
char S[] = Hello0 H
e
l
l
o
0
S[0] S[1] S[2] S[3] S[4] S[5] char S[6] = Hello
char S[5] = Hello H e l l o
char S[] = Le main L e m a i n 0
bull Un tableau de char agrave une dimension char Nom[dim]
bull Un type speacutecial string string Nom Il faut inclure ltstringgt
++- 32 M BENJELLOUN 2015 UMONS
string Nom Il faut inclure ltstringgt
string Nom est eacutequivalente agrave string Nom = Donc par deacutefaut la chaicircne est vide
Il existe de nombreuses faccedilons drsquoinitialiser Ident par exemple
string s1 = Bonjour a vous
string s2 = s1 s2 contient Bonjour a vous
string s3(4 x) eacutequivaut agrave string s3 = xxxx
string s4(s1 4 8) s4 contient our a voldquo S1 de 4 + 8
B o n j o u r a v o u s 0 1 2 3 4 5 6 7 8 9 10 11 12 13
include ltstringgt hellip string ST = Salut char H[6] = Hello for (int i=0 ilt5 i++) cout ltlt ST[i] ltlt affichera S a l u t
for (int i=0 ilt5 i++) cout ltlt H[i] ltlt affichera H e l l o
17
++- 33 M BENJELLOUN 2015 UMONS
Pourquoi utiliser string Nom plutocirct que char Nom[dim]
char S1[6] = Salut S2[6] = Hello S3[12]
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Interdit
string S1 = Salut S2 = Hello S3
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Autoriseacute
S1= Hello
S1= Hooo
S3= HoooHello
false
++- 34 M BENJELLOUN 2015 UMONS
include ltiostreamgt
include ltstringgt traitement de string
using namespace std espace de nommage std pour importer les
symboles de la bibliothegraveque standard C++
void main(void)
string nom1 nom2 nom3
int len size
cout ltlt Donnez Nom1 cin gtgt nom1
cout ltlt Donnez Nom2 cin gtgt nom2
len = nom1length() nombre de caractegraveres dans nom1
size = nom2size() nombre de caractegraveres dans nom2
cout ltlt Nom1 ltltnom1 ltlt Dim Nom1 = ltlt len ltlt endl
cout ltlt Nom2 ltltnom2 ltlt Dim Nom2 = ltlt size ltlt endl
nom3 = nom2+ +nom1
cout ltlt Nom3 = ltlt nom3 ltlt endl
if(nom1gtnom2) cout ltlt nom1 gt nom2 ltlt endl
else if (nom1==nom2) cout ltlt nom1 = nom2 ltlt endl
else cout ltlt nom1 lt nom2 ltlt endl
nom1=nom2
cout ltlt nom1 = ltlt nom1 ltlt nom2 ltlt nom2 ltlt endl
Donnez Nom1 salut
Donnez Nom2 hello
Nom1 salut Dim Nom1 = 5
Nom2 hello Dim Nom2 = 5
Nom3 = hello salut
nom1 gt nom2
nom1 = hello nom2 hello
Donnez Nom1 csou
Donnez Nom2 pi
Nom1csou Dim Nom1 = 4
Nom2pi Dim Nom2 = 2
Nom3 = pi csou
nom1 lt nom2
nom1 = pi nom2 pi
18
++- 35 M BENJELLOUN 2015 UMONS
Algorithmes de tri
Nom de lrsquoalgorithme Complexiteacute
Tri agrave bulles Tri par seacutelection Tri par insertion Tri de Shell (shell sort) Ameacutelioration du tri par insertion Tri fusion (merge sort) Tri rapide (quick sort) Tri par tas (heap sort)
O(N2) O(N2) O(N2)
O(N log2 N)
O(N log N) O(N log N) O(N log N)
++- 36 M BENJELLOUN 2015 UMONS
Tri agrave bulles bubble sort
reacutepeacuteter permutation = FALSE commencer au deacutebut du drapeau Pour i variant de 0 agrave N ndash 2 faire si cellule [i] gt cellule [i+1] alors deacutebut permuter cellules permutation = TRUE fin jusquagrave ce que (not permutation)
Complexiteacute O(Nsup2) Proportionnel agrave Nsup2 permutations
void TriaBulles(int x[] int N) int i perm=1 tmp while (perm==1) perm =0 for (i=0iltN-1i++) if(x[i] gt x[i+1]) tmp = x[i] x[i] = x[i+1] x[i+1] = tmp perm = 1
Algorithmes de tri
19
++- 37 M BENJELLOUN 2015 UMONS
void tri_par_selection(int t[] int n) int i j min tmp for (i = 0 i lt n - 1 i++) min = i for(j = i+1 j lt n j++) if(t[j] lt t[min]) min = j if(min = i) tmp = t[i] t[i] = t[min] t[min] = tmp
Le tri par seacutelection consiste en la recherche du plus grand eacuteleacutement (le plus petit) que lon va replacer en derniegravere position (en premiegravere) puis on recherche le second plus grand eacuteleacutement (le second plus petit) que lon va replacer eacutegalement agrave sa position finale et ainsi de suite
Algorithmes de tri
++- 38 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement dans un tableau
Recherche lineacuteaire Recherche dichotomique (binary search)
0
9
1
3
2
6
3
2
4
1
5
12
6
0
Est une meacutethode efficace pour retrouver un eacuteleacutement dans un tableau trieacute
A chaque eacutetape de la recherche dichotomique lrsquointervalle de recherche est diviseacute par deux
On utilise degraves lors deux index de recherche la borne infeacuterieure et la borne supeacuterieure
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup mid
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup
On initialise les bornes inf et sup agrave la premiegravere et derniegravere valeur des index du tableau tab
respectivement
Le milieu est donneacute par
mid = (inf+sup) 2 (0+6)2 =3
Supposons que lrsquoon recherche la valeur i=6 On
compare cette valeur avec tab[mid]=8 Comme
tab[mid]gti on change mid en sup
mid = (inf+sup) 2 (0+3)2 =1
inf=1 et sup=3
hellip
20
++- 39 M BENJELLOUN 2015 UMONS
44 Eacutecrire un programme qui supprime le premier et le dernier eacuteleacutement drsquoun vecteur
vecteur initial Tab 0 1 2 3 4 5 6
sup bords 1 2 3 4 5
sup bords 2 3 4
45 Eacutecrire un programme qui supprime le milieu du tableau et ajoute son double au deacutebut
vecteur initial Tab 1 2 3 4 5
sup Aj 6 1 2 4 5
sup Aj 4 6 1 4 5
46 Codez un programme de tri agrave bulles dun vecteur de strings
47 Codez un programme de recherche dichotomique dun nombre dans un vecteur de
strings rangeacutes par ordre croissant
++- 40 M BENJELLOUN 2015 UMONS
Matrices Rangeacutees ligne par ligne
Consideacutereacutees comme des vecteurs de lignes
Accegraves aux composantes par double crochets
int a[10][5]
a[1][0] = 7
int x[2][2] = 123 4 2 lignes et 2 colonnes
1 2
3 4 include hellip
void main()
int i j tab[5][4]
for (i = 0 i lt5 i++) Saisie
for (j = 0 j lt 4 j++) tab[i][j] = i
for (i = 0 i lt5 i++) Affichage
for (j = 0 j lt 4 j++) coutltlt tab[i][j] ltlt
cout ltlt endl
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
21
++- 41 M BENJELLOUN 2015 UMONS
Affichage de la table de multiplication
++- 42 M BENJELLOUN 2015 UMONS
Fonctions en C++
Encapsule un traitement particulier formant un tout
Peut impleacutementer la notion de module en logique
Augmente la lisibiliteacute drsquoun programme
Reacutealise un objectif preacutecis
Ameacuteliore le deacutebogage et la maintenance drsquoun programme
Son utilisation se deacutecompose en trois phases
Deacutefinition de la fonction
Deacuteclaration de la fonction
Appel de la fonction
Deacuteclarer une fonction
Appeler une fonction
Regravegles de visibiliteacute des variables
Passage des paramegravetres par valeur
Fonction renvoyant une valeur au programme
Passage des paramegravetres par valeur et par adresse
Passage des tableaux aux fonctions
22
++- 43 M BENJELLOUN 2015 UMONS
Type nom_fonction(liste_param_typeacutes)
deacuteclaration de variables locales
hellip Corps de la fonction
hellip
return (valeur)
Deacutefinition drsquoune fonction
Une fonction renvoie une valeur ou rien
liste_param_typeacutes = 0 void ou plusieurs
int Somme(int x int y)
int S Variable locale agrave Somme
S= x+y
return S
void fonction1()
coutltltn fonction1 n
void fonction2() coutltltn fonction2 n
Limbrication de fonctions
nest pas autoriseacutee
Deacutefinition
++- 44 M BENJELLOUN 2015 UMONS
Fonctions pourquoi
include ltiostreamgt
using namespace std
void main()
int i j SomCar1=0 SomCar2=0 SomCar3=0
for (i = 0 i lt5 i++)
SomCar1 = SomCar1 + ii
for (i = 0 i lt10 i++)
SomCar2 = SomCar2 + ii
for (j = 0 j lt 7 j++)
SomCar3 = SomCar3 + jj
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
include ltiostreamgt
using namespace std
int Fnct_SomCar(int N)
int i S=0
for (i = 0 i ltN i++)
S = S + ii S+=ii
return S
void main()
int SomCar1 SomCar2 SomCar3
SomCar1 = Fnct_SomCar(5)
SomCar2 = Fnct_SomCar(10)
SomCar3 = Fnct_SomCar(7)
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
23
++- 45 M BENJELLOUN 2015 UMONS
hellip
int Somme(int x int y)
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
int Somme(int x int y)
int S
S= x+y
return S
hellip
int Somme(int x int y)
int S
S= x+y
return S
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
Deacuteclaration et appel drsquoune fonction
++- 46 M BENJELLOUN 2015 UMONS
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
int addition() float tmp tmp = calcule(253) + calcule(572) return (int)tmp float calcule(float C float D) return ( (C + D ) 2)
float calcule(float float)
int addition()
float calcule(float A float B) return ( (A + B ) 2)
int addition() Appel drsquoune fonction dans une fonction
float tmp tmp = calcule(253) + calcule(572) return (int)tmp
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
Deacuteclaration et appel drsquoune fonction
24
++- 47 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void Addition(int v float f)
void main()
int v = 5
float f= 45
Addition(v f) Appel de la fonction
cout ltlt n Main v et f ltlt v ltlt et ltltf
void Addition(int v float f)
cout ltlt Addition v + f = ltlt v+f ltlt endl
f = f + v
cout ltlt Addition f = ltlt f
Addition v+f = 95
Addition f = 95
Main v et f = 5 et 45
v= 5 et f=45
5+ 45
f = 95
Les paramegravetres sont copieacutes La fonction travaille sur des copies de v et de f
++- 48 M BENJELLOUN 2015 UMONS
Fonction Renvoyant une valeur au programme
include ltiostreamgt
using namespace std
int change(int X)
void main(void)
int var = 5
int valeur
valeur = return_Val (var)
cout ltltmain var = ltlt var ltlt endl
cout ltltmain valeur = ltlt valeur
int return_Val (int v)
v = 100
cout ltlt return_Val v = ltlt v ltlt endl
return (v+1)
return_Val v = 100 main var = 5 main valeur = 101
Une fonction se termine et lsquorend la mainrsquo agrave
la fonction appelante lorsque son exeacutecution
rencontre lrsquoinstruction return expression
ou return
25
++- 49 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5 valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5
int valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
cout ltlt return_Val v = ltlt vltltendl
Qursquoaffiche ce programme agrave lrsquoeacutecran Qursquoaffiche ce programme agrave lrsquoeacutecran
++- 50 M BENJELLOUN 2015 UMONS
Fonctions et reacutecursiviteacute
Tours de Hanoiuml Suite de Fibonacci
un = un-1 + un-2
u0=u1=1
Puissance entiegravere
Une fonction est dite reacutecursive lorsqursquoelle srsquoappelle elle-mecircme
int factorielle (int n )
if ( n lt 0) return (ndash1) code derreur
else if ( n == 0 ) return 1 0 = 1
else
return n factorielle( n-1 ) n = n(n-1)
a x an-1 si n gt 0
1 si n = 0
an-1 =
26
++- 51 M BENJELLOUN 2015 UMONS
Passer des tableaux aux fonctions
Les tableaux peuvent ecirctre passeacutes comme paramegravetres dune fonction
Ils ne peuvent pas ecirctre retourneacutes comme reacutesultat dune fonction
La longueur du tableau ne doit pas ecirctre deacutefinie agrave la deacuteclaration de la fonction
Un tableau peut ecirctre modifieacute dans une fonction Il est passeacute par reacutefeacuterence (adresse) et
non par valeur
include hellip
void Modif(int a[])
a[0] = 5
a[1] = 6
void main(void)
int p[2] = 1 2
cout ltlt p[0] ltlt ltlt p[1]
Modif(p)
cout ltlt p[0] ltlt ltlt p[1]
1 2
5 6
include hellip
void Modif(int x[] int n)
void main(void)
int i
int p[6] = 1 2 3 5 7 11
Modif(p 6)
for (i=0ilt6i++)
coutltlt p[i]
void Modif(int a[] int n)
int i
for(i = 0 i ltn i++)
a[i] = 5
++- 52 M BENJELLOUN 2015 UMONS
void Saisie_Mat( int tab[][4] int m int n)
int i j
for (i = 0 i ltm i++)
for (j = 0 j lt n j++)
tab[i][j] = i
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
Matrice Exemple
void Affiche_Mat( int tab[][4] int m int n)
for (int i = 0 i ltm i++)
for (int j = 0 j lt n j++)
cout ltlt tab[i][j] ltlt
cout ltlt endl
include ltiostreamgt
using namespace std
void main()
int T[5][5]
Saisie_Mat( T 4 4 )
Affiche_Mat( T 4 4 )
27
++- 53 M BENJELLOUN 2015 UMONS
include hellip
int LaSomme( )
int A[Nmax] N int S = 0
for (int i=0ilt N i++)
cout ltltEntrez A[ltltiltlt]=
cin gtgtA[i]
S= S+ A[i]
return S
void main()
const int Nmax = 7
int i A[Nmax] S=0 N=3
S = LaSomme( )
cout ltlt Affichage ltlt endl
Affichage(A N)
cout ltlt n La somme est = ltlt S
Qursquoaffiche ce programme agrave lrsquoeacutecran
void Affichage( int A[] int N)
for (int i=0i lt N i++)
cout ltlt A[ltltiltlt]=
ltltA[i] ltltendl
++- 54 M BENJELLOUN 2015 UMONS
include hellip
void Saisie_T( int tab[] )
int N i
N= 3
for (i = 0 i ltN i++) tab[i] = i
void Affiche_T(int tab[] int N )
int i
for (i = 0 i ltN i++) cout ltlt tab[i]
void main()
int T[20] n
Saisie_T( T )
Affiche_T(T n )
tab[0] = 0
tab[1] = 1
tab[2] = 2
Qursquoaffiche ce programme agrave lrsquoeacutecran
28
++- 55 M BENJELLOUN 2015 UMONS
include hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 = 7
return hellip
Comment retourner v1 et v2
++- 56 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltlt a = ltlt a ltlt endl ltlt b = ltlt b
void echange(int xint y)
int tmp
tmp = x
x = y
y =tmp
void main()
int a = 1 b = 5
cout ltlt Avant ltltendl
affiche(ab)
echange(ab)
cout ltlt nApregraves ltltendl
affiche(ab)
Avant
a = 1
b = 5
Apregraves
PASSAGE DES PARAMETRES
Transmission des arguments
Comment eacutechanger a et b
a = 1
b = 5
PAR VALEUR
29
++- 57 M BENJELLOUN 2015 UMONS
Le pointeur prend comme
valeurs des adresses de
donneacutees en meacutemoire
Types de base hellip donneacutee
8
donneacutee
35 hellip
Adr i Adr j
Meacutemoire
12FF80 12FF84
Ladresse de leacuteleacutement i est ampi i=8 et ampi= 12FF80
int i=8 j=35
Et les pointeurs
hellip p=12FF84 hellip 35 hellip
12FF84 12FF80
int p p est le contenu pointeacute par p 35
p est lrsquoadresse 12FF84
++- 58 M BENJELLOUN 2015 UMONS
Deacuteclaration de Pointeurs Le symbole est utiliseacute entre le type et le nom du pointeur
Deacuteclaration drsquoun entier int i int p Deacuteclaration drsquoun pointeur vers un entier
Exemples de deacuteclarations de pointeurs
int pi pi est un pointeur vers un int pi deacutesigne le contenu de ladresse
float pf pf est un pointeur vers un float
char c d pc c et d sont des char pc est un pointeur vers un char
int C = 4
int p
p = ampC p reccediloit ladresse de c donc pointe sur c
cout ltlt p = ltltpltltendl
cout ltlt p = ltltp ltltendl
cout ltlt (ampC) ltlt(ampC)
p = 4
p = 0x12FF7C
(ampC) = 4
Ladresse de C est ampC
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
7
++- 13 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std int Somme(int x int y)
void main(void)
int Som
Som = Somme(79) appel de la fonction
if ( Som gt 10 )
cout ltlt Som gt 10 ltlt Somltlt endl
else
cout ltlt Som lt= 10 ltlt Som
int Somme(int x int y) Deacutefinition de
la fonction
int S
S= x+y
return S
Directives du preacuteprocesseur accegraves avant la compilation
Programme
principal
Deacuteclarations
Traitements Donneacutees Structures de controcircle Commentaires
Structure dun programme C++ exemple
++- 14 M BENJELLOUN 2015 UMONS
Les opeacuterateurs arithmeacutetiques
Le C++ propose les opeacuterateurs suivants
+ addition - soustraction multiplication division modulo (reste de la division entiegravere )
ne peut ecirctre utiliseacute quavec des entiers
72 702 720 7020
3
35
hellip void main() int i = 6 j = 4 k float f = 60 g = 40 h k = i j k= 64 = 1 h = f g h = 6040 = 15 h = i j h = 64 = 1000
Modulo C=AB C 42 = 0 52 = 1 83= 2 C=A2 Si C=0 alors A est pair sinon (=1) A est impair
8
++- 15 M BENJELLOUN 2015 UMONS
Comparaisons lt plus petit
lt= plus petit ou eacutegal
gt plus grand
gt= plus grand ou eacutegal
== eacutegal
= diffeacuterent
Les opeacuterateurs logiques
ampamp et
|| ou (non exclusif)
non
Contractions dopeacuterateurs
+= -= = = =
amp= |= ^= ltlt= gtgt=
a += 15
a = a + 15
i = j + 5
i = i (j + 5)
Le reacutesultat dune expression logique est un
booleacuteen Il vaut true si elle est vraie et false sinon
Reacuteciproquement toute valeur non nulle est consideacutereacutee
comme vraie et la valeur nulle comme fausse
Increacutement et deacutecreacutement
Pour
++ increacutement i++ ou ++i
est eacutequivalent agrave i += 1 ou i = i + 1
- - deacutecreacutement
int i = 5 j = 4
char lettre = B
i++ i vaudra 6
--j j vaudra 3
++i i vaudra 7
lettre++ lettre vaudra C
lettre -- lettre vaudra B
++- 16 M BENJELLOUN 2015 UMONS
Nous consideacuterons un circuit eacutelectrique Quand lrsquointerrupteur lsquoIntrsquo est dans la position de la Fig (X=1) le geacuteneacuterateur de tension lsquoGrsquo allume lrsquoampoule lsquoXrsquo (X=true ou X = 1) Quand lrsquointerrupteur srsquoouvre lsquoXrsquo srsquoeacuteteint (X=false ou X = 0) Afin de simuler le clignotement drsquoune ampoule (X) compleacutetez le code de sorte que lrsquoexeacutecution du programme fournisse les reacutesultats ci-dessous (en rouge)
include ltiostreamgt using namespace std void main() bool x = 1 cout ltlt Test X = ltlt x ltlt endl cout ltlt --------------------------ltlt endl for (int i=0 i lt 6 i++ ) x= 1-x x = x ou x=x2 cout ltlt X = ltlt x ltlt endl
Test X = 1 -------------- X = 0 X = 1 X = 0 X = 1 X = 0 X = 1
9
++- 17 M BENJELLOUN 2015 UMONS
Les structures de controcircle
Alternative if-else
Iteacuterations for while do-while
Rupture de Controcircle break continue return hellip
Choix Multiple switch-case
Bloc 1
drsquoinstructions
Bloc 2
drsquoinstructions
oui non
Suite du programme
oui non
Suite du
programme Bloc
drsquoinstructions
Condition
vraie
oui
non
Bloc
drsquoinstructions
programme
Condition vraie
Suite du programme
programme
Condition
vraie
if-else while
do-while
++- 18 M BENJELLOUN 2015 UMONS
Les deacutecisions - if hellip else
if (Condition vraie)
BLOC 1 DINSTRUCTIONS
else
BLOC 2 DINSTRUCTIONS
Bloc 1
drsquoinstructions
Bloc 2
drsquoinstructions
oui non
Suite du programme
programme
Condition
vraie
if (Condition vraie)
instruction 1
instruction 2
else
instruction 3
instruction 4
Bloc 1
drsquoinstructions
oui non
Suite du programme
Condition
vraie
if (Condition vraie)
instruction 1
instruction 2
instruction 3 hellip
instruction N
if (Condition vraie)
instruction 1
if ( temperature gt 700)
cout ltlt Alarme ltltendl
if (Condition vraie)
instruction A
else
instruction B
if (altb) min=a
else min=b
if (i) if (i = 0)
10
++- 19 M BENJELLOUN 2015 UMONS
if ( ltexpr1gt )
ltbloc1gt
else if (ltexpr2gt)
ltbloc2gt
else if (ltexpr3gt)
ltbloc3gt
else if (ltexprNgt)
ltblocNgt
else ltblocN+1gt
if ( ltexpr1gt )
ltbloc1gt
else if (ltexpr2gt)
ltbloc2gt
else if (ltexpr3gt)
ltbloc3gt
else if (ltexprNgt)
ltblocNgt
else ltblocN+1gt
if emboicircteacutes
else est associeacute avec le if le plus proche
if(i gt= 0)
if(i gt 1000) coutltlt i gt 1000
else coutltlt i lt 0 n
if(i gt= 0)
if(i gt 1000) coutltlt i gt 1000
else coutltlt i lt 0 n
++- 20 M BENJELLOUN 2015 UMONS
for( )
Les iteacuterations ndash for
for( initialisation (Condition vraie) iteacuteration )
liste dinstructions
int i j
float K
for(i = 0 j = 2 k = 75 (i lt 20) ampamp(j==2) i++ k-=02)
int ij
for (i = 0 i lt3 i++)
coutltlt i = ltlt i ltlt endl
cout ltltendlltltendl
for(j = 5 j gt 0 j- -)
coutltlt j = ltlt j ltlt endl
i = 0
i = 1
i = 2
j = 5
j = 4
j = 3
j = 2
j = 1
boucle infinie
11
++- 21 M BENJELLOUN 2015 UMONS
La boucle TANT QUE FAIRE
Boucle preacute-testeacutee
Il sagit de linstruction while
tant que (expression vraie)
faire BLOC DINSTRUCTIONS
Organigramme
while (Condition vraie)
bloc dinstructions
Le test se fait dabord le bloc
dinstructions nest pas forceacutement exeacutecuteacute
Syntaxe
tant que pas jusqursquoagrave ce que
oui non
Suite du
programme
Condition
vraie
Bloc 1
drsquoinstructions
++- 22 M BENJELLOUN 2015 UMONS
i=1
while(ilt5)
coutltltInterieur ltlti ltlt endl
i++
coutltltExterieur ltlti ltlt endl
Exemples
Interieur 1
hellip
hellip
int j = 5
coutltltstartn
while(j == 0)
coutltltj = ltltj--ltltendl
coutltltendn
start
end
i=1
while(ilt5)
coutltltInterieur ltlti ltlt endl
i++
iteacuteration
12
++- 23 M BENJELLOUN 2015 UMONS
do while = REPETER hellip tant que
do
bloc dinstructions
while (Condition vraie) Condition
vraie
oui non
Bloc
drsquoinstructions
programme
int j = 5
do
coutltltj = ltltj--ltltendl
while(j gt 0)
cout ltltstopn
Suite du programme
(garantit lrsquoexeacutecution au moins une fois)
int j = 5
do
coutltltj = ltltj ltltendl
j--
while(j gt 0)
cout ltltstopn
j = 5
j = 4
j = 3
j = 2
j = 1
stop
++- 24 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void main()
for (char lettre = A lettre lt= M lettre++)
coutltltlettre
coutltltendl
for (float pourcent = 00 pourcent lt 05 pourcent += 01)
coutltltpourcentltltendl
for (int i=2 i lt= 3 i++)
cout ltlt Table de ltlt i ltlt ltlt endl
for (int j=0 j lt= 3 j++)
cout ltlt ltlt i ltlt ltlt j ltlt = ltlt ij ltlt endl
ABCDEFGHIJKLM
0
01
02
03
04 Table de 2 2 0 = 0 2 1 = 2 2 2 = 4 2 3 = 6 Table de 3 3 0 = 0 hellip
13
++- 25 M BENJELLOUN 2015 UMONS
include hellip
void main()
bool sortir = false
char rep
coutltltAvant la boucleltltendl
while(sortir)
coutltltDans la boucleltltendl
coutltltVoulez vous quitter (ON)ltltendl
cingtgtrep
if(rep==O)
sortir=true
coutltltApres la boucleltltendl
include hellip
void main()
bool sortir = false
char rep
coutltltAvant la boucleltltendl
do
coutltltDans la boucleltltendl
coutltltVoulez vous quitter (ON)ltltendl
cingtgtrep
if(rep==O)
sortir=true
while(sortir)
coutltltApres la boucleltltendl
++- 26 M BENJELLOUN 2015 UMONS
int i j=1
char a
for (i = -10 i lt= 10 i++)
while(j=0)
cin gtgt a if(a==x)
break
Pour rompre le deacuteroulement seacutequentiel dune suite dinstructions
Instructions deacutechappement
return (expression) permet de sortir de la fonction qui la contient
exit (expression) La fonction est interrompue lsquoexpressionrsquo un entier
indiquant le code de terminaison du processus
for (i = -10 i lt= 10 i++)
if (i == 0)
continue pour eacuteviter la division par zeacutero
cout ltlt 1 i
while (Condition vraie)
continue
break
8
14
++- 27 M BENJELLOUN 2015 UMONS
switch = AU CAS OU FAIRE
hellip
switch(variable de type char ou int) au cas ougrave la variable vaut
case valeur1 variable=valeur1 exeacutecutez ce bloc dinstructions
break
case valeur2 variable=valeur2 exeacutecutez ce bloc dinstructions
break
etc
default aucune des valeurs preacuteceacutedentes exeacutecutez ce bloc
dinstructions pas de break ici
Le bloc default nest pas obligatoire valeur1 valeur2 hellip doivent ecirctre des expressions
constantes Lrsquoinstruction switch correspond agrave une cascade drsquoinstructions if else
++- 28 M BENJELLOUN 2015 UMONS
hellip
void main( )
const float PI= 314159 float rayon = 35 float diametre circonference surface int choix
cout ltlt 1 Calculer la circonferencen cout ltlt 2 Calculer la surfacen cout ltlt 3 Calculer le diametren cout ltlt Votre choix cin gtgt choix
switch (choix) case 1 circonference = 2PIrayon break case 2 surface = PIrayonrayon break case 3 diametre = 2rayon break default cout ltlt Mauvais choixhellipn
char choix
switch(choix)
case 1 hellip
switch(i)
case 2 j
float f
switch(f)
case 2
switch instruction commode pour les menus
15
++- 29 M BENJELLOUN 2015 UMONS
Tableaux et Strings
Un tableau est une collection de variables de mecircme type appeleacutees eacuteleacutements
Type Nom_Tableau[dim]
int tab[4] deacuteclare un tableau de 4 valeurs entiegraveres tab[0] tab[1] tab[2] tab[3]
const int SIZE = 5
int A[SIZE] A est un vecteur de 5 entiers
float B[5]
int A[SIZE] = 10 20 30 40 50
int premier[] = 1 2 3 5 7 11 13
char Tab_Char[4] = A C F G
int Tab[50] = 0
int i = 10
int a[i]
int primes[]
Deacuteclaration
Initialisation
Interdiction
Constante
++- 30 M BENJELLOUN 2015 UMONS
Accegraves aux eacuteleacutements drsquoun tableau
Les eacuteleacutements sont numeacuteroteacutes de 0 agrave dim-1
Il nrsquoy a pas de veacuterification des bornes
void main()
int a[6]
int i = 7
a[0] = 9
a[5] = -10
a[i2] = 2
a[6] = 0
a[-1] = 5
0
a
1
2
3
4
5
9
2
-10
void main(void)
const int dim=6
int i
int A[dim] = 1 2 3 4 5 6
for (i=0iltdimi++)
A[i] = 2i
coutltltA[ltltiltlt]=ltltA[i]
A[0]=0 A[1]=2 A[2]=4 A[3]=6 A[4]=8 A[5]=10
16
++- 31 M BENJELLOUN 2015 UMONS
Chaicircnes de caractegraveres ou String
char Nom[dim] Initialisation
Pour terminer la chaicircne on place en fin de chaicircne le caractegravere nul 0 de code ASCII 0
Ce caractegravere est soit ajouteacute automatiquement par le compilateur soit introduit par le programmeur selon les fonctions utiliseacutees
char S[] = Hello0 H
e
l
l
o
0
S[0] S[1] S[2] S[3] S[4] S[5] char S[6] = Hello
char S[5] = Hello H e l l o
char S[] = Le main L e m a i n 0
bull Un tableau de char agrave une dimension char Nom[dim]
bull Un type speacutecial string string Nom Il faut inclure ltstringgt
++- 32 M BENJELLOUN 2015 UMONS
string Nom Il faut inclure ltstringgt
string Nom est eacutequivalente agrave string Nom = Donc par deacutefaut la chaicircne est vide
Il existe de nombreuses faccedilons drsquoinitialiser Ident par exemple
string s1 = Bonjour a vous
string s2 = s1 s2 contient Bonjour a vous
string s3(4 x) eacutequivaut agrave string s3 = xxxx
string s4(s1 4 8) s4 contient our a voldquo S1 de 4 + 8
B o n j o u r a v o u s 0 1 2 3 4 5 6 7 8 9 10 11 12 13
include ltstringgt hellip string ST = Salut char H[6] = Hello for (int i=0 ilt5 i++) cout ltlt ST[i] ltlt affichera S a l u t
for (int i=0 ilt5 i++) cout ltlt H[i] ltlt affichera H e l l o
17
++- 33 M BENJELLOUN 2015 UMONS
Pourquoi utiliser string Nom plutocirct que char Nom[dim]
char S1[6] = Salut S2[6] = Hello S3[12]
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Interdit
string S1 = Salut S2 = Hello S3
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Autoriseacute
S1= Hello
S1= Hooo
S3= HoooHello
false
++- 34 M BENJELLOUN 2015 UMONS
include ltiostreamgt
include ltstringgt traitement de string
using namespace std espace de nommage std pour importer les
symboles de la bibliothegraveque standard C++
void main(void)
string nom1 nom2 nom3
int len size
cout ltlt Donnez Nom1 cin gtgt nom1
cout ltlt Donnez Nom2 cin gtgt nom2
len = nom1length() nombre de caractegraveres dans nom1
size = nom2size() nombre de caractegraveres dans nom2
cout ltlt Nom1 ltltnom1 ltlt Dim Nom1 = ltlt len ltlt endl
cout ltlt Nom2 ltltnom2 ltlt Dim Nom2 = ltlt size ltlt endl
nom3 = nom2+ +nom1
cout ltlt Nom3 = ltlt nom3 ltlt endl
if(nom1gtnom2) cout ltlt nom1 gt nom2 ltlt endl
else if (nom1==nom2) cout ltlt nom1 = nom2 ltlt endl
else cout ltlt nom1 lt nom2 ltlt endl
nom1=nom2
cout ltlt nom1 = ltlt nom1 ltlt nom2 ltlt nom2 ltlt endl
Donnez Nom1 salut
Donnez Nom2 hello
Nom1 salut Dim Nom1 = 5
Nom2 hello Dim Nom2 = 5
Nom3 = hello salut
nom1 gt nom2
nom1 = hello nom2 hello
Donnez Nom1 csou
Donnez Nom2 pi
Nom1csou Dim Nom1 = 4
Nom2pi Dim Nom2 = 2
Nom3 = pi csou
nom1 lt nom2
nom1 = pi nom2 pi
18
++- 35 M BENJELLOUN 2015 UMONS
Algorithmes de tri
Nom de lrsquoalgorithme Complexiteacute
Tri agrave bulles Tri par seacutelection Tri par insertion Tri de Shell (shell sort) Ameacutelioration du tri par insertion Tri fusion (merge sort) Tri rapide (quick sort) Tri par tas (heap sort)
O(N2) O(N2) O(N2)
O(N log2 N)
O(N log N) O(N log N) O(N log N)
++- 36 M BENJELLOUN 2015 UMONS
Tri agrave bulles bubble sort
reacutepeacuteter permutation = FALSE commencer au deacutebut du drapeau Pour i variant de 0 agrave N ndash 2 faire si cellule [i] gt cellule [i+1] alors deacutebut permuter cellules permutation = TRUE fin jusquagrave ce que (not permutation)
Complexiteacute O(Nsup2) Proportionnel agrave Nsup2 permutations
void TriaBulles(int x[] int N) int i perm=1 tmp while (perm==1) perm =0 for (i=0iltN-1i++) if(x[i] gt x[i+1]) tmp = x[i] x[i] = x[i+1] x[i+1] = tmp perm = 1
Algorithmes de tri
19
++- 37 M BENJELLOUN 2015 UMONS
void tri_par_selection(int t[] int n) int i j min tmp for (i = 0 i lt n - 1 i++) min = i for(j = i+1 j lt n j++) if(t[j] lt t[min]) min = j if(min = i) tmp = t[i] t[i] = t[min] t[min] = tmp
Le tri par seacutelection consiste en la recherche du plus grand eacuteleacutement (le plus petit) que lon va replacer en derniegravere position (en premiegravere) puis on recherche le second plus grand eacuteleacutement (le second plus petit) que lon va replacer eacutegalement agrave sa position finale et ainsi de suite
Algorithmes de tri
++- 38 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement dans un tableau
Recherche lineacuteaire Recherche dichotomique (binary search)
0
9
1
3
2
6
3
2
4
1
5
12
6
0
Est une meacutethode efficace pour retrouver un eacuteleacutement dans un tableau trieacute
A chaque eacutetape de la recherche dichotomique lrsquointervalle de recherche est diviseacute par deux
On utilise degraves lors deux index de recherche la borne infeacuterieure et la borne supeacuterieure
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup mid
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup
On initialise les bornes inf et sup agrave la premiegravere et derniegravere valeur des index du tableau tab
respectivement
Le milieu est donneacute par
mid = (inf+sup) 2 (0+6)2 =3
Supposons que lrsquoon recherche la valeur i=6 On
compare cette valeur avec tab[mid]=8 Comme
tab[mid]gti on change mid en sup
mid = (inf+sup) 2 (0+3)2 =1
inf=1 et sup=3
hellip
20
++- 39 M BENJELLOUN 2015 UMONS
44 Eacutecrire un programme qui supprime le premier et le dernier eacuteleacutement drsquoun vecteur
vecteur initial Tab 0 1 2 3 4 5 6
sup bords 1 2 3 4 5
sup bords 2 3 4
45 Eacutecrire un programme qui supprime le milieu du tableau et ajoute son double au deacutebut
vecteur initial Tab 1 2 3 4 5
sup Aj 6 1 2 4 5
sup Aj 4 6 1 4 5
46 Codez un programme de tri agrave bulles dun vecteur de strings
47 Codez un programme de recherche dichotomique dun nombre dans un vecteur de
strings rangeacutes par ordre croissant
++- 40 M BENJELLOUN 2015 UMONS
Matrices Rangeacutees ligne par ligne
Consideacutereacutees comme des vecteurs de lignes
Accegraves aux composantes par double crochets
int a[10][5]
a[1][0] = 7
int x[2][2] = 123 4 2 lignes et 2 colonnes
1 2
3 4 include hellip
void main()
int i j tab[5][4]
for (i = 0 i lt5 i++) Saisie
for (j = 0 j lt 4 j++) tab[i][j] = i
for (i = 0 i lt5 i++) Affichage
for (j = 0 j lt 4 j++) coutltlt tab[i][j] ltlt
cout ltlt endl
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
21
++- 41 M BENJELLOUN 2015 UMONS
Affichage de la table de multiplication
++- 42 M BENJELLOUN 2015 UMONS
Fonctions en C++
Encapsule un traitement particulier formant un tout
Peut impleacutementer la notion de module en logique
Augmente la lisibiliteacute drsquoun programme
Reacutealise un objectif preacutecis
Ameacuteliore le deacutebogage et la maintenance drsquoun programme
Son utilisation se deacutecompose en trois phases
Deacutefinition de la fonction
Deacuteclaration de la fonction
Appel de la fonction
Deacuteclarer une fonction
Appeler une fonction
Regravegles de visibiliteacute des variables
Passage des paramegravetres par valeur
Fonction renvoyant une valeur au programme
Passage des paramegravetres par valeur et par adresse
Passage des tableaux aux fonctions
22
++- 43 M BENJELLOUN 2015 UMONS
Type nom_fonction(liste_param_typeacutes)
deacuteclaration de variables locales
hellip Corps de la fonction
hellip
return (valeur)
Deacutefinition drsquoune fonction
Une fonction renvoie une valeur ou rien
liste_param_typeacutes = 0 void ou plusieurs
int Somme(int x int y)
int S Variable locale agrave Somme
S= x+y
return S
void fonction1()
coutltltn fonction1 n
void fonction2() coutltltn fonction2 n
Limbrication de fonctions
nest pas autoriseacutee
Deacutefinition
++- 44 M BENJELLOUN 2015 UMONS
Fonctions pourquoi
include ltiostreamgt
using namespace std
void main()
int i j SomCar1=0 SomCar2=0 SomCar3=0
for (i = 0 i lt5 i++)
SomCar1 = SomCar1 + ii
for (i = 0 i lt10 i++)
SomCar2 = SomCar2 + ii
for (j = 0 j lt 7 j++)
SomCar3 = SomCar3 + jj
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
include ltiostreamgt
using namespace std
int Fnct_SomCar(int N)
int i S=0
for (i = 0 i ltN i++)
S = S + ii S+=ii
return S
void main()
int SomCar1 SomCar2 SomCar3
SomCar1 = Fnct_SomCar(5)
SomCar2 = Fnct_SomCar(10)
SomCar3 = Fnct_SomCar(7)
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
23
++- 45 M BENJELLOUN 2015 UMONS
hellip
int Somme(int x int y)
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
int Somme(int x int y)
int S
S= x+y
return S
hellip
int Somme(int x int y)
int S
S= x+y
return S
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
Deacuteclaration et appel drsquoune fonction
++- 46 M BENJELLOUN 2015 UMONS
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
int addition() float tmp tmp = calcule(253) + calcule(572) return (int)tmp float calcule(float C float D) return ( (C + D ) 2)
float calcule(float float)
int addition()
float calcule(float A float B) return ( (A + B ) 2)
int addition() Appel drsquoune fonction dans une fonction
float tmp tmp = calcule(253) + calcule(572) return (int)tmp
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
Deacuteclaration et appel drsquoune fonction
24
++- 47 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void Addition(int v float f)
void main()
int v = 5
float f= 45
Addition(v f) Appel de la fonction
cout ltlt n Main v et f ltlt v ltlt et ltltf
void Addition(int v float f)
cout ltlt Addition v + f = ltlt v+f ltlt endl
f = f + v
cout ltlt Addition f = ltlt f
Addition v+f = 95
Addition f = 95
Main v et f = 5 et 45
v= 5 et f=45
5+ 45
f = 95
Les paramegravetres sont copieacutes La fonction travaille sur des copies de v et de f
++- 48 M BENJELLOUN 2015 UMONS
Fonction Renvoyant une valeur au programme
include ltiostreamgt
using namespace std
int change(int X)
void main(void)
int var = 5
int valeur
valeur = return_Val (var)
cout ltltmain var = ltlt var ltlt endl
cout ltltmain valeur = ltlt valeur
int return_Val (int v)
v = 100
cout ltlt return_Val v = ltlt v ltlt endl
return (v+1)
return_Val v = 100 main var = 5 main valeur = 101
Une fonction se termine et lsquorend la mainrsquo agrave
la fonction appelante lorsque son exeacutecution
rencontre lrsquoinstruction return expression
ou return
25
++- 49 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5 valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5
int valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
cout ltlt return_Val v = ltlt vltltendl
Qursquoaffiche ce programme agrave lrsquoeacutecran Qursquoaffiche ce programme agrave lrsquoeacutecran
++- 50 M BENJELLOUN 2015 UMONS
Fonctions et reacutecursiviteacute
Tours de Hanoiuml Suite de Fibonacci
un = un-1 + un-2
u0=u1=1
Puissance entiegravere
Une fonction est dite reacutecursive lorsqursquoelle srsquoappelle elle-mecircme
int factorielle (int n )
if ( n lt 0) return (ndash1) code derreur
else if ( n == 0 ) return 1 0 = 1
else
return n factorielle( n-1 ) n = n(n-1)
a x an-1 si n gt 0
1 si n = 0
an-1 =
26
++- 51 M BENJELLOUN 2015 UMONS
Passer des tableaux aux fonctions
Les tableaux peuvent ecirctre passeacutes comme paramegravetres dune fonction
Ils ne peuvent pas ecirctre retourneacutes comme reacutesultat dune fonction
La longueur du tableau ne doit pas ecirctre deacutefinie agrave la deacuteclaration de la fonction
Un tableau peut ecirctre modifieacute dans une fonction Il est passeacute par reacutefeacuterence (adresse) et
non par valeur
include hellip
void Modif(int a[])
a[0] = 5
a[1] = 6
void main(void)
int p[2] = 1 2
cout ltlt p[0] ltlt ltlt p[1]
Modif(p)
cout ltlt p[0] ltlt ltlt p[1]
1 2
5 6
include hellip
void Modif(int x[] int n)
void main(void)
int i
int p[6] = 1 2 3 5 7 11
Modif(p 6)
for (i=0ilt6i++)
coutltlt p[i]
void Modif(int a[] int n)
int i
for(i = 0 i ltn i++)
a[i] = 5
++- 52 M BENJELLOUN 2015 UMONS
void Saisie_Mat( int tab[][4] int m int n)
int i j
for (i = 0 i ltm i++)
for (j = 0 j lt n j++)
tab[i][j] = i
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
Matrice Exemple
void Affiche_Mat( int tab[][4] int m int n)
for (int i = 0 i ltm i++)
for (int j = 0 j lt n j++)
cout ltlt tab[i][j] ltlt
cout ltlt endl
include ltiostreamgt
using namespace std
void main()
int T[5][5]
Saisie_Mat( T 4 4 )
Affiche_Mat( T 4 4 )
27
++- 53 M BENJELLOUN 2015 UMONS
include hellip
int LaSomme( )
int A[Nmax] N int S = 0
for (int i=0ilt N i++)
cout ltltEntrez A[ltltiltlt]=
cin gtgtA[i]
S= S+ A[i]
return S
void main()
const int Nmax = 7
int i A[Nmax] S=0 N=3
S = LaSomme( )
cout ltlt Affichage ltlt endl
Affichage(A N)
cout ltlt n La somme est = ltlt S
Qursquoaffiche ce programme agrave lrsquoeacutecran
void Affichage( int A[] int N)
for (int i=0i lt N i++)
cout ltlt A[ltltiltlt]=
ltltA[i] ltltendl
++- 54 M BENJELLOUN 2015 UMONS
include hellip
void Saisie_T( int tab[] )
int N i
N= 3
for (i = 0 i ltN i++) tab[i] = i
void Affiche_T(int tab[] int N )
int i
for (i = 0 i ltN i++) cout ltlt tab[i]
void main()
int T[20] n
Saisie_T( T )
Affiche_T(T n )
tab[0] = 0
tab[1] = 1
tab[2] = 2
Qursquoaffiche ce programme agrave lrsquoeacutecran
28
++- 55 M BENJELLOUN 2015 UMONS
include hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 = 7
return hellip
Comment retourner v1 et v2
++- 56 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltlt a = ltlt a ltlt endl ltlt b = ltlt b
void echange(int xint y)
int tmp
tmp = x
x = y
y =tmp
void main()
int a = 1 b = 5
cout ltlt Avant ltltendl
affiche(ab)
echange(ab)
cout ltlt nApregraves ltltendl
affiche(ab)
Avant
a = 1
b = 5
Apregraves
PASSAGE DES PARAMETRES
Transmission des arguments
Comment eacutechanger a et b
a = 1
b = 5
PAR VALEUR
29
++- 57 M BENJELLOUN 2015 UMONS
Le pointeur prend comme
valeurs des adresses de
donneacutees en meacutemoire
Types de base hellip donneacutee
8
donneacutee
35 hellip
Adr i Adr j
Meacutemoire
12FF80 12FF84
Ladresse de leacuteleacutement i est ampi i=8 et ampi= 12FF80
int i=8 j=35
Et les pointeurs
hellip p=12FF84 hellip 35 hellip
12FF84 12FF80
int p p est le contenu pointeacute par p 35
p est lrsquoadresse 12FF84
++- 58 M BENJELLOUN 2015 UMONS
Deacuteclaration de Pointeurs Le symbole est utiliseacute entre le type et le nom du pointeur
Deacuteclaration drsquoun entier int i int p Deacuteclaration drsquoun pointeur vers un entier
Exemples de deacuteclarations de pointeurs
int pi pi est un pointeur vers un int pi deacutesigne le contenu de ladresse
float pf pf est un pointeur vers un float
char c d pc c et d sont des char pc est un pointeur vers un char
int C = 4
int p
p = ampC p reccediloit ladresse de c donc pointe sur c
cout ltlt p = ltltpltltendl
cout ltlt p = ltltp ltltendl
cout ltlt (ampC) ltlt(ampC)
p = 4
p = 0x12FF7C
(ampC) = 4
Ladresse de C est ampC
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
8
++- 15 M BENJELLOUN 2015 UMONS
Comparaisons lt plus petit
lt= plus petit ou eacutegal
gt plus grand
gt= plus grand ou eacutegal
== eacutegal
= diffeacuterent
Les opeacuterateurs logiques
ampamp et
|| ou (non exclusif)
non
Contractions dopeacuterateurs
+= -= = = =
amp= |= ^= ltlt= gtgt=
a += 15
a = a + 15
i = j + 5
i = i (j + 5)
Le reacutesultat dune expression logique est un
booleacuteen Il vaut true si elle est vraie et false sinon
Reacuteciproquement toute valeur non nulle est consideacutereacutee
comme vraie et la valeur nulle comme fausse
Increacutement et deacutecreacutement
Pour
++ increacutement i++ ou ++i
est eacutequivalent agrave i += 1 ou i = i + 1
- - deacutecreacutement
int i = 5 j = 4
char lettre = B
i++ i vaudra 6
--j j vaudra 3
++i i vaudra 7
lettre++ lettre vaudra C
lettre -- lettre vaudra B
++- 16 M BENJELLOUN 2015 UMONS
Nous consideacuterons un circuit eacutelectrique Quand lrsquointerrupteur lsquoIntrsquo est dans la position de la Fig (X=1) le geacuteneacuterateur de tension lsquoGrsquo allume lrsquoampoule lsquoXrsquo (X=true ou X = 1) Quand lrsquointerrupteur srsquoouvre lsquoXrsquo srsquoeacuteteint (X=false ou X = 0) Afin de simuler le clignotement drsquoune ampoule (X) compleacutetez le code de sorte que lrsquoexeacutecution du programme fournisse les reacutesultats ci-dessous (en rouge)
include ltiostreamgt using namespace std void main() bool x = 1 cout ltlt Test X = ltlt x ltlt endl cout ltlt --------------------------ltlt endl for (int i=0 i lt 6 i++ ) x= 1-x x = x ou x=x2 cout ltlt X = ltlt x ltlt endl
Test X = 1 -------------- X = 0 X = 1 X = 0 X = 1 X = 0 X = 1
9
++- 17 M BENJELLOUN 2015 UMONS
Les structures de controcircle
Alternative if-else
Iteacuterations for while do-while
Rupture de Controcircle break continue return hellip
Choix Multiple switch-case
Bloc 1
drsquoinstructions
Bloc 2
drsquoinstructions
oui non
Suite du programme
oui non
Suite du
programme Bloc
drsquoinstructions
Condition
vraie
oui
non
Bloc
drsquoinstructions
programme
Condition vraie
Suite du programme
programme
Condition
vraie
if-else while
do-while
++- 18 M BENJELLOUN 2015 UMONS
Les deacutecisions - if hellip else
if (Condition vraie)
BLOC 1 DINSTRUCTIONS
else
BLOC 2 DINSTRUCTIONS
Bloc 1
drsquoinstructions
Bloc 2
drsquoinstructions
oui non
Suite du programme
programme
Condition
vraie
if (Condition vraie)
instruction 1
instruction 2
else
instruction 3
instruction 4
Bloc 1
drsquoinstructions
oui non
Suite du programme
Condition
vraie
if (Condition vraie)
instruction 1
instruction 2
instruction 3 hellip
instruction N
if (Condition vraie)
instruction 1
if ( temperature gt 700)
cout ltlt Alarme ltltendl
if (Condition vraie)
instruction A
else
instruction B
if (altb) min=a
else min=b
if (i) if (i = 0)
10
++- 19 M BENJELLOUN 2015 UMONS
if ( ltexpr1gt )
ltbloc1gt
else if (ltexpr2gt)
ltbloc2gt
else if (ltexpr3gt)
ltbloc3gt
else if (ltexprNgt)
ltblocNgt
else ltblocN+1gt
if ( ltexpr1gt )
ltbloc1gt
else if (ltexpr2gt)
ltbloc2gt
else if (ltexpr3gt)
ltbloc3gt
else if (ltexprNgt)
ltblocNgt
else ltblocN+1gt
if emboicircteacutes
else est associeacute avec le if le plus proche
if(i gt= 0)
if(i gt 1000) coutltlt i gt 1000
else coutltlt i lt 0 n
if(i gt= 0)
if(i gt 1000) coutltlt i gt 1000
else coutltlt i lt 0 n
++- 20 M BENJELLOUN 2015 UMONS
for( )
Les iteacuterations ndash for
for( initialisation (Condition vraie) iteacuteration )
liste dinstructions
int i j
float K
for(i = 0 j = 2 k = 75 (i lt 20) ampamp(j==2) i++ k-=02)
int ij
for (i = 0 i lt3 i++)
coutltlt i = ltlt i ltlt endl
cout ltltendlltltendl
for(j = 5 j gt 0 j- -)
coutltlt j = ltlt j ltlt endl
i = 0
i = 1
i = 2
j = 5
j = 4
j = 3
j = 2
j = 1
boucle infinie
11
++- 21 M BENJELLOUN 2015 UMONS
La boucle TANT QUE FAIRE
Boucle preacute-testeacutee
Il sagit de linstruction while
tant que (expression vraie)
faire BLOC DINSTRUCTIONS
Organigramme
while (Condition vraie)
bloc dinstructions
Le test se fait dabord le bloc
dinstructions nest pas forceacutement exeacutecuteacute
Syntaxe
tant que pas jusqursquoagrave ce que
oui non
Suite du
programme
Condition
vraie
Bloc 1
drsquoinstructions
++- 22 M BENJELLOUN 2015 UMONS
i=1
while(ilt5)
coutltltInterieur ltlti ltlt endl
i++
coutltltExterieur ltlti ltlt endl
Exemples
Interieur 1
hellip
hellip
int j = 5
coutltltstartn
while(j == 0)
coutltltj = ltltj--ltltendl
coutltltendn
start
end
i=1
while(ilt5)
coutltltInterieur ltlti ltlt endl
i++
iteacuteration
12
++- 23 M BENJELLOUN 2015 UMONS
do while = REPETER hellip tant que
do
bloc dinstructions
while (Condition vraie) Condition
vraie
oui non
Bloc
drsquoinstructions
programme
int j = 5
do
coutltltj = ltltj--ltltendl
while(j gt 0)
cout ltltstopn
Suite du programme
(garantit lrsquoexeacutecution au moins une fois)
int j = 5
do
coutltltj = ltltj ltltendl
j--
while(j gt 0)
cout ltltstopn
j = 5
j = 4
j = 3
j = 2
j = 1
stop
++- 24 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void main()
for (char lettre = A lettre lt= M lettre++)
coutltltlettre
coutltltendl
for (float pourcent = 00 pourcent lt 05 pourcent += 01)
coutltltpourcentltltendl
for (int i=2 i lt= 3 i++)
cout ltlt Table de ltlt i ltlt ltlt endl
for (int j=0 j lt= 3 j++)
cout ltlt ltlt i ltlt ltlt j ltlt = ltlt ij ltlt endl
ABCDEFGHIJKLM
0
01
02
03
04 Table de 2 2 0 = 0 2 1 = 2 2 2 = 4 2 3 = 6 Table de 3 3 0 = 0 hellip
13
++- 25 M BENJELLOUN 2015 UMONS
include hellip
void main()
bool sortir = false
char rep
coutltltAvant la boucleltltendl
while(sortir)
coutltltDans la boucleltltendl
coutltltVoulez vous quitter (ON)ltltendl
cingtgtrep
if(rep==O)
sortir=true
coutltltApres la boucleltltendl
include hellip
void main()
bool sortir = false
char rep
coutltltAvant la boucleltltendl
do
coutltltDans la boucleltltendl
coutltltVoulez vous quitter (ON)ltltendl
cingtgtrep
if(rep==O)
sortir=true
while(sortir)
coutltltApres la boucleltltendl
++- 26 M BENJELLOUN 2015 UMONS
int i j=1
char a
for (i = -10 i lt= 10 i++)
while(j=0)
cin gtgt a if(a==x)
break
Pour rompre le deacuteroulement seacutequentiel dune suite dinstructions
Instructions deacutechappement
return (expression) permet de sortir de la fonction qui la contient
exit (expression) La fonction est interrompue lsquoexpressionrsquo un entier
indiquant le code de terminaison du processus
for (i = -10 i lt= 10 i++)
if (i == 0)
continue pour eacuteviter la division par zeacutero
cout ltlt 1 i
while (Condition vraie)
continue
break
8
14
++- 27 M BENJELLOUN 2015 UMONS
switch = AU CAS OU FAIRE
hellip
switch(variable de type char ou int) au cas ougrave la variable vaut
case valeur1 variable=valeur1 exeacutecutez ce bloc dinstructions
break
case valeur2 variable=valeur2 exeacutecutez ce bloc dinstructions
break
etc
default aucune des valeurs preacuteceacutedentes exeacutecutez ce bloc
dinstructions pas de break ici
Le bloc default nest pas obligatoire valeur1 valeur2 hellip doivent ecirctre des expressions
constantes Lrsquoinstruction switch correspond agrave une cascade drsquoinstructions if else
++- 28 M BENJELLOUN 2015 UMONS
hellip
void main( )
const float PI= 314159 float rayon = 35 float diametre circonference surface int choix
cout ltlt 1 Calculer la circonferencen cout ltlt 2 Calculer la surfacen cout ltlt 3 Calculer le diametren cout ltlt Votre choix cin gtgt choix
switch (choix) case 1 circonference = 2PIrayon break case 2 surface = PIrayonrayon break case 3 diametre = 2rayon break default cout ltlt Mauvais choixhellipn
char choix
switch(choix)
case 1 hellip
switch(i)
case 2 j
float f
switch(f)
case 2
switch instruction commode pour les menus
15
++- 29 M BENJELLOUN 2015 UMONS
Tableaux et Strings
Un tableau est une collection de variables de mecircme type appeleacutees eacuteleacutements
Type Nom_Tableau[dim]
int tab[4] deacuteclare un tableau de 4 valeurs entiegraveres tab[0] tab[1] tab[2] tab[3]
const int SIZE = 5
int A[SIZE] A est un vecteur de 5 entiers
float B[5]
int A[SIZE] = 10 20 30 40 50
int premier[] = 1 2 3 5 7 11 13
char Tab_Char[4] = A C F G
int Tab[50] = 0
int i = 10
int a[i]
int primes[]
Deacuteclaration
Initialisation
Interdiction
Constante
++- 30 M BENJELLOUN 2015 UMONS
Accegraves aux eacuteleacutements drsquoun tableau
Les eacuteleacutements sont numeacuteroteacutes de 0 agrave dim-1
Il nrsquoy a pas de veacuterification des bornes
void main()
int a[6]
int i = 7
a[0] = 9
a[5] = -10
a[i2] = 2
a[6] = 0
a[-1] = 5
0
a
1
2
3
4
5
9
2
-10
void main(void)
const int dim=6
int i
int A[dim] = 1 2 3 4 5 6
for (i=0iltdimi++)
A[i] = 2i
coutltltA[ltltiltlt]=ltltA[i]
A[0]=0 A[1]=2 A[2]=4 A[3]=6 A[4]=8 A[5]=10
16
++- 31 M BENJELLOUN 2015 UMONS
Chaicircnes de caractegraveres ou String
char Nom[dim] Initialisation
Pour terminer la chaicircne on place en fin de chaicircne le caractegravere nul 0 de code ASCII 0
Ce caractegravere est soit ajouteacute automatiquement par le compilateur soit introduit par le programmeur selon les fonctions utiliseacutees
char S[] = Hello0 H
e
l
l
o
0
S[0] S[1] S[2] S[3] S[4] S[5] char S[6] = Hello
char S[5] = Hello H e l l o
char S[] = Le main L e m a i n 0
bull Un tableau de char agrave une dimension char Nom[dim]
bull Un type speacutecial string string Nom Il faut inclure ltstringgt
++- 32 M BENJELLOUN 2015 UMONS
string Nom Il faut inclure ltstringgt
string Nom est eacutequivalente agrave string Nom = Donc par deacutefaut la chaicircne est vide
Il existe de nombreuses faccedilons drsquoinitialiser Ident par exemple
string s1 = Bonjour a vous
string s2 = s1 s2 contient Bonjour a vous
string s3(4 x) eacutequivaut agrave string s3 = xxxx
string s4(s1 4 8) s4 contient our a voldquo S1 de 4 + 8
B o n j o u r a v o u s 0 1 2 3 4 5 6 7 8 9 10 11 12 13
include ltstringgt hellip string ST = Salut char H[6] = Hello for (int i=0 ilt5 i++) cout ltlt ST[i] ltlt affichera S a l u t
for (int i=0 ilt5 i++) cout ltlt H[i] ltlt affichera H e l l o
17
++- 33 M BENJELLOUN 2015 UMONS
Pourquoi utiliser string Nom plutocirct que char Nom[dim]
char S1[6] = Salut S2[6] = Hello S3[12]
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Interdit
string S1 = Salut S2 = Hello S3
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Autoriseacute
S1= Hello
S1= Hooo
S3= HoooHello
false
++- 34 M BENJELLOUN 2015 UMONS
include ltiostreamgt
include ltstringgt traitement de string
using namespace std espace de nommage std pour importer les
symboles de la bibliothegraveque standard C++
void main(void)
string nom1 nom2 nom3
int len size
cout ltlt Donnez Nom1 cin gtgt nom1
cout ltlt Donnez Nom2 cin gtgt nom2
len = nom1length() nombre de caractegraveres dans nom1
size = nom2size() nombre de caractegraveres dans nom2
cout ltlt Nom1 ltltnom1 ltlt Dim Nom1 = ltlt len ltlt endl
cout ltlt Nom2 ltltnom2 ltlt Dim Nom2 = ltlt size ltlt endl
nom3 = nom2+ +nom1
cout ltlt Nom3 = ltlt nom3 ltlt endl
if(nom1gtnom2) cout ltlt nom1 gt nom2 ltlt endl
else if (nom1==nom2) cout ltlt nom1 = nom2 ltlt endl
else cout ltlt nom1 lt nom2 ltlt endl
nom1=nom2
cout ltlt nom1 = ltlt nom1 ltlt nom2 ltlt nom2 ltlt endl
Donnez Nom1 salut
Donnez Nom2 hello
Nom1 salut Dim Nom1 = 5
Nom2 hello Dim Nom2 = 5
Nom3 = hello salut
nom1 gt nom2
nom1 = hello nom2 hello
Donnez Nom1 csou
Donnez Nom2 pi
Nom1csou Dim Nom1 = 4
Nom2pi Dim Nom2 = 2
Nom3 = pi csou
nom1 lt nom2
nom1 = pi nom2 pi
18
++- 35 M BENJELLOUN 2015 UMONS
Algorithmes de tri
Nom de lrsquoalgorithme Complexiteacute
Tri agrave bulles Tri par seacutelection Tri par insertion Tri de Shell (shell sort) Ameacutelioration du tri par insertion Tri fusion (merge sort) Tri rapide (quick sort) Tri par tas (heap sort)
O(N2) O(N2) O(N2)
O(N log2 N)
O(N log N) O(N log N) O(N log N)
++- 36 M BENJELLOUN 2015 UMONS
Tri agrave bulles bubble sort
reacutepeacuteter permutation = FALSE commencer au deacutebut du drapeau Pour i variant de 0 agrave N ndash 2 faire si cellule [i] gt cellule [i+1] alors deacutebut permuter cellules permutation = TRUE fin jusquagrave ce que (not permutation)
Complexiteacute O(Nsup2) Proportionnel agrave Nsup2 permutations
void TriaBulles(int x[] int N) int i perm=1 tmp while (perm==1) perm =0 for (i=0iltN-1i++) if(x[i] gt x[i+1]) tmp = x[i] x[i] = x[i+1] x[i+1] = tmp perm = 1
Algorithmes de tri
19
++- 37 M BENJELLOUN 2015 UMONS
void tri_par_selection(int t[] int n) int i j min tmp for (i = 0 i lt n - 1 i++) min = i for(j = i+1 j lt n j++) if(t[j] lt t[min]) min = j if(min = i) tmp = t[i] t[i] = t[min] t[min] = tmp
Le tri par seacutelection consiste en la recherche du plus grand eacuteleacutement (le plus petit) que lon va replacer en derniegravere position (en premiegravere) puis on recherche le second plus grand eacuteleacutement (le second plus petit) que lon va replacer eacutegalement agrave sa position finale et ainsi de suite
Algorithmes de tri
++- 38 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement dans un tableau
Recherche lineacuteaire Recherche dichotomique (binary search)
0
9
1
3
2
6
3
2
4
1
5
12
6
0
Est une meacutethode efficace pour retrouver un eacuteleacutement dans un tableau trieacute
A chaque eacutetape de la recherche dichotomique lrsquointervalle de recherche est diviseacute par deux
On utilise degraves lors deux index de recherche la borne infeacuterieure et la borne supeacuterieure
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup mid
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup
On initialise les bornes inf et sup agrave la premiegravere et derniegravere valeur des index du tableau tab
respectivement
Le milieu est donneacute par
mid = (inf+sup) 2 (0+6)2 =3
Supposons que lrsquoon recherche la valeur i=6 On
compare cette valeur avec tab[mid]=8 Comme
tab[mid]gti on change mid en sup
mid = (inf+sup) 2 (0+3)2 =1
inf=1 et sup=3
hellip
20
++- 39 M BENJELLOUN 2015 UMONS
44 Eacutecrire un programme qui supprime le premier et le dernier eacuteleacutement drsquoun vecteur
vecteur initial Tab 0 1 2 3 4 5 6
sup bords 1 2 3 4 5
sup bords 2 3 4
45 Eacutecrire un programme qui supprime le milieu du tableau et ajoute son double au deacutebut
vecteur initial Tab 1 2 3 4 5
sup Aj 6 1 2 4 5
sup Aj 4 6 1 4 5
46 Codez un programme de tri agrave bulles dun vecteur de strings
47 Codez un programme de recherche dichotomique dun nombre dans un vecteur de
strings rangeacutes par ordre croissant
++- 40 M BENJELLOUN 2015 UMONS
Matrices Rangeacutees ligne par ligne
Consideacutereacutees comme des vecteurs de lignes
Accegraves aux composantes par double crochets
int a[10][5]
a[1][0] = 7
int x[2][2] = 123 4 2 lignes et 2 colonnes
1 2
3 4 include hellip
void main()
int i j tab[5][4]
for (i = 0 i lt5 i++) Saisie
for (j = 0 j lt 4 j++) tab[i][j] = i
for (i = 0 i lt5 i++) Affichage
for (j = 0 j lt 4 j++) coutltlt tab[i][j] ltlt
cout ltlt endl
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
21
++- 41 M BENJELLOUN 2015 UMONS
Affichage de la table de multiplication
++- 42 M BENJELLOUN 2015 UMONS
Fonctions en C++
Encapsule un traitement particulier formant un tout
Peut impleacutementer la notion de module en logique
Augmente la lisibiliteacute drsquoun programme
Reacutealise un objectif preacutecis
Ameacuteliore le deacutebogage et la maintenance drsquoun programme
Son utilisation se deacutecompose en trois phases
Deacutefinition de la fonction
Deacuteclaration de la fonction
Appel de la fonction
Deacuteclarer une fonction
Appeler une fonction
Regravegles de visibiliteacute des variables
Passage des paramegravetres par valeur
Fonction renvoyant une valeur au programme
Passage des paramegravetres par valeur et par adresse
Passage des tableaux aux fonctions
22
++- 43 M BENJELLOUN 2015 UMONS
Type nom_fonction(liste_param_typeacutes)
deacuteclaration de variables locales
hellip Corps de la fonction
hellip
return (valeur)
Deacutefinition drsquoune fonction
Une fonction renvoie une valeur ou rien
liste_param_typeacutes = 0 void ou plusieurs
int Somme(int x int y)
int S Variable locale agrave Somme
S= x+y
return S
void fonction1()
coutltltn fonction1 n
void fonction2() coutltltn fonction2 n
Limbrication de fonctions
nest pas autoriseacutee
Deacutefinition
++- 44 M BENJELLOUN 2015 UMONS
Fonctions pourquoi
include ltiostreamgt
using namespace std
void main()
int i j SomCar1=0 SomCar2=0 SomCar3=0
for (i = 0 i lt5 i++)
SomCar1 = SomCar1 + ii
for (i = 0 i lt10 i++)
SomCar2 = SomCar2 + ii
for (j = 0 j lt 7 j++)
SomCar3 = SomCar3 + jj
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
include ltiostreamgt
using namespace std
int Fnct_SomCar(int N)
int i S=0
for (i = 0 i ltN i++)
S = S + ii S+=ii
return S
void main()
int SomCar1 SomCar2 SomCar3
SomCar1 = Fnct_SomCar(5)
SomCar2 = Fnct_SomCar(10)
SomCar3 = Fnct_SomCar(7)
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
23
++- 45 M BENJELLOUN 2015 UMONS
hellip
int Somme(int x int y)
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
int Somme(int x int y)
int S
S= x+y
return S
hellip
int Somme(int x int y)
int S
S= x+y
return S
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
Deacuteclaration et appel drsquoune fonction
++- 46 M BENJELLOUN 2015 UMONS
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
int addition() float tmp tmp = calcule(253) + calcule(572) return (int)tmp float calcule(float C float D) return ( (C + D ) 2)
float calcule(float float)
int addition()
float calcule(float A float B) return ( (A + B ) 2)
int addition() Appel drsquoune fonction dans une fonction
float tmp tmp = calcule(253) + calcule(572) return (int)tmp
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
Deacuteclaration et appel drsquoune fonction
24
++- 47 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void Addition(int v float f)
void main()
int v = 5
float f= 45
Addition(v f) Appel de la fonction
cout ltlt n Main v et f ltlt v ltlt et ltltf
void Addition(int v float f)
cout ltlt Addition v + f = ltlt v+f ltlt endl
f = f + v
cout ltlt Addition f = ltlt f
Addition v+f = 95
Addition f = 95
Main v et f = 5 et 45
v= 5 et f=45
5+ 45
f = 95
Les paramegravetres sont copieacutes La fonction travaille sur des copies de v et de f
++- 48 M BENJELLOUN 2015 UMONS
Fonction Renvoyant une valeur au programme
include ltiostreamgt
using namespace std
int change(int X)
void main(void)
int var = 5
int valeur
valeur = return_Val (var)
cout ltltmain var = ltlt var ltlt endl
cout ltltmain valeur = ltlt valeur
int return_Val (int v)
v = 100
cout ltlt return_Val v = ltlt v ltlt endl
return (v+1)
return_Val v = 100 main var = 5 main valeur = 101
Une fonction se termine et lsquorend la mainrsquo agrave
la fonction appelante lorsque son exeacutecution
rencontre lrsquoinstruction return expression
ou return
25
++- 49 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5 valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5
int valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
cout ltlt return_Val v = ltlt vltltendl
Qursquoaffiche ce programme agrave lrsquoeacutecran Qursquoaffiche ce programme agrave lrsquoeacutecran
++- 50 M BENJELLOUN 2015 UMONS
Fonctions et reacutecursiviteacute
Tours de Hanoiuml Suite de Fibonacci
un = un-1 + un-2
u0=u1=1
Puissance entiegravere
Une fonction est dite reacutecursive lorsqursquoelle srsquoappelle elle-mecircme
int factorielle (int n )
if ( n lt 0) return (ndash1) code derreur
else if ( n == 0 ) return 1 0 = 1
else
return n factorielle( n-1 ) n = n(n-1)
a x an-1 si n gt 0
1 si n = 0
an-1 =
26
++- 51 M BENJELLOUN 2015 UMONS
Passer des tableaux aux fonctions
Les tableaux peuvent ecirctre passeacutes comme paramegravetres dune fonction
Ils ne peuvent pas ecirctre retourneacutes comme reacutesultat dune fonction
La longueur du tableau ne doit pas ecirctre deacutefinie agrave la deacuteclaration de la fonction
Un tableau peut ecirctre modifieacute dans une fonction Il est passeacute par reacutefeacuterence (adresse) et
non par valeur
include hellip
void Modif(int a[])
a[0] = 5
a[1] = 6
void main(void)
int p[2] = 1 2
cout ltlt p[0] ltlt ltlt p[1]
Modif(p)
cout ltlt p[0] ltlt ltlt p[1]
1 2
5 6
include hellip
void Modif(int x[] int n)
void main(void)
int i
int p[6] = 1 2 3 5 7 11
Modif(p 6)
for (i=0ilt6i++)
coutltlt p[i]
void Modif(int a[] int n)
int i
for(i = 0 i ltn i++)
a[i] = 5
++- 52 M BENJELLOUN 2015 UMONS
void Saisie_Mat( int tab[][4] int m int n)
int i j
for (i = 0 i ltm i++)
for (j = 0 j lt n j++)
tab[i][j] = i
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
Matrice Exemple
void Affiche_Mat( int tab[][4] int m int n)
for (int i = 0 i ltm i++)
for (int j = 0 j lt n j++)
cout ltlt tab[i][j] ltlt
cout ltlt endl
include ltiostreamgt
using namespace std
void main()
int T[5][5]
Saisie_Mat( T 4 4 )
Affiche_Mat( T 4 4 )
27
++- 53 M BENJELLOUN 2015 UMONS
include hellip
int LaSomme( )
int A[Nmax] N int S = 0
for (int i=0ilt N i++)
cout ltltEntrez A[ltltiltlt]=
cin gtgtA[i]
S= S+ A[i]
return S
void main()
const int Nmax = 7
int i A[Nmax] S=0 N=3
S = LaSomme( )
cout ltlt Affichage ltlt endl
Affichage(A N)
cout ltlt n La somme est = ltlt S
Qursquoaffiche ce programme agrave lrsquoeacutecran
void Affichage( int A[] int N)
for (int i=0i lt N i++)
cout ltlt A[ltltiltlt]=
ltltA[i] ltltendl
++- 54 M BENJELLOUN 2015 UMONS
include hellip
void Saisie_T( int tab[] )
int N i
N= 3
for (i = 0 i ltN i++) tab[i] = i
void Affiche_T(int tab[] int N )
int i
for (i = 0 i ltN i++) cout ltlt tab[i]
void main()
int T[20] n
Saisie_T( T )
Affiche_T(T n )
tab[0] = 0
tab[1] = 1
tab[2] = 2
Qursquoaffiche ce programme agrave lrsquoeacutecran
28
++- 55 M BENJELLOUN 2015 UMONS
include hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 = 7
return hellip
Comment retourner v1 et v2
++- 56 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltlt a = ltlt a ltlt endl ltlt b = ltlt b
void echange(int xint y)
int tmp
tmp = x
x = y
y =tmp
void main()
int a = 1 b = 5
cout ltlt Avant ltltendl
affiche(ab)
echange(ab)
cout ltlt nApregraves ltltendl
affiche(ab)
Avant
a = 1
b = 5
Apregraves
PASSAGE DES PARAMETRES
Transmission des arguments
Comment eacutechanger a et b
a = 1
b = 5
PAR VALEUR
29
++- 57 M BENJELLOUN 2015 UMONS
Le pointeur prend comme
valeurs des adresses de
donneacutees en meacutemoire
Types de base hellip donneacutee
8
donneacutee
35 hellip
Adr i Adr j
Meacutemoire
12FF80 12FF84
Ladresse de leacuteleacutement i est ampi i=8 et ampi= 12FF80
int i=8 j=35
Et les pointeurs
hellip p=12FF84 hellip 35 hellip
12FF84 12FF80
int p p est le contenu pointeacute par p 35
p est lrsquoadresse 12FF84
++- 58 M BENJELLOUN 2015 UMONS
Deacuteclaration de Pointeurs Le symbole est utiliseacute entre le type et le nom du pointeur
Deacuteclaration drsquoun entier int i int p Deacuteclaration drsquoun pointeur vers un entier
Exemples de deacuteclarations de pointeurs
int pi pi est un pointeur vers un int pi deacutesigne le contenu de ladresse
float pf pf est un pointeur vers un float
char c d pc c et d sont des char pc est un pointeur vers un char
int C = 4
int p
p = ampC p reccediloit ladresse de c donc pointe sur c
cout ltlt p = ltltpltltendl
cout ltlt p = ltltp ltltendl
cout ltlt (ampC) ltlt(ampC)
p = 4
p = 0x12FF7C
(ampC) = 4
Ladresse de C est ampC
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
9
++- 17 M BENJELLOUN 2015 UMONS
Les structures de controcircle
Alternative if-else
Iteacuterations for while do-while
Rupture de Controcircle break continue return hellip
Choix Multiple switch-case
Bloc 1
drsquoinstructions
Bloc 2
drsquoinstructions
oui non
Suite du programme
oui non
Suite du
programme Bloc
drsquoinstructions
Condition
vraie
oui
non
Bloc
drsquoinstructions
programme
Condition vraie
Suite du programme
programme
Condition
vraie
if-else while
do-while
++- 18 M BENJELLOUN 2015 UMONS
Les deacutecisions - if hellip else
if (Condition vraie)
BLOC 1 DINSTRUCTIONS
else
BLOC 2 DINSTRUCTIONS
Bloc 1
drsquoinstructions
Bloc 2
drsquoinstructions
oui non
Suite du programme
programme
Condition
vraie
if (Condition vraie)
instruction 1
instruction 2
else
instruction 3
instruction 4
Bloc 1
drsquoinstructions
oui non
Suite du programme
Condition
vraie
if (Condition vraie)
instruction 1
instruction 2
instruction 3 hellip
instruction N
if (Condition vraie)
instruction 1
if ( temperature gt 700)
cout ltlt Alarme ltltendl
if (Condition vraie)
instruction A
else
instruction B
if (altb) min=a
else min=b
if (i) if (i = 0)
10
++- 19 M BENJELLOUN 2015 UMONS
if ( ltexpr1gt )
ltbloc1gt
else if (ltexpr2gt)
ltbloc2gt
else if (ltexpr3gt)
ltbloc3gt
else if (ltexprNgt)
ltblocNgt
else ltblocN+1gt
if ( ltexpr1gt )
ltbloc1gt
else if (ltexpr2gt)
ltbloc2gt
else if (ltexpr3gt)
ltbloc3gt
else if (ltexprNgt)
ltblocNgt
else ltblocN+1gt
if emboicircteacutes
else est associeacute avec le if le plus proche
if(i gt= 0)
if(i gt 1000) coutltlt i gt 1000
else coutltlt i lt 0 n
if(i gt= 0)
if(i gt 1000) coutltlt i gt 1000
else coutltlt i lt 0 n
++- 20 M BENJELLOUN 2015 UMONS
for( )
Les iteacuterations ndash for
for( initialisation (Condition vraie) iteacuteration )
liste dinstructions
int i j
float K
for(i = 0 j = 2 k = 75 (i lt 20) ampamp(j==2) i++ k-=02)
int ij
for (i = 0 i lt3 i++)
coutltlt i = ltlt i ltlt endl
cout ltltendlltltendl
for(j = 5 j gt 0 j- -)
coutltlt j = ltlt j ltlt endl
i = 0
i = 1
i = 2
j = 5
j = 4
j = 3
j = 2
j = 1
boucle infinie
11
++- 21 M BENJELLOUN 2015 UMONS
La boucle TANT QUE FAIRE
Boucle preacute-testeacutee
Il sagit de linstruction while
tant que (expression vraie)
faire BLOC DINSTRUCTIONS
Organigramme
while (Condition vraie)
bloc dinstructions
Le test se fait dabord le bloc
dinstructions nest pas forceacutement exeacutecuteacute
Syntaxe
tant que pas jusqursquoagrave ce que
oui non
Suite du
programme
Condition
vraie
Bloc 1
drsquoinstructions
++- 22 M BENJELLOUN 2015 UMONS
i=1
while(ilt5)
coutltltInterieur ltlti ltlt endl
i++
coutltltExterieur ltlti ltlt endl
Exemples
Interieur 1
hellip
hellip
int j = 5
coutltltstartn
while(j == 0)
coutltltj = ltltj--ltltendl
coutltltendn
start
end
i=1
while(ilt5)
coutltltInterieur ltlti ltlt endl
i++
iteacuteration
12
++- 23 M BENJELLOUN 2015 UMONS
do while = REPETER hellip tant que
do
bloc dinstructions
while (Condition vraie) Condition
vraie
oui non
Bloc
drsquoinstructions
programme
int j = 5
do
coutltltj = ltltj--ltltendl
while(j gt 0)
cout ltltstopn
Suite du programme
(garantit lrsquoexeacutecution au moins une fois)
int j = 5
do
coutltltj = ltltj ltltendl
j--
while(j gt 0)
cout ltltstopn
j = 5
j = 4
j = 3
j = 2
j = 1
stop
++- 24 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void main()
for (char lettre = A lettre lt= M lettre++)
coutltltlettre
coutltltendl
for (float pourcent = 00 pourcent lt 05 pourcent += 01)
coutltltpourcentltltendl
for (int i=2 i lt= 3 i++)
cout ltlt Table de ltlt i ltlt ltlt endl
for (int j=0 j lt= 3 j++)
cout ltlt ltlt i ltlt ltlt j ltlt = ltlt ij ltlt endl
ABCDEFGHIJKLM
0
01
02
03
04 Table de 2 2 0 = 0 2 1 = 2 2 2 = 4 2 3 = 6 Table de 3 3 0 = 0 hellip
13
++- 25 M BENJELLOUN 2015 UMONS
include hellip
void main()
bool sortir = false
char rep
coutltltAvant la boucleltltendl
while(sortir)
coutltltDans la boucleltltendl
coutltltVoulez vous quitter (ON)ltltendl
cingtgtrep
if(rep==O)
sortir=true
coutltltApres la boucleltltendl
include hellip
void main()
bool sortir = false
char rep
coutltltAvant la boucleltltendl
do
coutltltDans la boucleltltendl
coutltltVoulez vous quitter (ON)ltltendl
cingtgtrep
if(rep==O)
sortir=true
while(sortir)
coutltltApres la boucleltltendl
++- 26 M BENJELLOUN 2015 UMONS
int i j=1
char a
for (i = -10 i lt= 10 i++)
while(j=0)
cin gtgt a if(a==x)
break
Pour rompre le deacuteroulement seacutequentiel dune suite dinstructions
Instructions deacutechappement
return (expression) permet de sortir de la fonction qui la contient
exit (expression) La fonction est interrompue lsquoexpressionrsquo un entier
indiquant le code de terminaison du processus
for (i = -10 i lt= 10 i++)
if (i == 0)
continue pour eacuteviter la division par zeacutero
cout ltlt 1 i
while (Condition vraie)
continue
break
8
14
++- 27 M BENJELLOUN 2015 UMONS
switch = AU CAS OU FAIRE
hellip
switch(variable de type char ou int) au cas ougrave la variable vaut
case valeur1 variable=valeur1 exeacutecutez ce bloc dinstructions
break
case valeur2 variable=valeur2 exeacutecutez ce bloc dinstructions
break
etc
default aucune des valeurs preacuteceacutedentes exeacutecutez ce bloc
dinstructions pas de break ici
Le bloc default nest pas obligatoire valeur1 valeur2 hellip doivent ecirctre des expressions
constantes Lrsquoinstruction switch correspond agrave une cascade drsquoinstructions if else
++- 28 M BENJELLOUN 2015 UMONS
hellip
void main( )
const float PI= 314159 float rayon = 35 float diametre circonference surface int choix
cout ltlt 1 Calculer la circonferencen cout ltlt 2 Calculer la surfacen cout ltlt 3 Calculer le diametren cout ltlt Votre choix cin gtgt choix
switch (choix) case 1 circonference = 2PIrayon break case 2 surface = PIrayonrayon break case 3 diametre = 2rayon break default cout ltlt Mauvais choixhellipn
char choix
switch(choix)
case 1 hellip
switch(i)
case 2 j
float f
switch(f)
case 2
switch instruction commode pour les menus
15
++- 29 M BENJELLOUN 2015 UMONS
Tableaux et Strings
Un tableau est une collection de variables de mecircme type appeleacutees eacuteleacutements
Type Nom_Tableau[dim]
int tab[4] deacuteclare un tableau de 4 valeurs entiegraveres tab[0] tab[1] tab[2] tab[3]
const int SIZE = 5
int A[SIZE] A est un vecteur de 5 entiers
float B[5]
int A[SIZE] = 10 20 30 40 50
int premier[] = 1 2 3 5 7 11 13
char Tab_Char[4] = A C F G
int Tab[50] = 0
int i = 10
int a[i]
int primes[]
Deacuteclaration
Initialisation
Interdiction
Constante
++- 30 M BENJELLOUN 2015 UMONS
Accegraves aux eacuteleacutements drsquoun tableau
Les eacuteleacutements sont numeacuteroteacutes de 0 agrave dim-1
Il nrsquoy a pas de veacuterification des bornes
void main()
int a[6]
int i = 7
a[0] = 9
a[5] = -10
a[i2] = 2
a[6] = 0
a[-1] = 5
0
a
1
2
3
4
5
9
2
-10
void main(void)
const int dim=6
int i
int A[dim] = 1 2 3 4 5 6
for (i=0iltdimi++)
A[i] = 2i
coutltltA[ltltiltlt]=ltltA[i]
A[0]=0 A[1]=2 A[2]=4 A[3]=6 A[4]=8 A[5]=10
16
++- 31 M BENJELLOUN 2015 UMONS
Chaicircnes de caractegraveres ou String
char Nom[dim] Initialisation
Pour terminer la chaicircne on place en fin de chaicircne le caractegravere nul 0 de code ASCII 0
Ce caractegravere est soit ajouteacute automatiquement par le compilateur soit introduit par le programmeur selon les fonctions utiliseacutees
char S[] = Hello0 H
e
l
l
o
0
S[0] S[1] S[2] S[3] S[4] S[5] char S[6] = Hello
char S[5] = Hello H e l l o
char S[] = Le main L e m a i n 0
bull Un tableau de char agrave une dimension char Nom[dim]
bull Un type speacutecial string string Nom Il faut inclure ltstringgt
++- 32 M BENJELLOUN 2015 UMONS
string Nom Il faut inclure ltstringgt
string Nom est eacutequivalente agrave string Nom = Donc par deacutefaut la chaicircne est vide
Il existe de nombreuses faccedilons drsquoinitialiser Ident par exemple
string s1 = Bonjour a vous
string s2 = s1 s2 contient Bonjour a vous
string s3(4 x) eacutequivaut agrave string s3 = xxxx
string s4(s1 4 8) s4 contient our a voldquo S1 de 4 + 8
B o n j o u r a v o u s 0 1 2 3 4 5 6 7 8 9 10 11 12 13
include ltstringgt hellip string ST = Salut char H[6] = Hello for (int i=0 ilt5 i++) cout ltlt ST[i] ltlt affichera S a l u t
for (int i=0 ilt5 i++) cout ltlt H[i] ltlt affichera H e l l o
17
++- 33 M BENJELLOUN 2015 UMONS
Pourquoi utiliser string Nom plutocirct que char Nom[dim]
char S1[6] = Salut S2[6] = Hello S3[12]
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Interdit
string S1 = Salut S2 = Hello S3
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Autoriseacute
S1= Hello
S1= Hooo
S3= HoooHello
false
++- 34 M BENJELLOUN 2015 UMONS
include ltiostreamgt
include ltstringgt traitement de string
using namespace std espace de nommage std pour importer les
symboles de la bibliothegraveque standard C++
void main(void)
string nom1 nom2 nom3
int len size
cout ltlt Donnez Nom1 cin gtgt nom1
cout ltlt Donnez Nom2 cin gtgt nom2
len = nom1length() nombre de caractegraveres dans nom1
size = nom2size() nombre de caractegraveres dans nom2
cout ltlt Nom1 ltltnom1 ltlt Dim Nom1 = ltlt len ltlt endl
cout ltlt Nom2 ltltnom2 ltlt Dim Nom2 = ltlt size ltlt endl
nom3 = nom2+ +nom1
cout ltlt Nom3 = ltlt nom3 ltlt endl
if(nom1gtnom2) cout ltlt nom1 gt nom2 ltlt endl
else if (nom1==nom2) cout ltlt nom1 = nom2 ltlt endl
else cout ltlt nom1 lt nom2 ltlt endl
nom1=nom2
cout ltlt nom1 = ltlt nom1 ltlt nom2 ltlt nom2 ltlt endl
Donnez Nom1 salut
Donnez Nom2 hello
Nom1 salut Dim Nom1 = 5
Nom2 hello Dim Nom2 = 5
Nom3 = hello salut
nom1 gt nom2
nom1 = hello nom2 hello
Donnez Nom1 csou
Donnez Nom2 pi
Nom1csou Dim Nom1 = 4
Nom2pi Dim Nom2 = 2
Nom3 = pi csou
nom1 lt nom2
nom1 = pi nom2 pi
18
++- 35 M BENJELLOUN 2015 UMONS
Algorithmes de tri
Nom de lrsquoalgorithme Complexiteacute
Tri agrave bulles Tri par seacutelection Tri par insertion Tri de Shell (shell sort) Ameacutelioration du tri par insertion Tri fusion (merge sort) Tri rapide (quick sort) Tri par tas (heap sort)
O(N2) O(N2) O(N2)
O(N log2 N)
O(N log N) O(N log N) O(N log N)
++- 36 M BENJELLOUN 2015 UMONS
Tri agrave bulles bubble sort
reacutepeacuteter permutation = FALSE commencer au deacutebut du drapeau Pour i variant de 0 agrave N ndash 2 faire si cellule [i] gt cellule [i+1] alors deacutebut permuter cellules permutation = TRUE fin jusquagrave ce que (not permutation)
Complexiteacute O(Nsup2) Proportionnel agrave Nsup2 permutations
void TriaBulles(int x[] int N) int i perm=1 tmp while (perm==1) perm =0 for (i=0iltN-1i++) if(x[i] gt x[i+1]) tmp = x[i] x[i] = x[i+1] x[i+1] = tmp perm = 1
Algorithmes de tri
19
++- 37 M BENJELLOUN 2015 UMONS
void tri_par_selection(int t[] int n) int i j min tmp for (i = 0 i lt n - 1 i++) min = i for(j = i+1 j lt n j++) if(t[j] lt t[min]) min = j if(min = i) tmp = t[i] t[i] = t[min] t[min] = tmp
Le tri par seacutelection consiste en la recherche du plus grand eacuteleacutement (le plus petit) que lon va replacer en derniegravere position (en premiegravere) puis on recherche le second plus grand eacuteleacutement (le second plus petit) que lon va replacer eacutegalement agrave sa position finale et ainsi de suite
Algorithmes de tri
++- 38 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement dans un tableau
Recherche lineacuteaire Recherche dichotomique (binary search)
0
9
1
3
2
6
3
2
4
1
5
12
6
0
Est une meacutethode efficace pour retrouver un eacuteleacutement dans un tableau trieacute
A chaque eacutetape de la recherche dichotomique lrsquointervalle de recherche est diviseacute par deux
On utilise degraves lors deux index de recherche la borne infeacuterieure et la borne supeacuterieure
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup mid
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup
On initialise les bornes inf et sup agrave la premiegravere et derniegravere valeur des index du tableau tab
respectivement
Le milieu est donneacute par
mid = (inf+sup) 2 (0+6)2 =3
Supposons que lrsquoon recherche la valeur i=6 On
compare cette valeur avec tab[mid]=8 Comme
tab[mid]gti on change mid en sup
mid = (inf+sup) 2 (0+3)2 =1
inf=1 et sup=3
hellip
20
++- 39 M BENJELLOUN 2015 UMONS
44 Eacutecrire un programme qui supprime le premier et le dernier eacuteleacutement drsquoun vecteur
vecteur initial Tab 0 1 2 3 4 5 6
sup bords 1 2 3 4 5
sup bords 2 3 4
45 Eacutecrire un programme qui supprime le milieu du tableau et ajoute son double au deacutebut
vecteur initial Tab 1 2 3 4 5
sup Aj 6 1 2 4 5
sup Aj 4 6 1 4 5
46 Codez un programme de tri agrave bulles dun vecteur de strings
47 Codez un programme de recherche dichotomique dun nombre dans un vecteur de
strings rangeacutes par ordre croissant
++- 40 M BENJELLOUN 2015 UMONS
Matrices Rangeacutees ligne par ligne
Consideacutereacutees comme des vecteurs de lignes
Accegraves aux composantes par double crochets
int a[10][5]
a[1][0] = 7
int x[2][2] = 123 4 2 lignes et 2 colonnes
1 2
3 4 include hellip
void main()
int i j tab[5][4]
for (i = 0 i lt5 i++) Saisie
for (j = 0 j lt 4 j++) tab[i][j] = i
for (i = 0 i lt5 i++) Affichage
for (j = 0 j lt 4 j++) coutltlt tab[i][j] ltlt
cout ltlt endl
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
21
++- 41 M BENJELLOUN 2015 UMONS
Affichage de la table de multiplication
++- 42 M BENJELLOUN 2015 UMONS
Fonctions en C++
Encapsule un traitement particulier formant un tout
Peut impleacutementer la notion de module en logique
Augmente la lisibiliteacute drsquoun programme
Reacutealise un objectif preacutecis
Ameacuteliore le deacutebogage et la maintenance drsquoun programme
Son utilisation se deacutecompose en trois phases
Deacutefinition de la fonction
Deacuteclaration de la fonction
Appel de la fonction
Deacuteclarer une fonction
Appeler une fonction
Regravegles de visibiliteacute des variables
Passage des paramegravetres par valeur
Fonction renvoyant une valeur au programme
Passage des paramegravetres par valeur et par adresse
Passage des tableaux aux fonctions
22
++- 43 M BENJELLOUN 2015 UMONS
Type nom_fonction(liste_param_typeacutes)
deacuteclaration de variables locales
hellip Corps de la fonction
hellip
return (valeur)
Deacutefinition drsquoune fonction
Une fonction renvoie une valeur ou rien
liste_param_typeacutes = 0 void ou plusieurs
int Somme(int x int y)
int S Variable locale agrave Somme
S= x+y
return S
void fonction1()
coutltltn fonction1 n
void fonction2() coutltltn fonction2 n
Limbrication de fonctions
nest pas autoriseacutee
Deacutefinition
++- 44 M BENJELLOUN 2015 UMONS
Fonctions pourquoi
include ltiostreamgt
using namespace std
void main()
int i j SomCar1=0 SomCar2=0 SomCar3=0
for (i = 0 i lt5 i++)
SomCar1 = SomCar1 + ii
for (i = 0 i lt10 i++)
SomCar2 = SomCar2 + ii
for (j = 0 j lt 7 j++)
SomCar3 = SomCar3 + jj
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
include ltiostreamgt
using namespace std
int Fnct_SomCar(int N)
int i S=0
for (i = 0 i ltN i++)
S = S + ii S+=ii
return S
void main()
int SomCar1 SomCar2 SomCar3
SomCar1 = Fnct_SomCar(5)
SomCar2 = Fnct_SomCar(10)
SomCar3 = Fnct_SomCar(7)
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
23
++- 45 M BENJELLOUN 2015 UMONS
hellip
int Somme(int x int y)
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
int Somme(int x int y)
int S
S= x+y
return S
hellip
int Somme(int x int y)
int S
S= x+y
return S
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
Deacuteclaration et appel drsquoune fonction
++- 46 M BENJELLOUN 2015 UMONS
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
int addition() float tmp tmp = calcule(253) + calcule(572) return (int)tmp float calcule(float C float D) return ( (C + D ) 2)
float calcule(float float)
int addition()
float calcule(float A float B) return ( (A + B ) 2)
int addition() Appel drsquoune fonction dans une fonction
float tmp tmp = calcule(253) + calcule(572) return (int)tmp
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
Deacuteclaration et appel drsquoune fonction
24
++- 47 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void Addition(int v float f)
void main()
int v = 5
float f= 45
Addition(v f) Appel de la fonction
cout ltlt n Main v et f ltlt v ltlt et ltltf
void Addition(int v float f)
cout ltlt Addition v + f = ltlt v+f ltlt endl
f = f + v
cout ltlt Addition f = ltlt f
Addition v+f = 95
Addition f = 95
Main v et f = 5 et 45
v= 5 et f=45
5+ 45
f = 95
Les paramegravetres sont copieacutes La fonction travaille sur des copies de v et de f
++- 48 M BENJELLOUN 2015 UMONS
Fonction Renvoyant une valeur au programme
include ltiostreamgt
using namespace std
int change(int X)
void main(void)
int var = 5
int valeur
valeur = return_Val (var)
cout ltltmain var = ltlt var ltlt endl
cout ltltmain valeur = ltlt valeur
int return_Val (int v)
v = 100
cout ltlt return_Val v = ltlt v ltlt endl
return (v+1)
return_Val v = 100 main var = 5 main valeur = 101
Une fonction se termine et lsquorend la mainrsquo agrave
la fonction appelante lorsque son exeacutecution
rencontre lrsquoinstruction return expression
ou return
25
++- 49 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5 valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5
int valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
cout ltlt return_Val v = ltlt vltltendl
Qursquoaffiche ce programme agrave lrsquoeacutecran Qursquoaffiche ce programme agrave lrsquoeacutecran
++- 50 M BENJELLOUN 2015 UMONS
Fonctions et reacutecursiviteacute
Tours de Hanoiuml Suite de Fibonacci
un = un-1 + un-2
u0=u1=1
Puissance entiegravere
Une fonction est dite reacutecursive lorsqursquoelle srsquoappelle elle-mecircme
int factorielle (int n )
if ( n lt 0) return (ndash1) code derreur
else if ( n == 0 ) return 1 0 = 1
else
return n factorielle( n-1 ) n = n(n-1)
a x an-1 si n gt 0
1 si n = 0
an-1 =
26
++- 51 M BENJELLOUN 2015 UMONS
Passer des tableaux aux fonctions
Les tableaux peuvent ecirctre passeacutes comme paramegravetres dune fonction
Ils ne peuvent pas ecirctre retourneacutes comme reacutesultat dune fonction
La longueur du tableau ne doit pas ecirctre deacutefinie agrave la deacuteclaration de la fonction
Un tableau peut ecirctre modifieacute dans une fonction Il est passeacute par reacutefeacuterence (adresse) et
non par valeur
include hellip
void Modif(int a[])
a[0] = 5
a[1] = 6
void main(void)
int p[2] = 1 2
cout ltlt p[0] ltlt ltlt p[1]
Modif(p)
cout ltlt p[0] ltlt ltlt p[1]
1 2
5 6
include hellip
void Modif(int x[] int n)
void main(void)
int i
int p[6] = 1 2 3 5 7 11
Modif(p 6)
for (i=0ilt6i++)
coutltlt p[i]
void Modif(int a[] int n)
int i
for(i = 0 i ltn i++)
a[i] = 5
++- 52 M BENJELLOUN 2015 UMONS
void Saisie_Mat( int tab[][4] int m int n)
int i j
for (i = 0 i ltm i++)
for (j = 0 j lt n j++)
tab[i][j] = i
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
Matrice Exemple
void Affiche_Mat( int tab[][4] int m int n)
for (int i = 0 i ltm i++)
for (int j = 0 j lt n j++)
cout ltlt tab[i][j] ltlt
cout ltlt endl
include ltiostreamgt
using namespace std
void main()
int T[5][5]
Saisie_Mat( T 4 4 )
Affiche_Mat( T 4 4 )
27
++- 53 M BENJELLOUN 2015 UMONS
include hellip
int LaSomme( )
int A[Nmax] N int S = 0
for (int i=0ilt N i++)
cout ltltEntrez A[ltltiltlt]=
cin gtgtA[i]
S= S+ A[i]
return S
void main()
const int Nmax = 7
int i A[Nmax] S=0 N=3
S = LaSomme( )
cout ltlt Affichage ltlt endl
Affichage(A N)
cout ltlt n La somme est = ltlt S
Qursquoaffiche ce programme agrave lrsquoeacutecran
void Affichage( int A[] int N)
for (int i=0i lt N i++)
cout ltlt A[ltltiltlt]=
ltltA[i] ltltendl
++- 54 M BENJELLOUN 2015 UMONS
include hellip
void Saisie_T( int tab[] )
int N i
N= 3
for (i = 0 i ltN i++) tab[i] = i
void Affiche_T(int tab[] int N )
int i
for (i = 0 i ltN i++) cout ltlt tab[i]
void main()
int T[20] n
Saisie_T( T )
Affiche_T(T n )
tab[0] = 0
tab[1] = 1
tab[2] = 2
Qursquoaffiche ce programme agrave lrsquoeacutecran
28
++- 55 M BENJELLOUN 2015 UMONS
include hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 = 7
return hellip
Comment retourner v1 et v2
++- 56 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltlt a = ltlt a ltlt endl ltlt b = ltlt b
void echange(int xint y)
int tmp
tmp = x
x = y
y =tmp
void main()
int a = 1 b = 5
cout ltlt Avant ltltendl
affiche(ab)
echange(ab)
cout ltlt nApregraves ltltendl
affiche(ab)
Avant
a = 1
b = 5
Apregraves
PASSAGE DES PARAMETRES
Transmission des arguments
Comment eacutechanger a et b
a = 1
b = 5
PAR VALEUR
29
++- 57 M BENJELLOUN 2015 UMONS
Le pointeur prend comme
valeurs des adresses de
donneacutees en meacutemoire
Types de base hellip donneacutee
8
donneacutee
35 hellip
Adr i Adr j
Meacutemoire
12FF80 12FF84
Ladresse de leacuteleacutement i est ampi i=8 et ampi= 12FF80
int i=8 j=35
Et les pointeurs
hellip p=12FF84 hellip 35 hellip
12FF84 12FF80
int p p est le contenu pointeacute par p 35
p est lrsquoadresse 12FF84
++- 58 M BENJELLOUN 2015 UMONS
Deacuteclaration de Pointeurs Le symbole est utiliseacute entre le type et le nom du pointeur
Deacuteclaration drsquoun entier int i int p Deacuteclaration drsquoun pointeur vers un entier
Exemples de deacuteclarations de pointeurs
int pi pi est un pointeur vers un int pi deacutesigne le contenu de ladresse
float pf pf est un pointeur vers un float
char c d pc c et d sont des char pc est un pointeur vers un char
int C = 4
int p
p = ampC p reccediloit ladresse de c donc pointe sur c
cout ltlt p = ltltpltltendl
cout ltlt p = ltltp ltltendl
cout ltlt (ampC) ltlt(ampC)
p = 4
p = 0x12FF7C
(ampC) = 4
Ladresse de C est ampC
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
10
++- 19 M BENJELLOUN 2015 UMONS
if ( ltexpr1gt )
ltbloc1gt
else if (ltexpr2gt)
ltbloc2gt
else if (ltexpr3gt)
ltbloc3gt
else if (ltexprNgt)
ltblocNgt
else ltblocN+1gt
if ( ltexpr1gt )
ltbloc1gt
else if (ltexpr2gt)
ltbloc2gt
else if (ltexpr3gt)
ltbloc3gt
else if (ltexprNgt)
ltblocNgt
else ltblocN+1gt
if emboicircteacutes
else est associeacute avec le if le plus proche
if(i gt= 0)
if(i gt 1000) coutltlt i gt 1000
else coutltlt i lt 0 n
if(i gt= 0)
if(i gt 1000) coutltlt i gt 1000
else coutltlt i lt 0 n
++- 20 M BENJELLOUN 2015 UMONS
for( )
Les iteacuterations ndash for
for( initialisation (Condition vraie) iteacuteration )
liste dinstructions
int i j
float K
for(i = 0 j = 2 k = 75 (i lt 20) ampamp(j==2) i++ k-=02)
int ij
for (i = 0 i lt3 i++)
coutltlt i = ltlt i ltlt endl
cout ltltendlltltendl
for(j = 5 j gt 0 j- -)
coutltlt j = ltlt j ltlt endl
i = 0
i = 1
i = 2
j = 5
j = 4
j = 3
j = 2
j = 1
boucle infinie
11
++- 21 M BENJELLOUN 2015 UMONS
La boucle TANT QUE FAIRE
Boucle preacute-testeacutee
Il sagit de linstruction while
tant que (expression vraie)
faire BLOC DINSTRUCTIONS
Organigramme
while (Condition vraie)
bloc dinstructions
Le test se fait dabord le bloc
dinstructions nest pas forceacutement exeacutecuteacute
Syntaxe
tant que pas jusqursquoagrave ce que
oui non
Suite du
programme
Condition
vraie
Bloc 1
drsquoinstructions
++- 22 M BENJELLOUN 2015 UMONS
i=1
while(ilt5)
coutltltInterieur ltlti ltlt endl
i++
coutltltExterieur ltlti ltlt endl
Exemples
Interieur 1
hellip
hellip
int j = 5
coutltltstartn
while(j == 0)
coutltltj = ltltj--ltltendl
coutltltendn
start
end
i=1
while(ilt5)
coutltltInterieur ltlti ltlt endl
i++
iteacuteration
12
++- 23 M BENJELLOUN 2015 UMONS
do while = REPETER hellip tant que
do
bloc dinstructions
while (Condition vraie) Condition
vraie
oui non
Bloc
drsquoinstructions
programme
int j = 5
do
coutltltj = ltltj--ltltendl
while(j gt 0)
cout ltltstopn
Suite du programme
(garantit lrsquoexeacutecution au moins une fois)
int j = 5
do
coutltltj = ltltj ltltendl
j--
while(j gt 0)
cout ltltstopn
j = 5
j = 4
j = 3
j = 2
j = 1
stop
++- 24 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void main()
for (char lettre = A lettre lt= M lettre++)
coutltltlettre
coutltltendl
for (float pourcent = 00 pourcent lt 05 pourcent += 01)
coutltltpourcentltltendl
for (int i=2 i lt= 3 i++)
cout ltlt Table de ltlt i ltlt ltlt endl
for (int j=0 j lt= 3 j++)
cout ltlt ltlt i ltlt ltlt j ltlt = ltlt ij ltlt endl
ABCDEFGHIJKLM
0
01
02
03
04 Table de 2 2 0 = 0 2 1 = 2 2 2 = 4 2 3 = 6 Table de 3 3 0 = 0 hellip
13
++- 25 M BENJELLOUN 2015 UMONS
include hellip
void main()
bool sortir = false
char rep
coutltltAvant la boucleltltendl
while(sortir)
coutltltDans la boucleltltendl
coutltltVoulez vous quitter (ON)ltltendl
cingtgtrep
if(rep==O)
sortir=true
coutltltApres la boucleltltendl
include hellip
void main()
bool sortir = false
char rep
coutltltAvant la boucleltltendl
do
coutltltDans la boucleltltendl
coutltltVoulez vous quitter (ON)ltltendl
cingtgtrep
if(rep==O)
sortir=true
while(sortir)
coutltltApres la boucleltltendl
++- 26 M BENJELLOUN 2015 UMONS
int i j=1
char a
for (i = -10 i lt= 10 i++)
while(j=0)
cin gtgt a if(a==x)
break
Pour rompre le deacuteroulement seacutequentiel dune suite dinstructions
Instructions deacutechappement
return (expression) permet de sortir de la fonction qui la contient
exit (expression) La fonction est interrompue lsquoexpressionrsquo un entier
indiquant le code de terminaison du processus
for (i = -10 i lt= 10 i++)
if (i == 0)
continue pour eacuteviter la division par zeacutero
cout ltlt 1 i
while (Condition vraie)
continue
break
8
14
++- 27 M BENJELLOUN 2015 UMONS
switch = AU CAS OU FAIRE
hellip
switch(variable de type char ou int) au cas ougrave la variable vaut
case valeur1 variable=valeur1 exeacutecutez ce bloc dinstructions
break
case valeur2 variable=valeur2 exeacutecutez ce bloc dinstructions
break
etc
default aucune des valeurs preacuteceacutedentes exeacutecutez ce bloc
dinstructions pas de break ici
Le bloc default nest pas obligatoire valeur1 valeur2 hellip doivent ecirctre des expressions
constantes Lrsquoinstruction switch correspond agrave une cascade drsquoinstructions if else
++- 28 M BENJELLOUN 2015 UMONS
hellip
void main( )
const float PI= 314159 float rayon = 35 float diametre circonference surface int choix
cout ltlt 1 Calculer la circonferencen cout ltlt 2 Calculer la surfacen cout ltlt 3 Calculer le diametren cout ltlt Votre choix cin gtgt choix
switch (choix) case 1 circonference = 2PIrayon break case 2 surface = PIrayonrayon break case 3 diametre = 2rayon break default cout ltlt Mauvais choixhellipn
char choix
switch(choix)
case 1 hellip
switch(i)
case 2 j
float f
switch(f)
case 2
switch instruction commode pour les menus
15
++- 29 M BENJELLOUN 2015 UMONS
Tableaux et Strings
Un tableau est une collection de variables de mecircme type appeleacutees eacuteleacutements
Type Nom_Tableau[dim]
int tab[4] deacuteclare un tableau de 4 valeurs entiegraveres tab[0] tab[1] tab[2] tab[3]
const int SIZE = 5
int A[SIZE] A est un vecteur de 5 entiers
float B[5]
int A[SIZE] = 10 20 30 40 50
int premier[] = 1 2 3 5 7 11 13
char Tab_Char[4] = A C F G
int Tab[50] = 0
int i = 10
int a[i]
int primes[]
Deacuteclaration
Initialisation
Interdiction
Constante
++- 30 M BENJELLOUN 2015 UMONS
Accegraves aux eacuteleacutements drsquoun tableau
Les eacuteleacutements sont numeacuteroteacutes de 0 agrave dim-1
Il nrsquoy a pas de veacuterification des bornes
void main()
int a[6]
int i = 7
a[0] = 9
a[5] = -10
a[i2] = 2
a[6] = 0
a[-1] = 5
0
a
1
2
3
4
5
9
2
-10
void main(void)
const int dim=6
int i
int A[dim] = 1 2 3 4 5 6
for (i=0iltdimi++)
A[i] = 2i
coutltltA[ltltiltlt]=ltltA[i]
A[0]=0 A[1]=2 A[2]=4 A[3]=6 A[4]=8 A[5]=10
16
++- 31 M BENJELLOUN 2015 UMONS
Chaicircnes de caractegraveres ou String
char Nom[dim] Initialisation
Pour terminer la chaicircne on place en fin de chaicircne le caractegravere nul 0 de code ASCII 0
Ce caractegravere est soit ajouteacute automatiquement par le compilateur soit introduit par le programmeur selon les fonctions utiliseacutees
char S[] = Hello0 H
e
l
l
o
0
S[0] S[1] S[2] S[3] S[4] S[5] char S[6] = Hello
char S[5] = Hello H e l l o
char S[] = Le main L e m a i n 0
bull Un tableau de char agrave une dimension char Nom[dim]
bull Un type speacutecial string string Nom Il faut inclure ltstringgt
++- 32 M BENJELLOUN 2015 UMONS
string Nom Il faut inclure ltstringgt
string Nom est eacutequivalente agrave string Nom = Donc par deacutefaut la chaicircne est vide
Il existe de nombreuses faccedilons drsquoinitialiser Ident par exemple
string s1 = Bonjour a vous
string s2 = s1 s2 contient Bonjour a vous
string s3(4 x) eacutequivaut agrave string s3 = xxxx
string s4(s1 4 8) s4 contient our a voldquo S1 de 4 + 8
B o n j o u r a v o u s 0 1 2 3 4 5 6 7 8 9 10 11 12 13
include ltstringgt hellip string ST = Salut char H[6] = Hello for (int i=0 ilt5 i++) cout ltlt ST[i] ltlt affichera S a l u t
for (int i=0 ilt5 i++) cout ltlt H[i] ltlt affichera H e l l o
17
++- 33 M BENJELLOUN 2015 UMONS
Pourquoi utiliser string Nom plutocirct que char Nom[dim]
char S1[6] = Salut S2[6] = Hello S3[12]
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Interdit
string S1 = Salut S2 = Hello S3
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Autoriseacute
S1= Hello
S1= Hooo
S3= HoooHello
false
++- 34 M BENJELLOUN 2015 UMONS
include ltiostreamgt
include ltstringgt traitement de string
using namespace std espace de nommage std pour importer les
symboles de la bibliothegraveque standard C++
void main(void)
string nom1 nom2 nom3
int len size
cout ltlt Donnez Nom1 cin gtgt nom1
cout ltlt Donnez Nom2 cin gtgt nom2
len = nom1length() nombre de caractegraveres dans nom1
size = nom2size() nombre de caractegraveres dans nom2
cout ltlt Nom1 ltltnom1 ltlt Dim Nom1 = ltlt len ltlt endl
cout ltlt Nom2 ltltnom2 ltlt Dim Nom2 = ltlt size ltlt endl
nom3 = nom2+ +nom1
cout ltlt Nom3 = ltlt nom3 ltlt endl
if(nom1gtnom2) cout ltlt nom1 gt nom2 ltlt endl
else if (nom1==nom2) cout ltlt nom1 = nom2 ltlt endl
else cout ltlt nom1 lt nom2 ltlt endl
nom1=nom2
cout ltlt nom1 = ltlt nom1 ltlt nom2 ltlt nom2 ltlt endl
Donnez Nom1 salut
Donnez Nom2 hello
Nom1 salut Dim Nom1 = 5
Nom2 hello Dim Nom2 = 5
Nom3 = hello salut
nom1 gt nom2
nom1 = hello nom2 hello
Donnez Nom1 csou
Donnez Nom2 pi
Nom1csou Dim Nom1 = 4
Nom2pi Dim Nom2 = 2
Nom3 = pi csou
nom1 lt nom2
nom1 = pi nom2 pi
18
++- 35 M BENJELLOUN 2015 UMONS
Algorithmes de tri
Nom de lrsquoalgorithme Complexiteacute
Tri agrave bulles Tri par seacutelection Tri par insertion Tri de Shell (shell sort) Ameacutelioration du tri par insertion Tri fusion (merge sort) Tri rapide (quick sort) Tri par tas (heap sort)
O(N2) O(N2) O(N2)
O(N log2 N)
O(N log N) O(N log N) O(N log N)
++- 36 M BENJELLOUN 2015 UMONS
Tri agrave bulles bubble sort
reacutepeacuteter permutation = FALSE commencer au deacutebut du drapeau Pour i variant de 0 agrave N ndash 2 faire si cellule [i] gt cellule [i+1] alors deacutebut permuter cellules permutation = TRUE fin jusquagrave ce que (not permutation)
Complexiteacute O(Nsup2) Proportionnel agrave Nsup2 permutations
void TriaBulles(int x[] int N) int i perm=1 tmp while (perm==1) perm =0 for (i=0iltN-1i++) if(x[i] gt x[i+1]) tmp = x[i] x[i] = x[i+1] x[i+1] = tmp perm = 1
Algorithmes de tri
19
++- 37 M BENJELLOUN 2015 UMONS
void tri_par_selection(int t[] int n) int i j min tmp for (i = 0 i lt n - 1 i++) min = i for(j = i+1 j lt n j++) if(t[j] lt t[min]) min = j if(min = i) tmp = t[i] t[i] = t[min] t[min] = tmp
Le tri par seacutelection consiste en la recherche du plus grand eacuteleacutement (le plus petit) que lon va replacer en derniegravere position (en premiegravere) puis on recherche le second plus grand eacuteleacutement (le second plus petit) que lon va replacer eacutegalement agrave sa position finale et ainsi de suite
Algorithmes de tri
++- 38 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement dans un tableau
Recherche lineacuteaire Recherche dichotomique (binary search)
0
9
1
3
2
6
3
2
4
1
5
12
6
0
Est une meacutethode efficace pour retrouver un eacuteleacutement dans un tableau trieacute
A chaque eacutetape de la recherche dichotomique lrsquointervalle de recherche est diviseacute par deux
On utilise degraves lors deux index de recherche la borne infeacuterieure et la borne supeacuterieure
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup mid
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup
On initialise les bornes inf et sup agrave la premiegravere et derniegravere valeur des index du tableau tab
respectivement
Le milieu est donneacute par
mid = (inf+sup) 2 (0+6)2 =3
Supposons que lrsquoon recherche la valeur i=6 On
compare cette valeur avec tab[mid]=8 Comme
tab[mid]gti on change mid en sup
mid = (inf+sup) 2 (0+3)2 =1
inf=1 et sup=3
hellip
20
++- 39 M BENJELLOUN 2015 UMONS
44 Eacutecrire un programme qui supprime le premier et le dernier eacuteleacutement drsquoun vecteur
vecteur initial Tab 0 1 2 3 4 5 6
sup bords 1 2 3 4 5
sup bords 2 3 4
45 Eacutecrire un programme qui supprime le milieu du tableau et ajoute son double au deacutebut
vecteur initial Tab 1 2 3 4 5
sup Aj 6 1 2 4 5
sup Aj 4 6 1 4 5
46 Codez un programme de tri agrave bulles dun vecteur de strings
47 Codez un programme de recherche dichotomique dun nombre dans un vecteur de
strings rangeacutes par ordre croissant
++- 40 M BENJELLOUN 2015 UMONS
Matrices Rangeacutees ligne par ligne
Consideacutereacutees comme des vecteurs de lignes
Accegraves aux composantes par double crochets
int a[10][5]
a[1][0] = 7
int x[2][2] = 123 4 2 lignes et 2 colonnes
1 2
3 4 include hellip
void main()
int i j tab[5][4]
for (i = 0 i lt5 i++) Saisie
for (j = 0 j lt 4 j++) tab[i][j] = i
for (i = 0 i lt5 i++) Affichage
for (j = 0 j lt 4 j++) coutltlt tab[i][j] ltlt
cout ltlt endl
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
21
++- 41 M BENJELLOUN 2015 UMONS
Affichage de la table de multiplication
++- 42 M BENJELLOUN 2015 UMONS
Fonctions en C++
Encapsule un traitement particulier formant un tout
Peut impleacutementer la notion de module en logique
Augmente la lisibiliteacute drsquoun programme
Reacutealise un objectif preacutecis
Ameacuteliore le deacutebogage et la maintenance drsquoun programme
Son utilisation se deacutecompose en trois phases
Deacutefinition de la fonction
Deacuteclaration de la fonction
Appel de la fonction
Deacuteclarer une fonction
Appeler une fonction
Regravegles de visibiliteacute des variables
Passage des paramegravetres par valeur
Fonction renvoyant une valeur au programme
Passage des paramegravetres par valeur et par adresse
Passage des tableaux aux fonctions
22
++- 43 M BENJELLOUN 2015 UMONS
Type nom_fonction(liste_param_typeacutes)
deacuteclaration de variables locales
hellip Corps de la fonction
hellip
return (valeur)
Deacutefinition drsquoune fonction
Une fonction renvoie une valeur ou rien
liste_param_typeacutes = 0 void ou plusieurs
int Somme(int x int y)
int S Variable locale agrave Somme
S= x+y
return S
void fonction1()
coutltltn fonction1 n
void fonction2() coutltltn fonction2 n
Limbrication de fonctions
nest pas autoriseacutee
Deacutefinition
++- 44 M BENJELLOUN 2015 UMONS
Fonctions pourquoi
include ltiostreamgt
using namespace std
void main()
int i j SomCar1=0 SomCar2=0 SomCar3=0
for (i = 0 i lt5 i++)
SomCar1 = SomCar1 + ii
for (i = 0 i lt10 i++)
SomCar2 = SomCar2 + ii
for (j = 0 j lt 7 j++)
SomCar3 = SomCar3 + jj
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
include ltiostreamgt
using namespace std
int Fnct_SomCar(int N)
int i S=0
for (i = 0 i ltN i++)
S = S + ii S+=ii
return S
void main()
int SomCar1 SomCar2 SomCar3
SomCar1 = Fnct_SomCar(5)
SomCar2 = Fnct_SomCar(10)
SomCar3 = Fnct_SomCar(7)
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
23
++- 45 M BENJELLOUN 2015 UMONS
hellip
int Somme(int x int y)
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
int Somme(int x int y)
int S
S= x+y
return S
hellip
int Somme(int x int y)
int S
S= x+y
return S
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
Deacuteclaration et appel drsquoune fonction
++- 46 M BENJELLOUN 2015 UMONS
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
int addition() float tmp tmp = calcule(253) + calcule(572) return (int)tmp float calcule(float C float D) return ( (C + D ) 2)
float calcule(float float)
int addition()
float calcule(float A float B) return ( (A + B ) 2)
int addition() Appel drsquoune fonction dans une fonction
float tmp tmp = calcule(253) + calcule(572) return (int)tmp
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
Deacuteclaration et appel drsquoune fonction
24
++- 47 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void Addition(int v float f)
void main()
int v = 5
float f= 45
Addition(v f) Appel de la fonction
cout ltlt n Main v et f ltlt v ltlt et ltltf
void Addition(int v float f)
cout ltlt Addition v + f = ltlt v+f ltlt endl
f = f + v
cout ltlt Addition f = ltlt f
Addition v+f = 95
Addition f = 95
Main v et f = 5 et 45
v= 5 et f=45
5+ 45
f = 95
Les paramegravetres sont copieacutes La fonction travaille sur des copies de v et de f
++- 48 M BENJELLOUN 2015 UMONS
Fonction Renvoyant une valeur au programme
include ltiostreamgt
using namespace std
int change(int X)
void main(void)
int var = 5
int valeur
valeur = return_Val (var)
cout ltltmain var = ltlt var ltlt endl
cout ltltmain valeur = ltlt valeur
int return_Val (int v)
v = 100
cout ltlt return_Val v = ltlt v ltlt endl
return (v+1)
return_Val v = 100 main var = 5 main valeur = 101
Une fonction se termine et lsquorend la mainrsquo agrave
la fonction appelante lorsque son exeacutecution
rencontre lrsquoinstruction return expression
ou return
25
++- 49 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5 valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5
int valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
cout ltlt return_Val v = ltlt vltltendl
Qursquoaffiche ce programme agrave lrsquoeacutecran Qursquoaffiche ce programme agrave lrsquoeacutecran
++- 50 M BENJELLOUN 2015 UMONS
Fonctions et reacutecursiviteacute
Tours de Hanoiuml Suite de Fibonacci
un = un-1 + un-2
u0=u1=1
Puissance entiegravere
Une fonction est dite reacutecursive lorsqursquoelle srsquoappelle elle-mecircme
int factorielle (int n )
if ( n lt 0) return (ndash1) code derreur
else if ( n == 0 ) return 1 0 = 1
else
return n factorielle( n-1 ) n = n(n-1)
a x an-1 si n gt 0
1 si n = 0
an-1 =
26
++- 51 M BENJELLOUN 2015 UMONS
Passer des tableaux aux fonctions
Les tableaux peuvent ecirctre passeacutes comme paramegravetres dune fonction
Ils ne peuvent pas ecirctre retourneacutes comme reacutesultat dune fonction
La longueur du tableau ne doit pas ecirctre deacutefinie agrave la deacuteclaration de la fonction
Un tableau peut ecirctre modifieacute dans une fonction Il est passeacute par reacutefeacuterence (adresse) et
non par valeur
include hellip
void Modif(int a[])
a[0] = 5
a[1] = 6
void main(void)
int p[2] = 1 2
cout ltlt p[0] ltlt ltlt p[1]
Modif(p)
cout ltlt p[0] ltlt ltlt p[1]
1 2
5 6
include hellip
void Modif(int x[] int n)
void main(void)
int i
int p[6] = 1 2 3 5 7 11
Modif(p 6)
for (i=0ilt6i++)
coutltlt p[i]
void Modif(int a[] int n)
int i
for(i = 0 i ltn i++)
a[i] = 5
++- 52 M BENJELLOUN 2015 UMONS
void Saisie_Mat( int tab[][4] int m int n)
int i j
for (i = 0 i ltm i++)
for (j = 0 j lt n j++)
tab[i][j] = i
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
Matrice Exemple
void Affiche_Mat( int tab[][4] int m int n)
for (int i = 0 i ltm i++)
for (int j = 0 j lt n j++)
cout ltlt tab[i][j] ltlt
cout ltlt endl
include ltiostreamgt
using namespace std
void main()
int T[5][5]
Saisie_Mat( T 4 4 )
Affiche_Mat( T 4 4 )
27
++- 53 M BENJELLOUN 2015 UMONS
include hellip
int LaSomme( )
int A[Nmax] N int S = 0
for (int i=0ilt N i++)
cout ltltEntrez A[ltltiltlt]=
cin gtgtA[i]
S= S+ A[i]
return S
void main()
const int Nmax = 7
int i A[Nmax] S=0 N=3
S = LaSomme( )
cout ltlt Affichage ltlt endl
Affichage(A N)
cout ltlt n La somme est = ltlt S
Qursquoaffiche ce programme agrave lrsquoeacutecran
void Affichage( int A[] int N)
for (int i=0i lt N i++)
cout ltlt A[ltltiltlt]=
ltltA[i] ltltendl
++- 54 M BENJELLOUN 2015 UMONS
include hellip
void Saisie_T( int tab[] )
int N i
N= 3
for (i = 0 i ltN i++) tab[i] = i
void Affiche_T(int tab[] int N )
int i
for (i = 0 i ltN i++) cout ltlt tab[i]
void main()
int T[20] n
Saisie_T( T )
Affiche_T(T n )
tab[0] = 0
tab[1] = 1
tab[2] = 2
Qursquoaffiche ce programme agrave lrsquoeacutecran
28
++- 55 M BENJELLOUN 2015 UMONS
include hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 = 7
return hellip
Comment retourner v1 et v2
++- 56 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltlt a = ltlt a ltlt endl ltlt b = ltlt b
void echange(int xint y)
int tmp
tmp = x
x = y
y =tmp
void main()
int a = 1 b = 5
cout ltlt Avant ltltendl
affiche(ab)
echange(ab)
cout ltlt nApregraves ltltendl
affiche(ab)
Avant
a = 1
b = 5
Apregraves
PASSAGE DES PARAMETRES
Transmission des arguments
Comment eacutechanger a et b
a = 1
b = 5
PAR VALEUR
29
++- 57 M BENJELLOUN 2015 UMONS
Le pointeur prend comme
valeurs des adresses de
donneacutees en meacutemoire
Types de base hellip donneacutee
8
donneacutee
35 hellip
Adr i Adr j
Meacutemoire
12FF80 12FF84
Ladresse de leacuteleacutement i est ampi i=8 et ampi= 12FF80
int i=8 j=35
Et les pointeurs
hellip p=12FF84 hellip 35 hellip
12FF84 12FF80
int p p est le contenu pointeacute par p 35
p est lrsquoadresse 12FF84
++- 58 M BENJELLOUN 2015 UMONS
Deacuteclaration de Pointeurs Le symbole est utiliseacute entre le type et le nom du pointeur
Deacuteclaration drsquoun entier int i int p Deacuteclaration drsquoun pointeur vers un entier
Exemples de deacuteclarations de pointeurs
int pi pi est un pointeur vers un int pi deacutesigne le contenu de ladresse
float pf pf est un pointeur vers un float
char c d pc c et d sont des char pc est un pointeur vers un char
int C = 4
int p
p = ampC p reccediloit ladresse de c donc pointe sur c
cout ltlt p = ltltpltltendl
cout ltlt p = ltltp ltltendl
cout ltlt (ampC) ltlt(ampC)
p = 4
p = 0x12FF7C
(ampC) = 4
Ladresse de C est ampC
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
11
++- 21 M BENJELLOUN 2015 UMONS
La boucle TANT QUE FAIRE
Boucle preacute-testeacutee
Il sagit de linstruction while
tant que (expression vraie)
faire BLOC DINSTRUCTIONS
Organigramme
while (Condition vraie)
bloc dinstructions
Le test se fait dabord le bloc
dinstructions nest pas forceacutement exeacutecuteacute
Syntaxe
tant que pas jusqursquoagrave ce que
oui non
Suite du
programme
Condition
vraie
Bloc 1
drsquoinstructions
++- 22 M BENJELLOUN 2015 UMONS
i=1
while(ilt5)
coutltltInterieur ltlti ltlt endl
i++
coutltltExterieur ltlti ltlt endl
Exemples
Interieur 1
hellip
hellip
int j = 5
coutltltstartn
while(j == 0)
coutltltj = ltltj--ltltendl
coutltltendn
start
end
i=1
while(ilt5)
coutltltInterieur ltlti ltlt endl
i++
iteacuteration
12
++- 23 M BENJELLOUN 2015 UMONS
do while = REPETER hellip tant que
do
bloc dinstructions
while (Condition vraie) Condition
vraie
oui non
Bloc
drsquoinstructions
programme
int j = 5
do
coutltltj = ltltj--ltltendl
while(j gt 0)
cout ltltstopn
Suite du programme
(garantit lrsquoexeacutecution au moins une fois)
int j = 5
do
coutltltj = ltltj ltltendl
j--
while(j gt 0)
cout ltltstopn
j = 5
j = 4
j = 3
j = 2
j = 1
stop
++- 24 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void main()
for (char lettre = A lettre lt= M lettre++)
coutltltlettre
coutltltendl
for (float pourcent = 00 pourcent lt 05 pourcent += 01)
coutltltpourcentltltendl
for (int i=2 i lt= 3 i++)
cout ltlt Table de ltlt i ltlt ltlt endl
for (int j=0 j lt= 3 j++)
cout ltlt ltlt i ltlt ltlt j ltlt = ltlt ij ltlt endl
ABCDEFGHIJKLM
0
01
02
03
04 Table de 2 2 0 = 0 2 1 = 2 2 2 = 4 2 3 = 6 Table de 3 3 0 = 0 hellip
13
++- 25 M BENJELLOUN 2015 UMONS
include hellip
void main()
bool sortir = false
char rep
coutltltAvant la boucleltltendl
while(sortir)
coutltltDans la boucleltltendl
coutltltVoulez vous quitter (ON)ltltendl
cingtgtrep
if(rep==O)
sortir=true
coutltltApres la boucleltltendl
include hellip
void main()
bool sortir = false
char rep
coutltltAvant la boucleltltendl
do
coutltltDans la boucleltltendl
coutltltVoulez vous quitter (ON)ltltendl
cingtgtrep
if(rep==O)
sortir=true
while(sortir)
coutltltApres la boucleltltendl
++- 26 M BENJELLOUN 2015 UMONS
int i j=1
char a
for (i = -10 i lt= 10 i++)
while(j=0)
cin gtgt a if(a==x)
break
Pour rompre le deacuteroulement seacutequentiel dune suite dinstructions
Instructions deacutechappement
return (expression) permet de sortir de la fonction qui la contient
exit (expression) La fonction est interrompue lsquoexpressionrsquo un entier
indiquant le code de terminaison du processus
for (i = -10 i lt= 10 i++)
if (i == 0)
continue pour eacuteviter la division par zeacutero
cout ltlt 1 i
while (Condition vraie)
continue
break
8
14
++- 27 M BENJELLOUN 2015 UMONS
switch = AU CAS OU FAIRE
hellip
switch(variable de type char ou int) au cas ougrave la variable vaut
case valeur1 variable=valeur1 exeacutecutez ce bloc dinstructions
break
case valeur2 variable=valeur2 exeacutecutez ce bloc dinstructions
break
etc
default aucune des valeurs preacuteceacutedentes exeacutecutez ce bloc
dinstructions pas de break ici
Le bloc default nest pas obligatoire valeur1 valeur2 hellip doivent ecirctre des expressions
constantes Lrsquoinstruction switch correspond agrave une cascade drsquoinstructions if else
++- 28 M BENJELLOUN 2015 UMONS
hellip
void main( )
const float PI= 314159 float rayon = 35 float diametre circonference surface int choix
cout ltlt 1 Calculer la circonferencen cout ltlt 2 Calculer la surfacen cout ltlt 3 Calculer le diametren cout ltlt Votre choix cin gtgt choix
switch (choix) case 1 circonference = 2PIrayon break case 2 surface = PIrayonrayon break case 3 diametre = 2rayon break default cout ltlt Mauvais choixhellipn
char choix
switch(choix)
case 1 hellip
switch(i)
case 2 j
float f
switch(f)
case 2
switch instruction commode pour les menus
15
++- 29 M BENJELLOUN 2015 UMONS
Tableaux et Strings
Un tableau est une collection de variables de mecircme type appeleacutees eacuteleacutements
Type Nom_Tableau[dim]
int tab[4] deacuteclare un tableau de 4 valeurs entiegraveres tab[0] tab[1] tab[2] tab[3]
const int SIZE = 5
int A[SIZE] A est un vecteur de 5 entiers
float B[5]
int A[SIZE] = 10 20 30 40 50
int premier[] = 1 2 3 5 7 11 13
char Tab_Char[4] = A C F G
int Tab[50] = 0
int i = 10
int a[i]
int primes[]
Deacuteclaration
Initialisation
Interdiction
Constante
++- 30 M BENJELLOUN 2015 UMONS
Accegraves aux eacuteleacutements drsquoun tableau
Les eacuteleacutements sont numeacuteroteacutes de 0 agrave dim-1
Il nrsquoy a pas de veacuterification des bornes
void main()
int a[6]
int i = 7
a[0] = 9
a[5] = -10
a[i2] = 2
a[6] = 0
a[-1] = 5
0
a
1
2
3
4
5
9
2
-10
void main(void)
const int dim=6
int i
int A[dim] = 1 2 3 4 5 6
for (i=0iltdimi++)
A[i] = 2i
coutltltA[ltltiltlt]=ltltA[i]
A[0]=0 A[1]=2 A[2]=4 A[3]=6 A[4]=8 A[5]=10
16
++- 31 M BENJELLOUN 2015 UMONS
Chaicircnes de caractegraveres ou String
char Nom[dim] Initialisation
Pour terminer la chaicircne on place en fin de chaicircne le caractegravere nul 0 de code ASCII 0
Ce caractegravere est soit ajouteacute automatiquement par le compilateur soit introduit par le programmeur selon les fonctions utiliseacutees
char S[] = Hello0 H
e
l
l
o
0
S[0] S[1] S[2] S[3] S[4] S[5] char S[6] = Hello
char S[5] = Hello H e l l o
char S[] = Le main L e m a i n 0
bull Un tableau de char agrave une dimension char Nom[dim]
bull Un type speacutecial string string Nom Il faut inclure ltstringgt
++- 32 M BENJELLOUN 2015 UMONS
string Nom Il faut inclure ltstringgt
string Nom est eacutequivalente agrave string Nom = Donc par deacutefaut la chaicircne est vide
Il existe de nombreuses faccedilons drsquoinitialiser Ident par exemple
string s1 = Bonjour a vous
string s2 = s1 s2 contient Bonjour a vous
string s3(4 x) eacutequivaut agrave string s3 = xxxx
string s4(s1 4 8) s4 contient our a voldquo S1 de 4 + 8
B o n j o u r a v o u s 0 1 2 3 4 5 6 7 8 9 10 11 12 13
include ltstringgt hellip string ST = Salut char H[6] = Hello for (int i=0 ilt5 i++) cout ltlt ST[i] ltlt affichera S a l u t
for (int i=0 ilt5 i++) cout ltlt H[i] ltlt affichera H e l l o
17
++- 33 M BENJELLOUN 2015 UMONS
Pourquoi utiliser string Nom plutocirct que char Nom[dim]
char S1[6] = Salut S2[6] = Hello S3[12]
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Interdit
string S1 = Salut S2 = Hello S3
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Autoriseacute
S1= Hello
S1= Hooo
S3= HoooHello
false
++- 34 M BENJELLOUN 2015 UMONS
include ltiostreamgt
include ltstringgt traitement de string
using namespace std espace de nommage std pour importer les
symboles de la bibliothegraveque standard C++
void main(void)
string nom1 nom2 nom3
int len size
cout ltlt Donnez Nom1 cin gtgt nom1
cout ltlt Donnez Nom2 cin gtgt nom2
len = nom1length() nombre de caractegraveres dans nom1
size = nom2size() nombre de caractegraveres dans nom2
cout ltlt Nom1 ltltnom1 ltlt Dim Nom1 = ltlt len ltlt endl
cout ltlt Nom2 ltltnom2 ltlt Dim Nom2 = ltlt size ltlt endl
nom3 = nom2+ +nom1
cout ltlt Nom3 = ltlt nom3 ltlt endl
if(nom1gtnom2) cout ltlt nom1 gt nom2 ltlt endl
else if (nom1==nom2) cout ltlt nom1 = nom2 ltlt endl
else cout ltlt nom1 lt nom2 ltlt endl
nom1=nom2
cout ltlt nom1 = ltlt nom1 ltlt nom2 ltlt nom2 ltlt endl
Donnez Nom1 salut
Donnez Nom2 hello
Nom1 salut Dim Nom1 = 5
Nom2 hello Dim Nom2 = 5
Nom3 = hello salut
nom1 gt nom2
nom1 = hello nom2 hello
Donnez Nom1 csou
Donnez Nom2 pi
Nom1csou Dim Nom1 = 4
Nom2pi Dim Nom2 = 2
Nom3 = pi csou
nom1 lt nom2
nom1 = pi nom2 pi
18
++- 35 M BENJELLOUN 2015 UMONS
Algorithmes de tri
Nom de lrsquoalgorithme Complexiteacute
Tri agrave bulles Tri par seacutelection Tri par insertion Tri de Shell (shell sort) Ameacutelioration du tri par insertion Tri fusion (merge sort) Tri rapide (quick sort) Tri par tas (heap sort)
O(N2) O(N2) O(N2)
O(N log2 N)
O(N log N) O(N log N) O(N log N)
++- 36 M BENJELLOUN 2015 UMONS
Tri agrave bulles bubble sort
reacutepeacuteter permutation = FALSE commencer au deacutebut du drapeau Pour i variant de 0 agrave N ndash 2 faire si cellule [i] gt cellule [i+1] alors deacutebut permuter cellules permutation = TRUE fin jusquagrave ce que (not permutation)
Complexiteacute O(Nsup2) Proportionnel agrave Nsup2 permutations
void TriaBulles(int x[] int N) int i perm=1 tmp while (perm==1) perm =0 for (i=0iltN-1i++) if(x[i] gt x[i+1]) tmp = x[i] x[i] = x[i+1] x[i+1] = tmp perm = 1
Algorithmes de tri
19
++- 37 M BENJELLOUN 2015 UMONS
void tri_par_selection(int t[] int n) int i j min tmp for (i = 0 i lt n - 1 i++) min = i for(j = i+1 j lt n j++) if(t[j] lt t[min]) min = j if(min = i) tmp = t[i] t[i] = t[min] t[min] = tmp
Le tri par seacutelection consiste en la recherche du plus grand eacuteleacutement (le plus petit) que lon va replacer en derniegravere position (en premiegravere) puis on recherche le second plus grand eacuteleacutement (le second plus petit) que lon va replacer eacutegalement agrave sa position finale et ainsi de suite
Algorithmes de tri
++- 38 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement dans un tableau
Recherche lineacuteaire Recherche dichotomique (binary search)
0
9
1
3
2
6
3
2
4
1
5
12
6
0
Est une meacutethode efficace pour retrouver un eacuteleacutement dans un tableau trieacute
A chaque eacutetape de la recherche dichotomique lrsquointervalle de recherche est diviseacute par deux
On utilise degraves lors deux index de recherche la borne infeacuterieure et la borne supeacuterieure
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup mid
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup
On initialise les bornes inf et sup agrave la premiegravere et derniegravere valeur des index du tableau tab
respectivement
Le milieu est donneacute par
mid = (inf+sup) 2 (0+6)2 =3
Supposons que lrsquoon recherche la valeur i=6 On
compare cette valeur avec tab[mid]=8 Comme
tab[mid]gti on change mid en sup
mid = (inf+sup) 2 (0+3)2 =1
inf=1 et sup=3
hellip
20
++- 39 M BENJELLOUN 2015 UMONS
44 Eacutecrire un programme qui supprime le premier et le dernier eacuteleacutement drsquoun vecteur
vecteur initial Tab 0 1 2 3 4 5 6
sup bords 1 2 3 4 5
sup bords 2 3 4
45 Eacutecrire un programme qui supprime le milieu du tableau et ajoute son double au deacutebut
vecteur initial Tab 1 2 3 4 5
sup Aj 6 1 2 4 5
sup Aj 4 6 1 4 5
46 Codez un programme de tri agrave bulles dun vecteur de strings
47 Codez un programme de recherche dichotomique dun nombre dans un vecteur de
strings rangeacutes par ordre croissant
++- 40 M BENJELLOUN 2015 UMONS
Matrices Rangeacutees ligne par ligne
Consideacutereacutees comme des vecteurs de lignes
Accegraves aux composantes par double crochets
int a[10][5]
a[1][0] = 7
int x[2][2] = 123 4 2 lignes et 2 colonnes
1 2
3 4 include hellip
void main()
int i j tab[5][4]
for (i = 0 i lt5 i++) Saisie
for (j = 0 j lt 4 j++) tab[i][j] = i
for (i = 0 i lt5 i++) Affichage
for (j = 0 j lt 4 j++) coutltlt tab[i][j] ltlt
cout ltlt endl
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
21
++- 41 M BENJELLOUN 2015 UMONS
Affichage de la table de multiplication
++- 42 M BENJELLOUN 2015 UMONS
Fonctions en C++
Encapsule un traitement particulier formant un tout
Peut impleacutementer la notion de module en logique
Augmente la lisibiliteacute drsquoun programme
Reacutealise un objectif preacutecis
Ameacuteliore le deacutebogage et la maintenance drsquoun programme
Son utilisation se deacutecompose en trois phases
Deacutefinition de la fonction
Deacuteclaration de la fonction
Appel de la fonction
Deacuteclarer une fonction
Appeler une fonction
Regravegles de visibiliteacute des variables
Passage des paramegravetres par valeur
Fonction renvoyant une valeur au programme
Passage des paramegravetres par valeur et par adresse
Passage des tableaux aux fonctions
22
++- 43 M BENJELLOUN 2015 UMONS
Type nom_fonction(liste_param_typeacutes)
deacuteclaration de variables locales
hellip Corps de la fonction
hellip
return (valeur)
Deacutefinition drsquoune fonction
Une fonction renvoie une valeur ou rien
liste_param_typeacutes = 0 void ou plusieurs
int Somme(int x int y)
int S Variable locale agrave Somme
S= x+y
return S
void fonction1()
coutltltn fonction1 n
void fonction2() coutltltn fonction2 n
Limbrication de fonctions
nest pas autoriseacutee
Deacutefinition
++- 44 M BENJELLOUN 2015 UMONS
Fonctions pourquoi
include ltiostreamgt
using namespace std
void main()
int i j SomCar1=0 SomCar2=0 SomCar3=0
for (i = 0 i lt5 i++)
SomCar1 = SomCar1 + ii
for (i = 0 i lt10 i++)
SomCar2 = SomCar2 + ii
for (j = 0 j lt 7 j++)
SomCar3 = SomCar3 + jj
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
include ltiostreamgt
using namespace std
int Fnct_SomCar(int N)
int i S=0
for (i = 0 i ltN i++)
S = S + ii S+=ii
return S
void main()
int SomCar1 SomCar2 SomCar3
SomCar1 = Fnct_SomCar(5)
SomCar2 = Fnct_SomCar(10)
SomCar3 = Fnct_SomCar(7)
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
23
++- 45 M BENJELLOUN 2015 UMONS
hellip
int Somme(int x int y)
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
int Somme(int x int y)
int S
S= x+y
return S
hellip
int Somme(int x int y)
int S
S= x+y
return S
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
Deacuteclaration et appel drsquoune fonction
++- 46 M BENJELLOUN 2015 UMONS
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
int addition() float tmp tmp = calcule(253) + calcule(572) return (int)tmp float calcule(float C float D) return ( (C + D ) 2)
float calcule(float float)
int addition()
float calcule(float A float B) return ( (A + B ) 2)
int addition() Appel drsquoune fonction dans une fonction
float tmp tmp = calcule(253) + calcule(572) return (int)tmp
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
Deacuteclaration et appel drsquoune fonction
24
++- 47 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void Addition(int v float f)
void main()
int v = 5
float f= 45
Addition(v f) Appel de la fonction
cout ltlt n Main v et f ltlt v ltlt et ltltf
void Addition(int v float f)
cout ltlt Addition v + f = ltlt v+f ltlt endl
f = f + v
cout ltlt Addition f = ltlt f
Addition v+f = 95
Addition f = 95
Main v et f = 5 et 45
v= 5 et f=45
5+ 45
f = 95
Les paramegravetres sont copieacutes La fonction travaille sur des copies de v et de f
++- 48 M BENJELLOUN 2015 UMONS
Fonction Renvoyant une valeur au programme
include ltiostreamgt
using namespace std
int change(int X)
void main(void)
int var = 5
int valeur
valeur = return_Val (var)
cout ltltmain var = ltlt var ltlt endl
cout ltltmain valeur = ltlt valeur
int return_Val (int v)
v = 100
cout ltlt return_Val v = ltlt v ltlt endl
return (v+1)
return_Val v = 100 main var = 5 main valeur = 101
Une fonction se termine et lsquorend la mainrsquo agrave
la fonction appelante lorsque son exeacutecution
rencontre lrsquoinstruction return expression
ou return
25
++- 49 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5 valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5
int valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
cout ltlt return_Val v = ltlt vltltendl
Qursquoaffiche ce programme agrave lrsquoeacutecran Qursquoaffiche ce programme agrave lrsquoeacutecran
++- 50 M BENJELLOUN 2015 UMONS
Fonctions et reacutecursiviteacute
Tours de Hanoiuml Suite de Fibonacci
un = un-1 + un-2
u0=u1=1
Puissance entiegravere
Une fonction est dite reacutecursive lorsqursquoelle srsquoappelle elle-mecircme
int factorielle (int n )
if ( n lt 0) return (ndash1) code derreur
else if ( n == 0 ) return 1 0 = 1
else
return n factorielle( n-1 ) n = n(n-1)
a x an-1 si n gt 0
1 si n = 0
an-1 =
26
++- 51 M BENJELLOUN 2015 UMONS
Passer des tableaux aux fonctions
Les tableaux peuvent ecirctre passeacutes comme paramegravetres dune fonction
Ils ne peuvent pas ecirctre retourneacutes comme reacutesultat dune fonction
La longueur du tableau ne doit pas ecirctre deacutefinie agrave la deacuteclaration de la fonction
Un tableau peut ecirctre modifieacute dans une fonction Il est passeacute par reacutefeacuterence (adresse) et
non par valeur
include hellip
void Modif(int a[])
a[0] = 5
a[1] = 6
void main(void)
int p[2] = 1 2
cout ltlt p[0] ltlt ltlt p[1]
Modif(p)
cout ltlt p[0] ltlt ltlt p[1]
1 2
5 6
include hellip
void Modif(int x[] int n)
void main(void)
int i
int p[6] = 1 2 3 5 7 11
Modif(p 6)
for (i=0ilt6i++)
coutltlt p[i]
void Modif(int a[] int n)
int i
for(i = 0 i ltn i++)
a[i] = 5
++- 52 M BENJELLOUN 2015 UMONS
void Saisie_Mat( int tab[][4] int m int n)
int i j
for (i = 0 i ltm i++)
for (j = 0 j lt n j++)
tab[i][j] = i
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
Matrice Exemple
void Affiche_Mat( int tab[][4] int m int n)
for (int i = 0 i ltm i++)
for (int j = 0 j lt n j++)
cout ltlt tab[i][j] ltlt
cout ltlt endl
include ltiostreamgt
using namespace std
void main()
int T[5][5]
Saisie_Mat( T 4 4 )
Affiche_Mat( T 4 4 )
27
++- 53 M BENJELLOUN 2015 UMONS
include hellip
int LaSomme( )
int A[Nmax] N int S = 0
for (int i=0ilt N i++)
cout ltltEntrez A[ltltiltlt]=
cin gtgtA[i]
S= S+ A[i]
return S
void main()
const int Nmax = 7
int i A[Nmax] S=0 N=3
S = LaSomme( )
cout ltlt Affichage ltlt endl
Affichage(A N)
cout ltlt n La somme est = ltlt S
Qursquoaffiche ce programme agrave lrsquoeacutecran
void Affichage( int A[] int N)
for (int i=0i lt N i++)
cout ltlt A[ltltiltlt]=
ltltA[i] ltltendl
++- 54 M BENJELLOUN 2015 UMONS
include hellip
void Saisie_T( int tab[] )
int N i
N= 3
for (i = 0 i ltN i++) tab[i] = i
void Affiche_T(int tab[] int N )
int i
for (i = 0 i ltN i++) cout ltlt tab[i]
void main()
int T[20] n
Saisie_T( T )
Affiche_T(T n )
tab[0] = 0
tab[1] = 1
tab[2] = 2
Qursquoaffiche ce programme agrave lrsquoeacutecran
28
++- 55 M BENJELLOUN 2015 UMONS
include hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 = 7
return hellip
Comment retourner v1 et v2
++- 56 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltlt a = ltlt a ltlt endl ltlt b = ltlt b
void echange(int xint y)
int tmp
tmp = x
x = y
y =tmp
void main()
int a = 1 b = 5
cout ltlt Avant ltltendl
affiche(ab)
echange(ab)
cout ltlt nApregraves ltltendl
affiche(ab)
Avant
a = 1
b = 5
Apregraves
PASSAGE DES PARAMETRES
Transmission des arguments
Comment eacutechanger a et b
a = 1
b = 5
PAR VALEUR
29
++- 57 M BENJELLOUN 2015 UMONS
Le pointeur prend comme
valeurs des adresses de
donneacutees en meacutemoire
Types de base hellip donneacutee
8
donneacutee
35 hellip
Adr i Adr j
Meacutemoire
12FF80 12FF84
Ladresse de leacuteleacutement i est ampi i=8 et ampi= 12FF80
int i=8 j=35
Et les pointeurs
hellip p=12FF84 hellip 35 hellip
12FF84 12FF80
int p p est le contenu pointeacute par p 35
p est lrsquoadresse 12FF84
++- 58 M BENJELLOUN 2015 UMONS
Deacuteclaration de Pointeurs Le symbole est utiliseacute entre le type et le nom du pointeur
Deacuteclaration drsquoun entier int i int p Deacuteclaration drsquoun pointeur vers un entier
Exemples de deacuteclarations de pointeurs
int pi pi est un pointeur vers un int pi deacutesigne le contenu de ladresse
float pf pf est un pointeur vers un float
char c d pc c et d sont des char pc est un pointeur vers un char
int C = 4
int p
p = ampC p reccediloit ladresse de c donc pointe sur c
cout ltlt p = ltltpltltendl
cout ltlt p = ltltp ltltendl
cout ltlt (ampC) ltlt(ampC)
p = 4
p = 0x12FF7C
(ampC) = 4
Ladresse de C est ampC
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
12
++- 23 M BENJELLOUN 2015 UMONS
do while = REPETER hellip tant que
do
bloc dinstructions
while (Condition vraie) Condition
vraie
oui non
Bloc
drsquoinstructions
programme
int j = 5
do
coutltltj = ltltj--ltltendl
while(j gt 0)
cout ltltstopn
Suite du programme
(garantit lrsquoexeacutecution au moins une fois)
int j = 5
do
coutltltj = ltltj ltltendl
j--
while(j gt 0)
cout ltltstopn
j = 5
j = 4
j = 3
j = 2
j = 1
stop
++- 24 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void main()
for (char lettre = A lettre lt= M lettre++)
coutltltlettre
coutltltendl
for (float pourcent = 00 pourcent lt 05 pourcent += 01)
coutltltpourcentltltendl
for (int i=2 i lt= 3 i++)
cout ltlt Table de ltlt i ltlt ltlt endl
for (int j=0 j lt= 3 j++)
cout ltlt ltlt i ltlt ltlt j ltlt = ltlt ij ltlt endl
ABCDEFGHIJKLM
0
01
02
03
04 Table de 2 2 0 = 0 2 1 = 2 2 2 = 4 2 3 = 6 Table de 3 3 0 = 0 hellip
13
++- 25 M BENJELLOUN 2015 UMONS
include hellip
void main()
bool sortir = false
char rep
coutltltAvant la boucleltltendl
while(sortir)
coutltltDans la boucleltltendl
coutltltVoulez vous quitter (ON)ltltendl
cingtgtrep
if(rep==O)
sortir=true
coutltltApres la boucleltltendl
include hellip
void main()
bool sortir = false
char rep
coutltltAvant la boucleltltendl
do
coutltltDans la boucleltltendl
coutltltVoulez vous quitter (ON)ltltendl
cingtgtrep
if(rep==O)
sortir=true
while(sortir)
coutltltApres la boucleltltendl
++- 26 M BENJELLOUN 2015 UMONS
int i j=1
char a
for (i = -10 i lt= 10 i++)
while(j=0)
cin gtgt a if(a==x)
break
Pour rompre le deacuteroulement seacutequentiel dune suite dinstructions
Instructions deacutechappement
return (expression) permet de sortir de la fonction qui la contient
exit (expression) La fonction est interrompue lsquoexpressionrsquo un entier
indiquant le code de terminaison du processus
for (i = -10 i lt= 10 i++)
if (i == 0)
continue pour eacuteviter la division par zeacutero
cout ltlt 1 i
while (Condition vraie)
continue
break
8
14
++- 27 M BENJELLOUN 2015 UMONS
switch = AU CAS OU FAIRE
hellip
switch(variable de type char ou int) au cas ougrave la variable vaut
case valeur1 variable=valeur1 exeacutecutez ce bloc dinstructions
break
case valeur2 variable=valeur2 exeacutecutez ce bloc dinstructions
break
etc
default aucune des valeurs preacuteceacutedentes exeacutecutez ce bloc
dinstructions pas de break ici
Le bloc default nest pas obligatoire valeur1 valeur2 hellip doivent ecirctre des expressions
constantes Lrsquoinstruction switch correspond agrave une cascade drsquoinstructions if else
++- 28 M BENJELLOUN 2015 UMONS
hellip
void main( )
const float PI= 314159 float rayon = 35 float diametre circonference surface int choix
cout ltlt 1 Calculer la circonferencen cout ltlt 2 Calculer la surfacen cout ltlt 3 Calculer le diametren cout ltlt Votre choix cin gtgt choix
switch (choix) case 1 circonference = 2PIrayon break case 2 surface = PIrayonrayon break case 3 diametre = 2rayon break default cout ltlt Mauvais choixhellipn
char choix
switch(choix)
case 1 hellip
switch(i)
case 2 j
float f
switch(f)
case 2
switch instruction commode pour les menus
15
++- 29 M BENJELLOUN 2015 UMONS
Tableaux et Strings
Un tableau est une collection de variables de mecircme type appeleacutees eacuteleacutements
Type Nom_Tableau[dim]
int tab[4] deacuteclare un tableau de 4 valeurs entiegraveres tab[0] tab[1] tab[2] tab[3]
const int SIZE = 5
int A[SIZE] A est un vecteur de 5 entiers
float B[5]
int A[SIZE] = 10 20 30 40 50
int premier[] = 1 2 3 5 7 11 13
char Tab_Char[4] = A C F G
int Tab[50] = 0
int i = 10
int a[i]
int primes[]
Deacuteclaration
Initialisation
Interdiction
Constante
++- 30 M BENJELLOUN 2015 UMONS
Accegraves aux eacuteleacutements drsquoun tableau
Les eacuteleacutements sont numeacuteroteacutes de 0 agrave dim-1
Il nrsquoy a pas de veacuterification des bornes
void main()
int a[6]
int i = 7
a[0] = 9
a[5] = -10
a[i2] = 2
a[6] = 0
a[-1] = 5
0
a
1
2
3
4
5
9
2
-10
void main(void)
const int dim=6
int i
int A[dim] = 1 2 3 4 5 6
for (i=0iltdimi++)
A[i] = 2i
coutltltA[ltltiltlt]=ltltA[i]
A[0]=0 A[1]=2 A[2]=4 A[3]=6 A[4]=8 A[5]=10
16
++- 31 M BENJELLOUN 2015 UMONS
Chaicircnes de caractegraveres ou String
char Nom[dim] Initialisation
Pour terminer la chaicircne on place en fin de chaicircne le caractegravere nul 0 de code ASCII 0
Ce caractegravere est soit ajouteacute automatiquement par le compilateur soit introduit par le programmeur selon les fonctions utiliseacutees
char S[] = Hello0 H
e
l
l
o
0
S[0] S[1] S[2] S[3] S[4] S[5] char S[6] = Hello
char S[5] = Hello H e l l o
char S[] = Le main L e m a i n 0
bull Un tableau de char agrave une dimension char Nom[dim]
bull Un type speacutecial string string Nom Il faut inclure ltstringgt
++- 32 M BENJELLOUN 2015 UMONS
string Nom Il faut inclure ltstringgt
string Nom est eacutequivalente agrave string Nom = Donc par deacutefaut la chaicircne est vide
Il existe de nombreuses faccedilons drsquoinitialiser Ident par exemple
string s1 = Bonjour a vous
string s2 = s1 s2 contient Bonjour a vous
string s3(4 x) eacutequivaut agrave string s3 = xxxx
string s4(s1 4 8) s4 contient our a voldquo S1 de 4 + 8
B o n j o u r a v o u s 0 1 2 3 4 5 6 7 8 9 10 11 12 13
include ltstringgt hellip string ST = Salut char H[6] = Hello for (int i=0 ilt5 i++) cout ltlt ST[i] ltlt affichera S a l u t
for (int i=0 ilt5 i++) cout ltlt H[i] ltlt affichera H e l l o
17
++- 33 M BENJELLOUN 2015 UMONS
Pourquoi utiliser string Nom plutocirct que char Nom[dim]
char S1[6] = Salut S2[6] = Hello S3[12]
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Interdit
string S1 = Salut S2 = Hello S3
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Autoriseacute
S1= Hello
S1= Hooo
S3= HoooHello
false
++- 34 M BENJELLOUN 2015 UMONS
include ltiostreamgt
include ltstringgt traitement de string
using namespace std espace de nommage std pour importer les
symboles de la bibliothegraveque standard C++
void main(void)
string nom1 nom2 nom3
int len size
cout ltlt Donnez Nom1 cin gtgt nom1
cout ltlt Donnez Nom2 cin gtgt nom2
len = nom1length() nombre de caractegraveres dans nom1
size = nom2size() nombre de caractegraveres dans nom2
cout ltlt Nom1 ltltnom1 ltlt Dim Nom1 = ltlt len ltlt endl
cout ltlt Nom2 ltltnom2 ltlt Dim Nom2 = ltlt size ltlt endl
nom3 = nom2+ +nom1
cout ltlt Nom3 = ltlt nom3 ltlt endl
if(nom1gtnom2) cout ltlt nom1 gt nom2 ltlt endl
else if (nom1==nom2) cout ltlt nom1 = nom2 ltlt endl
else cout ltlt nom1 lt nom2 ltlt endl
nom1=nom2
cout ltlt nom1 = ltlt nom1 ltlt nom2 ltlt nom2 ltlt endl
Donnez Nom1 salut
Donnez Nom2 hello
Nom1 salut Dim Nom1 = 5
Nom2 hello Dim Nom2 = 5
Nom3 = hello salut
nom1 gt nom2
nom1 = hello nom2 hello
Donnez Nom1 csou
Donnez Nom2 pi
Nom1csou Dim Nom1 = 4
Nom2pi Dim Nom2 = 2
Nom3 = pi csou
nom1 lt nom2
nom1 = pi nom2 pi
18
++- 35 M BENJELLOUN 2015 UMONS
Algorithmes de tri
Nom de lrsquoalgorithme Complexiteacute
Tri agrave bulles Tri par seacutelection Tri par insertion Tri de Shell (shell sort) Ameacutelioration du tri par insertion Tri fusion (merge sort) Tri rapide (quick sort) Tri par tas (heap sort)
O(N2) O(N2) O(N2)
O(N log2 N)
O(N log N) O(N log N) O(N log N)
++- 36 M BENJELLOUN 2015 UMONS
Tri agrave bulles bubble sort
reacutepeacuteter permutation = FALSE commencer au deacutebut du drapeau Pour i variant de 0 agrave N ndash 2 faire si cellule [i] gt cellule [i+1] alors deacutebut permuter cellules permutation = TRUE fin jusquagrave ce que (not permutation)
Complexiteacute O(Nsup2) Proportionnel agrave Nsup2 permutations
void TriaBulles(int x[] int N) int i perm=1 tmp while (perm==1) perm =0 for (i=0iltN-1i++) if(x[i] gt x[i+1]) tmp = x[i] x[i] = x[i+1] x[i+1] = tmp perm = 1
Algorithmes de tri
19
++- 37 M BENJELLOUN 2015 UMONS
void tri_par_selection(int t[] int n) int i j min tmp for (i = 0 i lt n - 1 i++) min = i for(j = i+1 j lt n j++) if(t[j] lt t[min]) min = j if(min = i) tmp = t[i] t[i] = t[min] t[min] = tmp
Le tri par seacutelection consiste en la recherche du plus grand eacuteleacutement (le plus petit) que lon va replacer en derniegravere position (en premiegravere) puis on recherche le second plus grand eacuteleacutement (le second plus petit) que lon va replacer eacutegalement agrave sa position finale et ainsi de suite
Algorithmes de tri
++- 38 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement dans un tableau
Recherche lineacuteaire Recherche dichotomique (binary search)
0
9
1
3
2
6
3
2
4
1
5
12
6
0
Est une meacutethode efficace pour retrouver un eacuteleacutement dans un tableau trieacute
A chaque eacutetape de la recherche dichotomique lrsquointervalle de recherche est diviseacute par deux
On utilise degraves lors deux index de recherche la borne infeacuterieure et la borne supeacuterieure
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup mid
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup
On initialise les bornes inf et sup agrave la premiegravere et derniegravere valeur des index du tableau tab
respectivement
Le milieu est donneacute par
mid = (inf+sup) 2 (0+6)2 =3
Supposons que lrsquoon recherche la valeur i=6 On
compare cette valeur avec tab[mid]=8 Comme
tab[mid]gti on change mid en sup
mid = (inf+sup) 2 (0+3)2 =1
inf=1 et sup=3
hellip
20
++- 39 M BENJELLOUN 2015 UMONS
44 Eacutecrire un programme qui supprime le premier et le dernier eacuteleacutement drsquoun vecteur
vecteur initial Tab 0 1 2 3 4 5 6
sup bords 1 2 3 4 5
sup bords 2 3 4
45 Eacutecrire un programme qui supprime le milieu du tableau et ajoute son double au deacutebut
vecteur initial Tab 1 2 3 4 5
sup Aj 6 1 2 4 5
sup Aj 4 6 1 4 5
46 Codez un programme de tri agrave bulles dun vecteur de strings
47 Codez un programme de recherche dichotomique dun nombre dans un vecteur de
strings rangeacutes par ordre croissant
++- 40 M BENJELLOUN 2015 UMONS
Matrices Rangeacutees ligne par ligne
Consideacutereacutees comme des vecteurs de lignes
Accegraves aux composantes par double crochets
int a[10][5]
a[1][0] = 7
int x[2][2] = 123 4 2 lignes et 2 colonnes
1 2
3 4 include hellip
void main()
int i j tab[5][4]
for (i = 0 i lt5 i++) Saisie
for (j = 0 j lt 4 j++) tab[i][j] = i
for (i = 0 i lt5 i++) Affichage
for (j = 0 j lt 4 j++) coutltlt tab[i][j] ltlt
cout ltlt endl
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
21
++- 41 M BENJELLOUN 2015 UMONS
Affichage de la table de multiplication
++- 42 M BENJELLOUN 2015 UMONS
Fonctions en C++
Encapsule un traitement particulier formant un tout
Peut impleacutementer la notion de module en logique
Augmente la lisibiliteacute drsquoun programme
Reacutealise un objectif preacutecis
Ameacuteliore le deacutebogage et la maintenance drsquoun programme
Son utilisation se deacutecompose en trois phases
Deacutefinition de la fonction
Deacuteclaration de la fonction
Appel de la fonction
Deacuteclarer une fonction
Appeler une fonction
Regravegles de visibiliteacute des variables
Passage des paramegravetres par valeur
Fonction renvoyant une valeur au programme
Passage des paramegravetres par valeur et par adresse
Passage des tableaux aux fonctions
22
++- 43 M BENJELLOUN 2015 UMONS
Type nom_fonction(liste_param_typeacutes)
deacuteclaration de variables locales
hellip Corps de la fonction
hellip
return (valeur)
Deacutefinition drsquoune fonction
Une fonction renvoie une valeur ou rien
liste_param_typeacutes = 0 void ou plusieurs
int Somme(int x int y)
int S Variable locale agrave Somme
S= x+y
return S
void fonction1()
coutltltn fonction1 n
void fonction2() coutltltn fonction2 n
Limbrication de fonctions
nest pas autoriseacutee
Deacutefinition
++- 44 M BENJELLOUN 2015 UMONS
Fonctions pourquoi
include ltiostreamgt
using namespace std
void main()
int i j SomCar1=0 SomCar2=0 SomCar3=0
for (i = 0 i lt5 i++)
SomCar1 = SomCar1 + ii
for (i = 0 i lt10 i++)
SomCar2 = SomCar2 + ii
for (j = 0 j lt 7 j++)
SomCar3 = SomCar3 + jj
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
include ltiostreamgt
using namespace std
int Fnct_SomCar(int N)
int i S=0
for (i = 0 i ltN i++)
S = S + ii S+=ii
return S
void main()
int SomCar1 SomCar2 SomCar3
SomCar1 = Fnct_SomCar(5)
SomCar2 = Fnct_SomCar(10)
SomCar3 = Fnct_SomCar(7)
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
23
++- 45 M BENJELLOUN 2015 UMONS
hellip
int Somme(int x int y)
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
int Somme(int x int y)
int S
S= x+y
return S
hellip
int Somme(int x int y)
int S
S= x+y
return S
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
Deacuteclaration et appel drsquoune fonction
++- 46 M BENJELLOUN 2015 UMONS
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
int addition() float tmp tmp = calcule(253) + calcule(572) return (int)tmp float calcule(float C float D) return ( (C + D ) 2)
float calcule(float float)
int addition()
float calcule(float A float B) return ( (A + B ) 2)
int addition() Appel drsquoune fonction dans une fonction
float tmp tmp = calcule(253) + calcule(572) return (int)tmp
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
Deacuteclaration et appel drsquoune fonction
24
++- 47 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void Addition(int v float f)
void main()
int v = 5
float f= 45
Addition(v f) Appel de la fonction
cout ltlt n Main v et f ltlt v ltlt et ltltf
void Addition(int v float f)
cout ltlt Addition v + f = ltlt v+f ltlt endl
f = f + v
cout ltlt Addition f = ltlt f
Addition v+f = 95
Addition f = 95
Main v et f = 5 et 45
v= 5 et f=45
5+ 45
f = 95
Les paramegravetres sont copieacutes La fonction travaille sur des copies de v et de f
++- 48 M BENJELLOUN 2015 UMONS
Fonction Renvoyant une valeur au programme
include ltiostreamgt
using namespace std
int change(int X)
void main(void)
int var = 5
int valeur
valeur = return_Val (var)
cout ltltmain var = ltlt var ltlt endl
cout ltltmain valeur = ltlt valeur
int return_Val (int v)
v = 100
cout ltlt return_Val v = ltlt v ltlt endl
return (v+1)
return_Val v = 100 main var = 5 main valeur = 101
Une fonction se termine et lsquorend la mainrsquo agrave
la fonction appelante lorsque son exeacutecution
rencontre lrsquoinstruction return expression
ou return
25
++- 49 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5 valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5
int valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
cout ltlt return_Val v = ltlt vltltendl
Qursquoaffiche ce programme agrave lrsquoeacutecran Qursquoaffiche ce programme agrave lrsquoeacutecran
++- 50 M BENJELLOUN 2015 UMONS
Fonctions et reacutecursiviteacute
Tours de Hanoiuml Suite de Fibonacci
un = un-1 + un-2
u0=u1=1
Puissance entiegravere
Une fonction est dite reacutecursive lorsqursquoelle srsquoappelle elle-mecircme
int factorielle (int n )
if ( n lt 0) return (ndash1) code derreur
else if ( n == 0 ) return 1 0 = 1
else
return n factorielle( n-1 ) n = n(n-1)
a x an-1 si n gt 0
1 si n = 0
an-1 =
26
++- 51 M BENJELLOUN 2015 UMONS
Passer des tableaux aux fonctions
Les tableaux peuvent ecirctre passeacutes comme paramegravetres dune fonction
Ils ne peuvent pas ecirctre retourneacutes comme reacutesultat dune fonction
La longueur du tableau ne doit pas ecirctre deacutefinie agrave la deacuteclaration de la fonction
Un tableau peut ecirctre modifieacute dans une fonction Il est passeacute par reacutefeacuterence (adresse) et
non par valeur
include hellip
void Modif(int a[])
a[0] = 5
a[1] = 6
void main(void)
int p[2] = 1 2
cout ltlt p[0] ltlt ltlt p[1]
Modif(p)
cout ltlt p[0] ltlt ltlt p[1]
1 2
5 6
include hellip
void Modif(int x[] int n)
void main(void)
int i
int p[6] = 1 2 3 5 7 11
Modif(p 6)
for (i=0ilt6i++)
coutltlt p[i]
void Modif(int a[] int n)
int i
for(i = 0 i ltn i++)
a[i] = 5
++- 52 M BENJELLOUN 2015 UMONS
void Saisie_Mat( int tab[][4] int m int n)
int i j
for (i = 0 i ltm i++)
for (j = 0 j lt n j++)
tab[i][j] = i
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
Matrice Exemple
void Affiche_Mat( int tab[][4] int m int n)
for (int i = 0 i ltm i++)
for (int j = 0 j lt n j++)
cout ltlt tab[i][j] ltlt
cout ltlt endl
include ltiostreamgt
using namespace std
void main()
int T[5][5]
Saisie_Mat( T 4 4 )
Affiche_Mat( T 4 4 )
27
++- 53 M BENJELLOUN 2015 UMONS
include hellip
int LaSomme( )
int A[Nmax] N int S = 0
for (int i=0ilt N i++)
cout ltltEntrez A[ltltiltlt]=
cin gtgtA[i]
S= S+ A[i]
return S
void main()
const int Nmax = 7
int i A[Nmax] S=0 N=3
S = LaSomme( )
cout ltlt Affichage ltlt endl
Affichage(A N)
cout ltlt n La somme est = ltlt S
Qursquoaffiche ce programme agrave lrsquoeacutecran
void Affichage( int A[] int N)
for (int i=0i lt N i++)
cout ltlt A[ltltiltlt]=
ltltA[i] ltltendl
++- 54 M BENJELLOUN 2015 UMONS
include hellip
void Saisie_T( int tab[] )
int N i
N= 3
for (i = 0 i ltN i++) tab[i] = i
void Affiche_T(int tab[] int N )
int i
for (i = 0 i ltN i++) cout ltlt tab[i]
void main()
int T[20] n
Saisie_T( T )
Affiche_T(T n )
tab[0] = 0
tab[1] = 1
tab[2] = 2
Qursquoaffiche ce programme agrave lrsquoeacutecran
28
++- 55 M BENJELLOUN 2015 UMONS
include hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 = 7
return hellip
Comment retourner v1 et v2
++- 56 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltlt a = ltlt a ltlt endl ltlt b = ltlt b
void echange(int xint y)
int tmp
tmp = x
x = y
y =tmp
void main()
int a = 1 b = 5
cout ltlt Avant ltltendl
affiche(ab)
echange(ab)
cout ltlt nApregraves ltltendl
affiche(ab)
Avant
a = 1
b = 5
Apregraves
PASSAGE DES PARAMETRES
Transmission des arguments
Comment eacutechanger a et b
a = 1
b = 5
PAR VALEUR
29
++- 57 M BENJELLOUN 2015 UMONS
Le pointeur prend comme
valeurs des adresses de
donneacutees en meacutemoire
Types de base hellip donneacutee
8
donneacutee
35 hellip
Adr i Adr j
Meacutemoire
12FF80 12FF84
Ladresse de leacuteleacutement i est ampi i=8 et ampi= 12FF80
int i=8 j=35
Et les pointeurs
hellip p=12FF84 hellip 35 hellip
12FF84 12FF80
int p p est le contenu pointeacute par p 35
p est lrsquoadresse 12FF84
++- 58 M BENJELLOUN 2015 UMONS
Deacuteclaration de Pointeurs Le symbole est utiliseacute entre le type et le nom du pointeur
Deacuteclaration drsquoun entier int i int p Deacuteclaration drsquoun pointeur vers un entier
Exemples de deacuteclarations de pointeurs
int pi pi est un pointeur vers un int pi deacutesigne le contenu de ladresse
float pf pf est un pointeur vers un float
char c d pc c et d sont des char pc est un pointeur vers un char
int C = 4
int p
p = ampC p reccediloit ladresse de c donc pointe sur c
cout ltlt p = ltltpltltendl
cout ltlt p = ltltp ltltendl
cout ltlt (ampC) ltlt(ampC)
p = 4
p = 0x12FF7C
(ampC) = 4
Ladresse de C est ampC
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
13
++- 25 M BENJELLOUN 2015 UMONS
include hellip
void main()
bool sortir = false
char rep
coutltltAvant la boucleltltendl
while(sortir)
coutltltDans la boucleltltendl
coutltltVoulez vous quitter (ON)ltltendl
cingtgtrep
if(rep==O)
sortir=true
coutltltApres la boucleltltendl
include hellip
void main()
bool sortir = false
char rep
coutltltAvant la boucleltltendl
do
coutltltDans la boucleltltendl
coutltltVoulez vous quitter (ON)ltltendl
cingtgtrep
if(rep==O)
sortir=true
while(sortir)
coutltltApres la boucleltltendl
++- 26 M BENJELLOUN 2015 UMONS
int i j=1
char a
for (i = -10 i lt= 10 i++)
while(j=0)
cin gtgt a if(a==x)
break
Pour rompre le deacuteroulement seacutequentiel dune suite dinstructions
Instructions deacutechappement
return (expression) permet de sortir de la fonction qui la contient
exit (expression) La fonction est interrompue lsquoexpressionrsquo un entier
indiquant le code de terminaison du processus
for (i = -10 i lt= 10 i++)
if (i == 0)
continue pour eacuteviter la division par zeacutero
cout ltlt 1 i
while (Condition vraie)
continue
break
8
14
++- 27 M BENJELLOUN 2015 UMONS
switch = AU CAS OU FAIRE
hellip
switch(variable de type char ou int) au cas ougrave la variable vaut
case valeur1 variable=valeur1 exeacutecutez ce bloc dinstructions
break
case valeur2 variable=valeur2 exeacutecutez ce bloc dinstructions
break
etc
default aucune des valeurs preacuteceacutedentes exeacutecutez ce bloc
dinstructions pas de break ici
Le bloc default nest pas obligatoire valeur1 valeur2 hellip doivent ecirctre des expressions
constantes Lrsquoinstruction switch correspond agrave une cascade drsquoinstructions if else
++- 28 M BENJELLOUN 2015 UMONS
hellip
void main( )
const float PI= 314159 float rayon = 35 float diametre circonference surface int choix
cout ltlt 1 Calculer la circonferencen cout ltlt 2 Calculer la surfacen cout ltlt 3 Calculer le diametren cout ltlt Votre choix cin gtgt choix
switch (choix) case 1 circonference = 2PIrayon break case 2 surface = PIrayonrayon break case 3 diametre = 2rayon break default cout ltlt Mauvais choixhellipn
char choix
switch(choix)
case 1 hellip
switch(i)
case 2 j
float f
switch(f)
case 2
switch instruction commode pour les menus
15
++- 29 M BENJELLOUN 2015 UMONS
Tableaux et Strings
Un tableau est une collection de variables de mecircme type appeleacutees eacuteleacutements
Type Nom_Tableau[dim]
int tab[4] deacuteclare un tableau de 4 valeurs entiegraveres tab[0] tab[1] tab[2] tab[3]
const int SIZE = 5
int A[SIZE] A est un vecteur de 5 entiers
float B[5]
int A[SIZE] = 10 20 30 40 50
int premier[] = 1 2 3 5 7 11 13
char Tab_Char[4] = A C F G
int Tab[50] = 0
int i = 10
int a[i]
int primes[]
Deacuteclaration
Initialisation
Interdiction
Constante
++- 30 M BENJELLOUN 2015 UMONS
Accegraves aux eacuteleacutements drsquoun tableau
Les eacuteleacutements sont numeacuteroteacutes de 0 agrave dim-1
Il nrsquoy a pas de veacuterification des bornes
void main()
int a[6]
int i = 7
a[0] = 9
a[5] = -10
a[i2] = 2
a[6] = 0
a[-1] = 5
0
a
1
2
3
4
5
9
2
-10
void main(void)
const int dim=6
int i
int A[dim] = 1 2 3 4 5 6
for (i=0iltdimi++)
A[i] = 2i
coutltltA[ltltiltlt]=ltltA[i]
A[0]=0 A[1]=2 A[2]=4 A[3]=6 A[4]=8 A[5]=10
16
++- 31 M BENJELLOUN 2015 UMONS
Chaicircnes de caractegraveres ou String
char Nom[dim] Initialisation
Pour terminer la chaicircne on place en fin de chaicircne le caractegravere nul 0 de code ASCII 0
Ce caractegravere est soit ajouteacute automatiquement par le compilateur soit introduit par le programmeur selon les fonctions utiliseacutees
char S[] = Hello0 H
e
l
l
o
0
S[0] S[1] S[2] S[3] S[4] S[5] char S[6] = Hello
char S[5] = Hello H e l l o
char S[] = Le main L e m a i n 0
bull Un tableau de char agrave une dimension char Nom[dim]
bull Un type speacutecial string string Nom Il faut inclure ltstringgt
++- 32 M BENJELLOUN 2015 UMONS
string Nom Il faut inclure ltstringgt
string Nom est eacutequivalente agrave string Nom = Donc par deacutefaut la chaicircne est vide
Il existe de nombreuses faccedilons drsquoinitialiser Ident par exemple
string s1 = Bonjour a vous
string s2 = s1 s2 contient Bonjour a vous
string s3(4 x) eacutequivaut agrave string s3 = xxxx
string s4(s1 4 8) s4 contient our a voldquo S1 de 4 + 8
B o n j o u r a v o u s 0 1 2 3 4 5 6 7 8 9 10 11 12 13
include ltstringgt hellip string ST = Salut char H[6] = Hello for (int i=0 ilt5 i++) cout ltlt ST[i] ltlt affichera S a l u t
for (int i=0 ilt5 i++) cout ltlt H[i] ltlt affichera H e l l o
17
++- 33 M BENJELLOUN 2015 UMONS
Pourquoi utiliser string Nom plutocirct que char Nom[dim]
char S1[6] = Salut S2[6] = Hello S3[12]
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Interdit
string S1 = Salut S2 = Hello S3
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Autoriseacute
S1= Hello
S1= Hooo
S3= HoooHello
false
++- 34 M BENJELLOUN 2015 UMONS
include ltiostreamgt
include ltstringgt traitement de string
using namespace std espace de nommage std pour importer les
symboles de la bibliothegraveque standard C++
void main(void)
string nom1 nom2 nom3
int len size
cout ltlt Donnez Nom1 cin gtgt nom1
cout ltlt Donnez Nom2 cin gtgt nom2
len = nom1length() nombre de caractegraveres dans nom1
size = nom2size() nombre de caractegraveres dans nom2
cout ltlt Nom1 ltltnom1 ltlt Dim Nom1 = ltlt len ltlt endl
cout ltlt Nom2 ltltnom2 ltlt Dim Nom2 = ltlt size ltlt endl
nom3 = nom2+ +nom1
cout ltlt Nom3 = ltlt nom3 ltlt endl
if(nom1gtnom2) cout ltlt nom1 gt nom2 ltlt endl
else if (nom1==nom2) cout ltlt nom1 = nom2 ltlt endl
else cout ltlt nom1 lt nom2 ltlt endl
nom1=nom2
cout ltlt nom1 = ltlt nom1 ltlt nom2 ltlt nom2 ltlt endl
Donnez Nom1 salut
Donnez Nom2 hello
Nom1 salut Dim Nom1 = 5
Nom2 hello Dim Nom2 = 5
Nom3 = hello salut
nom1 gt nom2
nom1 = hello nom2 hello
Donnez Nom1 csou
Donnez Nom2 pi
Nom1csou Dim Nom1 = 4
Nom2pi Dim Nom2 = 2
Nom3 = pi csou
nom1 lt nom2
nom1 = pi nom2 pi
18
++- 35 M BENJELLOUN 2015 UMONS
Algorithmes de tri
Nom de lrsquoalgorithme Complexiteacute
Tri agrave bulles Tri par seacutelection Tri par insertion Tri de Shell (shell sort) Ameacutelioration du tri par insertion Tri fusion (merge sort) Tri rapide (quick sort) Tri par tas (heap sort)
O(N2) O(N2) O(N2)
O(N log2 N)
O(N log N) O(N log N) O(N log N)
++- 36 M BENJELLOUN 2015 UMONS
Tri agrave bulles bubble sort
reacutepeacuteter permutation = FALSE commencer au deacutebut du drapeau Pour i variant de 0 agrave N ndash 2 faire si cellule [i] gt cellule [i+1] alors deacutebut permuter cellules permutation = TRUE fin jusquagrave ce que (not permutation)
Complexiteacute O(Nsup2) Proportionnel agrave Nsup2 permutations
void TriaBulles(int x[] int N) int i perm=1 tmp while (perm==1) perm =0 for (i=0iltN-1i++) if(x[i] gt x[i+1]) tmp = x[i] x[i] = x[i+1] x[i+1] = tmp perm = 1
Algorithmes de tri
19
++- 37 M BENJELLOUN 2015 UMONS
void tri_par_selection(int t[] int n) int i j min tmp for (i = 0 i lt n - 1 i++) min = i for(j = i+1 j lt n j++) if(t[j] lt t[min]) min = j if(min = i) tmp = t[i] t[i] = t[min] t[min] = tmp
Le tri par seacutelection consiste en la recherche du plus grand eacuteleacutement (le plus petit) que lon va replacer en derniegravere position (en premiegravere) puis on recherche le second plus grand eacuteleacutement (le second plus petit) que lon va replacer eacutegalement agrave sa position finale et ainsi de suite
Algorithmes de tri
++- 38 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement dans un tableau
Recherche lineacuteaire Recherche dichotomique (binary search)
0
9
1
3
2
6
3
2
4
1
5
12
6
0
Est une meacutethode efficace pour retrouver un eacuteleacutement dans un tableau trieacute
A chaque eacutetape de la recherche dichotomique lrsquointervalle de recherche est diviseacute par deux
On utilise degraves lors deux index de recherche la borne infeacuterieure et la borne supeacuterieure
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup mid
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup
On initialise les bornes inf et sup agrave la premiegravere et derniegravere valeur des index du tableau tab
respectivement
Le milieu est donneacute par
mid = (inf+sup) 2 (0+6)2 =3
Supposons que lrsquoon recherche la valeur i=6 On
compare cette valeur avec tab[mid]=8 Comme
tab[mid]gti on change mid en sup
mid = (inf+sup) 2 (0+3)2 =1
inf=1 et sup=3
hellip
20
++- 39 M BENJELLOUN 2015 UMONS
44 Eacutecrire un programme qui supprime le premier et le dernier eacuteleacutement drsquoun vecteur
vecteur initial Tab 0 1 2 3 4 5 6
sup bords 1 2 3 4 5
sup bords 2 3 4
45 Eacutecrire un programme qui supprime le milieu du tableau et ajoute son double au deacutebut
vecteur initial Tab 1 2 3 4 5
sup Aj 6 1 2 4 5
sup Aj 4 6 1 4 5
46 Codez un programme de tri agrave bulles dun vecteur de strings
47 Codez un programme de recherche dichotomique dun nombre dans un vecteur de
strings rangeacutes par ordre croissant
++- 40 M BENJELLOUN 2015 UMONS
Matrices Rangeacutees ligne par ligne
Consideacutereacutees comme des vecteurs de lignes
Accegraves aux composantes par double crochets
int a[10][5]
a[1][0] = 7
int x[2][2] = 123 4 2 lignes et 2 colonnes
1 2
3 4 include hellip
void main()
int i j tab[5][4]
for (i = 0 i lt5 i++) Saisie
for (j = 0 j lt 4 j++) tab[i][j] = i
for (i = 0 i lt5 i++) Affichage
for (j = 0 j lt 4 j++) coutltlt tab[i][j] ltlt
cout ltlt endl
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
21
++- 41 M BENJELLOUN 2015 UMONS
Affichage de la table de multiplication
++- 42 M BENJELLOUN 2015 UMONS
Fonctions en C++
Encapsule un traitement particulier formant un tout
Peut impleacutementer la notion de module en logique
Augmente la lisibiliteacute drsquoun programme
Reacutealise un objectif preacutecis
Ameacuteliore le deacutebogage et la maintenance drsquoun programme
Son utilisation se deacutecompose en trois phases
Deacutefinition de la fonction
Deacuteclaration de la fonction
Appel de la fonction
Deacuteclarer une fonction
Appeler une fonction
Regravegles de visibiliteacute des variables
Passage des paramegravetres par valeur
Fonction renvoyant une valeur au programme
Passage des paramegravetres par valeur et par adresse
Passage des tableaux aux fonctions
22
++- 43 M BENJELLOUN 2015 UMONS
Type nom_fonction(liste_param_typeacutes)
deacuteclaration de variables locales
hellip Corps de la fonction
hellip
return (valeur)
Deacutefinition drsquoune fonction
Une fonction renvoie une valeur ou rien
liste_param_typeacutes = 0 void ou plusieurs
int Somme(int x int y)
int S Variable locale agrave Somme
S= x+y
return S
void fonction1()
coutltltn fonction1 n
void fonction2() coutltltn fonction2 n
Limbrication de fonctions
nest pas autoriseacutee
Deacutefinition
++- 44 M BENJELLOUN 2015 UMONS
Fonctions pourquoi
include ltiostreamgt
using namespace std
void main()
int i j SomCar1=0 SomCar2=0 SomCar3=0
for (i = 0 i lt5 i++)
SomCar1 = SomCar1 + ii
for (i = 0 i lt10 i++)
SomCar2 = SomCar2 + ii
for (j = 0 j lt 7 j++)
SomCar3 = SomCar3 + jj
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
include ltiostreamgt
using namespace std
int Fnct_SomCar(int N)
int i S=0
for (i = 0 i ltN i++)
S = S + ii S+=ii
return S
void main()
int SomCar1 SomCar2 SomCar3
SomCar1 = Fnct_SomCar(5)
SomCar2 = Fnct_SomCar(10)
SomCar3 = Fnct_SomCar(7)
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
23
++- 45 M BENJELLOUN 2015 UMONS
hellip
int Somme(int x int y)
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
int Somme(int x int y)
int S
S= x+y
return S
hellip
int Somme(int x int y)
int S
S= x+y
return S
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
Deacuteclaration et appel drsquoune fonction
++- 46 M BENJELLOUN 2015 UMONS
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
int addition() float tmp tmp = calcule(253) + calcule(572) return (int)tmp float calcule(float C float D) return ( (C + D ) 2)
float calcule(float float)
int addition()
float calcule(float A float B) return ( (A + B ) 2)
int addition() Appel drsquoune fonction dans une fonction
float tmp tmp = calcule(253) + calcule(572) return (int)tmp
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
Deacuteclaration et appel drsquoune fonction
24
++- 47 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void Addition(int v float f)
void main()
int v = 5
float f= 45
Addition(v f) Appel de la fonction
cout ltlt n Main v et f ltlt v ltlt et ltltf
void Addition(int v float f)
cout ltlt Addition v + f = ltlt v+f ltlt endl
f = f + v
cout ltlt Addition f = ltlt f
Addition v+f = 95
Addition f = 95
Main v et f = 5 et 45
v= 5 et f=45
5+ 45
f = 95
Les paramegravetres sont copieacutes La fonction travaille sur des copies de v et de f
++- 48 M BENJELLOUN 2015 UMONS
Fonction Renvoyant une valeur au programme
include ltiostreamgt
using namespace std
int change(int X)
void main(void)
int var = 5
int valeur
valeur = return_Val (var)
cout ltltmain var = ltlt var ltlt endl
cout ltltmain valeur = ltlt valeur
int return_Val (int v)
v = 100
cout ltlt return_Val v = ltlt v ltlt endl
return (v+1)
return_Val v = 100 main var = 5 main valeur = 101
Une fonction se termine et lsquorend la mainrsquo agrave
la fonction appelante lorsque son exeacutecution
rencontre lrsquoinstruction return expression
ou return
25
++- 49 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5 valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5
int valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
cout ltlt return_Val v = ltlt vltltendl
Qursquoaffiche ce programme agrave lrsquoeacutecran Qursquoaffiche ce programme agrave lrsquoeacutecran
++- 50 M BENJELLOUN 2015 UMONS
Fonctions et reacutecursiviteacute
Tours de Hanoiuml Suite de Fibonacci
un = un-1 + un-2
u0=u1=1
Puissance entiegravere
Une fonction est dite reacutecursive lorsqursquoelle srsquoappelle elle-mecircme
int factorielle (int n )
if ( n lt 0) return (ndash1) code derreur
else if ( n == 0 ) return 1 0 = 1
else
return n factorielle( n-1 ) n = n(n-1)
a x an-1 si n gt 0
1 si n = 0
an-1 =
26
++- 51 M BENJELLOUN 2015 UMONS
Passer des tableaux aux fonctions
Les tableaux peuvent ecirctre passeacutes comme paramegravetres dune fonction
Ils ne peuvent pas ecirctre retourneacutes comme reacutesultat dune fonction
La longueur du tableau ne doit pas ecirctre deacutefinie agrave la deacuteclaration de la fonction
Un tableau peut ecirctre modifieacute dans une fonction Il est passeacute par reacutefeacuterence (adresse) et
non par valeur
include hellip
void Modif(int a[])
a[0] = 5
a[1] = 6
void main(void)
int p[2] = 1 2
cout ltlt p[0] ltlt ltlt p[1]
Modif(p)
cout ltlt p[0] ltlt ltlt p[1]
1 2
5 6
include hellip
void Modif(int x[] int n)
void main(void)
int i
int p[6] = 1 2 3 5 7 11
Modif(p 6)
for (i=0ilt6i++)
coutltlt p[i]
void Modif(int a[] int n)
int i
for(i = 0 i ltn i++)
a[i] = 5
++- 52 M BENJELLOUN 2015 UMONS
void Saisie_Mat( int tab[][4] int m int n)
int i j
for (i = 0 i ltm i++)
for (j = 0 j lt n j++)
tab[i][j] = i
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
Matrice Exemple
void Affiche_Mat( int tab[][4] int m int n)
for (int i = 0 i ltm i++)
for (int j = 0 j lt n j++)
cout ltlt tab[i][j] ltlt
cout ltlt endl
include ltiostreamgt
using namespace std
void main()
int T[5][5]
Saisie_Mat( T 4 4 )
Affiche_Mat( T 4 4 )
27
++- 53 M BENJELLOUN 2015 UMONS
include hellip
int LaSomme( )
int A[Nmax] N int S = 0
for (int i=0ilt N i++)
cout ltltEntrez A[ltltiltlt]=
cin gtgtA[i]
S= S+ A[i]
return S
void main()
const int Nmax = 7
int i A[Nmax] S=0 N=3
S = LaSomme( )
cout ltlt Affichage ltlt endl
Affichage(A N)
cout ltlt n La somme est = ltlt S
Qursquoaffiche ce programme agrave lrsquoeacutecran
void Affichage( int A[] int N)
for (int i=0i lt N i++)
cout ltlt A[ltltiltlt]=
ltltA[i] ltltendl
++- 54 M BENJELLOUN 2015 UMONS
include hellip
void Saisie_T( int tab[] )
int N i
N= 3
for (i = 0 i ltN i++) tab[i] = i
void Affiche_T(int tab[] int N )
int i
for (i = 0 i ltN i++) cout ltlt tab[i]
void main()
int T[20] n
Saisie_T( T )
Affiche_T(T n )
tab[0] = 0
tab[1] = 1
tab[2] = 2
Qursquoaffiche ce programme agrave lrsquoeacutecran
28
++- 55 M BENJELLOUN 2015 UMONS
include hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 = 7
return hellip
Comment retourner v1 et v2
++- 56 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltlt a = ltlt a ltlt endl ltlt b = ltlt b
void echange(int xint y)
int tmp
tmp = x
x = y
y =tmp
void main()
int a = 1 b = 5
cout ltlt Avant ltltendl
affiche(ab)
echange(ab)
cout ltlt nApregraves ltltendl
affiche(ab)
Avant
a = 1
b = 5
Apregraves
PASSAGE DES PARAMETRES
Transmission des arguments
Comment eacutechanger a et b
a = 1
b = 5
PAR VALEUR
29
++- 57 M BENJELLOUN 2015 UMONS
Le pointeur prend comme
valeurs des adresses de
donneacutees en meacutemoire
Types de base hellip donneacutee
8
donneacutee
35 hellip
Adr i Adr j
Meacutemoire
12FF80 12FF84
Ladresse de leacuteleacutement i est ampi i=8 et ampi= 12FF80
int i=8 j=35
Et les pointeurs
hellip p=12FF84 hellip 35 hellip
12FF84 12FF80
int p p est le contenu pointeacute par p 35
p est lrsquoadresse 12FF84
++- 58 M BENJELLOUN 2015 UMONS
Deacuteclaration de Pointeurs Le symbole est utiliseacute entre le type et le nom du pointeur
Deacuteclaration drsquoun entier int i int p Deacuteclaration drsquoun pointeur vers un entier
Exemples de deacuteclarations de pointeurs
int pi pi est un pointeur vers un int pi deacutesigne le contenu de ladresse
float pf pf est un pointeur vers un float
char c d pc c et d sont des char pc est un pointeur vers un char
int C = 4
int p
p = ampC p reccediloit ladresse de c donc pointe sur c
cout ltlt p = ltltpltltendl
cout ltlt p = ltltp ltltendl
cout ltlt (ampC) ltlt(ampC)
p = 4
p = 0x12FF7C
(ampC) = 4
Ladresse de C est ampC
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
14
++- 27 M BENJELLOUN 2015 UMONS
switch = AU CAS OU FAIRE
hellip
switch(variable de type char ou int) au cas ougrave la variable vaut
case valeur1 variable=valeur1 exeacutecutez ce bloc dinstructions
break
case valeur2 variable=valeur2 exeacutecutez ce bloc dinstructions
break
etc
default aucune des valeurs preacuteceacutedentes exeacutecutez ce bloc
dinstructions pas de break ici
Le bloc default nest pas obligatoire valeur1 valeur2 hellip doivent ecirctre des expressions
constantes Lrsquoinstruction switch correspond agrave une cascade drsquoinstructions if else
++- 28 M BENJELLOUN 2015 UMONS
hellip
void main( )
const float PI= 314159 float rayon = 35 float diametre circonference surface int choix
cout ltlt 1 Calculer la circonferencen cout ltlt 2 Calculer la surfacen cout ltlt 3 Calculer le diametren cout ltlt Votre choix cin gtgt choix
switch (choix) case 1 circonference = 2PIrayon break case 2 surface = PIrayonrayon break case 3 diametre = 2rayon break default cout ltlt Mauvais choixhellipn
char choix
switch(choix)
case 1 hellip
switch(i)
case 2 j
float f
switch(f)
case 2
switch instruction commode pour les menus
15
++- 29 M BENJELLOUN 2015 UMONS
Tableaux et Strings
Un tableau est une collection de variables de mecircme type appeleacutees eacuteleacutements
Type Nom_Tableau[dim]
int tab[4] deacuteclare un tableau de 4 valeurs entiegraveres tab[0] tab[1] tab[2] tab[3]
const int SIZE = 5
int A[SIZE] A est un vecteur de 5 entiers
float B[5]
int A[SIZE] = 10 20 30 40 50
int premier[] = 1 2 3 5 7 11 13
char Tab_Char[4] = A C F G
int Tab[50] = 0
int i = 10
int a[i]
int primes[]
Deacuteclaration
Initialisation
Interdiction
Constante
++- 30 M BENJELLOUN 2015 UMONS
Accegraves aux eacuteleacutements drsquoun tableau
Les eacuteleacutements sont numeacuteroteacutes de 0 agrave dim-1
Il nrsquoy a pas de veacuterification des bornes
void main()
int a[6]
int i = 7
a[0] = 9
a[5] = -10
a[i2] = 2
a[6] = 0
a[-1] = 5
0
a
1
2
3
4
5
9
2
-10
void main(void)
const int dim=6
int i
int A[dim] = 1 2 3 4 5 6
for (i=0iltdimi++)
A[i] = 2i
coutltltA[ltltiltlt]=ltltA[i]
A[0]=0 A[1]=2 A[2]=4 A[3]=6 A[4]=8 A[5]=10
16
++- 31 M BENJELLOUN 2015 UMONS
Chaicircnes de caractegraveres ou String
char Nom[dim] Initialisation
Pour terminer la chaicircne on place en fin de chaicircne le caractegravere nul 0 de code ASCII 0
Ce caractegravere est soit ajouteacute automatiquement par le compilateur soit introduit par le programmeur selon les fonctions utiliseacutees
char S[] = Hello0 H
e
l
l
o
0
S[0] S[1] S[2] S[3] S[4] S[5] char S[6] = Hello
char S[5] = Hello H e l l o
char S[] = Le main L e m a i n 0
bull Un tableau de char agrave une dimension char Nom[dim]
bull Un type speacutecial string string Nom Il faut inclure ltstringgt
++- 32 M BENJELLOUN 2015 UMONS
string Nom Il faut inclure ltstringgt
string Nom est eacutequivalente agrave string Nom = Donc par deacutefaut la chaicircne est vide
Il existe de nombreuses faccedilons drsquoinitialiser Ident par exemple
string s1 = Bonjour a vous
string s2 = s1 s2 contient Bonjour a vous
string s3(4 x) eacutequivaut agrave string s3 = xxxx
string s4(s1 4 8) s4 contient our a voldquo S1 de 4 + 8
B o n j o u r a v o u s 0 1 2 3 4 5 6 7 8 9 10 11 12 13
include ltstringgt hellip string ST = Salut char H[6] = Hello for (int i=0 ilt5 i++) cout ltlt ST[i] ltlt affichera S a l u t
for (int i=0 ilt5 i++) cout ltlt H[i] ltlt affichera H e l l o
17
++- 33 M BENJELLOUN 2015 UMONS
Pourquoi utiliser string Nom plutocirct que char Nom[dim]
char S1[6] = Salut S2[6] = Hello S3[12]
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Interdit
string S1 = Salut S2 = Hello S3
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Autoriseacute
S1= Hello
S1= Hooo
S3= HoooHello
false
++- 34 M BENJELLOUN 2015 UMONS
include ltiostreamgt
include ltstringgt traitement de string
using namespace std espace de nommage std pour importer les
symboles de la bibliothegraveque standard C++
void main(void)
string nom1 nom2 nom3
int len size
cout ltlt Donnez Nom1 cin gtgt nom1
cout ltlt Donnez Nom2 cin gtgt nom2
len = nom1length() nombre de caractegraveres dans nom1
size = nom2size() nombre de caractegraveres dans nom2
cout ltlt Nom1 ltltnom1 ltlt Dim Nom1 = ltlt len ltlt endl
cout ltlt Nom2 ltltnom2 ltlt Dim Nom2 = ltlt size ltlt endl
nom3 = nom2+ +nom1
cout ltlt Nom3 = ltlt nom3 ltlt endl
if(nom1gtnom2) cout ltlt nom1 gt nom2 ltlt endl
else if (nom1==nom2) cout ltlt nom1 = nom2 ltlt endl
else cout ltlt nom1 lt nom2 ltlt endl
nom1=nom2
cout ltlt nom1 = ltlt nom1 ltlt nom2 ltlt nom2 ltlt endl
Donnez Nom1 salut
Donnez Nom2 hello
Nom1 salut Dim Nom1 = 5
Nom2 hello Dim Nom2 = 5
Nom3 = hello salut
nom1 gt nom2
nom1 = hello nom2 hello
Donnez Nom1 csou
Donnez Nom2 pi
Nom1csou Dim Nom1 = 4
Nom2pi Dim Nom2 = 2
Nom3 = pi csou
nom1 lt nom2
nom1 = pi nom2 pi
18
++- 35 M BENJELLOUN 2015 UMONS
Algorithmes de tri
Nom de lrsquoalgorithme Complexiteacute
Tri agrave bulles Tri par seacutelection Tri par insertion Tri de Shell (shell sort) Ameacutelioration du tri par insertion Tri fusion (merge sort) Tri rapide (quick sort) Tri par tas (heap sort)
O(N2) O(N2) O(N2)
O(N log2 N)
O(N log N) O(N log N) O(N log N)
++- 36 M BENJELLOUN 2015 UMONS
Tri agrave bulles bubble sort
reacutepeacuteter permutation = FALSE commencer au deacutebut du drapeau Pour i variant de 0 agrave N ndash 2 faire si cellule [i] gt cellule [i+1] alors deacutebut permuter cellules permutation = TRUE fin jusquagrave ce que (not permutation)
Complexiteacute O(Nsup2) Proportionnel agrave Nsup2 permutations
void TriaBulles(int x[] int N) int i perm=1 tmp while (perm==1) perm =0 for (i=0iltN-1i++) if(x[i] gt x[i+1]) tmp = x[i] x[i] = x[i+1] x[i+1] = tmp perm = 1
Algorithmes de tri
19
++- 37 M BENJELLOUN 2015 UMONS
void tri_par_selection(int t[] int n) int i j min tmp for (i = 0 i lt n - 1 i++) min = i for(j = i+1 j lt n j++) if(t[j] lt t[min]) min = j if(min = i) tmp = t[i] t[i] = t[min] t[min] = tmp
Le tri par seacutelection consiste en la recherche du plus grand eacuteleacutement (le plus petit) que lon va replacer en derniegravere position (en premiegravere) puis on recherche le second plus grand eacuteleacutement (le second plus petit) que lon va replacer eacutegalement agrave sa position finale et ainsi de suite
Algorithmes de tri
++- 38 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement dans un tableau
Recherche lineacuteaire Recherche dichotomique (binary search)
0
9
1
3
2
6
3
2
4
1
5
12
6
0
Est une meacutethode efficace pour retrouver un eacuteleacutement dans un tableau trieacute
A chaque eacutetape de la recherche dichotomique lrsquointervalle de recherche est diviseacute par deux
On utilise degraves lors deux index de recherche la borne infeacuterieure et la borne supeacuterieure
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup mid
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup
On initialise les bornes inf et sup agrave la premiegravere et derniegravere valeur des index du tableau tab
respectivement
Le milieu est donneacute par
mid = (inf+sup) 2 (0+6)2 =3
Supposons que lrsquoon recherche la valeur i=6 On
compare cette valeur avec tab[mid]=8 Comme
tab[mid]gti on change mid en sup
mid = (inf+sup) 2 (0+3)2 =1
inf=1 et sup=3
hellip
20
++- 39 M BENJELLOUN 2015 UMONS
44 Eacutecrire un programme qui supprime le premier et le dernier eacuteleacutement drsquoun vecteur
vecteur initial Tab 0 1 2 3 4 5 6
sup bords 1 2 3 4 5
sup bords 2 3 4
45 Eacutecrire un programme qui supprime le milieu du tableau et ajoute son double au deacutebut
vecteur initial Tab 1 2 3 4 5
sup Aj 6 1 2 4 5
sup Aj 4 6 1 4 5
46 Codez un programme de tri agrave bulles dun vecteur de strings
47 Codez un programme de recherche dichotomique dun nombre dans un vecteur de
strings rangeacutes par ordre croissant
++- 40 M BENJELLOUN 2015 UMONS
Matrices Rangeacutees ligne par ligne
Consideacutereacutees comme des vecteurs de lignes
Accegraves aux composantes par double crochets
int a[10][5]
a[1][0] = 7
int x[2][2] = 123 4 2 lignes et 2 colonnes
1 2
3 4 include hellip
void main()
int i j tab[5][4]
for (i = 0 i lt5 i++) Saisie
for (j = 0 j lt 4 j++) tab[i][j] = i
for (i = 0 i lt5 i++) Affichage
for (j = 0 j lt 4 j++) coutltlt tab[i][j] ltlt
cout ltlt endl
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
21
++- 41 M BENJELLOUN 2015 UMONS
Affichage de la table de multiplication
++- 42 M BENJELLOUN 2015 UMONS
Fonctions en C++
Encapsule un traitement particulier formant un tout
Peut impleacutementer la notion de module en logique
Augmente la lisibiliteacute drsquoun programme
Reacutealise un objectif preacutecis
Ameacuteliore le deacutebogage et la maintenance drsquoun programme
Son utilisation se deacutecompose en trois phases
Deacutefinition de la fonction
Deacuteclaration de la fonction
Appel de la fonction
Deacuteclarer une fonction
Appeler une fonction
Regravegles de visibiliteacute des variables
Passage des paramegravetres par valeur
Fonction renvoyant une valeur au programme
Passage des paramegravetres par valeur et par adresse
Passage des tableaux aux fonctions
22
++- 43 M BENJELLOUN 2015 UMONS
Type nom_fonction(liste_param_typeacutes)
deacuteclaration de variables locales
hellip Corps de la fonction
hellip
return (valeur)
Deacutefinition drsquoune fonction
Une fonction renvoie une valeur ou rien
liste_param_typeacutes = 0 void ou plusieurs
int Somme(int x int y)
int S Variable locale agrave Somme
S= x+y
return S
void fonction1()
coutltltn fonction1 n
void fonction2() coutltltn fonction2 n
Limbrication de fonctions
nest pas autoriseacutee
Deacutefinition
++- 44 M BENJELLOUN 2015 UMONS
Fonctions pourquoi
include ltiostreamgt
using namespace std
void main()
int i j SomCar1=0 SomCar2=0 SomCar3=0
for (i = 0 i lt5 i++)
SomCar1 = SomCar1 + ii
for (i = 0 i lt10 i++)
SomCar2 = SomCar2 + ii
for (j = 0 j lt 7 j++)
SomCar3 = SomCar3 + jj
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
include ltiostreamgt
using namespace std
int Fnct_SomCar(int N)
int i S=0
for (i = 0 i ltN i++)
S = S + ii S+=ii
return S
void main()
int SomCar1 SomCar2 SomCar3
SomCar1 = Fnct_SomCar(5)
SomCar2 = Fnct_SomCar(10)
SomCar3 = Fnct_SomCar(7)
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
23
++- 45 M BENJELLOUN 2015 UMONS
hellip
int Somme(int x int y)
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
int Somme(int x int y)
int S
S= x+y
return S
hellip
int Somme(int x int y)
int S
S= x+y
return S
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
Deacuteclaration et appel drsquoune fonction
++- 46 M BENJELLOUN 2015 UMONS
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
int addition() float tmp tmp = calcule(253) + calcule(572) return (int)tmp float calcule(float C float D) return ( (C + D ) 2)
float calcule(float float)
int addition()
float calcule(float A float B) return ( (A + B ) 2)
int addition() Appel drsquoune fonction dans une fonction
float tmp tmp = calcule(253) + calcule(572) return (int)tmp
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
Deacuteclaration et appel drsquoune fonction
24
++- 47 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void Addition(int v float f)
void main()
int v = 5
float f= 45
Addition(v f) Appel de la fonction
cout ltlt n Main v et f ltlt v ltlt et ltltf
void Addition(int v float f)
cout ltlt Addition v + f = ltlt v+f ltlt endl
f = f + v
cout ltlt Addition f = ltlt f
Addition v+f = 95
Addition f = 95
Main v et f = 5 et 45
v= 5 et f=45
5+ 45
f = 95
Les paramegravetres sont copieacutes La fonction travaille sur des copies de v et de f
++- 48 M BENJELLOUN 2015 UMONS
Fonction Renvoyant une valeur au programme
include ltiostreamgt
using namespace std
int change(int X)
void main(void)
int var = 5
int valeur
valeur = return_Val (var)
cout ltltmain var = ltlt var ltlt endl
cout ltltmain valeur = ltlt valeur
int return_Val (int v)
v = 100
cout ltlt return_Val v = ltlt v ltlt endl
return (v+1)
return_Val v = 100 main var = 5 main valeur = 101
Une fonction se termine et lsquorend la mainrsquo agrave
la fonction appelante lorsque son exeacutecution
rencontre lrsquoinstruction return expression
ou return
25
++- 49 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5 valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5
int valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
cout ltlt return_Val v = ltlt vltltendl
Qursquoaffiche ce programme agrave lrsquoeacutecran Qursquoaffiche ce programme agrave lrsquoeacutecran
++- 50 M BENJELLOUN 2015 UMONS
Fonctions et reacutecursiviteacute
Tours de Hanoiuml Suite de Fibonacci
un = un-1 + un-2
u0=u1=1
Puissance entiegravere
Une fonction est dite reacutecursive lorsqursquoelle srsquoappelle elle-mecircme
int factorielle (int n )
if ( n lt 0) return (ndash1) code derreur
else if ( n == 0 ) return 1 0 = 1
else
return n factorielle( n-1 ) n = n(n-1)
a x an-1 si n gt 0
1 si n = 0
an-1 =
26
++- 51 M BENJELLOUN 2015 UMONS
Passer des tableaux aux fonctions
Les tableaux peuvent ecirctre passeacutes comme paramegravetres dune fonction
Ils ne peuvent pas ecirctre retourneacutes comme reacutesultat dune fonction
La longueur du tableau ne doit pas ecirctre deacutefinie agrave la deacuteclaration de la fonction
Un tableau peut ecirctre modifieacute dans une fonction Il est passeacute par reacutefeacuterence (adresse) et
non par valeur
include hellip
void Modif(int a[])
a[0] = 5
a[1] = 6
void main(void)
int p[2] = 1 2
cout ltlt p[0] ltlt ltlt p[1]
Modif(p)
cout ltlt p[0] ltlt ltlt p[1]
1 2
5 6
include hellip
void Modif(int x[] int n)
void main(void)
int i
int p[6] = 1 2 3 5 7 11
Modif(p 6)
for (i=0ilt6i++)
coutltlt p[i]
void Modif(int a[] int n)
int i
for(i = 0 i ltn i++)
a[i] = 5
++- 52 M BENJELLOUN 2015 UMONS
void Saisie_Mat( int tab[][4] int m int n)
int i j
for (i = 0 i ltm i++)
for (j = 0 j lt n j++)
tab[i][j] = i
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
Matrice Exemple
void Affiche_Mat( int tab[][4] int m int n)
for (int i = 0 i ltm i++)
for (int j = 0 j lt n j++)
cout ltlt tab[i][j] ltlt
cout ltlt endl
include ltiostreamgt
using namespace std
void main()
int T[5][5]
Saisie_Mat( T 4 4 )
Affiche_Mat( T 4 4 )
27
++- 53 M BENJELLOUN 2015 UMONS
include hellip
int LaSomme( )
int A[Nmax] N int S = 0
for (int i=0ilt N i++)
cout ltltEntrez A[ltltiltlt]=
cin gtgtA[i]
S= S+ A[i]
return S
void main()
const int Nmax = 7
int i A[Nmax] S=0 N=3
S = LaSomme( )
cout ltlt Affichage ltlt endl
Affichage(A N)
cout ltlt n La somme est = ltlt S
Qursquoaffiche ce programme agrave lrsquoeacutecran
void Affichage( int A[] int N)
for (int i=0i lt N i++)
cout ltlt A[ltltiltlt]=
ltltA[i] ltltendl
++- 54 M BENJELLOUN 2015 UMONS
include hellip
void Saisie_T( int tab[] )
int N i
N= 3
for (i = 0 i ltN i++) tab[i] = i
void Affiche_T(int tab[] int N )
int i
for (i = 0 i ltN i++) cout ltlt tab[i]
void main()
int T[20] n
Saisie_T( T )
Affiche_T(T n )
tab[0] = 0
tab[1] = 1
tab[2] = 2
Qursquoaffiche ce programme agrave lrsquoeacutecran
28
++- 55 M BENJELLOUN 2015 UMONS
include hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 = 7
return hellip
Comment retourner v1 et v2
++- 56 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltlt a = ltlt a ltlt endl ltlt b = ltlt b
void echange(int xint y)
int tmp
tmp = x
x = y
y =tmp
void main()
int a = 1 b = 5
cout ltlt Avant ltltendl
affiche(ab)
echange(ab)
cout ltlt nApregraves ltltendl
affiche(ab)
Avant
a = 1
b = 5
Apregraves
PASSAGE DES PARAMETRES
Transmission des arguments
Comment eacutechanger a et b
a = 1
b = 5
PAR VALEUR
29
++- 57 M BENJELLOUN 2015 UMONS
Le pointeur prend comme
valeurs des adresses de
donneacutees en meacutemoire
Types de base hellip donneacutee
8
donneacutee
35 hellip
Adr i Adr j
Meacutemoire
12FF80 12FF84
Ladresse de leacuteleacutement i est ampi i=8 et ampi= 12FF80
int i=8 j=35
Et les pointeurs
hellip p=12FF84 hellip 35 hellip
12FF84 12FF80
int p p est le contenu pointeacute par p 35
p est lrsquoadresse 12FF84
++- 58 M BENJELLOUN 2015 UMONS
Deacuteclaration de Pointeurs Le symbole est utiliseacute entre le type et le nom du pointeur
Deacuteclaration drsquoun entier int i int p Deacuteclaration drsquoun pointeur vers un entier
Exemples de deacuteclarations de pointeurs
int pi pi est un pointeur vers un int pi deacutesigne le contenu de ladresse
float pf pf est un pointeur vers un float
char c d pc c et d sont des char pc est un pointeur vers un char
int C = 4
int p
p = ampC p reccediloit ladresse de c donc pointe sur c
cout ltlt p = ltltpltltendl
cout ltlt p = ltltp ltltendl
cout ltlt (ampC) ltlt(ampC)
p = 4
p = 0x12FF7C
(ampC) = 4
Ladresse de C est ampC
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
15
++- 29 M BENJELLOUN 2015 UMONS
Tableaux et Strings
Un tableau est une collection de variables de mecircme type appeleacutees eacuteleacutements
Type Nom_Tableau[dim]
int tab[4] deacuteclare un tableau de 4 valeurs entiegraveres tab[0] tab[1] tab[2] tab[3]
const int SIZE = 5
int A[SIZE] A est un vecteur de 5 entiers
float B[5]
int A[SIZE] = 10 20 30 40 50
int premier[] = 1 2 3 5 7 11 13
char Tab_Char[4] = A C F G
int Tab[50] = 0
int i = 10
int a[i]
int primes[]
Deacuteclaration
Initialisation
Interdiction
Constante
++- 30 M BENJELLOUN 2015 UMONS
Accegraves aux eacuteleacutements drsquoun tableau
Les eacuteleacutements sont numeacuteroteacutes de 0 agrave dim-1
Il nrsquoy a pas de veacuterification des bornes
void main()
int a[6]
int i = 7
a[0] = 9
a[5] = -10
a[i2] = 2
a[6] = 0
a[-1] = 5
0
a
1
2
3
4
5
9
2
-10
void main(void)
const int dim=6
int i
int A[dim] = 1 2 3 4 5 6
for (i=0iltdimi++)
A[i] = 2i
coutltltA[ltltiltlt]=ltltA[i]
A[0]=0 A[1]=2 A[2]=4 A[3]=6 A[4]=8 A[5]=10
16
++- 31 M BENJELLOUN 2015 UMONS
Chaicircnes de caractegraveres ou String
char Nom[dim] Initialisation
Pour terminer la chaicircne on place en fin de chaicircne le caractegravere nul 0 de code ASCII 0
Ce caractegravere est soit ajouteacute automatiquement par le compilateur soit introduit par le programmeur selon les fonctions utiliseacutees
char S[] = Hello0 H
e
l
l
o
0
S[0] S[1] S[2] S[3] S[4] S[5] char S[6] = Hello
char S[5] = Hello H e l l o
char S[] = Le main L e m a i n 0
bull Un tableau de char agrave une dimension char Nom[dim]
bull Un type speacutecial string string Nom Il faut inclure ltstringgt
++- 32 M BENJELLOUN 2015 UMONS
string Nom Il faut inclure ltstringgt
string Nom est eacutequivalente agrave string Nom = Donc par deacutefaut la chaicircne est vide
Il existe de nombreuses faccedilons drsquoinitialiser Ident par exemple
string s1 = Bonjour a vous
string s2 = s1 s2 contient Bonjour a vous
string s3(4 x) eacutequivaut agrave string s3 = xxxx
string s4(s1 4 8) s4 contient our a voldquo S1 de 4 + 8
B o n j o u r a v o u s 0 1 2 3 4 5 6 7 8 9 10 11 12 13
include ltstringgt hellip string ST = Salut char H[6] = Hello for (int i=0 ilt5 i++) cout ltlt ST[i] ltlt affichera S a l u t
for (int i=0 ilt5 i++) cout ltlt H[i] ltlt affichera H e l l o
17
++- 33 M BENJELLOUN 2015 UMONS
Pourquoi utiliser string Nom plutocirct que char Nom[dim]
char S1[6] = Salut S2[6] = Hello S3[12]
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Interdit
string S1 = Salut S2 = Hello S3
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Autoriseacute
S1= Hello
S1= Hooo
S3= HoooHello
false
++- 34 M BENJELLOUN 2015 UMONS
include ltiostreamgt
include ltstringgt traitement de string
using namespace std espace de nommage std pour importer les
symboles de la bibliothegraveque standard C++
void main(void)
string nom1 nom2 nom3
int len size
cout ltlt Donnez Nom1 cin gtgt nom1
cout ltlt Donnez Nom2 cin gtgt nom2
len = nom1length() nombre de caractegraveres dans nom1
size = nom2size() nombre de caractegraveres dans nom2
cout ltlt Nom1 ltltnom1 ltlt Dim Nom1 = ltlt len ltlt endl
cout ltlt Nom2 ltltnom2 ltlt Dim Nom2 = ltlt size ltlt endl
nom3 = nom2+ +nom1
cout ltlt Nom3 = ltlt nom3 ltlt endl
if(nom1gtnom2) cout ltlt nom1 gt nom2 ltlt endl
else if (nom1==nom2) cout ltlt nom1 = nom2 ltlt endl
else cout ltlt nom1 lt nom2 ltlt endl
nom1=nom2
cout ltlt nom1 = ltlt nom1 ltlt nom2 ltlt nom2 ltlt endl
Donnez Nom1 salut
Donnez Nom2 hello
Nom1 salut Dim Nom1 = 5
Nom2 hello Dim Nom2 = 5
Nom3 = hello salut
nom1 gt nom2
nom1 = hello nom2 hello
Donnez Nom1 csou
Donnez Nom2 pi
Nom1csou Dim Nom1 = 4
Nom2pi Dim Nom2 = 2
Nom3 = pi csou
nom1 lt nom2
nom1 = pi nom2 pi
18
++- 35 M BENJELLOUN 2015 UMONS
Algorithmes de tri
Nom de lrsquoalgorithme Complexiteacute
Tri agrave bulles Tri par seacutelection Tri par insertion Tri de Shell (shell sort) Ameacutelioration du tri par insertion Tri fusion (merge sort) Tri rapide (quick sort) Tri par tas (heap sort)
O(N2) O(N2) O(N2)
O(N log2 N)
O(N log N) O(N log N) O(N log N)
++- 36 M BENJELLOUN 2015 UMONS
Tri agrave bulles bubble sort
reacutepeacuteter permutation = FALSE commencer au deacutebut du drapeau Pour i variant de 0 agrave N ndash 2 faire si cellule [i] gt cellule [i+1] alors deacutebut permuter cellules permutation = TRUE fin jusquagrave ce que (not permutation)
Complexiteacute O(Nsup2) Proportionnel agrave Nsup2 permutations
void TriaBulles(int x[] int N) int i perm=1 tmp while (perm==1) perm =0 for (i=0iltN-1i++) if(x[i] gt x[i+1]) tmp = x[i] x[i] = x[i+1] x[i+1] = tmp perm = 1
Algorithmes de tri
19
++- 37 M BENJELLOUN 2015 UMONS
void tri_par_selection(int t[] int n) int i j min tmp for (i = 0 i lt n - 1 i++) min = i for(j = i+1 j lt n j++) if(t[j] lt t[min]) min = j if(min = i) tmp = t[i] t[i] = t[min] t[min] = tmp
Le tri par seacutelection consiste en la recherche du plus grand eacuteleacutement (le plus petit) que lon va replacer en derniegravere position (en premiegravere) puis on recherche le second plus grand eacuteleacutement (le second plus petit) que lon va replacer eacutegalement agrave sa position finale et ainsi de suite
Algorithmes de tri
++- 38 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement dans un tableau
Recherche lineacuteaire Recherche dichotomique (binary search)
0
9
1
3
2
6
3
2
4
1
5
12
6
0
Est une meacutethode efficace pour retrouver un eacuteleacutement dans un tableau trieacute
A chaque eacutetape de la recherche dichotomique lrsquointervalle de recherche est diviseacute par deux
On utilise degraves lors deux index de recherche la borne infeacuterieure et la borne supeacuterieure
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup mid
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup
On initialise les bornes inf et sup agrave la premiegravere et derniegravere valeur des index du tableau tab
respectivement
Le milieu est donneacute par
mid = (inf+sup) 2 (0+6)2 =3
Supposons que lrsquoon recherche la valeur i=6 On
compare cette valeur avec tab[mid]=8 Comme
tab[mid]gti on change mid en sup
mid = (inf+sup) 2 (0+3)2 =1
inf=1 et sup=3
hellip
20
++- 39 M BENJELLOUN 2015 UMONS
44 Eacutecrire un programme qui supprime le premier et le dernier eacuteleacutement drsquoun vecteur
vecteur initial Tab 0 1 2 3 4 5 6
sup bords 1 2 3 4 5
sup bords 2 3 4
45 Eacutecrire un programme qui supprime le milieu du tableau et ajoute son double au deacutebut
vecteur initial Tab 1 2 3 4 5
sup Aj 6 1 2 4 5
sup Aj 4 6 1 4 5
46 Codez un programme de tri agrave bulles dun vecteur de strings
47 Codez un programme de recherche dichotomique dun nombre dans un vecteur de
strings rangeacutes par ordre croissant
++- 40 M BENJELLOUN 2015 UMONS
Matrices Rangeacutees ligne par ligne
Consideacutereacutees comme des vecteurs de lignes
Accegraves aux composantes par double crochets
int a[10][5]
a[1][0] = 7
int x[2][2] = 123 4 2 lignes et 2 colonnes
1 2
3 4 include hellip
void main()
int i j tab[5][4]
for (i = 0 i lt5 i++) Saisie
for (j = 0 j lt 4 j++) tab[i][j] = i
for (i = 0 i lt5 i++) Affichage
for (j = 0 j lt 4 j++) coutltlt tab[i][j] ltlt
cout ltlt endl
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
21
++- 41 M BENJELLOUN 2015 UMONS
Affichage de la table de multiplication
++- 42 M BENJELLOUN 2015 UMONS
Fonctions en C++
Encapsule un traitement particulier formant un tout
Peut impleacutementer la notion de module en logique
Augmente la lisibiliteacute drsquoun programme
Reacutealise un objectif preacutecis
Ameacuteliore le deacutebogage et la maintenance drsquoun programme
Son utilisation se deacutecompose en trois phases
Deacutefinition de la fonction
Deacuteclaration de la fonction
Appel de la fonction
Deacuteclarer une fonction
Appeler une fonction
Regravegles de visibiliteacute des variables
Passage des paramegravetres par valeur
Fonction renvoyant une valeur au programme
Passage des paramegravetres par valeur et par adresse
Passage des tableaux aux fonctions
22
++- 43 M BENJELLOUN 2015 UMONS
Type nom_fonction(liste_param_typeacutes)
deacuteclaration de variables locales
hellip Corps de la fonction
hellip
return (valeur)
Deacutefinition drsquoune fonction
Une fonction renvoie une valeur ou rien
liste_param_typeacutes = 0 void ou plusieurs
int Somme(int x int y)
int S Variable locale agrave Somme
S= x+y
return S
void fonction1()
coutltltn fonction1 n
void fonction2() coutltltn fonction2 n
Limbrication de fonctions
nest pas autoriseacutee
Deacutefinition
++- 44 M BENJELLOUN 2015 UMONS
Fonctions pourquoi
include ltiostreamgt
using namespace std
void main()
int i j SomCar1=0 SomCar2=0 SomCar3=0
for (i = 0 i lt5 i++)
SomCar1 = SomCar1 + ii
for (i = 0 i lt10 i++)
SomCar2 = SomCar2 + ii
for (j = 0 j lt 7 j++)
SomCar3 = SomCar3 + jj
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
include ltiostreamgt
using namespace std
int Fnct_SomCar(int N)
int i S=0
for (i = 0 i ltN i++)
S = S + ii S+=ii
return S
void main()
int SomCar1 SomCar2 SomCar3
SomCar1 = Fnct_SomCar(5)
SomCar2 = Fnct_SomCar(10)
SomCar3 = Fnct_SomCar(7)
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
23
++- 45 M BENJELLOUN 2015 UMONS
hellip
int Somme(int x int y)
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
int Somme(int x int y)
int S
S= x+y
return S
hellip
int Somme(int x int y)
int S
S= x+y
return S
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
Deacuteclaration et appel drsquoune fonction
++- 46 M BENJELLOUN 2015 UMONS
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
int addition() float tmp tmp = calcule(253) + calcule(572) return (int)tmp float calcule(float C float D) return ( (C + D ) 2)
float calcule(float float)
int addition()
float calcule(float A float B) return ( (A + B ) 2)
int addition() Appel drsquoune fonction dans une fonction
float tmp tmp = calcule(253) + calcule(572) return (int)tmp
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
Deacuteclaration et appel drsquoune fonction
24
++- 47 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void Addition(int v float f)
void main()
int v = 5
float f= 45
Addition(v f) Appel de la fonction
cout ltlt n Main v et f ltlt v ltlt et ltltf
void Addition(int v float f)
cout ltlt Addition v + f = ltlt v+f ltlt endl
f = f + v
cout ltlt Addition f = ltlt f
Addition v+f = 95
Addition f = 95
Main v et f = 5 et 45
v= 5 et f=45
5+ 45
f = 95
Les paramegravetres sont copieacutes La fonction travaille sur des copies de v et de f
++- 48 M BENJELLOUN 2015 UMONS
Fonction Renvoyant une valeur au programme
include ltiostreamgt
using namespace std
int change(int X)
void main(void)
int var = 5
int valeur
valeur = return_Val (var)
cout ltltmain var = ltlt var ltlt endl
cout ltltmain valeur = ltlt valeur
int return_Val (int v)
v = 100
cout ltlt return_Val v = ltlt v ltlt endl
return (v+1)
return_Val v = 100 main var = 5 main valeur = 101
Une fonction se termine et lsquorend la mainrsquo agrave
la fonction appelante lorsque son exeacutecution
rencontre lrsquoinstruction return expression
ou return
25
++- 49 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5 valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5
int valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
cout ltlt return_Val v = ltlt vltltendl
Qursquoaffiche ce programme agrave lrsquoeacutecran Qursquoaffiche ce programme agrave lrsquoeacutecran
++- 50 M BENJELLOUN 2015 UMONS
Fonctions et reacutecursiviteacute
Tours de Hanoiuml Suite de Fibonacci
un = un-1 + un-2
u0=u1=1
Puissance entiegravere
Une fonction est dite reacutecursive lorsqursquoelle srsquoappelle elle-mecircme
int factorielle (int n )
if ( n lt 0) return (ndash1) code derreur
else if ( n == 0 ) return 1 0 = 1
else
return n factorielle( n-1 ) n = n(n-1)
a x an-1 si n gt 0
1 si n = 0
an-1 =
26
++- 51 M BENJELLOUN 2015 UMONS
Passer des tableaux aux fonctions
Les tableaux peuvent ecirctre passeacutes comme paramegravetres dune fonction
Ils ne peuvent pas ecirctre retourneacutes comme reacutesultat dune fonction
La longueur du tableau ne doit pas ecirctre deacutefinie agrave la deacuteclaration de la fonction
Un tableau peut ecirctre modifieacute dans une fonction Il est passeacute par reacutefeacuterence (adresse) et
non par valeur
include hellip
void Modif(int a[])
a[0] = 5
a[1] = 6
void main(void)
int p[2] = 1 2
cout ltlt p[0] ltlt ltlt p[1]
Modif(p)
cout ltlt p[0] ltlt ltlt p[1]
1 2
5 6
include hellip
void Modif(int x[] int n)
void main(void)
int i
int p[6] = 1 2 3 5 7 11
Modif(p 6)
for (i=0ilt6i++)
coutltlt p[i]
void Modif(int a[] int n)
int i
for(i = 0 i ltn i++)
a[i] = 5
++- 52 M BENJELLOUN 2015 UMONS
void Saisie_Mat( int tab[][4] int m int n)
int i j
for (i = 0 i ltm i++)
for (j = 0 j lt n j++)
tab[i][j] = i
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
Matrice Exemple
void Affiche_Mat( int tab[][4] int m int n)
for (int i = 0 i ltm i++)
for (int j = 0 j lt n j++)
cout ltlt tab[i][j] ltlt
cout ltlt endl
include ltiostreamgt
using namespace std
void main()
int T[5][5]
Saisie_Mat( T 4 4 )
Affiche_Mat( T 4 4 )
27
++- 53 M BENJELLOUN 2015 UMONS
include hellip
int LaSomme( )
int A[Nmax] N int S = 0
for (int i=0ilt N i++)
cout ltltEntrez A[ltltiltlt]=
cin gtgtA[i]
S= S+ A[i]
return S
void main()
const int Nmax = 7
int i A[Nmax] S=0 N=3
S = LaSomme( )
cout ltlt Affichage ltlt endl
Affichage(A N)
cout ltlt n La somme est = ltlt S
Qursquoaffiche ce programme agrave lrsquoeacutecran
void Affichage( int A[] int N)
for (int i=0i lt N i++)
cout ltlt A[ltltiltlt]=
ltltA[i] ltltendl
++- 54 M BENJELLOUN 2015 UMONS
include hellip
void Saisie_T( int tab[] )
int N i
N= 3
for (i = 0 i ltN i++) tab[i] = i
void Affiche_T(int tab[] int N )
int i
for (i = 0 i ltN i++) cout ltlt tab[i]
void main()
int T[20] n
Saisie_T( T )
Affiche_T(T n )
tab[0] = 0
tab[1] = 1
tab[2] = 2
Qursquoaffiche ce programme agrave lrsquoeacutecran
28
++- 55 M BENJELLOUN 2015 UMONS
include hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 = 7
return hellip
Comment retourner v1 et v2
++- 56 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltlt a = ltlt a ltlt endl ltlt b = ltlt b
void echange(int xint y)
int tmp
tmp = x
x = y
y =tmp
void main()
int a = 1 b = 5
cout ltlt Avant ltltendl
affiche(ab)
echange(ab)
cout ltlt nApregraves ltltendl
affiche(ab)
Avant
a = 1
b = 5
Apregraves
PASSAGE DES PARAMETRES
Transmission des arguments
Comment eacutechanger a et b
a = 1
b = 5
PAR VALEUR
29
++- 57 M BENJELLOUN 2015 UMONS
Le pointeur prend comme
valeurs des adresses de
donneacutees en meacutemoire
Types de base hellip donneacutee
8
donneacutee
35 hellip
Adr i Adr j
Meacutemoire
12FF80 12FF84
Ladresse de leacuteleacutement i est ampi i=8 et ampi= 12FF80
int i=8 j=35
Et les pointeurs
hellip p=12FF84 hellip 35 hellip
12FF84 12FF80
int p p est le contenu pointeacute par p 35
p est lrsquoadresse 12FF84
++- 58 M BENJELLOUN 2015 UMONS
Deacuteclaration de Pointeurs Le symbole est utiliseacute entre le type et le nom du pointeur
Deacuteclaration drsquoun entier int i int p Deacuteclaration drsquoun pointeur vers un entier
Exemples de deacuteclarations de pointeurs
int pi pi est un pointeur vers un int pi deacutesigne le contenu de ladresse
float pf pf est un pointeur vers un float
char c d pc c et d sont des char pc est un pointeur vers un char
int C = 4
int p
p = ampC p reccediloit ladresse de c donc pointe sur c
cout ltlt p = ltltpltltendl
cout ltlt p = ltltp ltltendl
cout ltlt (ampC) ltlt(ampC)
p = 4
p = 0x12FF7C
(ampC) = 4
Ladresse de C est ampC
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
16
++- 31 M BENJELLOUN 2015 UMONS
Chaicircnes de caractegraveres ou String
char Nom[dim] Initialisation
Pour terminer la chaicircne on place en fin de chaicircne le caractegravere nul 0 de code ASCII 0
Ce caractegravere est soit ajouteacute automatiquement par le compilateur soit introduit par le programmeur selon les fonctions utiliseacutees
char S[] = Hello0 H
e
l
l
o
0
S[0] S[1] S[2] S[3] S[4] S[5] char S[6] = Hello
char S[5] = Hello H e l l o
char S[] = Le main L e m a i n 0
bull Un tableau de char agrave une dimension char Nom[dim]
bull Un type speacutecial string string Nom Il faut inclure ltstringgt
++- 32 M BENJELLOUN 2015 UMONS
string Nom Il faut inclure ltstringgt
string Nom est eacutequivalente agrave string Nom = Donc par deacutefaut la chaicircne est vide
Il existe de nombreuses faccedilons drsquoinitialiser Ident par exemple
string s1 = Bonjour a vous
string s2 = s1 s2 contient Bonjour a vous
string s3(4 x) eacutequivaut agrave string s3 = xxxx
string s4(s1 4 8) s4 contient our a voldquo S1 de 4 + 8
B o n j o u r a v o u s 0 1 2 3 4 5 6 7 8 9 10 11 12 13
include ltstringgt hellip string ST = Salut char H[6] = Hello for (int i=0 ilt5 i++) cout ltlt ST[i] ltlt affichera S a l u t
for (int i=0 ilt5 i++) cout ltlt H[i] ltlt affichera H e l l o
17
++- 33 M BENJELLOUN 2015 UMONS
Pourquoi utiliser string Nom plutocirct que char Nom[dim]
char S1[6] = Salut S2[6] = Hello S3[12]
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Interdit
string S1 = Salut S2 = Hello S3
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Autoriseacute
S1= Hello
S1= Hooo
S3= HoooHello
false
++- 34 M BENJELLOUN 2015 UMONS
include ltiostreamgt
include ltstringgt traitement de string
using namespace std espace de nommage std pour importer les
symboles de la bibliothegraveque standard C++
void main(void)
string nom1 nom2 nom3
int len size
cout ltlt Donnez Nom1 cin gtgt nom1
cout ltlt Donnez Nom2 cin gtgt nom2
len = nom1length() nombre de caractegraveres dans nom1
size = nom2size() nombre de caractegraveres dans nom2
cout ltlt Nom1 ltltnom1 ltlt Dim Nom1 = ltlt len ltlt endl
cout ltlt Nom2 ltltnom2 ltlt Dim Nom2 = ltlt size ltlt endl
nom3 = nom2+ +nom1
cout ltlt Nom3 = ltlt nom3 ltlt endl
if(nom1gtnom2) cout ltlt nom1 gt nom2 ltlt endl
else if (nom1==nom2) cout ltlt nom1 = nom2 ltlt endl
else cout ltlt nom1 lt nom2 ltlt endl
nom1=nom2
cout ltlt nom1 = ltlt nom1 ltlt nom2 ltlt nom2 ltlt endl
Donnez Nom1 salut
Donnez Nom2 hello
Nom1 salut Dim Nom1 = 5
Nom2 hello Dim Nom2 = 5
Nom3 = hello salut
nom1 gt nom2
nom1 = hello nom2 hello
Donnez Nom1 csou
Donnez Nom2 pi
Nom1csou Dim Nom1 = 4
Nom2pi Dim Nom2 = 2
Nom3 = pi csou
nom1 lt nom2
nom1 = pi nom2 pi
18
++- 35 M BENJELLOUN 2015 UMONS
Algorithmes de tri
Nom de lrsquoalgorithme Complexiteacute
Tri agrave bulles Tri par seacutelection Tri par insertion Tri de Shell (shell sort) Ameacutelioration du tri par insertion Tri fusion (merge sort) Tri rapide (quick sort) Tri par tas (heap sort)
O(N2) O(N2) O(N2)
O(N log2 N)
O(N log N) O(N log N) O(N log N)
++- 36 M BENJELLOUN 2015 UMONS
Tri agrave bulles bubble sort
reacutepeacuteter permutation = FALSE commencer au deacutebut du drapeau Pour i variant de 0 agrave N ndash 2 faire si cellule [i] gt cellule [i+1] alors deacutebut permuter cellules permutation = TRUE fin jusquagrave ce que (not permutation)
Complexiteacute O(Nsup2) Proportionnel agrave Nsup2 permutations
void TriaBulles(int x[] int N) int i perm=1 tmp while (perm==1) perm =0 for (i=0iltN-1i++) if(x[i] gt x[i+1]) tmp = x[i] x[i] = x[i+1] x[i+1] = tmp perm = 1
Algorithmes de tri
19
++- 37 M BENJELLOUN 2015 UMONS
void tri_par_selection(int t[] int n) int i j min tmp for (i = 0 i lt n - 1 i++) min = i for(j = i+1 j lt n j++) if(t[j] lt t[min]) min = j if(min = i) tmp = t[i] t[i] = t[min] t[min] = tmp
Le tri par seacutelection consiste en la recherche du plus grand eacuteleacutement (le plus petit) que lon va replacer en derniegravere position (en premiegravere) puis on recherche le second plus grand eacuteleacutement (le second plus petit) que lon va replacer eacutegalement agrave sa position finale et ainsi de suite
Algorithmes de tri
++- 38 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement dans un tableau
Recherche lineacuteaire Recherche dichotomique (binary search)
0
9
1
3
2
6
3
2
4
1
5
12
6
0
Est une meacutethode efficace pour retrouver un eacuteleacutement dans un tableau trieacute
A chaque eacutetape de la recherche dichotomique lrsquointervalle de recherche est diviseacute par deux
On utilise degraves lors deux index de recherche la borne infeacuterieure et la borne supeacuterieure
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup mid
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup
On initialise les bornes inf et sup agrave la premiegravere et derniegravere valeur des index du tableau tab
respectivement
Le milieu est donneacute par
mid = (inf+sup) 2 (0+6)2 =3
Supposons que lrsquoon recherche la valeur i=6 On
compare cette valeur avec tab[mid]=8 Comme
tab[mid]gti on change mid en sup
mid = (inf+sup) 2 (0+3)2 =1
inf=1 et sup=3
hellip
20
++- 39 M BENJELLOUN 2015 UMONS
44 Eacutecrire un programme qui supprime le premier et le dernier eacuteleacutement drsquoun vecteur
vecteur initial Tab 0 1 2 3 4 5 6
sup bords 1 2 3 4 5
sup bords 2 3 4
45 Eacutecrire un programme qui supprime le milieu du tableau et ajoute son double au deacutebut
vecteur initial Tab 1 2 3 4 5
sup Aj 6 1 2 4 5
sup Aj 4 6 1 4 5
46 Codez un programme de tri agrave bulles dun vecteur de strings
47 Codez un programme de recherche dichotomique dun nombre dans un vecteur de
strings rangeacutes par ordre croissant
++- 40 M BENJELLOUN 2015 UMONS
Matrices Rangeacutees ligne par ligne
Consideacutereacutees comme des vecteurs de lignes
Accegraves aux composantes par double crochets
int a[10][5]
a[1][0] = 7
int x[2][2] = 123 4 2 lignes et 2 colonnes
1 2
3 4 include hellip
void main()
int i j tab[5][4]
for (i = 0 i lt5 i++) Saisie
for (j = 0 j lt 4 j++) tab[i][j] = i
for (i = 0 i lt5 i++) Affichage
for (j = 0 j lt 4 j++) coutltlt tab[i][j] ltlt
cout ltlt endl
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
21
++- 41 M BENJELLOUN 2015 UMONS
Affichage de la table de multiplication
++- 42 M BENJELLOUN 2015 UMONS
Fonctions en C++
Encapsule un traitement particulier formant un tout
Peut impleacutementer la notion de module en logique
Augmente la lisibiliteacute drsquoun programme
Reacutealise un objectif preacutecis
Ameacuteliore le deacutebogage et la maintenance drsquoun programme
Son utilisation se deacutecompose en trois phases
Deacutefinition de la fonction
Deacuteclaration de la fonction
Appel de la fonction
Deacuteclarer une fonction
Appeler une fonction
Regravegles de visibiliteacute des variables
Passage des paramegravetres par valeur
Fonction renvoyant une valeur au programme
Passage des paramegravetres par valeur et par adresse
Passage des tableaux aux fonctions
22
++- 43 M BENJELLOUN 2015 UMONS
Type nom_fonction(liste_param_typeacutes)
deacuteclaration de variables locales
hellip Corps de la fonction
hellip
return (valeur)
Deacutefinition drsquoune fonction
Une fonction renvoie une valeur ou rien
liste_param_typeacutes = 0 void ou plusieurs
int Somme(int x int y)
int S Variable locale agrave Somme
S= x+y
return S
void fonction1()
coutltltn fonction1 n
void fonction2() coutltltn fonction2 n
Limbrication de fonctions
nest pas autoriseacutee
Deacutefinition
++- 44 M BENJELLOUN 2015 UMONS
Fonctions pourquoi
include ltiostreamgt
using namespace std
void main()
int i j SomCar1=0 SomCar2=0 SomCar3=0
for (i = 0 i lt5 i++)
SomCar1 = SomCar1 + ii
for (i = 0 i lt10 i++)
SomCar2 = SomCar2 + ii
for (j = 0 j lt 7 j++)
SomCar3 = SomCar3 + jj
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
include ltiostreamgt
using namespace std
int Fnct_SomCar(int N)
int i S=0
for (i = 0 i ltN i++)
S = S + ii S+=ii
return S
void main()
int SomCar1 SomCar2 SomCar3
SomCar1 = Fnct_SomCar(5)
SomCar2 = Fnct_SomCar(10)
SomCar3 = Fnct_SomCar(7)
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
23
++- 45 M BENJELLOUN 2015 UMONS
hellip
int Somme(int x int y)
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
int Somme(int x int y)
int S
S= x+y
return S
hellip
int Somme(int x int y)
int S
S= x+y
return S
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
Deacuteclaration et appel drsquoune fonction
++- 46 M BENJELLOUN 2015 UMONS
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
int addition() float tmp tmp = calcule(253) + calcule(572) return (int)tmp float calcule(float C float D) return ( (C + D ) 2)
float calcule(float float)
int addition()
float calcule(float A float B) return ( (A + B ) 2)
int addition() Appel drsquoune fonction dans une fonction
float tmp tmp = calcule(253) + calcule(572) return (int)tmp
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
Deacuteclaration et appel drsquoune fonction
24
++- 47 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void Addition(int v float f)
void main()
int v = 5
float f= 45
Addition(v f) Appel de la fonction
cout ltlt n Main v et f ltlt v ltlt et ltltf
void Addition(int v float f)
cout ltlt Addition v + f = ltlt v+f ltlt endl
f = f + v
cout ltlt Addition f = ltlt f
Addition v+f = 95
Addition f = 95
Main v et f = 5 et 45
v= 5 et f=45
5+ 45
f = 95
Les paramegravetres sont copieacutes La fonction travaille sur des copies de v et de f
++- 48 M BENJELLOUN 2015 UMONS
Fonction Renvoyant une valeur au programme
include ltiostreamgt
using namespace std
int change(int X)
void main(void)
int var = 5
int valeur
valeur = return_Val (var)
cout ltltmain var = ltlt var ltlt endl
cout ltltmain valeur = ltlt valeur
int return_Val (int v)
v = 100
cout ltlt return_Val v = ltlt v ltlt endl
return (v+1)
return_Val v = 100 main var = 5 main valeur = 101
Une fonction se termine et lsquorend la mainrsquo agrave
la fonction appelante lorsque son exeacutecution
rencontre lrsquoinstruction return expression
ou return
25
++- 49 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5 valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5
int valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
cout ltlt return_Val v = ltlt vltltendl
Qursquoaffiche ce programme agrave lrsquoeacutecran Qursquoaffiche ce programme agrave lrsquoeacutecran
++- 50 M BENJELLOUN 2015 UMONS
Fonctions et reacutecursiviteacute
Tours de Hanoiuml Suite de Fibonacci
un = un-1 + un-2
u0=u1=1
Puissance entiegravere
Une fonction est dite reacutecursive lorsqursquoelle srsquoappelle elle-mecircme
int factorielle (int n )
if ( n lt 0) return (ndash1) code derreur
else if ( n == 0 ) return 1 0 = 1
else
return n factorielle( n-1 ) n = n(n-1)
a x an-1 si n gt 0
1 si n = 0
an-1 =
26
++- 51 M BENJELLOUN 2015 UMONS
Passer des tableaux aux fonctions
Les tableaux peuvent ecirctre passeacutes comme paramegravetres dune fonction
Ils ne peuvent pas ecirctre retourneacutes comme reacutesultat dune fonction
La longueur du tableau ne doit pas ecirctre deacutefinie agrave la deacuteclaration de la fonction
Un tableau peut ecirctre modifieacute dans une fonction Il est passeacute par reacutefeacuterence (adresse) et
non par valeur
include hellip
void Modif(int a[])
a[0] = 5
a[1] = 6
void main(void)
int p[2] = 1 2
cout ltlt p[0] ltlt ltlt p[1]
Modif(p)
cout ltlt p[0] ltlt ltlt p[1]
1 2
5 6
include hellip
void Modif(int x[] int n)
void main(void)
int i
int p[6] = 1 2 3 5 7 11
Modif(p 6)
for (i=0ilt6i++)
coutltlt p[i]
void Modif(int a[] int n)
int i
for(i = 0 i ltn i++)
a[i] = 5
++- 52 M BENJELLOUN 2015 UMONS
void Saisie_Mat( int tab[][4] int m int n)
int i j
for (i = 0 i ltm i++)
for (j = 0 j lt n j++)
tab[i][j] = i
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
Matrice Exemple
void Affiche_Mat( int tab[][4] int m int n)
for (int i = 0 i ltm i++)
for (int j = 0 j lt n j++)
cout ltlt tab[i][j] ltlt
cout ltlt endl
include ltiostreamgt
using namespace std
void main()
int T[5][5]
Saisie_Mat( T 4 4 )
Affiche_Mat( T 4 4 )
27
++- 53 M BENJELLOUN 2015 UMONS
include hellip
int LaSomme( )
int A[Nmax] N int S = 0
for (int i=0ilt N i++)
cout ltltEntrez A[ltltiltlt]=
cin gtgtA[i]
S= S+ A[i]
return S
void main()
const int Nmax = 7
int i A[Nmax] S=0 N=3
S = LaSomme( )
cout ltlt Affichage ltlt endl
Affichage(A N)
cout ltlt n La somme est = ltlt S
Qursquoaffiche ce programme agrave lrsquoeacutecran
void Affichage( int A[] int N)
for (int i=0i lt N i++)
cout ltlt A[ltltiltlt]=
ltltA[i] ltltendl
++- 54 M BENJELLOUN 2015 UMONS
include hellip
void Saisie_T( int tab[] )
int N i
N= 3
for (i = 0 i ltN i++) tab[i] = i
void Affiche_T(int tab[] int N )
int i
for (i = 0 i ltN i++) cout ltlt tab[i]
void main()
int T[20] n
Saisie_T( T )
Affiche_T(T n )
tab[0] = 0
tab[1] = 1
tab[2] = 2
Qursquoaffiche ce programme agrave lrsquoeacutecran
28
++- 55 M BENJELLOUN 2015 UMONS
include hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 = 7
return hellip
Comment retourner v1 et v2
++- 56 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltlt a = ltlt a ltlt endl ltlt b = ltlt b
void echange(int xint y)
int tmp
tmp = x
x = y
y =tmp
void main()
int a = 1 b = 5
cout ltlt Avant ltltendl
affiche(ab)
echange(ab)
cout ltlt nApregraves ltltendl
affiche(ab)
Avant
a = 1
b = 5
Apregraves
PASSAGE DES PARAMETRES
Transmission des arguments
Comment eacutechanger a et b
a = 1
b = 5
PAR VALEUR
29
++- 57 M BENJELLOUN 2015 UMONS
Le pointeur prend comme
valeurs des adresses de
donneacutees en meacutemoire
Types de base hellip donneacutee
8
donneacutee
35 hellip
Adr i Adr j
Meacutemoire
12FF80 12FF84
Ladresse de leacuteleacutement i est ampi i=8 et ampi= 12FF80
int i=8 j=35
Et les pointeurs
hellip p=12FF84 hellip 35 hellip
12FF84 12FF80
int p p est le contenu pointeacute par p 35
p est lrsquoadresse 12FF84
++- 58 M BENJELLOUN 2015 UMONS
Deacuteclaration de Pointeurs Le symbole est utiliseacute entre le type et le nom du pointeur
Deacuteclaration drsquoun entier int i int p Deacuteclaration drsquoun pointeur vers un entier
Exemples de deacuteclarations de pointeurs
int pi pi est un pointeur vers un int pi deacutesigne le contenu de ladresse
float pf pf est un pointeur vers un float
char c d pc c et d sont des char pc est un pointeur vers un char
int C = 4
int p
p = ampC p reccediloit ladresse de c donc pointe sur c
cout ltlt p = ltltpltltendl
cout ltlt p = ltltp ltltendl
cout ltlt (ampC) ltlt(ampC)
p = 4
p = 0x12FF7C
(ampC) = 4
Ladresse de C est ampC
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
17
++- 33 M BENJELLOUN 2015 UMONS
Pourquoi utiliser string Nom plutocirct que char Nom[dim]
char S1[6] = Salut S2[6] = Hello S3[12]
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Interdit
string S1 = Salut S2 = Hello S3
S1= S2 S1= Hooo S3=S1+S2 if(S1= =S2) hellip Autoriseacute
S1= Hello
S1= Hooo
S3= HoooHello
false
++- 34 M BENJELLOUN 2015 UMONS
include ltiostreamgt
include ltstringgt traitement de string
using namespace std espace de nommage std pour importer les
symboles de la bibliothegraveque standard C++
void main(void)
string nom1 nom2 nom3
int len size
cout ltlt Donnez Nom1 cin gtgt nom1
cout ltlt Donnez Nom2 cin gtgt nom2
len = nom1length() nombre de caractegraveres dans nom1
size = nom2size() nombre de caractegraveres dans nom2
cout ltlt Nom1 ltltnom1 ltlt Dim Nom1 = ltlt len ltlt endl
cout ltlt Nom2 ltltnom2 ltlt Dim Nom2 = ltlt size ltlt endl
nom3 = nom2+ +nom1
cout ltlt Nom3 = ltlt nom3 ltlt endl
if(nom1gtnom2) cout ltlt nom1 gt nom2 ltlt endl
else if (nom1==nom2) cout ltlt nom1 = nom2 ltlt endl
else cout ltlt nom1 lt nom2 ltlt endl
nom1=nom2
cout ltlt nom1 = ltlt nom1 ltlt nom2 ltlt nom2 ltlt endl
Donnez Nom1 salut
Donnez Nom2 hello
Nom1 salut Dim Nom1 = 5
Nom2 hello Dim Nom2 = 5
Nom3 = hello salut
nom1 gt nom2
nom1 = hello nom2 hello
Donnez Nom1 csou
Donnez Nom2 pi
Nom1csou Dim Nom1 = 4
Nom2pi Dim Nom2 = 2
Nom3 = pi csou
nom1 lt nom2
nom1 = pi nom2 pi
18
++- 35 M BENJELLOUN 2015 UMONS
Algorithmes de tri
Nom de lrsquoalgorithme Complexiteacute
Tri agrave bulles Tri par seacutelection Tri par insertion Tri de Shell (shell sort) Ameacutelioration du tri par insertion Tri fusion (merge sort) Tri rapide (quick sort) Tri par tas (heap sort)
O(N2) O(N2) O(N2)
O(N log2 N)
O(N log N) O(N log N) O(N log N)
++- 36 M BENJELLOUN 2015 UMONS
Tri agrave bulles bubble sort
reacutepeacuteter permutation = FALSE commencer au deacutebut du drapeau Pour i variant de 0 agrave N ndash 2 faire si cellule [i] gt cellule [i+1] alors deacutebut permuter cellules permutation = TRUE fin jusquagrave ce que (not permutation)
Complexiteacute O(Nsup2) Proportionnel agrave Nsup2 permutations
void TriaBulles(int x[] int N) int i perm=1 tmp while (perm==1) perm =0 for (i=0iltN-1i++) if(x[i] gt x[i+1]) tmp = x[i] x[i] = x[i+1] x[i+1] = tmp perm = 1
Algorithmes de tri
19
++- 37 M BENJELLOUN 2015 UMONS
void tri_par_selection(int t[] int n) int i j min tmp for (i = 0 i lt n - 1 i++) min = i for(j = i+1 j lt n j++) if(t[j] lt t[min]) min = j if(min = i) tmp = t[i] t[i] = t[min] t[min] = tmp
Le tri par seacutelection consiste en la recherche du plus grand eacuteleacutement (le plus petit) que lon va replacer en derniegravere position (en premiegravere) puis on recherche le second plus grand eacuteleacutement (le second plus petit) que lon va replacer eacutegalement agrave sa position finale et ainsi de suite
Algorithmes de tri
++- 38 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement dans un tableau
Recherche lineacuteaire Recherche dichotomique (binary search)
0
9
1
3
2
6
3
2
4
1
5
12
6
0
Est une meacutethode efficace pour retrouver un eacuteleacutement dans un tableau trieacute
A chaque eacutetape de la recherche dichotomique lrsquointervalle de recherche est diviseacute par deux
On utilise degraves lors deux index de recherche la borne infeacuterieure et la borne supeacuterieure
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup mid
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup
On initialise les bornes inf et sup agrave la premiegravere et derniegravere valeur des index du tableau tab
respectivement
Le milieu est donneacute par
mid = (inf+sup) 2 (0+6)2 =3
Supposons que lrsquoon recherche la valeur i=6 On
compare cette valeur avec tab[mid]=8 Comme
tab[mid]gti on change mid en sup
mid = (inf+sup) 2 (0+3)2 =1
inf=1 et sup=3
hellip
20
++- 39 M BENJELLOUN 2015 UMONS
44 Eacutecrire un programme qui supprime le premier et le dernier eacuteleacutement drsquoun vecteur
vecteur initial Tab 0 1 2 3 4 5 6
sup bords 1 2 3 4 5
sup bords 2 3 4
45 Eacutecrire un programme qui supprime le milieu du tableau et ajoute son double au deacutebut
vecteur initial Tab 1 2 3 4 5
sup Aj 6 1 2 4 5
sup Aj 4 6 1 4 5
46 Codez un programme de tri agrave bulles dun vecteur de strings
47 Codez un programme de recherche dichotomique dun nombre dans un vecteur de
strings rangeacutes par ordre croissant
++- 40 M BENJELLOUN 2015 UMONS
Matrices Rangeacutees ligne par ligne
Consideacutereacutees comme des vecteurs de lignes
Accegraves aux composantes par double crochets
int a[10][5]
a[1][0] = 7
int x[2][2] = 123 4 2 lignes et 2 colonnes
1 2
3 4 include hellip
void main()
int i j tab[5][4]
for (i = 0 i lt5 i++) Saisie
for (j = 0 j lt 4 j++) tab[i][j] = i
for (i = 0 i lt5 i++) Affichage
for (j = 0 j lt 4 j++) coutltlt tab[i][j] ltlt
cout ltlt endl
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
21
++- 41 M BENJELLOUN 2015 UMONS
Affichage de la table de multiplication
++- 42 M BENJELLOUN 2015 UMONS
Fonctions en C++
Encapsule un traitement particulier formant un tout
Peut impleacutementer la notion de module en logique
Augmente la lisibiliteacute drsquoun programme
Reacutealise un objectif preacutecis
Ameacuteliore le deacutebogage et la maintenance drsquoun programme
Son utilisation se deacutecompose en trois phases
Deacutefinition de la fonction
Deacuteclaration de la fonction
Appel de la fonction
Deacuteclarer une fonction
Appeler une fonction
Regravegles de visibiliteacute des variables
Passage des paramegravetres par valeur
Fonction renvoyant une valeur au programme
Passage des paramegravetres par valeur et par adresse
Passage des tableaux aux fonctions
22
++- 43 M BENJELLOUN 2015 UMONS
Type nom_fonction(liste_param_typeacutes)
deacuteclaration de variables locales
hellip Corps de la fonction
hellip
return (valeur)
Deacutefinition drsquoune fonction
Une fonction renvoie une valeur ou rien
liste_param_typeacutes = 0 void ou plusieurs
int Somme(int x int y)
int S Variable locale agrave Somme
S= x+y
return S
void fonction1()
coutltltn fonction1 n
void fonction2() coutltltn fonction2 n
Limbrication de fonctions
nest pas autoriseacutee
Deacutefinition
++- 44 M BENJELLOUN 2015 UMONS
Fonctions pourquoi
include ltiostreamgt
using namespace std
void main()
int i j SomCar1=0 SomCar2=0 SomCar3=0
for (i = 0 i lt5 i++)
SomCar1 = SomCar1 + ii
for (i = 0 i lt10 i++)
SomCar2 = SomCar2 + ii
for (j = 0 j lt 7 j++)
SomCar3 = SomCar3 + jj
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
include ltiostreamgt
using namespace std
int Fnct_SomCar(int N)
int i S=0
for (i = 0 i ltN i++)
S = S + ii S+=ii
return S
void main()
int SomCar1 SomCar2 SomCar3
SomCar1 = Fnct_SomCar(5)
SomCar2 = Fnct_SomCar(10)
SomCar3 = Fnct_SomCar(7)
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
23
++- 45 M BENJELLOUN 2015 UMONS
hellip
int Somme(int x int y)
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
int Somme(int x int y)
int S
S= x+y
return S
hellip
int Somme(int x int y)
int S
S= x+y
return S
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
Deacuteclaration et appel drsquoune fonction
++- 46 M BENJELLOUN 2015 UMONS
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
int addition() float tmp tmp = calcule(253) + calcule(572) return (int)tmp float calcule(float C float D) return ( (C + D ) 2)
float calcule(float float)
int addition()
float calcule(float A float B) return ( (A + B ) 2)
int addition() Appel drsquoune fonction dans une fonction
float tmp tmp = calcule(253) + calcule(572) return (int)tmp
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
Deacuteclaration et appel drsquoune fonction
24
++- 47 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void Addition(int v float f)
void main()
int v = 5
float f= 45
Addition(v f) Appel de la fonction
cout ltlt n Main v et f ltlt v ltlt et ltltf
void Addition(int v float f)
cout ltlt Addition v + f = ltlt v+f ltlt endl
f = f + v
cout ltlt Addition f = ltlt f
Addition v+f = 95
Addition f = 95
Main v et f = 5 et 45
v= 5 et f=45
5+ 45
f = 95
Les paramegravetres sont copieacutes La fonction travaille sur des copies de v et de f
++- 48 M BENJELLOUN 2015 UMONS
Fonction Renvoyant une valeur au programme
include ltiostreamgt
using namespace std
int change(int X)
void main(void)
int var = 5
int valeur
valeur = return_Val (var)
cout ltltmain var = ltlt var ltlt endl
cout ltltmain valeur = ltlt valeur
int return_Val (int v)
v = 100
cout ltlt return_Val v = ltlt v ltlt endl
return (v+1)
return_Val v = 100 main var = 5 main valeur = 101
Une fonction se termine et lsquorend la mainrsquo agrave
la fonction appelante lorsque son exeacutecution
rencontre lrsquoinstruction return expression
ou return
25
++- 49 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5 valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5
int valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
cout ltlt return_Val v = ltlt vltltendl
Qursquoaffiche ce programme agrave lrsquoeacutecran Qursquoaffiche ce programme agrave lrsquoeacutecran
++- 50 M BENJELLOUN 2015 UMONS
Fonctions et reacutecursiviteacute
Tours de Hanoiuml Suite de Fibonacci
un = un-1 + un-2
u0=u1=1
Puissance entiegravere
Une fonction est dite reacutecursive lorsqursquoelle srsquoappelle elle-mecircme
int factorielle (int n )
if ( n lt 0) return (ndash1) code derreur
else if ( n == 0 ) return 1 0 = 1
else
return n factorielle( n-1 ) n = n(n-1)
a x an-1 si n gt 0
1 si n = 0
an-1 =
26
++- 51 M BENJELLOUN 2015 UMONS
Passer des tableaux aux fonctions
Les tableaux peuvent ecirctre passeacutes comme paramegravetres dune fonction
Ils ne peuvent pas ecirctre retourneacutes comme reacutesultat dune fonction
La longueur du tableau ne doit pas ecirctre deacutefinie agrave la deacuteclaration de la fonction
Un tableau peut ecirctre modifieacute dans une fonction Il est passeacute par reacutefeacuterence (adresse) et
non par valeur
include hellip
void Modif(int a[])
a[0] = 5
a[1] = 6
void main(void)
int p[2] = 1 2
cout ltlt p[0] ltlt ltlt p[1]
Modif(p)
cout ltlt p[0] ltlt ltlt p[1]
1 2
5 6
include hellip
void Modif(int x[] int n)
void main(void)
int i
int p[6] = 1 2 3 5 7 11
Modif(p 6)
for (i=0ilt6i++)
coutltlt p[i]
void Modif(int a[] int n)
int i
for(i = 0 i ltn i++)
a[i] = 5
++- 52 M BENJELLOUN 2015 UMONS
void Saisie_Mat( int tab[][4] int m int n)
int i j
for (i = 0 i ltm i++)
for (j = 0 j lt n j++)
tab[i][j] = i
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
Matrice Exemple
void Affiche_Mat( int tab[][4] int m int n)
for (int i = 0 i ltm i++)
for (int j = 0 j lt n j++)
cout ltlt tab[i][j] ltlt
cout ltlt endl
include ltiostreamgt
using namespace std
void main()
int T[5][5]
Saisie_Mat( T 4 4 )
Affiche_Mat( T 4 4 )
27
++- 53 M BENJELLOUN 2015 UMONS
include hellip
int LaSomme( )
int A[Nmax] N int S = 0
for (int i=0ilt N i++)
cout ltltEntrez A[ltltiltlt]=
cin gtgtA[i]
S= S+ A[i]
return S
void main()
const int Nmax = 7
int i A[Nmax] S=0 N=3
S = LaSomme( )
cout ltlt Affichage ltlt endl
Affichage(A N)
cout ltlt n La somme est = ltlt S
Qursquoaffiche ce programme agrave lrsquoeacutecran
void Affichage( int A[] int N)
for (int i=0i lt N i++)
cout ltlt A[ltltiltlt]=
ltltA[i] ltltendl
++- 54 M BENJELLOUN 2015 UMONS
include hellip
void Saisie_T( int tab[] )
int N i
N= 3
for (i = 0 i ltN i++) tab[i] = i
void Affiche_T(int tab[] int N )
int i
for (i = 0 i ltN i++) cout ltlt tab[i]
void main()
int T[20] n
Saisie_T( T )
Affiche_T(T n )
tab[0] = 0
tab[1] = 1
tab[2] = 2
Qursquoaffiche ce programme agrave lrsquoeacutecran
28
++- 55 M BENJELLOUN 2015 UMONS
include hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 = 7
return hellip
Comment retourner v1 et v2
++- 56 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltlt a = ltlt a ltlt endl ltlt b = ltlt b
void echange(int xint y)
int tmp
tmp = x
x = y
y =tmp
void main()
int a = 1 b = 5
cout ltlt Avant ltltendl
affiche(ab)
echange(ab)
cout ltlt nApregraves ltltendl
affiche(ab)
Avant
a = 1
b = 5
Apregraves
PASSAGE DES PARAMETRES
Transmission des arguments
Comment eacutechanger a et b
a = 1
b = 5
PAR VALEUR
29
++- 57 M BENJELLOUN 2015 UMONS
Le pointeur prend comme
valeurs des adresses de
donneacutees en meacutemoire
Types de base hellip donneacutee
8
donneacutee
35 hellip
Adr i Adr j
Meacutemoire
12FF80 12FF84
Ladresse de leacuteleacutement i est ampi i=8 et ampi= 12FF80
int i=8 j=35
Et les pointeurs
hellip p=12FF84 hellip 35 hellip
12FF84 12FF80
int p p est le contenu pointeacute par p 35
p est lrsquoadresse 12FF84
++- 58 M BENJELLOUN 2015 UMONS
Deacuteclaration de Pointeurs Le symbole est utiliseacute entre le type et le nom du pointeur
Deacuteclaration drsquoun entier int i int p Deacuteclaration drsquoun pointeur vers un entier
Exemples de deacuteclarations de pointeurs
int pi pi est un pointeur vers un int pi deacutesigne le contenu de ladresse
float pf pf est un pointeur vers un float
char c d pc c et d sont des char pc est un pointeur vers un char
int C = 4
int p
p = ampC p reccediloit ladresse de c donc pointe sur c
cout ltlt p = ltltpltltendl
cout ltlt p = ltltp ltltendl
cout ltlt (ampC) ltlt(ampC)
p = 4
p = 0x12FF7C
(ampC) = 4
Ladresse de C est ampC
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
18
++- 35 M BENJELLOUN 2015 UMONS
Algorithmes de tri
Nom de lrsquoalgorithme Complexiteacute
Tri agrave bulles Tri par seacutelection Tri par insertion Tri de Shell (shell sort) Ameacutelioration du tri par insertion Tri fusion (merge sort) Tri rapide (quick sort) Tri par tas (heap sort)
O(N2) O(N2) O(N2)
O(N log2 N)
O(N log N) O(N log N) O(N log N)
++- 36 M BENJELLOUN 2015 UMONS
Tri agrave bulles bubble sort
reacutepeacuteter permutation = FALSE commencer au deacutebut du drapeau Pour i variant de 0 agrave N ndash 2 faire si cellule [i] gt cellule [i+1] alors deacutebut permuter cellules permutation = TRUE fin jusquagrave ce que (not permutation)
Complexiteacute O(Nsup2) Proportionnel agrave Nsup2 permutations
void TriaBulles(int x[] int N) int i perm=1 tmp while (perm==1) perm =0 for (i=0iltN-1i++) if(x[i] gt x[i+1]) tmp = x[i] x[i] = x[i+1] x[i+1] = tmp perm = 1
Algorithmes de tri
19
++- 37 M BENJELLOUN 2015 UMONS
void tri_par_selection(int t[] int n) int i j min tmp for (i = 0 i lt n - 1 i++) min = i for(j = i+1 j lt n j++) if(t[j] lt t[min]) min = j if(min = i) tmp = t[i] t[i] = t[min] t[min] = tmp
Le tri par seacutelection consiste en la recherche du plus grand eacuteleacutement (le plus petit) que lon va replacer en derniegravere position (en premiegravere) puis on recherche le second plus grand eacuteleacutement (le second plus petit) que lon va replacer eacutegalement agrave sa position finale et ainsi de suite
Algorithmes de tri
++- 38 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement dans un tableau
Recherche lineacuteaire Recherche dichotomique (binary search)
0
9
1
3
2
6
3
2
4
1
5
12
6
0
Est une meacutethode efficace pour retrouver un eacuteleacutement dans un tableau trieacute
A chaque eacutetape de la recherche dichotomique lrsquointervalle de recherche est diviseacute par deux
On utilise degraves lors deux index de recherche la borne infeacuterieure et la borne supeacuterieure
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup mid
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup
On initialise les bornes inf et sup agrave la premiegravere et derniegravere valeur des index du tableau tab
respectivement
Le milieu est donneacute par
mid = (inf+sup) 2 (0+6)2 =3
Supposons que lrsquoon recherche la valeur i=6 On
compare cette valeur avec tab[mid]=8 Comme
tab[mid]gti on change mid en sup
mid = (inf+sup) 2 (0+3)2 =1
inf=1 et sup=3
hellip
20
++- 39 M BENJELLOUN 2015 UMONS
44 Eacutecrire un programme qui supprime le premier et le dernier eacuteleacutement drsquoun vecteur
vecteur initial Tab 0 1 2 3 4 5 6
sup bords 1 2 3 4 5
sup bords 2 3 4
45 Eacutecrire un programme qui supprime le milieu du tableau et ajoute son double au deacutebut
vecteur initial Tab 1 2 3 4 5
sup Aj 6 1 2 4 5
sup Aj 4 6 1 4 5
46 Codez un programme de tri agrave bulles dun vecteur de strings
47 Codez un programme de recherche dichotomique dun nombre dans un vecteur de
strings rangeacutes par ordre croissant
++- 40 M BENJELLOUN 2015 UMONS
Matrices Rangeacutees ligne par ligne
Consideacutereacutees comme des vecteurs de lignes
Accegraves aux composantes par double crochets
int a[10][5]
a[1][0] = 7
int x[2][2] = 123 4 2 lignes et 2 colonnes
1 2
3 4 include hellip
void main()
int i j tab[5][4]
for (i = 0 i lt5 i++) Saisie
for (j = 0 j lt 4 j++) tab[i][j] = i
for (i = 0 i lt5 i++) Affichage
for (j = 0 j lt 4 j++) coutltlt tab[i][j] ltlt
cout ltlt endl
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
21
++- 41 M BENJELLOUN 2015 UMONS
Affichage de la table de multiplication
++- 42 M BENJELLOUN 2015 UMONS
Fonctions en C++
Encapsule un traitement particulier formant un tout
Peut impleacutementer la notion de module en logique
Augmente la lisibiliteacute drsquoun programme
Reacutealise un objectif preacutecis
Ameacuteliore le deacutebogage et la maintenance drsquoun programme
Son utilisation se deacutecompose en trois phases
Deacutefinition de la fonction
Deacuteclaration de la fonction
Appel de la fonction
Deacuteclarer une fonction
Appeler une fonction
Regravegles de visibiliteacute des variables
Passage des paramegravetres par valeur
Fonction renvoyant une valeur au programme
Passage des paramegravetres par valeur et par adresse
Passage des tableaux aux fonctions
22
++- 43 M BENJELLOUN 2015 UMONS
Type nom_fonction(liste_param_typeacutes)
deacuteclaration de variables locales
hellip Corps de la fonction
hellip
return (valeur)
Deacutefinition drsquoune fonction
Une fonction renvoie une valeur ou rien
liste_param_typeacutes = 0 void ou plusieurs
int Somme(int x int y)
int S Variable locale agrave Somme
S= x+y
return S
void fonction1()
coutltltn fonction1 n
void fonction2() coutltltn fonction2 n
Limbrication de fonctions
nest pas autoriseacutee
Deacutefinition
++- 44 M BENJELLOUN 2015 UMONS
Fonctions pourquoi
include ltiostreamgt
using namespace std
void main()
int i j SomCar1=0 SomCar2=0 SomCar3=0
for (i = 0 i lt5 i++)
SomCar1 = SomCar1 + ii
for (i = 0 i lt10 i++)
SomCar2 = SomCar2 + ii
for (j = 0 j lt 7 j++)
SomCar3 = SomCar3 + jj
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
include ltiostreamgt
using namespace std
int Fnct_SomCar(int N)
int i S=0
for (i = 0 i ltN i++)
S = S + ii S+=ii
return S
void main()
int SomCar1 SomCar2 SomCar3
SomCar1 = Fnct_SomCar(5)
SomCar2 = Fnct_SomCar(10)
SomCar3 = Fnct_SomCar(7)
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
23
++- 45 M BENJELLOUN 2015 UMONS
hellip
int Somme(int x int y)
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
int Somme(int x int y)
int S
S= x+y
return S
hellip
int Somme(int x int y)
int S
S= x+y
return S
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
Deacuteclaration et appel drsquoune fonction
++- 46 M BENJELLOUN 2015 UMONS
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
int addition() float tmp tmp = calcule(253) + calcule(572) return (int)tmp float calcule(float C float D) return ( (C + D ) 2)
float calcule(float float)
int addition()
float calcule(float A float B) return ( (A + B ) 2)
int addition() Appel drsquoune fonction dans une fonction
float tmp tmp = calcule(253) + calcule(572) return (int)tmp
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
Deacuteclaration et appel drsquoune fonction
24
++- 47 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void Addition(int v float f)
void main()
int v = 5
float f= 45
Addition(v f) Appel de la fonction
cout ltlt n Main v et f ltlt v ltlt et ltltf
void Addition(int v float f)
cout ltlt Addition v + f = ltlt v+f ltlt endl
f = f + v
cout ltlt Addition f = ltlt f
Addition v+f = 95
Addition f = 95
Main v et f = 5 et 45
v= 5 et f=45
5+ 45
f = 95
Les paramegravetres sont copieacutes La fonction travaille sur des copies de v et de f
++- 48 M BENJELLOUN 2015 UMONS
Fonction Renvoyant une valeur au programme
include ltiostreamgt
using namespace std
int change(int X)
void main(void)
int var = 5
int valeur
valeur = return_Val (var)
cout ltltmain var = ltlt var ltlt endl
cout ltltmain valeur = ltlt valeur
int return_Val (int v)
v = 100
cout ltlt return_Val v = ltlt v ltlt endl
return (v+1)
return_Val v = 100 main var = 5 main valeur = 101
Une fonction se termine et lsquorend la mainrsquo agrave
la fonction appelante lorsque son exeacutecution
rencontre lrsquoinstruction return expression
ou return
25
++- 49 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5 valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5
int valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
cout ltlt return_Val v = ltlt vltltendl
Qursquoaffiche ce programme agrave lrsquoeacutecran Qursquoaffiche ce programme agrave lrsquoeacutecran
++- 50 M BENJELLOUN 2015 UMONS
Fonctions et reacutecursiviteacute
Tours de Hanoiuml Suite de Fibonacci
un = un-1 + un-2
u0=u1=1
Puissance entiegravere
Une fonction est dite reacutecursive lorsqursquoelle srsquoappelle elle-mecircme
int factorielle (int n )
if ( n lt 0) return (ndash1) code derreur
else if ( n == 0 ) return 1 0 = 1
else
return n factorielle( n-1 ) n = n(n-1)
a x an-1 si n gt 0
1 si n = 0
an-1 =
26
++- 51 M BENJELLOUN 2015 UMONS
Passer des tableaux aux fonctions
Les tableaux peuvent ecirctre passeacutes comme paramegravetres dune fonction
Ils ne peuvent pas ecirctre retourneacutes comme reacutesultat dune fonction
La longueur du tableau ne doit pas ecirctre deacutefinie agrave la deacuteclaration de la fonction
Un tableau peut ecirctre modifieacute dans une fonction Il est passeacute par reacutefeacuterence (adresse) et
non par valeur
include hellip
void Modif(int a[])
a[0] = 5
a[1] = 6
void main(void)
int p[2] = 1 2
cout ltlt p[0] ltlt ltlt p[1]
Modif(p)
cout ltlt p[0] ltlt ltlt p[1]
1 2
5 6
include hellip
void Modif(int x[] int n)
void main(void)
int i
int p[6] = 1 2 3 5 7 11
Modif(p 6)
for (i=0ilt6i++)
coutltlt p[i]
void Modif(int a[] int n)
int i
for(i = 0 i ltn i++)
a[i] = 5
++- 52 M BENJELLOUN 2015 UMONS
void Saisie_Mat( int tab[][4] int m int n)
int i j
for (i = 0 i ltm i++)
for (j = 0 j lt n j++)
tab[i][j] = i
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
Matrice Exemple
void Affiche_Mat( int tab[][4] int m int n)
for (int i = 0 i ltm i++)
for (int j = 0 j lt n j++)
cout ltlt tab[i][j] ltlt
cout ltlt endl
include ltiostreamgt
using namespace std
void main()
int T[5][5]
Saisie_Mat( T 4 4 )
Affiche_Mat( T 4 4 )
27
++- 53 M BENJELLOUN 2015 UMONS
include hellip
int LaSomme( )
int A[Nmax] N int S = 0
for (int i=0ilt N i++)
cout ltltEntrez A[ltltiltlt]=
cin gtgtA[i]
S= S+ A[i]
return S
void main()
const int Nmax = 7
int i A[Nmax] S=0 N=3
S = LaSomme( )
cout ltlt Affichage ltlt endl
Affichage(A N)
cout ltlt n La somme est = ltlt S
Qursquoaffiche ce programme agrave lrsquoeacutecran
void Affichage( int A[] int N)
for (int i=0i lt N i++)
cout ltlt A[ltltiltlt]=
ltltA[i] ltltendl
++- 54 M BENJELLOUN 2015 UMONS
include hellip
void Saisie_T( int tab[] )
int N i
N= 3
for (i = 0 i ltN i++) tab[i] = i
void Affiche_T(int tab[] int N )
int i
for (i = 0 i ltN i++) cout ltlt tab[i]
void main()
int T[20] n
Saisie_T( T )
Affiche_T(T n )
tab[0] = 0
tab[1] = 1
tab[2] = 2
Qursquoaffiche ce programme agrave lrsquoeacutecran
28
++- 55 M BENJELLOUN 2015 UMONS
include hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 = 7
return hellip
Comment retourner v1 et v2
++- 56 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltlt a = ltlt a ltlt endl ltlt b = ltlt b
void echange(int xint y)
int tmp
tmp = x
x = y
y =tmp
void main()
int a = 1 b = 5
cout ltlt Avant ltltendl
affiche(ab)
echange(ab)
cout ltlt nApregraves ltltendl
affiche(ab)
Avant
a = 1
b = 5
Apregraves
PASSAGE DES PARAMETRES
Transmission des arguments
Comment eacutechanger a et b
a = 1
b = 5
PAR VALEUR
29
++- 57 M BENJELLOUN 2015 UMONS
Le pointeur prend comme
valeurs des adresses de
donneacutees en meacutemoire
Types de base hellip donneacutee
8
donneacutee
35 hellip
Adr i Adr j
Meacutemoire
12FF80 12FF84
Ladresse de leacuteleacutement i est ampi i=8 et ampi= 12FF80
int i=8 j=35
Et les pointeurs
hellip p=12FF84 hellip 35 hellip
12FF84 12FF80
int p p est le contenu pointeacute par p 35
p est lrsquoadresse 12FF84
++- 58 M BENJELLOUN 2015 UMONS
Deacuteclaration de Pointeurs Le symbole est utiliseacute entre le type et le nom du pointeur
Deacuteclaration drsquoun entier int i int p Deacuteclaration drsquoun pointeur vers un entier
Exemples de deacuteclarations de pointeurs
int pi pi est un pointeur vers un int pi deacutesigne le contenu de ladresse
float pf pf est un pointeur vers un float
char c d pc c et d sont des char pc est un pointeur vers un char
int C = 4
int p
p = ampC p reccediloit ladresse de c donc pointe sur c
cout ltlt p = ltltpltltendl
cout ltlt p = ltltp ltltendl
cout ltlt (ampC) ltlt(ampC)
p = 4
p = 0x12FF7C
(ampC) = 4
Ladresse de C est ampC
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
19
++- 37 M BENJELLOUN 2015 UMONS
void tri_par_selection(int t[] int n) int i j min tmp for (i = 0 i lt n - 1 i++) min = i for(j = i+1 j lt n j++) if(t[j] lt t[min]) min = j if(min = i) tmp = t[i] t[i] = t[min] t[min] = tmp
Le tri par seacutelection consiste en la recherche du plus grand eacuteleacutement (le plus petit) que lon va replacer en derniegravere position (en premiegravere) puis on recherche le second plus grand eacuteleacutement (le second plus petit) que lon va replacer eacutegalement agrave sa position finale et ainsi de suite
Algorithmes de tri
++- 38 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement dans un tableau
Recherche lineacuteaire Recherche dichotomique (binary search)
0
9
1
3
2
6
3
2
4
1
5
12
6
0
Est une meacutethode efficace pour retrouver un eacuteleacutement dans un tableau trieacute
A chaque eacutetape de la recherche dichotomique lrsquointervalle de recherche est diviseacute par deux
On utilise degraves lors deux index de recherche la borne infeacuterieure et la borne supeacuterieure
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup mid
0
2
1
4
2
6
3
8
4
10
5
12
6
14
inf sup
On initialise les bornes inf et sup agrave la premiegravere et derniegravere valeur des index du tableau tab
respectivement
Le milieu est donneacute par
mid = (inf+sup) 2 (0+6)2 =3
Supposons que lrsquoon recherche la valeur i=6 On
compare cette valeur avec tab[mid]=8 Comme
tab[mid]gti on change mid en sup
mid = (inf+sup) 2 (0+3)2 =1
inf=1 et sup=3
hellip
20
++- 39 M BENJELLOUN 2015 UMONS
44 Eacutecrire un programme qui supprime le premier et le dernier eacuteleacutement drsquoun vecteur
vecteur initial Tab 0 1 2 3 4 5 6
sup bords 1 2 3 4 5
sup bords 2 3 4
45 Eacutecrire un programme qui supprime le milieu du tableau et ajoute son double au deacutebut
vecteur initial Tab 1 2 3 4 5
sup Aj 6 1 2 4 5
sup Aj 4 6 1 4 5
46 Codez un programme de tri agrave bulles dun vecteur de strings
47 Codez un programme de recherche dichotomique dun nombre dans un vecteur de
strings rangeacutes par ordre croissant
++- 40 M BENJELLOUN 2015 UMONS
Matrices Rangeacutees ligne par ligne
Consideacutereacutees comme des vecteurs de lignes
Accegraves aux composantes par double crochets
int a[10][5]
a[1][0] = 7
int x[2][2] = 123 4 2 lignes et 2 colonnes
1 2
3 4 include hellip
void main()
int i j tab[5][4]
for (i = 0 i lt5 i++) Saisie
for (j = 0 j lt 4 j++) tab[i][j] = i
for (i = 0 i lt5 i++) Affichage
for (j = 0 j lt 4 j++) coutltlt tab[i][j] ltlt
cout ltlt endl
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
21
++- 41 M BENJELLOUN 2015 UMONS
Affichage de la table de multiplication
++- 42 M BENJELLOUN 2015 UMONS
Fonctions en C++
Encapsule un traitement particulier formant un tout
Peut impleacutementer la notion de module en logique
Augmente la lisibiliteacute drsquoun programme
Reacutealise un objectif preacutecis
Ameacuteliore le deacutebogage et la maintenance drsquoun programme
Son utilisation se deacutecompose en trois phases
Deacutefinition de la fonction
Deacuteclaration de la fonction
Appel de la fonction
Deacuteclarer une fonction
Appeler une fonction
Regravegles de visibiliteacute des variables
Passage des paramegravetres par valeur
Fonction renvoyant une valeur au programme
Passage des paramegravetres par valeur et par adresse
Passage des tableaux aux fonctions
22
++- 43 M BENJELLOUN 2015 UMONS
Type nom_fonction(liste_param_typeacutes)
deacuteclaration de variables locales
hellip Corps de la fonction
hellip
return (valeur)
Deacutefinition drsquoune fonction
Une fonction renvoie une valeur ou rien
liste_param_typeacutes = 0 void ou plusieurs
int Somme(int x int y)
int S Variable locale agrave Somme
S= x+y
return S
void fonction1()
coutltltn fonction1 n
void fonction2() coutltltn fonction2 n
Limbrication de fonctions
nest pas autoriseacutee
Deacutefinition
++- 44 M BENJELLOUN 2015 UMONS
Fonctions pourquoi
include ltiostreamgt
using namespace std
void main()
int i j SomCar1=0 SomCar2=0 SomCar3=0
for (i = 0 i lt5 i++)
SomCar1 = SomCar1 + ii
for (i = 0 i lt10 i++)
SomCar2 = SomCar2 + ii
for (j = 0 j lt 7 j++)
SomCar3 = SomCar3 + jj
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
include ltiostreamgt
using namespace std
int Fnct_SomCar(int N)
int i S=0
for (i = 0 i ltN i++)
S = S + ii S+=ii
return S
void main()
int SomCar1 SomCar2 SomCar3
SomCar1 = Fnct_SomCar(5)
SomCar2 = Fnct_SomCar(10)
SomCar3 = Fnct_SomCar(7)
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
23
++- 45 M BENJELLOUN 2015 UMONS
hellip
int Somme(int x int y)
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
int Somme(int x int y)
int S
S= x+y
return S
hellip
int Somme(int x int y)
int S
S= x+y
return S
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
Deacuteclaration et appel drsquoune fonction
++- 46 M BENJELLOUN 2015 UMONS
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
int addition() float tmp tmp = calcule(253) + calcule(572) return (int)tmp float calcule(float C float D) return ( (C + D ) 2)
float calcule(float float)
int addition()
float calcule(float A float B) return ( (A + B ) 2)
int addition() Appel drsquoune fonction dans une fonction
float tmp tmp = calcule(253) + calcule(572) return (int)tmp
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
Deacuteclaration et appel drsquoune fonction
24
++- 47 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void Addition(int v float f)
void main()
int v = 5
float f= 45
Addition(v f) Appel de la fonction
cout ltlt n Main v et f ltlt v ltlt et ltltf
void Addition(int v float f)
cout ltlt Addition v + f = ltlt v+f ltlt endl
f = f + v
cout ltlt Addition f = ltlt f
Addition v+f = 95
Addition f = 95
Main v et f = 5 et 45
v= 5 et f=45
5+ 45
f = 95
Les paramegravetres sont copieacutes La fonction travaille sur des copies de v et de f
++- 48 M BENJELLOUN 2015 UMONS
Fonction Renvoyant une valeur au programme
include ltiostreamgt
using namespace std
int change(int X)
void main(void)
int var = 5
int valeur
valeur = return_Val (var)
cout ltltmain var = ltlt var ltlt endl
cout ltltmain valeur = ltlt valeur
int return_Val (int v)
v = 100
cout ltlt return_Val v = ltlt v ltlt endl
return (v+1)
return_Val v = 100 main var = 5 main valeur = 101
Une fonction se termine et lsquorend la mainrsquo agrave
la fonction appelante lorsque son exeacutecution
rencontre lrsquoinstruction return expression
ou return
25
++- 49 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5 valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5
int valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
cout ltlt return_Val v = ltlt vltltendl
Qursquoaffiche ce programme agrave lrsquoeacutecran Qursquoaffiche ce programme agrave lrsquoeacutecran
++- 50 M BENJELLOUN 2015 UMONS
Fonctions et reacutecursiviteacute
Tours de Hanoiuml Suite de Fibonacci
un = un-1 + un-2
u0=u1=1
Puissance entiegravere
Une fonction est dite reacutecursive lorsqursquoelle srsquoappelle elle-mecircme
int factorielle (int n )
if ( n lt 0) return (ndash1) code derreur
else if ( n == 0 ) return 1 0 = 1
else
return n factorielle( n-1 ) n = n(n-1)
a x an-1 si n gt 0
1 si n = 0
an-1 =
26
++- 51 M BENJELLOUN 2015 UMONS
Passer des tableaux aux fonctions
Les tableaux peuvent ecirctre passeacutes comme paramegravetres dune fonction
Ils ne peuvent pas ecirctre retourneacutes comme reacutesultat dune fonction
La longueur du tableau ne doit pas ecirctre deacutefinie agrave la deacuteclaration de la fonction
Un tableau peut ecirctre modifieacute dans une fonction Il est passeacute par reacutefeacuterence (adresse) et
non par valeur
include hellip
void Modif(int a[])
a[0] = 5
a[1] = 6
void main(void)
int p[2] = 1 2
cout ltlt p[0] ltlt ltlt p[1]
Modif(p)
cout ltlt p[0] ltlt ltlt p[1]
1 2
5 6
include hellip
void Modif(int x[] int n)
void main(void)
int i
int p[6] = 1 2 3 5 7 11
Modif(p 6)
for (i=0ilt6i++)
coutltlt p[i]
void Modif(int a[] int n)
int i
for(i = 0 i ltn i++)
a[i] = 5
++- 52 M BENJELLOUN 2015 UMONS
void Saisie_Mat( int tab[][4] int m int n)
int i j
for (i = 0 i ltm i++)
for (j = 0 j lt n j++)
tab[i][j] = i
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
Matrice Exemple
void Affiche_Mat( int tab[][4] int m int n)
for (int i = 0 i ltm i++)
for (int j = 0 j lt n j++)
cout ltlt tab[i][j] ltlt
cout ltlt endl
include ltiostreamgt
using namespace std
void main()
int T[5][5]
Saisie_Mat( T 4 4 )
Affiche_Mat( T 4 4 )
27
++- 53 M BENJELLOUN 2015 UMONS
include hellip
int LaSomme( )
int A[Nmax] N int S = 0
for (int i=0ilt N i++)
cout ltltEntrez A[ltltiltlt]=
cin gtgtA[i]
S= S+ A[i]
return S
void main()
const int Nmax = 7
int i A[Nmax] S=0 N=3
S = LaSomme( )
cout ltlt Affichage ltlt endl
Affichage(A N)
cout ltlt n La somme est = ltlt S
Qursquoaffiche ce programme agrave lrsquoeacutecran
void Affichage( int A[] int N)
for (int i=0i lt N i++)
cout ltlt A[ltltiltlt]=
ltltA[i] ltltendl
++- 54 M BENJELLOUN 2015 UMONS
include hellip
void Saisie_T( int tab[] )
int N i
N= 3
for (i = 0 i ltN i++) tab[i] = i
void Affiche_T(int tab[] int N )
int i
for (i = 0 i ltN i++) cout ltlt tab[i]
void main()
int T[20] n
Saisie_T( T )
Affiche_T(T n )
tab[0] = 0
tab[1] = 1
tab[2] = 2
Qursquoaffiche ce programme agrave lrsquoeacutecran
28
++- 55 M BENJELLOUN 2015 UMONS
include hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 = 7
return hellip
Comment retourner v1 et v2
++- 56 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltlt a = ltlt a ltlt endl ltlt b = ltlt b
void echange(int xint y)
int tmp
tmp = x
x = y
y =tmp
void main()
int a = 1 b = 5
cout ltlt Avant ltltendl
affiche(ab)
echange(ab)
cout ltlt nApregraves ltltendl
affiche(ab)
Avant
a = 1
b = 5
Apregraves
PASSAGE DES PARAMETRES
Transmission des arguments
Comment eacutechanger a et b
a = 1
b = 5
PAR VALEUR
29
++- 57 M BENJELLOUN 2015 UMONS
Le pointeur prend comme
valeurs des adresses de
donneacutees en meacutemoire
Types de base hellip donneacutee
8
donneacutee
35 hellip
Adr i Adr j
Meacutemoire
12FF80 12FF84
Ladresse de leacuteleacutement i est ampi i=8 et ampi= 12FF80
int i=8 j=35
Et les pointeurs
hellip p=12FF84 hellip 35 hellip
12FF84 12FF80
int p p est le contenu pointeacute par p 35
p est lrsquoadresse 12FF84
++- 58 M BENJELLOUN 2015 UMONS
Deacuteclaration de Pointeurs Le symbole est utiliseacute entre le type et le nom du pointeur
Deacuteclaration drsquoun entier int i int p Deacuteclaration drsquoun pointeur vers un entier
Exemples de deacuteclarations de pointeurs
int pi pi est un pointeur vers un int pi deacutesigne le contenu de ladresse
float pf pf est un pointeur vers un float
char c d pc c et d sont des char pc est un pointeur vers un char
int C = 4
int p
p = ampC p reccediloit ladresse de c donc pointe sur c
cout ltlt p = ltltpltltendl
cout ltlt p = ltltp ltltendl
cout ltlt (ampC) ltlt(ampC)
p = 4
p = 0x12FF7C
(ampC) = 4
Ladresse de C est ampC
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
20
++- 39 M BENJELLOUN 2015 UMONS
44 Eacutecrire un programme qui supprime le premier et le dernier eacuteleacutement drsquoun vecteur
vecteur initial Tab 0 1 2 3 4 5 6
sup bords 1 2 3 4 5
sup bords 2 3 4
45 Eacutecrire un programme qui supprime le milieu du tableau et ajoute son double au deacutebut
vecteur initial Tab 1 2 3 4 5
sup Aj 6 1 2 4 5
sup Aj 4 6 1 4 5
46 Codez un programme de tri agrave bulles dun vecteur de strings
47 Codez un programme de recherche dichotomique dun nombre dans un vecteur de
strings rangeacutes par ordre croissant
++- 40 M BENJELLOUN 2015 UMONS
Matrices Rangeacutees ligne par ligne
Consideacutereacutees comme des vecteurs de lignes
Accegraves aux composantes par double crochets
int a[10][5]
a[1][0] = 7
int x[2][2] = 123 4 2 lignes et 2 colonnes
1 2
3 4 include hellip
void main()
int i j tab[5][4]
for (i = 0 i lt5 i++) Saisie
for (j = 0 j lt 4 j++) tab[i][j] = i
for (i = 0 i lt5 i++) Affichage
for (j = 0 j lt 4 j++) coutltlt tab[i][j] ltlt
cout ltlt endl
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
21
++- 41 M BENJELLOUN 2015 UMONS
Affichage de la table de multiplication
++- 42 M BENJELLOUN 2015 UMONS
Fonctions en C++
Encapsule un traitement particulier formant un tout
Peut impleacutementer la notion de module en logique
Augmente la lisibiliteacute drsquoun programme
Reacutealise un objectif preacutecis
Ameacuteliore le deacutebogage et la maintenance drsquoun programme
Son utilisation se deacutecompose en trois phases
Deacutefinition de la fonction
Deacuteclaration de la fonction
Appel de la fonction
Deacuteclarer une fonction
Appeler une fonction
Regravegles de visibiliteacute des variables
Passage des paramegravetres par valeur
Fonction renvoyant une valeur au programme
Passage des paramegravetres par valeur et par adresse
Passage des tableaux aux fonctions
22
++- 43 M BENJELLOUN 2015 UMONS
Type nom_fonction(liste_param_typeacutes)
deacuteclaration de variables locales
hellip Corps de la fonction
hellip
return (valeur)
Deacutefinition drsquoune fonction
Une fonction renvoie une valeur ou rien
liste_param_typeacutes = 0 void ou plusieurs
int Somme(int x int y)
int S Variable locale agrave Somme
S= x+y
return S
void fonction1()
coutltltn fonction1 n
void fonction2() coutltltn fonction2 n
Limbrication de fonctions
nest pas autoriseacutee
Deacutefinition
++- 44 M BENJELLOUN 2015 UMONS
Fonctions pourquoi
include ltiostreamgt
using namespace std
void main()
int i j SomCar1=0 SomCar2=0 SomCar3=0
for (i = 0 i lt5 i++)
SomCar1 = SomCar1 + ii
for (i = 0 i lt10 i++)
SomCar2 = SomCar2 + ii
for (j = 0 j lt 7 j++)
SomCar3 = SomCar3 + jj
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
include ltiostreamgt
using namespace std
int Fnct_SomCar(int N)
int i S=0
for (i = 0 i ltN i++)
S = S + ii S+=ii
return S
void main()
int SomCar1 SomCar2 SomCar3
SomCar1 = Fnct_SomCar(5)
SomCar2 = Fnct_SomCar(10)
SomCar3 = Fnct_SomCar(7)
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
23
++- 45 M BENJELLOUN 2015 UMONS
hellip
int Somme(int x int y)
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
int Somme(int x int y)
int S
S= x+y
return S
hellip
int Somme(int x int y)
int S
S= x+y
return S
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
Deacuteclaration et appel drsquoune fonction
++- 46 M BENJELLOUN 2015 UMONS
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
int addition() float tmp tmp = calcule(253) + calcule(572) return (int)tmp float calcule(float C float D) return ( (C + D ) 2)
float calcule(float float)
int addition()
float calcule(float A float B) return ( (A + B ) 2)
int addition() Appel drsquoune fonction dans une fonction
float tmp tmp = calcule(253) + calcule(572) return (int)tmp
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
Deacuteclaration et appel drsquoune fonction
24
++- 47 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void Addition(int v float f)
void main()
int v = 5
float f= 45
Addition(v f) Appel de la fonction
cout ltlt n Main v et f ltlt v ltlt et ltltf
void Addition(int v float f)
cout ltlt Addition v + f = ltlt v+f ltlt endl
f = f + v
cout ltlt Addition f = ltlt f
Addition v+f = 95
Addition f = 95
Main v et f = 5 et 45
v= 5 et f=45
5+ 45
f = 95
Les paramegravetres sont copieacutes La fonction travaille sur des copies de v et de f
++- 48 M BENJELLOUN 2015 UMONS
Fonction Renvoyant une valeur au programme
include ltiostreamgt
using namespace std
int change(int X)
void main(void)
int var = 5
int valeur
valeur = return_Val (var)
cout ltltmain var = ltlt var ltlt endl
cout ltltmain valeur = ltlt valeur
int return_Val (int v)
v = 100
cout ltlt return_Val v = ltlt v ltlt endl
return (v+1)
return_Val v = 100 main var = 5 main valeur = 101
Une fonction se termine et lsquorend la mainrsquo agrave
la fonction appelante lorsque son exeacutecution
rencontre lrsquoinstruction return expression
ou return
25
++- 49 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5 valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5
int valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
cout ltlt return_Val v = ltlt vltltendl
Qursquoaffiche ce programme agrave lrsquoeacutecran Qursquoaffiche ce programme agrave lrsquoeacutecran
++- 50 M BENJELLOUN 2015 UMONS
Fonctions et reacutecursiviteacute
Tours de Hanoiuml Suite de Fibonacci
un = un-1 + un-2
u0=u1=1
Puissance entiegravere
Une fonction est dite reacutecursive lorsqursquoelle srsquoappelle elle-mecircme
int factorielle (int n )
if ( n lt 0) return (ndash1) code derreur
else if ( n == 0 ) return 1 0 = 1
else
return n factorielle( n-1 ) n = n(n-1)
a x an-1 si n gt 0
1 si n = 0
an-1 =
26
++- 51 M BENJELLOUN 2015 UMONS
Passer des tableaux aux fonctions
Les tableaux peuvent ecirctre passeacutes comme paramegravetres dune fonction
Ils ne peuvent pas ecirctre retourneacutes comme reacutesultat dune fonction
La longueur du tableau ne doit pas ecirctre deacutefinie agrave la deacuteclaration de la fonction
Un tableau peut ecirctre modifieacute dans une fonction Il est passeacute par reacutefeacuterence (adresse) et
non par valeur
include hellip
void Modif(int a[])
a[0] = 5
a[1] = 6
void main(void)
int p[2] = 1 2
cout ltlt p[0] ltlt ltlt p[1]
Modif(p)
cout ltlt p[0] ltlt ltlt p[1]
1 2
5 6
include hellip
void Modif(int x[] int n)
void main(void)
int i
int p[6] = 1 2 3 5 7 11
Modif(p 6)
for (i=0ilt6i++)
coutltlt p[i]
void Modif(int a[] int n)
int i
for(i = 0 i ltn i++)
a[i] = 5
++- 52 M BENJELLOUN 2015 UMONS
void Saisie_Mat( int tab[][4] int m int n)
int i j
for (i = 0 i ltm i++)
for (j = 0 j lt n j++)
tab[i][j] = i
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
Matrice Exemple
void Affiche_Mat( int tab[][4] int m int n)
for (int i = 0 i ltm i++)
for (int j = 0 j lt n j++)
cout ltlt tab[i][j] ltlt
cout ltlt endl
include ltiostreamgt
using namespace std
void main()
int T[5][5]
Saisie_Mat( T 4 4 )
Affiche_Mat( T 4 4 )
27
++- 53 M BENJELLOUN 2015 UMONS
include hellip
int LaSomme( )
int A[Nmax] N int S = 0
for (int i=0ilt N i++)
cout ltltEntrez A[ltltiltlt]=
cin gtgtA[i]
S= S+ A[i]
return S
void main()
const int Nmax = 7
int i A[Nmax] S=0 N=3
S = LaSomme( )
cout ltlt Affichage ltlt endl
Affichage(A N)
cout ltlt n La somme est = ltlt S
Qursquoaffiche ce programme agrave lrsquoeacutecran
void Affichage( int A[] int N)
for (int i=0i lt N i++)
cout ltlt A[ltltiltlt]=
ltltA[i] ltltendl
++- 54 M BENJELLOUN 2015 UMONS
include hellip
void Saisie_T( int tab[] )
int N i
N= 3
for (i = 0 i ltN i++) tab[i] = i
void Affiche_T(int tab[] int N )
int i
for (i = 0 i ltN i++) cout ltlt tab[i]
void main()
int T[20] n
Saisie_T( T )
Affiche_T(T n )
tab[0] = 0
tab[1] = 1
tab[2] = 2
Qursquoaffiche ce programme agrave lrsquoeacutecran
28
++- 55 M BENJELLOUN 2015 UMONS
include hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 = 7
return hellip
Comment retourner v1 et v2
++- 56 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltlt a = ltlt a ltlt endl ltlt b = ltlt b
void echange(int xint y)
int tmp
tmp = x
x = y
y =tmp
void main()
int a = 1 b = 5
cout ltlt Avant ltltendl
affiche(ab)
echange(ab)
cout ltlt nApregraves ltltendl
affiche(ab)
Avant
a = 1
b = 5
Apregraves
PASSAGE DES PARAMETRES
Transmission des arguments
Comment eacutechanger a et b
a = 1
b = 5
PAR VALEUR
29
++- 57 M BENJELLOUN 2015 UMONS
Le pointeur prend comme
valeurs des adresses de
donneacutees en meacutemoire
Types de base hellip donneacutee
8
donneacutee
35 hellip
Adr i Adr j
Meacutemoire
12FF80 12FF84
Ladresse de leacuteleacutement i est ampi i=8 et ampi= 12FF80
int i=8 j=35
Et les pointeurs
hellip p=12FF84 hellip 35 hellip
12FF84 12FF80
int p p est le contenu pointeacute par p 35
p est lrsquoadresse 12FF84
++- 58 M BENJELLOUN 2015 UMONS
Deacuteclaration de Pointeurs Le symbole est utiliseacute entre le type et le nom du pointeur
Deacuteclaration drsquoun entier int i int p Deacuteclaration drsquoun pointeur vers un entier
Exemples de deacuteclarations de pointeurs
int pi pi est un pointeur vers un int pi deacutesigne le contenu de ladresse
float pf pf est un pointeur vers un float
char c d pc c et d sont des char pc est un pointeur vers un char
int C = 4
int p
p = ampC p reccediloit ladresse de c donc pointe sur c
cout ltlt p = ltltpltltendl
cout ltlt p = ltltp ltltendl
cout ltlt (ampC) ltlt(ampC)
p = 4
p = 0x12FF7C
(ampC) = 4
Ladresse de C est ampC
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
21
++- 41 M BENJELLOUN 2015 UMONS
Affichage de la table de multiplication
++- 42 M BENJELLOUN 2015 UMONS
Fonctions en C++
Encapsule un traitement particulier formant un tout
Peut impleacutementer la notion de module en logique
Augmente la lisibiliteacute drsquoun programme
Reacutealise un objectif preacutecis
Ameacuteliore le deacutebogage et la maintenance drsquoun programme
Son utilisation se deacutecompose en trois phases
Deacutefinition de la fonction
Deacuteclaration de la fonction
Appel de la fonction
Deacuteclarer une fonction
Appeler une fonction
Regravegles de visibiliteacute des variables
Passage des paramegravetres par valeur
Fonction renvoyant une valeur au programme
Passage des paramegravetres par valeur et par adresse
Passage des tableaux aux fonctions
22
++- 43 M BENJELLOUN 2015 UMONS
Type nom_fonction(liste_param_typeacutes)
deacuteclaration de variables locales
hellip Corps de la fonction
hellip
return (valeur)
Deacutefinition drsquoune fonction
Une fonction renvoie une valeur ou rien
liste_param_typeacutes = 0 void ou plusieurs
int Somme(int x int y)
int S Variable locale agrave Somme
S= x+y
return S
void fonction1()
coutltltn fonction1 n
void fonction2() coutltltn fonction2 n
Limbrication de fonctions
nest pas autoriseacutee
Deacutefinition
++- 44 M BENJELLOUN 2015 UMONS
Fonctions pourquoi
include ltiostreamgt
using namespace std
void main()
int i j SomCar1=0 SomCar2=0 SomCar3=0
for (i = 0 i lt5 i++)
SomCar1 = SomCar1 + ii
for (i = 0 i lt10 i++)
SomCar2 = SomCar2 + ii
for (j = 0 j lt 7 j++)
SomCar3 = SomCar3 + jj
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
include ltiostreamgt
using namespace std
int Fnct_SomCar(int N)
int i S=0
for (i = 0 i ltN i++)
S = S + ii S+=ii
return S
void main()
int SomCar1 SomCar2 SomCar3
SomCar1 = Fnct_SomCar(5)
SomCar2 = Fnct_SomCar(10)
SomCar3 = Fnct_SomCar(7)
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
23
++- 45 M BENJELLOUN 2015 UMONS
hellip
int Somme(int x int y)
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
int Somme(int x int y)
int S
S= x+y
return S
hellip
int Somme(int x int y)
int S
S= x+y
return S
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
Deacuteclaration et appel drsquoune fonction
++- 46 M BENJELLOUN 2015 UMONS
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
int addition() float tmp tmp = calcule(253) + calcule(572) return (int)tmp float calcule(float C float D) return ( (C + D ) 2)
float calcule(float float)
int addition()
float calcule(float A float B) return ( (A + B ) 2)
int addition() Appel drsquoune fonction dans une fonction
float tmp tmp = calcule(253) + calcule(572) return (int)tmp
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
Deacuteclaration et appel drsquoune fonction
24
++- 47 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void Addition(int v float f)
void main()
int v = 5
float f= 45
Addition(v f) Appel de la fonction
cout ltlt n Main v et f ltlt v ltlt et ltltf
void Addition(int v float f)
cout ltlt Addition v + f = ltlt v+f ltlt endl
f = f + v
cout ltlt Addition f = ltlt f
Addition v+f = 95
Addition f = 95
Main v et f = 5 et 45
v= 5 et f=45
5+ 45
f = 95
Les paramegravetres sont copieacutes La fonction travaille sur des copies de v et de f
++- 48 M BENJELLOUN 2015 UMONS
Fonction Renvoyant une valeur au programme
include ltiostreamgt
using namespace std
int change(int X)
void main(void)
int var = 5
int valeur
valeur = return_Val (var)
cout ltltmain var = ltlt var ltlt endl
cout ltltmain valeur = ltlt valeur
int return_Val (int v)
v = 100
cout ltlt return_Val v = ltlt v ltlt endl
return (v+1)
return_Val v = 100 main var = 5 main valeur = 101
Une fonction se termine et lsquorend la mainrsquo agrave
la fonction appelante lorsque son exeacutecution
rencontre lrsquoinstruction return expression
ou return
25
++- 49 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5 valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5
int valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
cout ltlt return_Val v = ltlt vltltendl
Qursquoaffiche ce programme agrave lrsquoeacutecran Qursquoaffiche ce programme agrave lrsquoeacutecran
++- 50 M BENJELLOUN 2015 UMONS
Fonctions et reacutecursiviteacute
Tours de Hanoiuml Suite de Fibonacci
un = un-1 + un-2
u0=u1=1
Puissance entiegravere
Une fonction est dite reacutecursive lorsqursquoelle srsquoappelle elle-mecircme
int factorielle (int n )
if ( n lt 0) return (ndash1) code derreur
else if ( n == 0 ) return 1 0 = 1
else
return n factorielle( n-1 ) n = n(n-1)
a x an-1 si n gt 0
1 si n = 0
an-1 =
26
++- 51 M BENJELLOUN 2015 UMONS
Passer des tableaux aux fonctions
Les tableaux peuvent ecirctre passeacutes comme paramegravetres dune fonction
Ils ne peuvent pas ecirctre retourneacutes comme reacutesultat dune fonction
La longueur du tableau ne doit pas ecirctre deacutefinie agrave la deacuteclaration de la fonction
Un tableau peut ecirctre modifieacute dans une fonction Il est passeacute par reacutefeacuterence (adresse) et
non par valeur
include hellip
void Modif(int a[])
a[0] = 5
a[1] = 6
void main(void)
int p[2] = 1 2
cout ltlt p[0] ltlt ltlt p[1]
Modif(p)
cout ltlt p[0] ltlt ltlt p[1]
1 2
5 6
include hellip
void Modif(int x[] int n)
void main(void)
int i
int p[6] = 1 2 3 5 7 11
Modif(p 6)
for (i=0ilt6i++)
coutltlt p[i]
void Modif(int a[] int n)
int i
for(i = 0 i ltn i++)
a[i] = 5
++- 52 M BENJELLOUN 2015 UMONS
void Saisie_Mat( int tab[][4] int m int n)
int i j
for (i = 0 i ltm i++)
for (j = 0 j lt n j++)
tab[i][j] = i
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
Matrice Exemple
void Affiche_Mat( int tab[][4] int m int n)
for (int i = 0 i ltm i++)
for (int j = 0 j lt n j++)
cout ltlt tab[i][j] ltlt
cout ltlt endl
include ltiostreamgt
using namespace std
void main()
int T[5][5]
Saisie_Mat( T 4 4 )
Affiche_Mat( T 4 4 )
27
++- 53 M BENJELLOUN 2015 UMONS
include hellip
int LaSomme( )
int A[Nmax] N int S = 0
for (int i=0ilt N i++)
cout ltltEntrez A[ltltiltlt]=
cin gtgtA[i]
S= S+ A[i]
return S
void main()
const int Nmax = 7
int i A[Nmax] S=0 N=3
S = LaSomme( )
cout ltlt Affichage ltlt endl
Affichage(A N)
cout ltlt n La somme est = ltlt S
Qursquoaffiche ce programme agrave lrsquoeacutecran
void Affichage( int A[] int N)
for (int i=0i lt N i++)
cout ltlt A[ltltiltlt]=
ltltA[i] ltltendl
++- 54 M BENJELLOUN 2015 UMONS
include hellip
void Saisie_T( int tab[] )
int N i
N= 3
for (i = 0 i ltN i++) tab[i] = i
void Affiche_T(int tab[] int N )
int i
for (i = 0 i ltN i++) cout ltlt tab[i]
void main()
int T[20] n
Saisie_T( T )
Affiche_T(T n )
tab[0] = 0
tab[1] = 1
tab[2] = 2
Qursquoaffiche ce programme agrave lrsquoeacutecran
28
++- 55 M BENJELLOUN 2015 UMONS
include hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 = 7
return hellip
Comment retourner v1 et v2
++- 56 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltlt a = ltlt a ltlt endl ltlt b = ltlt b
void echange(int xint y)
int tmp
tmp = x
x = y
y =tmp
void main()
int a = 1 b = 5
cout ltlt Avant ltltendl
affiche(ab)
echange(ab)
cout ltlt nApregraves ltltendl
affiche(ab)
Avant
a = 1
b = 5
Apregraves
PASSAGE DES PARAMETRES
Transmission des arguments
Comment eacutechanger a et b
a = 1
b = 5
PAR VALEUR
29
++- 57 M BENJELLOUN 2015 UMONS
Le pointeur prend comme
valeurs des adresses de
donneacutees en meacutemoire
Types de base hellip donneacutee
8
donneacutee
35 hellip
Adr i Adr j
Meacutemoire
12FF80 12FF84
Ladresse de leacuteleacutement i est ampi i=8 et ampi= 12FF80
int i=8 j=35
Et les pointeurs
hellip p=12FF84 hellip 35 hellip
12FF84 12FF80
int p p est le contenu pointeacute par p 35
p est lrsquoadresse 12FF84
++- 58 M BENJELLOUN 2015 UMONS
Deacuteclaration de Pointeurs Le symbole est utiliseacute entre le type et le nom du pointeur
Deacuteclaration drsquoun entier int i int p Deacuteclaration drsquoun pointeur vers un entier
Exemples de deacuteclarations de pointeurs
int pi pi est un pointeur vers un int pi deacutesigne le contenu de ladresse
float pf pf est un pointeur vers un float
char c d pc c et d sont des char pc est un pointeur vers un char
int C = 4
int p
p = ampC p reccediloit ladresse de c donc pointe sur c
cout ltlt p = ltltpltltendl
cout ltlt p = ltltp ltltendl
cout ltlt (ampC) ltlt(ampC)
p = 4
p = 0x12FF7C
(ampC) = 4
Ladresse de C est ampC
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
22
++- 43 M BENJELLOUN 2015 UMONS
Type nom_fonction(liste_param_typeacutes)
deacuteclaration de variables locales
hellip Corps de la fonction
hellip
return (valeur)
Deacutefinition drsquoune fonction
Une fonction renvoie une valeur ou rien
liste_param_typeacutes = 0 void ou plusieurs
int Somme(int x int y)
int S Variable locale agrave Somme
S= x+y
return S
void fonction1()
coutltltn fonction1 n
void fonction2() coutltltn fonction2 n
Limbrication de fonctions
nest pas autoriseacutee
Deacutefinition
++- 44 M BENJELLOUN 2015 UMONS
Fonctions pourquoi
include ltiostreamgt
using namespace std
void main()
int i j SomCar1=0 SomCar2=0 SomCar3=0
for (i = 0 i lt5 i++)
SomCar1 = SomCar1 + ii
for (i = 0 i lt10 i++)
SomCar2 = SomCar2 + ii
for (j = 0 j lt 7 j++)
SomCar3 = SomCar3 + jj
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
include ltiostreamgt
using namespace std
int Fnct_SomCar(int N)
int i S=0
for (i = 0 i ltN i++)
S = S + ii S+=ii
return S
void main()
int SomCar1 SomCar2 SomCar3
SomCar1 = Fnct_SomCar(5)
SomCar2 = Fnct_SomCar(10)
SomCar3 = Fnct_SomCar(7)
coutltlt SC1=ltltSomCar1ltlt SC2=
ltlt SomCar2 ltlt SC3=ltltSomCar3
23
++- 45 M BENJELLOUN 2015 UMONS
hellip
int Somme(int x int y)
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
int Somme(int x int y)
int S
S= x+y
return S
hellip
int Somme(int x int y)
int S
S= x+y
return S
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
Deacuteclaration et appel drsquoune fonction
++- 46 M BENJELLOUN 2015 UMONS
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
int addition() float tmp tmp = calcule(253) + calcule(572) return (int)tmp float calcule(float C float D) return ( (C + D ) 2)
float calcule(float float)
int addition()
float calcule(float A float B) return ( (A + B ) 2)
int addition() Appel drsquoune fonction dans une fonction
float tmp tmp = calcule(253) + calcule(572) return (int)tmp
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
Deacuteclaration et appel drsquoune fonction
24
++- 47 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void Addition(int v float f)
void main()
int v = 5
float f= 45
Addition(v f) Appel de la fonction
cout ltlt n Main v et f ltlt v ltlt et ltltf
void Addition(int v float f)
cout ltlt Addition v + f = ltlt v+f ltlt endl
f = f + v
cout ltlt Addition f = ltlt f
Addition v+f = 95
Addition f = 95
Main v et f = 5 et 45
v= 5 et f=45
5+ 45
f = 95
Les paramegravetres sont copieacutes La fonction travaille sur des copies de v et de f
++- 48 M BENJELLOUN 2015 UMONS
Fonction Renvoyant une valeur au programme
include ltiostreamgt
using namespace std
int change(int X)
void main(void)
int var = 5
int valeur
valeur = return_Val (var)
cout ltltmain var = ltlt var ltlt endl
cout ltltmain valeur = ltlt valeur
int return_Val (int v)
v = 100
cout ltlt return_Val v = ltlt v ltlt endl
return (v+1)
return_Val v = 100 main var = 5 main valeur = 101
Une fonction se termine et lsquorend la mainrsquo agrave
la fonction appelante lorsque son exeacutecution
rencontre lrsquoinstruction return expression
ou return
25
++- 49 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5 valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5
int valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
cout ltlt return_Val v = ltlt vltltendl
Qursquoaffiche ce programme agrave lrsquoeacutecran Qursquoaffiche ce programme agrave lrsquoeacutecran
++- 50 M BENJELLOUN 2015 UMONS
Fonctions et reacutecursiviteacute
Tours de Hanoiuml Suite de Fibonacci
un = un-1 + un-2
u0=u1=1
Puissance entiegravere
Une fonction est dite reacutecursive lorsqursquoelle srsquoappelle elle-mecircme
int factorielle (int n )
if ( n lt 0) return (ndash1) code derreur
else if ( n == 0 ) return 1 0 = 1
else
return n factorielle( n-1 ) n = n(n-1)
a x an-1 si n gt 0
1 si n = 0
an-1 =
26
++- 51 M BENJELLOUN 2015 UMONS
Passer des tableaux aux fonctions
Les tableaux peuvent ecirctre passeacutes comme paramegravetres dune fonction
Ils ne peuvent pas ecirctre retourneacutes comme reacutesultat dune fonction
La longueur du tableau ne doit pas ecirctre deacutefinie agrave la deacuteclaration de la fonction
Un tableau peut ecirctre modifieacute dans une fonction Il est passeacute par reacutefeacuterence (adresse) et
non par valeur
include hellip
void Modif(int a[])
a[0] = 5
a[1] = 6
void main(void)
int p[2] = 1 2
cout ltlt p[0] ltlt ltlt p[1]
Modif(p)
cout ltlt p[0] ltlt ltlt p[1]
1 2
5 6
include hellip
void Modif(int x[] int n)
void main(void)
int i
int p[6] = 1 2 3 5 7 11
Modif(p 6)
for (i=0ilt6i++)
coutltlt p[i]
void Modif(int a[] int n)
int i
for(i = 0 i ltn i++)
a[i] = 5
++- 52 M BENJELLOUN 2015 UMONS
void Saisie_Mat( int tab[][4] int m int n)
int i j
for (i = 0 i ltm i++)
for (j = 0 j lt n j++)
tab[i][j] = i
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
Matrice Exemple
void Affiche_Mat( int tab[][4] int m int n)
for (int i = 0 i ltm i++)
for (int j = 0 j lt n j++)
cout ltlt tab[i][j] ltlt
cout ltlt endl
include ltiostreamgt
using namespace std
void main()
int T[5][5]
Saisie_Mat( T 4 4 )
Affiche_Mat( T 4 4 )
27
++- 53 M BENJELLOUN 2015 UMONS
include hellip
int LaSomme( )
int A[Nmax] N int S = 0
for (int i=0ilt N i++)
cout ltltEntrez A[ltltiltlt]=
cin gtgtA[i]
S= S+ A[i]
return S
void main()
const int Nmax = 7
int i A[Nmax] S=0 N=3
S = LaSomme( )
cout ltlt Affichage ltlt endl
Affichage(A N)
cout ltlt n La somme est = ltlt S
Qursquoaffiche ce programme agrave lrsquoeacutecran
void Affichage( int A[] int N)
for (int i=0i lt N i++)
cout ltlt A[ltltiltlt]=
ltltA[i] ltltendl
++- 54 M BENJELLOUN 2015 UMONS
include hellip
void Saisie_T( int tab[] )
int N i
N= 3
for (i = 0 i ltN i++) tab[i] = i
void Affiche_T(int tab[] int N )
int i
for (i = 0 i ltN i++) cout ltlt tab[i]
void main()
int T[20] n
Saisie_T( T )
Affiche_T(T n )
tab[0] = 0
tab[1] = 1
tab[2] = 2
Qursquoaffiche ce programme agrave lrsquoeacutecran
28
++- 55 M BENJELLOUN 2015 UMONS
include hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 = 7
return hellip
Comment retourner v1 et v2
++- 56 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltlt a = ltlt a ltlt endl ltlt b = ltlt b
void echange(int xint y)
int tmp
tmp = x
x = y
y =tmp
void main()
int a = 1 b = 5
cout ltlt Avant ltltendl
affiche(ab)
echange(ab)
cout ltlt nApregraves ltltendl
affiche(ab)
Avant
a = 1
b = 5
Apregraves
PASSAGE DES PARAMETRES
Transmission des arguments
Comment eacutechanger a et b
a = 1
b = 5
PAR VALEUR
29
++- 57 M BENJELLOUN 2015 UMONS
Le pointeur prend comme
valeurs des adresses de
donneacutees en meacutemoire
Types de base hellip donneacutee
8
donneacutee
35 hellip
Adr i Adr j
Meacutemoire
12FF80 12FF84
Ladresse de leacuteleacutement i est ampi i=8 et ampi= 12FF80
int i=8 j=35
Et les pointeurs
hellip p=12FF84 hellip 35 hellip
12FF84 12FF80
int p p est le contenu pointeacute par p 35
p est lrsquoadresse 12FF84
++- 58 M BENJELLOUN 2015 UMONS
Deacuteclaration de Pointeurs Le symbole est utiliseacute entre le type et le nom du pointeur
Deacuteclaration drsquoun entier int i int p Deacuteclaration drsquoun pointeur vers un entier
Exemples de deacuteclarations de pointeurs
int pi pi est un pointeur vers un int pi deacutesigne le contenu de ladresse
float pf pf est un pointeur vers un float
char c d pc c et d sont des char pc est un pointeur vers un char
int C = 4
int p
p = ampC p reccediloit ladresse de c donc pointe sur c
cout ltlt p = ltltpltltendl
cout ltlt p = ltltp ltltendl
cout ltlt (ampC) ltlt(ampC)
p = 4
p = 0x12FF7C
(ampC) = 4
Ladresse de C est ampC
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
23
++- 45 M BENJELLOUN 2015 UMONS
hellip
int Somme(int x int y)
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
int Somme(int x int y)
int S
S= x+y
return S
hellip
int Somme(int x int y)
int S
S= x+y
return S
void main(void)
int a=5 b=6 Som
Som = Somme(77)
cout ltlt Som = ltlt Somltlt endl
cout ltlt Som = ltlt Somme(ab)
Deacuteclaration et appel drsquoune fonction
++- 46 M BENJELLOUN 2015 UMONS
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
int addition() float tmp tmp = calcule(253) + calcule(572) return (int)tmp float calcule(float C float D) return ( (C + D ) 2)
float calcule(float float)
int addition()
float calcule(float A float B) return ( (A + B ) 2)
int addition() Appel drsquoune fonction dans une fonction
float tmp tmp = calcule(253) + calcule(572) return (int)tmp
void main(void) int Val Val = addition() cout ltlt val = ltlt Valltltendl
Deacuteclaration et appel drsquoune fonction
24
++- 47 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void Addition(int v float f)
void main()
int v = 5
float f= 45
Addition(v f) Appel de la fonction
cout ltlt n Main v et f ltlt v ltlt et ltltf
void Addition(int v float f)
cout ltlt Addition v + f = ltlt v+f ltlt endl
f = f + v
cout ltlt Addition f = ltlt f
Addition v+f = 95
Addition f = 95
Main v et f = 5 et 45
v= 5 et f=45
5+ 45
f = 95
Les paramegravetres sont copieacutes La fonction travaille sur des copies de v et de f
++- 48 M BENJELLOUN 2015 UMONS
Fonction Renvoyant une valeur au programme
include ltiostreamgt
using namespace std
int change(int X)
void main(void)
int var = 5
int valeur
valeur = return_Val (var)
cout ltltmain var = ltlt var ltlt endl
cout ltltmain valeur = ltlt valeur
int return_Val (int v)
v = 100
cout ltlt return_Val v = ltlt v ltlt endl
return (v+1)
return_Val v = 100 main var = 5 main valeur = 101
Une fonction se termine et lsquorend la mainrsquo agrave
la fonction appelante lorsque son exeacutecution
rencontre lrsquoinstruction return expression
ou return
25
++- 49 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5 valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5
int valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
cout ltlt return_Val v = ltlt vltltendl
Qursquoaffiche ce programme agrave lrsquoeacutecran Qursquoaffiche ce programme agrave lrsquoeacutecran
++- 50 M BENJELLOUN 2015 UMONS
Fonctions et reacutecursiviteacute
Tours de Hanoiuml Suite de Fibonacci
un = un-1 + un-2
u0=u1=1
Puissance entiegravere
Une fonction est dite reacutecursive lorsqursquoelle srsquoappelle elle-mecircme
int factorielle (int n )
if ( n lt 0) return (ndash1) code derreur
else if ( n == 0 ) return 1 0 = 1
else
return n factorielle( n-1 ) n = n(n-1)
a x an-1 si n gt 0
1 si n = 0
an-1 =
26
++- 51 M BENJELLOUN 2015 UMONS
Passer des tableaux aux fonctions
Les tableaux peuvent ecirctre passeacutes comme paramegravetres dune fonction
Ils ne peuvent pas ecirctre retourneacutes comme reacutesultat dune fonction
La longueur du tableau ne doit pas ecirctre deacutefinie agrave la deacuteclaration de la fonction
Un tableau peut ecirctre modifieacute dans une fonction Il est passeacute par reacutefeacuterence (adresse) et
non par valeur
include hellip
void Modif(int a[])
a[0] = 5
a[1] = 6
void main(void)
int p[2] = 1 2
cout ltlt p[0] ltlt ltlt p[1]
Modif(p)
cout ltlt p[0] ltlt ltlt p[1]
1 2
5 6
include hellip
void Modif(int x[] int n)
void main(void)
int i
int p[6] = 1 2 3 5 7 11
Modif(p 6)
for (i=0ilt6i++)
coutltlt p[i]
void Modif(int a[] int n)
int i
for(i = 0 i ltn i++)
a[i] = 5
++- 52 M BENJELLOUN 2015 UMONS
void Saisie_Mat( int tab[][4] int m int n)
int i j
for (i = 0 i ltm i++)
for (j = 0 j lt n j++)
tab[i][j] = i
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
Matrice Exemple
void Affiche_Mat( int tab[][4] int m int n)
for (int i = 0 i ltm i++)
for (int j = 0 j lt n j++)
cout ltlt tab[i][j] ltlt
cout ltlt endl
include ltiostreamgt
using namespace std
void main()
int T[5][5]
Saisie_Mat( T 4 4 )
Affiche_Mat( T 4 4 )
27
++- 53 M BENJELLOUN 2015 UMONS
include hellip
int LaSomme( )
int A[Nmax] N int S = 0
for (int i=0ilt N i++)
cout ltltEntrez A[ltltiltlt]=
cin gtgtA[i]
S= S+ A[i]
return S
void main()
const int Nmax = 7
int i A[Nmax] S=0 N=3
S = LaSomme( )
cout ltlt Affichage ltlt endl
Affichage(A N)
cout ltlt n La somme est = ltlt S
Qursquoaffiche ce programme agrave lrsquoeacutecran
void Affichage( int A[] int N)
for (int i=0i lt N i++)
cout ltlt A[ltltiltlt]=
ltltA[i] ltltendl
++- 54 M BENJELLOUN 2015 UMONS
include hellip
void Saisie_T( int tab[] )
int N i
N= 3
for (i = 0 i ltN i++) tab[i] = i
void Affiche_T(int tab[] int N )
int i
for (i = 0 i ltN i++) cout ltlt tab[i]
void main()
int T[20] n
Saisie_T( T )
Affiche_T(T n )
tab[0] = 0
tab[1] = 1
tab[2] = 2
Qursquoaffiche ce programme agrave lrsquoeacutecran
28
++- 55 M BENJELLOUN 2015 UMONS
include hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 = 7
return hellip
Comment retourner v1 et v2
++- 56 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltlt a = ltlt a ltlt endl ltlt b = ltlt b
void echange(int xint y)
int tmp
tmp = x
x = y
y =tmp
void main()
int a = 1 b = 5
cout ltlt Avant ltltendl
affiche(ab)
echange(ab)
cout ltlt nApregraves ltltendl
affiche(ab)
Avant
a = 1
b = 5
Apregraves
PASSAGE DES PARAMETRES
Transmission des arguments
Comment eacutechanger a et b
a = 1
b = 5
PAR VALEUR
29
++- 57 M BENJELLOUN 2015 UMONS
Le pointeur prend comme
valeurs des adresses de
donneacutees en meacutemoire
Types de base hellip donneacutee
8
donneacutee
35 hellip
Adr i Adr j
Meacutemoire
12FF80 12FF84
Ladresse de leacuteleacutement i est ampi i=8 et ampi= 12FF80
int i=8 j=35
Et les pointeurs
hellip p=12FF84 hellip 35 hellip
12FF84 12FF80
int p p est le contenu pointeacute par p 35
p est lrsquoadresse 12FF84
++- 58 M BENJELLOUN 2015 UMONS
Deacuteclaration de Pointeurs Le symbole est utiliseacute entre le type et le nom du pointeur
Deacuteclaration drsquoun entier int i int p Deacuteclaration drsquoun pointeur vers un entier
Exemples de deacuteclarations de pointeurs
int pi pi est un pointeur vers un int pi deacutesigne le contenu de ladresse
float pf pf est un pointeur vers un float
char c d pc c et d sont des char pc est un pointeur vers un char
int C = 4
int p
p = ampC p reccediloit ladresse de c donc pointe sur c
cout ltlt p = ltltpltltendl
cout ltlt p = ltltp ltltendl
cout ltlt (ampC) ltlt(ampC)
p = 4
p = 0x12FF7C
(ampC) = 4
Ladresse de C est ampC
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
24
++- 47 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void Addition(int v float f)
void main()
int v = 5
float f= 45
Addition(v f) Appel de la fonction
cout ltlt n Main v et f ltlt v ltlt et ltltf
void Addition(int v float f)
cout ltlt Addition v + f = ltlt v+f ltlt endl
f = f + v
cout ltlt Addition f = ltlt f
Addition v+f = 95
Addition f = 95
Main v et f = 5 et 45
v= 5 et f=45
5+ 45
f = 95
Les paramegravetres sont copieacutes La fonction travaille sur des copies de v et de f
++- 48 M BENJELLOUN 2015 UMONS
Fonction Renvoyant une valeur au programme
include ltiostreamgt
using namespace std
int change(int X)
void main(void)
int var = 5
int valeur
valeur = return_Val (var)
cout ltltmain var = ltlt var ltlt endl
cout ltltmain valeur = ltlt valeur
int return_Val (int v)
v = 100
cout ltlt return_Val v = ltlt v ltlt endl
return (v+1)
return_Val v = 100 main var = 5 main valeur = 101
Une fonction se termine et lsquorend la mainrsquo agrave
la fonction appelante lorsque son exeacutecution
rencontre lrsquoinstruction return expression
ou return
25
++- 49 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5 valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5
int valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
cout ltlt return_Val v = ltlt vltltendl
Qursquoaffiche ce programme agrave lrsquoeacutecran Qursquoaffiche ce programme agrave lrsquoeacutecran
++- 50 M BENJELLOUN 2015 UMONS
Fonctions et reacutecursiviteacute
Tours de Hanoiuml Suite de Fibonacci
un = un-1 + un-2
u0=u1=1
Puissance entiegravere
Une fonction est dite reacutecursive lorsqursquoelle srsquoappelle elle-mecircme
int factorielle (int n )
if ( n lt 0) return (ndash1) code derreur
else if ( n == 0 ) return 1 0 = 1
else
return n factorielle( n-1 ) n = n(n-1)
a x an-1 si n gt 0
1 si n = 0
an-1 =
26
++- 51 M BENJELLOUN 2015 UMONS
Passer des tableaux aux fonctions
Les tableaux peuvent ecirctre passeacutes comme paramegravetres dune fonction
Ils ne peuvent pas ecirctre retourneacutes comme reacutesultat dune fonction
La longueur du tableau ne doit pas ecirctre deacutefinie agrave la deacuteclaration de la fonction
Un tableau peut ecirctre modifieacute dans une fonction Il est passeacute par reacutefeacuterence (adresse) et
non par valeur
include hellip
void Modif(int a[])
a[0] = 5
a[1] = 6
void main(void)
int p[2] = 1 2
cout ltlt p[0] ltlt ltlt p[1]
Modif(p)
cout ltlt p[0] ltlt ltlt p[1]
1 2
5 6
include hellip
void Modif(int x[] int n)
void main(void)
int i
int p[6] = 1 2 3 5 7 11
Modif(p 6)
for (i=0ilt6i++)
coutltlt p[i]
void Modif(int a[] int n)
int i
for(i = 0 i ltn i++)
a[i] = 5
++- 52 M BENJELLOUN 2015 UMONS
void Saisie_Mat( int tab[][4] int m int n)
int i j
for (i = 0 i ltm i++)
for (j = 0 j lt n j++)
tab[i][j] = i
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
Matrice Exemple
void Affiche_Mat( int tab[][4] int m int n)
for (int i = 0 i ltm i++)
for (int j = 0 j lt n j++)
cout ltlt tab[i][j] ltlt
cout ltlt endl
include ltiostreamgt
using namespace std
void main()
int T[5][5]
Saisie_Mat( T 4 4 )
Affiche_Mat( T 4 4 )
27
++- 53 M BENJELLOUN 2015 UMONS
include hellip
int LaSomme( )
int A[Nmax] N int S = 0
for (int i=0ilt N i++)
cout ltltEntrez A[ltltiltlt]=
cin gtgtA[i]
S= S+ A[i]
return S
void main()
const int Nmax = 7
int i A[Nmax] S=0 N=3
S = LaSomme( )
cout ltlt Affichage ltlt endl
Affichage(A N)
cout ltlt n La somme est = ltlt S
Qursquoaffiche ce programme agrave lrsquoeacutecran
void Affichage( int A[] int N)
for (int i=0i lt N i++)
cout ltlt A[ltltiltlt]=
ltltA[i] ltltendl
++- 54 M BENJELLOUN 2015 UMONS
include hellip
void Saisie_T( int tab[] )
int N i
N= 3
for (i = 0 i ltN i++) tab[i] = i
void Affiche_T(int tab[] int N )
int i
for (i = 0 i ltN i++) cout ltlt tab[i]
void main()
int T[20] n
Saisie_T( T )
Affiche_T(T n )
tab[0] = 0
tab[1] = 1
tab[2] = 2
Qursquoaffiche ce programme agrave lrsquoeacutecran
28
++- 55 M BENJELLOUN 2015 UMONS
include hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 = 7
return hellip
Comment retourner v1 et v2
++- 56 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltlt a = ltlt a ltlt endl ltlt b = ltlt b
void echange(int xint y)
int tmp
tmp = x
x = y
y =tmp
void main()
int a = 1 b = 5
cout ltlt Avant ltltendl
affiche(ab)
echange(ab)
cout ltlt nApregraves ltltendl
affiche(ab)
Avant
a = 1
b = 5
Apregraves
PASSAGE DES PARAMETRES
Transmission des arguments
Comment eacutechanger a et b
a = 1
b = 5
PAR VALEUR
29
++- 57 M BENJELLOUN 2015 UMONS
Le pointeur prend comme
valeurs des adresses de
donneacutees en meacutemoire
Types de base hellip donneacutee
8
donneacutee
35 hellip
Adr i Adr j
Meacutemoire
12FF80 12FF84
Ladresse de leacuteleacutement i est ampi i=8 et ampi= 12FF80
int i=8 j=35
Et les pointeurs
hellip p=12FF84 hellip 35 hellip
12FF84 12FF80
int p p est le contenu pointeacute par p 35
p est lrsquoadresse 12FF84
++- 58 M BENJELLOUN 2015 UMONS
Deacuteclaration de Pointeurs Le symbole est utiliseacute entre le type et le nom du pointeur
Deacuteclaration drsquoun entier int i int p Deacuteclaration drsquoun pointeur vers un entier
Exemples de deacuteclarations de pointeurs
int pi pi est un pointeur vers un int pi deacutesigne le contenu de ladresse
float pf pf est un pointeur vers un float
char c d pc c et d sont des char pc est un pointeur vers un char
int C = 4
int p
p = ampC p reccediloit ladresse de c donc pointe sur c
cout ltlt p = ltltpltltendl
cout ltlt p = ltltp ltltendl
cout ltlt (ampC) ltlt(ampC)
p = 4
p = 0x12FF7C
(ampC) = 4
Ladresse de C est ampC
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
25
++- 49 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5 valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
include ltiostreamgt
using namespace std
int return_Val(int v)
void main(void)
int var = 5
int valeur
valeur = return_Val(var)
cout ltlt main var = ltlt var ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v)
if (v == 10) return (2v)
else return (3v)
cout ltlt return_Val v = ltlt vltltendl
Qursquoaffiche ce programme agrave lrsquoeacutecran Qursquoaffiche ce programme agrave lrsquoeacutecran
++- 50 M BENJELLOUN 2015 UMONS
Fonctions et reacutecursiviteacute
Tours de Hanoiuml Suite de Fibonacci
un = un-1 + un-2
u0=u1=1
Puissance entiegravere
Une fonction est dite reacutecursive lorsqursquoelle srsquoappelle elle-mecircme
int factorielle (int n )
if ( n lt 0) return (ndash1) code derreur
else if ( n == 0 ) return 1 0 = 1
else
return n factorielle( n-1 ) n = n(n-1)
a x an-1 si n gt 0
1 si n = 0
an-1 =
26
++- 51 M BENJELLOUN 2015 UMONS
Passer des tableaux aux fonctions
Les tableaux peuvent ecirctre passeacutes comme paramegravetres dune fonction
Ils ne peuvent pas ecirctre retourneacutes comme reacutesultat dune fonction
La longueur du tableau ne doit pas ecirctre deacutefinie agrave la deacuteclaration de la fonction
Un tableau peut ecirctre modifieacute dans une fonction Il est passeacute par reacutefeacuterence (adresse) et
non par valeur
include hellip
void Modif(int a[])
a[0] = 5
a[1] = 6
void main(void)
int p[2] = 1 2
cout ltlt p[0] ltlt ltlt p[1]
Modif(p)
cout ltlt p[0] ltlt ltlt p[1]
1 2
5 6
include hellip
void Modif(int x[] int n)
void main(void)
int i
int p[6] = 1 2 3 5 7 11
Modif(p 6)
for (i=0ilt6i++)
coutltlt p[i]
void Modif(int a[] int n)
int i
for(i = 0 i ltn i++)
a[i] = 5
++- 52 M BENJELLOUN 2015 UMONS
void Saisie_Mat( int tab[][4] int m int n)
int i j
for (i = 0 i ltm i++)
for (j = 0 j lt n j++)
tab[i][j] = i
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
Matrice Exemple
void Affiche_Mat( int tab[][4] int m int n)
for (int i = 0 i ltm i++)
for (int j = 0 j lt n j++)
cout ltlt tab[i][j] ltlt
cout ltlt endl
include ltiostreamgt
using namespace std
void main()
int T[5][5]
Saisie_Mat( T 4 4 )
Affiche_Mat( T 4 4 )
27
++- 53 M BENJELLOUN 2015 UMONS
include hellip
int LaSomme( )
int A[Nmax] N int S = 0
for (int i=0ilt N i++)
cout ltltEntrez A[ltltiltlt]=
cin gtgtA[i]
S= S+ A[i]
return S
void main()
const int Nmax = 7
int i A[Nmax] S=0 N=3
S = LaSomme( )
cout ltlt Affichage ltlt endl
Affichage(A N)
cout ltlt n La somme est = ltlt S
Qursquoaffiche ce programme agrave lrsquoeacutecran
void Affichage( int A[] int N)
for (int i=0i lt N i++)
cout ltlt A[ltltiltlt]=
ltltA[i] ltltendl
++- 54 M BENJELLOUN 2015 UMONS
include hellip
void Saisie_T( int tab[] )
int N i
N= 3
for (i = 0 i ltN i++) tab[i] = i
void Affiche_T(int tab[] int N )
int i
for (i = 0 i ltN i++) cout ltlt tab[i]
void main()
int T[20] n
Saisie_T( T )
Affiche_T(T n )
tab[0] = 0
tab[1] = 1
tab[2] = 2
Qursquoaffiche ce programme agrave lrsquoeacutecran
28
++- 55 M BENJELLOUN 2015 UMONS
include hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 = 7
return hellip
Comment retourner v1 et v2
++- 56 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltlt a = ltlt a ltlt endl ltlt b = ltlt b
void echange(int xint y)
int tmp
tmp = x
x = y
y =tmp
void main()
int a = 1 b = 5
cout ltlt Avant ltltendl
affiche(ab)
echange(ab)
cout ltlt nApregraves ltltendl
affiche(ab)
Avant
a = 1
b = 5
Apregraves
PASSAGE DES PARAMETRES
Transmission des arguments
Comment eacutechanger a et b
a = 1
b = 5
PAR VALEUR
29
++- 57 M BENJELLOUN 2015 UMONS
Le pointeur prend comme
valeurs des adresses de
donneacutees en meacutemoire
Types de base hellip donneacutee
8
donneacutee
35 hellip
Adr i Adr j
Meacutemoire
12FF80 12FF84
Ladresse de leacuteleacutement i est ampi i=8 et ampi= 12FF80
int i=8 j=35
Et les pointeurs
hellip p=12FF84 hellip 35 hellip
12FF84 12FF80
int p p est le contenu pointeacute par p 35
p est lrsquoadresse 12FF84
++- 58 M BENJELLOUN 2015 UMONS
Deacuteclaration de Pointeurs Le symbole est utiliseacute entre le type et le nom du pointeur
Deacuteclaration drsquoun entier int i int p Deacuteclaration drsquoun pointeur vers un entier
Exemples de deacuteclarations de pointeurs
int pi pi est un pointeur vers un int pi deacutesigne le contenu de ladresse
float pf pf est un pointeur vers un float
char c d pc c et d sont des char pc est un pointeur vers un char
int C = 4
int p
p = ampC p reccediloit ladresse de c donc pointe sur c
cout ltlt p = ltltpltltendl
cout ltlt p = ltltp ltltendl
cout ltlt (ampC) ltlt(ampC)
p = 4
p = 0x12FF7C
(ampC) = 4
Ladresse de C est ampC
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
26
++- 51 M BENJELLOUN 2015 UMONS
Passer des tableaux aux fonctions
Les tableaux peuvent ecirctre passeacutes comme paramegravetres dune fonction
Ils ne peuvent pas ecirctre retourneacutes comme reacutesultat dune fonction
La longueur du tableau ne doit pas ecirctre deacutefinie agrave la deacuteclaration de la fonction
Un tableau peut ecirctre modifieacute dans une fonction Il est passeacute par reacutefeacuterence (adresse) et
non par valeur
include hellip
void Modif(int a[])
a[0] = 5
a[1] = 6
void main(void)
int p[2] = 1 2
cout ltlt p[0] ltlt ltlt p[1]
Modif(p)
cout ltlt p[0] ltlt ltlt p[1]
1 2
5 6
include hellip
void Modif(int x[] int n)
void main(void)
int i
int p[6] = 1 2 3 5 7 11
Modif(p 6)
for (i=0ilt6i++)
coutltlt p[i]
void Modif(int a[] int n)
int i
for(i = 0 i ltn i++)
a[i] = 5
++- 52 M BENJELLOUN 2015 UMONS
void Saisie_Mat( int tab[][4] int m int n)
int i j
for (i = 0 i ltm i++)
for (j = 0 j lt n j++)
tab[i][j] = i
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
Matrice Exemple
void Affiche_Mat( int tab[][4] int m int n)
for (int i = 0 i ltm i++)
for (int j = 0 j lt n j++)
cout ltlt tab[i][j] ltlt
cout ltlt endl
include ltiostreamgt
using namespace std
void main()
int T[5][5]
Saisie_Mat( T 4 4 )
Affiche_Mat( T 4 4 )
27
++- 53 M BENJELLOUN 2015 UMONS
include hellip
int LaSomme( )
int A[Nmax] N int S = 0
for (int i=0ilt N i++)
cout ltltEntrez A[ltltiltlt]=
cin gtgtA[i]
S= S+ A[i]
return S
void main()
const int Nmax = 7
int i A[Nmax] S=0 N=3
S = LaSomme( )
cout ltlt Affichage ltlt endl
Affichage(A N)
cout ltlt n La somme est = ltlt S
Qursquoaffiche ce programme agrave lrsquoeacutecran
void Affichage( int A[] int N)
for (int i=0i lt N i++)
cout ltlt A[ltltiltlt]=
ltltA[i] ltltendl
++- 54 M BENJELLOUN 2015 UMONS
include hellip
void Saisie_T( int tab[] )
int N i
N= 3
for (i = 0 i ltN i++) tab[i] = i
void Affiche_T(int tab[] int N )
int i
for (i = 0 i ltN i++) cout ltlt tab[i]
void main()
int T[20] n
Saisie_T( T )
Affiche_T(T n )
tab[0] = 0
tab[1] = 1
tab[2] = 2
Qursquoaffiche ce programme agrave lrsquoeacutecran
28
++- 55 M BENJELLOUN 2015 UMONS
include hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 = 7
return hellip
Comment retourner v1 et v2
++- 56 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltlt a = ltlt a ltlt endl ltlt b = ltlt b
void echange(int xint y)
int tmp
tmp = x
x = y
y =tmp
void main()
int a = 1 b = 5
cout ltlt Avant ltltendl
affiche(ab)
echange(ab)
cout ltlt nApregraves ltltendl
affiche(ab)
Avant
a = 1
b = 5
Apregraves
PASSAGE DES PARAMETRES
Transmission des arguments
Comment eacutechanger a et b
a = 1
b = 5
PAR VALEUR
29
++- 57 M BENJELLOUN 2015 UMONS
Le pointeur prend comme
valeurs des adresses de
donneacutees en meacutemoire
Types de base hellip donneacutee
8
donneacutee
35 hellip
Adr i Adr j
Meacutemoire
12FF80 12FF84
Ladresse de leacuteleacutement i est ampi i=8 et ampi= 12FF80
int i=8 j=35
Et les pointeurs
hellip p=12FF84 hellip 35 hellip
12FF84 12FF80
int p p est le contenu pointeacute par p 35
p est lrsquoadresse 12FF84
++- 58 M BENJELLOUN 2015 UMONS
Deacuteclaration de Pointeurs Le symbole est utiliseacute entre le type et le nom du pointeur
Deacuteclaration drsquoun entier int i int p Deacuteclaration drsquoun pointeur vers un entier
Exemples de deacuteclarations de pointeurs
int pi pi est un pointeur vers un int pi deacutesigne le contenu de ladresse
float pf pf est un pointeur vers un float
char c d pc c et d sont des char pc est un pointeur vers un char
int C = 4
int p
p = ampC p reccediloit ladresse de c donc pointe sur c
cout ltlt p = ltltpltltendl
cout ltlt p = ltltp ltltendl
cout ltlt (ampC) ltlt(ampC)
p = 4
p = 0x12FF7C
(ampC) = 4
Ladresse de C est ampC
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
27
++- 53 M BENJELLOUN 2015 UMONS
include hellip
int LaSomme( )
int A[Nmax] N int S = 0
for (int i=0ilt N i++)
cout ltltEntrez A[ltltiltlt]=
cin gtgtA[i]
S= S+ A[i]
return S
void main()
const int Nmax = 7
int i A[Nmax] S=0 N=3
S = LaSomme( )
cout ltlt Affichage ltlt endl
Affichage(A N)
cout ltlt n La somme est = ltlt S
Qursquoaffiche ce programme agrave lrsquoeacutecran
void Affichage( int A[] int N)
for (int i=0i lt N i++)
cout ltlt A[ltltiltlt]=
ltltA[i] ltltendl
++- 54 M BENJELLOUN 2015 UMONS
include hellip
void Saisie_T( int tab[] )
int N i
N= 3
for (i = 0 i ltN i++) tab[i] = i
void Affiche_T(int tab[] int N )
int i
for (i = 0 i ltN i++) cout ltlt tab[i]
void main()
int T[20] n
Saisie_T( T )
Affiche_T(T n )
tab[0] = 0
tab[1] = 1
tab[2] = 2
Qursquoaffiche ce programme agrave lrsquoeacutecran
28
++- 55 M BENJELLOUN 2015 UMONS
include hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 = 7
return hellip
Comment retourner v1 et v2
++- 56 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltlt a = ltlt a ltlt endl ltlt b = ltlt b
void echange(int xint y)
int tmp
tmp = x
x = y
y =tmp
void main()
int a = 1 b = 5
cout ltlt Avant ltltendl
affiche(ab)
echange(ab)
cout ltlt nApregraves ltltendl
affiche(ab)
Avant
a = 1
b = 5
Apregraves
PASSAGE DES PARAMETRES
Transmission des arguments
Comment eacutechanger a et b
a = 1
b = 5
PAR VALEUR
29
++- 57 M BENJELLOUN 2015 UMONS
Le pointeur prend comme
valeurs des adresses de
donneacutees en meacutemoire
Types de base hellip donneacutee
8
donneacutee
35 hellip
Adr i Adr j
Meacutemoire
12FF80 12FF84
Ladresse de leacuteleacutement i est ampi i=8 et ampi= 12FF80
int i=8 j=35
Et les pointeurs
hellip p=12FF84 hellip 35 hellip
12FF84 12FF80
int p p est le contenu pointeacute par p 35
p est lrsquoadresse 12FF84
++- 58 M BENJELLOUN 2015 UMONS
Deacuteclaration de Pointeurs Le symbole est utiliseacute entre le type et le nom du pointeur
Deacuteclaration drsquoun entier int i int p Deacuteclaration drsquoun pointeur vers un entier
Exemples de deacuteclarations de pointeurs
int pi pi est un pointeur vers un int pi deacutesigne le contenu de ladresse
float pf pf est un pointeur vers un float
char c d pc c et d sont des char pc est un pointeur vers un char
int C = 4
int p
p = ampC p reccediloit ladresse de c donc pointe sur c
cout ltlt p = ltltpltltendl
cout ltlt p = ltltp ltltendl
cout ltlt (ampC) ltlt(ampC)
p = 4
p = 0x12FF7C
(ampC) = 4
Ladresse de C est ampC
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
28
++- 55 M BENJELLOUN 2015 UMONS
include hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 = 7
return hellip
Comment retourner v1 et v2
++- 56 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltlt a = ltlt a ltlt endl ltlt b = ltlt b
void echange(int xint y)
int tmp
tmp = x
x = y
y =tmp
void main()
int a = 1 b = 5
cout ltlt Avant ltltendl
affiche(ab)
echange(ab)
cout ltlt nApregraves ltltendl
affiche(ab)
Avant
a = 1
b = 5
Apregraves
PASSAGE DES PARAMETRES
Transmission des arguments
Comment eacutechanger a et b
a = 1
b = 5
PAR VALEUR
29
++- 57 M BENJELLOUN 2015 UMONS
Le pointeur prend comme
valeurs des adresses de
donneacutees en meacutemoire
Types de base hellip donneacutee
8
donneacutee
35 hellip
Adr i Adr j
Meacutemoire
12FF80 12FF84
Ladresse de leacuteleacutement i est ampi i=8 et ampi= 12FF80
int i=8 j=35
Et les pointeurs
hellip p=12FF84 hellip 35 hellip
12FF84 12FF80
int p p est le contenu pointeacute par p 35
p est lrsquoadresse 12FF84
++- 58 M BENJELLOUN 2015 UMONS
Deacuteclaration de Pointeurs Le symbole est utiliseacute entre le type et le nom du pointeur
Deacuteclaration drsquoun entier int i int p Deacuteclaration drsquoun pointeur vers un entier
Exemples de deacuteclarations de pointeurs
int pi pi est un pointeur vers un int pi deacutesigne le contenu de ladresse
float pf pf est un pointeur vers un float
char c d pc c et d sont des char pc est un pointeur vers un char
int C = 4
int p
p = ampC p reccediloit ladresse de c donc pointe sur c
cout ltlt p = ltltpltltendl
cout ltlt p = ltltp ltltendl
cout ltlt (ampC) ltlt(ampC)
p = 4
p = 0x12FF7C
(ampC) = 4
Ladresse de C est ampC
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
29
++- 57 M BENJELLOUN 2015 UMONS
Le pointeur prend comme
valeurs des adresses de
donneacutees en meacutemoire
Types de base hellip donneacutee
8
donneacutee
35 hellip
Adr i Adr j
Meacutemoire
12FF80 12FF84
Ladresse de leacuteleacutement i est ampi i=8 et ampi= 12FF80
int i=8 j=35
Et les pointeurs
hellip p=12FF84 hellip 35 hellip
12FF84 12FF80
int p p est le contenu pointeacute par p 35
p est lrsquoadresse 12FF84
++- 58 M BENJELLOUN 2015 UMONS
Deacuteclaration de Pointeurs Le symbole est utiliseacute entre le type et le nom du pointeur
Deacuteclaration drsquoun entier int i int p Deacuteclaration drsquoun pointeur vers un entier
Exemples de deacuteclarations de pointeurs
int pi pi est un pointeur vers un int pi deacutesigne le contenu de ladresse
float pf pf est un pointeur vers un float
char c d pc c et d sont des char pc est un pointeur vers un char
int C = 4
int p
p = ampC p reccediloit ladresse de c donc pointe sur c
cout ltlt p = ltltpltltendl
cout ltlt p = ltltp ltltendl
cout ltlt (ampC) ltlt(ampC)
p = 4
p = 0x12FF7C
(ampC) = 4
Ladresse de C est ampC
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
30
++- 59 M BENJELLOUN 2015 UMONS
Une reacutefeacuterence vers un objet permet de deacutefinir un nouveau nom un alias pour deacutesigner lrsquoemplacement meacutemoire de lrsquoobjet reacutefeacuterenceacute En tant qualias la reacutefeacuterence doit impeacuterativement ecirctre initialiseacutee avec lobjet reacutefeacuterenceacute
int i = 35 j
int ampref = i ref une reacutefeacuterence sur la variable i permet au programme de manipuler i
sous un autre nom que celui sous lequel elle a eacuteteacute deacuteclareacutee
i et ref deux identificateurs qui repreacutesentent la mecircme variable
int ampErRef INTERDIT une reacutefeacuterence doit ecirctre initialiseacutee
j = ref j = la valeur de lobjet reacutefeacuterenceacute par ref (j = i = 35)
ref = 100 ref=i= 100 j reste agrave 35
i = j ref=i=j = 35
Les Reacutefeacuterences en C++
++- 60 M BENJELLOUN 2015 UMONS
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int v)
void main()
int v = 5
Modifier(ampv)
cout ltlt nmain v = ltlt v
void Modifier(int v)
v = v 100
cout ltlt Modifier v = ltlt v
include hellip
void Modifier(int ampv)
void main()
int v = 5
Modifier(v)
cout ltlt nmain v = ltlt v
void Modifier(int ampv)
v = v 100
cout ltlt Modifier v = ltlt v
par Valeur Pointeur Reacutefeacuterence
Appel par valeurs pointeurs reacutefeacuterences
var = 5
var = 500
Modifier v = 500
main v = 5
Modifier v = 500
main v = 500
Modifier v = 500
main v = 500
var = 5
var = 500
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
31
++- 61 M BENJELLOUN 2015 UMONS
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
5
include hellip
int fonct (int a)
a=1
return a
void main(void)
int var = 5
var = fonct (var)
cout ltlt var ltlt endl
1 1
include hellip
void fonct (int a)
a=1
void main(void)
int var = 5
fonct (ampvar)
cout ltlt var ltlt endl
include hellip
void fonct (int ampa)
a=1
void main(void)
int var = 5
fonct (var)
cout ltlt var ltlt endl
1
++- 62 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void affiche (int a int b)
coutltltt i = ltlt a ltlt j = ltlt b ltlt endl
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (int int)
void main ()
int i= 1 j=5
affiche (i j)
echange (ampi ampj)
affiche (i j)
void echange (int a int b)
int tmp
tmp = b
b = a
a = tmp
void echange (intamp intamp)
void main ()
int i= 1 j=5
affiche (i j)
echange (i j)
affiche (i j)
void echange (int ampa int ampb)
int tmp
tmp = b
b = a
a = tmp
i = 1 j = 5
i = 1 j = 5
i = 1 j = 5
i = 5 j = 1
i = 1 j = 5
i = 5 j = 1
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
32
++- 63 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
int return_Val(int int)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
int return_Val(int v1 int v2)
v1 = 10
v2 += 7
return hellip
Comment retourner v1 et v2
include ltiostreamgt hellip
void return_Val(int amp intamp)
void main(void)
int var1 = 5 var2=0
int valeur
valeur = return_Val(var1 var2)
cout ltlt var1 = ltlt var1
ltlt var2 = ltltvar2 ltlt endl
cout ltlt main valeur = ltlt valeur
void return_Val(int ampv1 int ampv2)
v1 = 10
v2 += 7
return hellip
var1 = 50 var2 = 7
++- 64 M BENJELLOUN 2015 UMONS
include ltiostreamgt hellip
void somme(int int int amp)
int modif(int int amp int amp)
void main()
int a b c
a = 2 b = 8
somme(a b c)
cout ltltSomme de a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
a = modif(a b c)
cout ltlt Modif a=ltltaltlt et b=ltltbltlt ltlt c ltlt endl
void somme(int x int y int ampz)
z = x + y
y = 29
int modif(int x int ampy int ampz)
x = 2 y= x+ y z= 5
return x
Somme de a= et b=
Modif a= et b=
Quaffiche le code agrave leacutecran
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
33
++- 65 M BENJELLOUN 2015 UMONS
Si x=1
Si x =2
Si x=3
Si x=4
Si x=5
hellip
int Fonct1(int y)
y = 10 return (y)
void Fonct2(int y)
y = 11 exit(0)
void Fonct3(int y)
y = 12
void Fonct4(int ampy)
y = 13
void main()
int x=0 y=0
cin gtgt x
if (x== 1) y = Fonct1(y)
if (x== 2) Fonct2(y)
if (x== 3) return ( )
if (x== 4) Fonct4(y)
if (x== 5) Fonct3(y)
cout ltltICI y=ltlty
++- 66 M BENJELLOUN 2015 UMONS
include ltiostreamgt
using namespace std
void affiche(int a int b)
cout ltlt Deux entiers ltlt a ltlt et ltlt b ltlt n
void affiche(float a float b)
cout ltlt Deux reels ltlt a ltlt et ltlt b ltlt endl
void affiche(int c)
cout ltlt Un entier ltlt c ltlt n
void main()
affiche (52 63)
affiche (1 2)
affiche (100)
Surcharge des fonctions
Le C++ permet drsquoutiliser des fonctions qui portent le mecircme nom mais pas
le mecircme type etou le nombre de paramegravetres
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
34
++- 67 M BENJELLOUN 2015 UMONS
Paramegravetres par deacutefaut
include ltiostreamgt
using namespace std
void affiche(int un = 1 int deux = 2 int trois = 3)
cout ltlt un ltlt ltlt deux ltlt ltlt trois ltlt n
void main(void)
affiche(1 2 3)
affiche(5 6 7)
affiche(100 200)
affiche(1000)
affiche()
1 2 3 5 6 7 100 200 3 1000 2 3 1 2 3
++- 68 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include ltiostreamgt
using namespace std
void main()
const float PI= 314159
float rayon = 35
float circonference surface
int choix
cout ltlt 1 Calculer la circonferencen
cout ltlt 2 Calculer la surfacen
cout ltlt Votre choix
cin gtgt choix
switch (choix)
case 1 rayon = 0
circonference = 2PIrayon
cout ltlt circonference ltlt endl break
case 2 surface = PIrayonrayon
cout ltlt surface ltlt endl break
Le C++ est un langage structureacute en blocs les variables ne peuvent ecirctre utiliseacutees
que lagrave ougrave elles sont deacuteclareacutees
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
35
++- 69 M BENJELLOUN 2015 UMONS
Regravegles de visibiliteacute des variables
include hellip
int globale=0
void fonc(int v) double d f i++ globale --
void main(void) int i = 5 j float f = 28 g d = 37 globale =10 cout ltlt valeur de j= ltlt j cout ltlt nglobale = ltlt globale fonc (i) cout ltlt nglobale = ltlt globale
(0)
(1)
(2)
(3)
(4)
(5)
include hellip
int g
void affichage(int un int deux)
cout ltlt un ltlt ltlt deux ltlt ltlt g ltlt endl
void fonct(int un int deux)
affichage(un deux)
un += 2 deux += 2 g += 2
affichage(un deux)
void main(void)
int i = 5 j
affichage(i j)
j=10
fonct(i j)
affichage(i j)
5 -858993460 0
5 10 0
7 12 2
5 10 2
++- 70 M BENJELLOUN 2015 UMONS
include hellip
const int Nmax=20
void main()
int iN=3tab[Nmax]
saisie(tabN)
for(i=0iltNi++)
cout ltlttab[i]
void saisie(int tab[] int N)
int i
for(i=0iltNi++)
cingtgttab[i]
N=15
mon_programmecpp Meacutemoire utiliseacutee par mon_programmecpp
Nmax=20 i N=3
Meacutemoire pour saisie()
i N=3 N=15
Tab[Nmax] 5 -1 9
i=0 i=1 i=2
i=0 i=1 i=2
i=3
hellip
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
36
++- 71 M BENJELLOUN 2015 UMONS
Allocation dynamique de la meacutemoire
Tableaux reacuteserver plus de places en meacutemoire que neacutecessaire
Creacuteation drsquoun tableau
de taille quelconque
lallocation dynamique
include ltiostreamgt hellip
void affiche(int T[] int d char C[])
for(int i=0 iltd i++)
coutltlt n T[ltltiltlt] = ltlt T[i] ltlt C[ltltiltlt] = ltltC[i]
cout ltlt endl
void main()
int N T i
cout ltlt N = cin gtgt N
char C = new char[N]
T= new int[N] affiche(T N C)
for(i=0 iltN i++)
T[i]=i
C[i]=A+i
affiche(T N C)
delete[] T affiche(T N C)
delete[] C affiche(T N C)
T[0] = -842150451 C[0] =
T[1] = -842150451 C[1] =
T[2] = -842150451 C[2] =
T[0] = 0 C[0] = A
T[1] = 1 C[1] = B
T[2] = 2 C[2] = C
T[0] = -572662307 C[0] = A
T[1] = -572662307 C[1] = B
T[2] = -572662307 C[2] = C
T[0] = -572662307 C[0] = brvbar
T[1] = -572662307 C[1] = brvbar
T[2] = -572662307 C[2] = brvbar
++- 72 M BENJELLOUN 2015 UMONS
Tableau de taille quelconque
include lthellip
void saisie_vect(int Tab[] int n)
for(int i=0iltni++)
cin gtgt Tab[i]
void Affiche(int Tab[] int dim)
for(int i=0iltdimi++)
cout ltlt Tab[ ltlt i ltlt]=
ltlt i ltltTab[i]
void main() int tab n
cout ltlt N=
cin gtgt n
tab = new int [n]
saisie_vect(tab n)
Affiche(tab n)
delete [] tab
include lthellip
void main()
int T pointeur sur un pointeur sur un entier
int i j lignes colonnes
cout ltlt nEntrez le nb de lignes et de colonnes
cin gtgt lignes gtgt colonnes
T = new int [lignes] Alloc drsquoun tableau de pointeurs
pour chaque ligne alloc du nb de col
for (i=0 iltlignes i++)
T[i] = new int[colonnes]
for (i=0 iltlignes i++)
for (j=0 jltcolonnes j++)
cout ltltT[ ltlti ltlt ltltj ltlt]
cin gtgt T[i][j]
Destruction
for (i=lignes-1 igt=0 i--)
delete[] T[i]
delete[] T
Tableau dynamique agrave deux dimensions
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
37
++- 73 M BENJELLOUN 2015 UMONS
Gestion des fichiers en C++
Pour manipuler un fichier en C++ il faut include ltfstreamgt
On y trouve essentiellement les classes bull ofstream (output file stream) permet drsquoeacutecrire les donneacutees dans le fichier bull ifstream (input file stream) permet de lire les donneacutees du fichier
Ouverture et fermeture drsquoun fichier
ofstream output X outputopen(Restxt) ou outputopen(clabojeudiRestxt) Xopen(Data) ou Xopen(AData)
Eacutecriture
Lecture ifstream input inputopen(Datatxt) ou inputopen(clabojeudiDatatxt)
++- 74 M BENJELLOUN 2015 UMONS
include ltfstreamgt hellip
void main()
ofstream Ecri
char Tab1[6]=Hello
int Tab2[5]=12345
Ecriopen(Mon_fichiertxt)
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
include ltfstreamgt hellip
void main()
ifstream Lec
char Tab1[6] Titre[100]
int Tab2[5] i=0
Lecopen(Mon_fichiertxt)
Lecgetline(Titre100) cout ltlt Titre ltlt endl
while(Leceof())
Lec gtgt Tab1[i] gtgt Tab2[i]
cout ltlt Tab1[i] ltlt ltlt Tab2[i]ltlt endl
i++
Lecclose()
Mes Donnees
H 1
e 2
l 3
l 4
o 5
o 5
Test
Mon_fichiertxt
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
38
++- 75 M BENJELLOUN 2015 UMONS
Ecriopen(Mon_fichiertxt)
if(Ecri) if (Ecri= NULL)
on veacuterifie si louverture se passe bien
Ecri ltlt Mes Donnees ltlt endl
for(int i=0 ilt5 i++)
Ecri ltlt Tab1[i] ltlt
ltlt Tab2[i]ltltendl
Ecriclose()
else si eacutechec agrave louverture
coutltltErreurltltendl
if (Ecribad()) return 0
Ecrifail()
++- 76 M BENJELLOUN 2015 UMONS
Les Structures
Structure = ensemble de variables deacutefinissant un nouveau type sous un seul nom Les structures sont deacutefinies en utilisant le mot-cleacute struct
struct Date int jour int mois int an
Deacuteclarer des instances
struct Date paques semaine[7]
Date noeumll pas de struct
Date nouvel_an = 1 1 2007 Initialisation
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
39
++- 77 M BENJELLOUN 2015 UMONS
Structure dans Structure struct Date
int jour
int mois
int an
struct Etudiant char nom[30] string prenom char adresse int numero float Cotes[3] struct Date D_Nais
Etudiant JD =
Dupont Jpp
rue de Houdain 9 7000 Mons
102
105 11 145
15 10 1986
Les membres sont acceacutedeacutes par le nom de
lrsquoinstance suivi de suivi du nom du membre
cout ltltnom = ltlt JDnom
cout ltltn Cote 0 = ltlt JDCotes[0]ltlt endl
cout ltlt jour de naissance ltltJD D_Naisjour
++- 78 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom ltlt Prix = ltlt ARprix
void main(void)
Article X T[5]
cout ltlt Entrez le nom cin gtgt Xnom
cout ltlt nEntrez le prix cin gtgt Xprix
Affiche(X)
for (int i=0 ilt5 i++)
cout ltlt Entrez le nom cin gtgt T[i]nom
cout ltlt nEntrez le prix cin gtgt T[i]prix
Affiche(T[i])
nom1
prix1
nom2
prix2
nom3
prix3
nom4
prix4
hellip
T[0] T[1] T[2]
Et si nom contenait un espace Exp Mon GSM
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
40
++- 79 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Affiche(Article AR)
cout ltlt nt Nom = ltlt ARnom
ltlt Prix = ltlt ARprix
void Saisie(Article AR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main(void)
Article X
Saisie(X)
Affiche(X)
Entrez le nom
Entrez le prix
Une structure peut ecirctre passeacutee comme une autre variable par valeur ou par adresse
++- 80 M BENJELLOUN 2015 UMONS
include hellip
struct Article
string nom
int prix
void Saisie(Article ampAR)
cout ltlt Entrez le nom cin gtgt ARnom
cout ltlt nEntrez le prix cin gtgt ARprix
void main( )
Article T[5]
for (int i=0 ilt5 i++)
Saisie(T[i])
T[i]=Nouv()
Article Nouv()
Article AA
cout ltlt Entrez le nom cin gtgt AAnom
cout ltlt nEntrez le prix cin gtgt AAprix
return AA
Lrsquoopeacuteration drsquoaffectation = peut se faire
avec des structures
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
41
++- 81 M BENJELLOUN 2015 UMONS
const int NMax = 5
struct Etudiant
string nom
int numero
int Matieres[NMax]
void saisie(Etudiant T[] int n int NM)
hellip
n
NM
hellip
const int NMax = 5
struct Etudiant
char nom
int numero
int Matieres[NMax]
82 et 83 Eacutecrire le mecircme programme que 81 en remplaccedilant la structure par
84 Donnez la structure repreacutesentant ce tableau
Nom adresse Sexe res1 res2
hellip resN Code Myne
nom1 56 rue je ne sais pas bte 10 hellip
M 10 15 hellip 8 A 133
nom2 33 rue qui nrsquoexiste pas hellip
F 10 20 hellip 19 V 157
nom3 hellip M 13 14 hellip 15 C 139
nom20 hellip F 10 10 hellip 11 D 102
Eacutecrire un programme permettant de manipuler un
tableau de cette structure Ce programme doit geacuterer
en boucle le menu suivant
1 - SAISIE et AFFICHAGE du tableau
2 - Sauvegarde dans un fichier
3 - Lecture fichier
4 - ARRET du programme
++- 82 M BENJELLOUN 2015 UMONS
Les listes sont des structures de donneacutees dynamiques lineacuteaires Elles sont composeacutees de cellules chaicircneacutees les unes aux autres par pointeurs
NULL
NULL
Une cellule eacutetant une structure qui contient un eacuteleacutement agrave stocker et un pointeur sur la prochaine cellule de la liste
struct Cellule int Data struct Cellule suiv pointeur sur le prochain maillon
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
42
++- 83 M BENJELLOUN 2015 UMONS
Modeacuteliser une liste chaicircneacutee consiste agrave allouer dynamiquement les cellules
chaque fois que cela est neacutecessaire
Tecircte Elm1 Elm2 Elm3 Elm4
Liste simplement chaicircneacutee
4000
Elem1
0700
Elem2
0900
Elem3
2170
Elem4
NULL
4000
0700
0900
2170
Tecircte_List
Liste simplement chaicircneacutee
++- 84 M BENJELLOUN 2015 UMONS
Allouer et assigner une Cellule
Cette fonction reacuteserve lespace meacutemoire neacutecessaire pour une nouvelle Cellule
dans la liste assigne les donneacutees et retourne un pointeur sur cette Cellule
struct CEL
string name
struct CEL suiv
CEL cel Pcel
cel name = Toto
Pcel name = Jo
Toto
NULL
debut
Nouvelle cellule dans une liste chaicircneacutee vide
CEL debut
debut = new CEL
debutname = Toto
debutsuiv = NULL
Le deacutebut de la liste est indiqueacute par un pointeur indeacutependant (debut) et la fin par NULL
Liste simplement chaicircneacutee
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
43
++- 85 M BENJELLOUN 2015 UMONS
NULL
CEL prec
prec = new CEL
precname= ldquoJo
precsuiv = debut
debut = prec prec
Jo Toto
debut
Ajouter une nouvelle cellule en tecircte de liste
Inseacuterer une nouvelle cellule apregraves la cellule prec
Claire
Denis
NULL
prec
Jo
Toto
NULL
prec
Alfred
p
debut
CEL p
p = new CEL
pname = Alfred
psuiv = precsuiv
precsuiv = p
Liste simplement chaicircneacutee
++- 86 M BENJELLOUN 2015 UMONS
Recherche dans une liste
boolean EstDansL(string x CEL a) while (a = null) if (aname == x) return true a = asuiv return false
struct CEL string name struct CEL suiv
boolean EstDansL(string x CEL a) for ( a = null a = asuiv) if (aname == x) return true return false
boolean EstDansL(string x CEL a) if (a == null) return false if (aname == x) return true return EstDansL (x asuiv)
Liste simplement chaicircneacutee
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
44
++- 87 M BENJELLOUN 2015 UMONS
Une pile est une liste qui respecte la regravegle ldquodernier arriveacute premier sortirdquo (Last In First Out) Crsquoest une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoagrave une seule extreacutemiteacute appeleacutee sommet de la pile
PILE [stack LIFO]
Une file dattente est une structure de donneacutees pour laquelle lrsquoajout et la suppression drsquoun eacuteleacutement ne sont autoriseacutes qursquoaux seules extreacutemiteacutes appeleacutees la tecircte et la queue de la file Les eacuteleacutements sont ajouteacutes en queue de file et sont retireacutes en tecircte de file Premier entreacute Premier sorti liste FIFO (First In First Out)
FILE DATTENTE queue [queue FiFo]
Liste simplement chaicircneacutee
++- 88 M BENJELLOUN 2015 UMONS
debut
Noeud
debut
NULL
struct Noeud int data Noeud next Noeud prev
Liste chaicircneacutee
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
45
++- 89 M BENJELLOUN 2015 UMONS
debut fin
NULL
debutprev = NULL
debutnext = fin
finprev = debut
NULL
finnext = NULL
data prev next
struct Noeud int data Noeud next Noeud prev
Liste doublement chaicircneacutee
++- 90 M BENJELLOUN 2015 UMONS
Inseacuterer un eacuteleacutement devant act
tmp-gtprev = act-gtprev
act-gtprev-gtnext = tmp
tmp-gtnext = act
act
data prev next
1
2
3
4
NULL
1
2
3
4
act-gtprev = tmp
Liste doublement chaicircneacutee
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
46
++- 91 M BENJELLOUN 2015 UMONS
Liste doublement chaicircneacutee
Liste dont les eacuteleacutements ont un eacuteleacutement suivant et un eacuteleacutement preacuteceacutedent Il nrsquoy a pas de tecircte de liste ni de fin de liste la chaicircne est fermeacutee
A B C liste
Une liste avec un seul eacuteleacutement
A liste
Liste doublement chaicircneacutee
++- 92 M BENJELLOUN 2015 UMONS
a
b
c
d
e
f
g
La recherche dun cocircteacute est plus lente que lautre
Arbres binaires
a
b
c
d
e
f
g
arbre eacutequilibreacute
La diffeacuterence entre la hauteur du sous-arbre gauche et la hauteur du sous-arbre droit est dau plus une uniteacute
h
Un arbre binaire est un triplet (eacuteleacutement sous_arbre sous_arbre)
Arbres
struct cellule int data struct noeud fils_gauche struct noeud fils_droit
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
47
++- 93 M BENJELLOUN 2015 UMONS
Arbre binaire de recherche ABR
Un arbre binaire de recherche est un arbre binaire tel que pour tout nœud X les nœuds de son sous-arbre gauche srsquoils en existent ont des valeurs infeacuterieures ou eacutegales agrave celle de X et les nœuds de son sous-arbre droit des valeurs strictement supeacuterieures
X
lt=X gtX
Ce que lrsquoon traduit par g(A) racine(A) lt d(A)
Utilisation importante en Info pour la localisation + - tri hellip
24
10 37
Arbres
Parcours dun arbre binaire de recherche
Le parcours drsquoun arbre binaire consiste agrave examiner systeacutematiquement dans un certain ordre tous les nœuds de lrsquoarbre pour effectuer un traitement de donneacutees (ex Affichage) Les parcours en profondeur infixe suffixe et preacutefixe se deacutefinissent de maniegravere reacutecursive et se distinguent par lordre dans lequel sont faits ces traitements
++- 94 M BENJELLOUN 2015 UMONS
I III
II
SI ABR
Le parcours infixe affiche les
eacuteleacutements dans lrsquoordre croissant
12
23
78
9
-77
22 10 -2
8
Parcours infixe (in-order)
infixe -77 -2 8 9 10 12 22 23 78
void infixe(arbre racine)
if ( vide(racine))
infixe(racinefils_gauche)
cout ltlt racinedata
infixe(racinefils_droit)
Infixe(Fils_G)
Lister Pegravere
Infixe (Fils_autres)
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
48
++- 95 M BENJELLOUN 2015 UMONS
III
II I
Postfixe
-77 8 -2 10 9 22 78 23 12
12
23
78
9
-77
22 10 -2
8 void Postfixe(arbre racine)
if ( vide(racine))
Postfixe(racinefils_gauche)
Postfixe(racinefils_droit)
cout ltlt racinedata
Parcours Postfixe (suffixe ou post-order)
++- 96 M BENJELLOUN 2015 UMONS
Preacutefixe
12 9 -2 -77 8 10 23 22 78
12
23
78
9
-77
22 10 -2
8
Le parcours en profondeur agrave gauche consiste agrave partir de la racine et agrave tourner autour de lrsquoarbre en allant toujours le plus agrave gauche possible Le parcours se termine lorsqursquoon est revenu agrave la racine par le cocircteacute droit
void Prefixe(arbre racine)
if ( vide(racine))
cout ltlt racinedata
Prefixe(racinefils_gauche)
Prefixe(racinefils_droit)
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Parcours Preacutefixe (pre-order)
Arbres
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
49
++- 97 M BENJELLOUN 2015 UMONS
4
9 2
10 6 3 1
8 7 5
Arbre non binaire
Principe Parcours de gauche agrave droite sur la position courante lrsquoenfant le plus agrave gauche a la prioriteacute puis la position courante puis les autres enfants
Infixe
10
9 3
8 7 2 1
6 5 4
Principe On opegravere drsquoabord sur les feuilles (gauche) puis sur les branches
Postfixe
1
5 2
10 6 4 3
9 8 7
Principe Depuis la racine descendre la hieacuterarchie quand on arrive sur une feuille on remonte jusqursquo agrave une branche non visiteacutee auparavant
Preacutefixe
Exemple Parcours
Arbres
++- 98 M BENJELLOUN 2015 UMONS
Exemples 3
1 8
0 2 9
Parcours infixe Infixe(Fils_G)
Lister Pegravere
Infixe(Fils_autres)
Posfixe(Fils_G)
Posfixe(Fils_autres)
Lister Pegravere
4 Parcours preacutefixe
Lister Pegravere
Prefixe(Fils_G)
Prefixe(Fils_autres)
Arbres
1
2 3 4
5 6 7
Parcours postfixe
Qursquoest-ce que les parcours preacutefixe infixe et postfixe affichent pour ces 3 arbres
+
+ 2 a
a
b
1
+2ab+a1
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
50
++- 99 M BENJELLOUN 2015 UMONS
rechercher valeur x dans arbre == Rech(xarbre) booleacuteen
On compare lrsquoeacuteleacutement agrave la valeur de la racine
- si le sous-arbre seacutelectionneacute est vide lrsquoeacuteleacutement est absent eacutechec
rechercher ( x ) = faux
- si eacutegaliteacute succegraves x = r rechercher (x ltr g d gt ) = vraie
Recherche drsquoun eacuteleacutement Recherche dichotomique
- si la valeur est plus petite on recommence reacutecursivement dans le sous-arbre
gauche et reacuteciproquement si la valeur est plus grande dans le sous-arbre droit
x lt r rechercher (x lt r g d gt ) = rechercher (x g )
x gt r rechercher (x lt r g d gt ) = rechercher (x d )
Complexiteacute Dans le pire des cas la complexiteacute est en O ( hauteur de lrsquoarbre lt N)
Arbres
++- 100 M BENJELLOUN 2015 UMONS
La structure de tas est un arbre veacuterifiant les deux proprieacuteteacutes suivantes bull Lrsquoarbre est un arbre binaire parfait bull La valeur de tout nœud est gt= agrave celle de ses descendants
La structure de tas
24
23
7
16
1
22 10 8
5 4 20
24
23
7
16
1
22 20 8
5 4 10
tant que ( y racine ) et ( y gt pegravere(y) ) faire eacutechanger y et pegravere(y)
Arbres
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
51
++- 101 M BENJELLOUN 2015 UMONS
Tri par tas [Heap sort] Principe deux phases
- Construire un tas contenant les n eacuteleacutements par adjonction successives en O (n log n)
- Tant que le tas nrsquoest pas vide reacutepeacuteter lopeacuteration de prendre leacuteleacutement de la racine (max) le retirer du tas avec reacuteorganisation mettre ce max agrave sa place deacutefinitive en O (n log n)
15
14 5
8 13 2 3
3
14 5
8 13 2 15
reacuteorganisation
Suppression
14
13 5
8 3 2 15
Arbres
++- 102 M BENJELLOUN 2015 UMONS
Table de hachage
Pour trouver la position dun Etudiant E dans
struct Etudiant string nom prenom Tel int Matiere[10] char adresse
Tableaux non ordonneacutes Recherche seacutequentielle en O(N) Tableaux ordonneacutes Recherche dichotomique en O(log N) Listes Recherche seacutequentielle en O(N) Arbres Recherche en O(log N)
Comment tendre vers une recherche en O(1) en moyenne mecircme si N uarr
si N uarr alors le temps de la recherche uarr
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
52
++- 103 M BENJELLOUN 2015 UMONS
Une table de hachage est une structure de donneacutees dont le principe est drsquoassocier agrave chaque information agrave stocker une cleacute Elle permet
1048709 un accegraves rapide comme les tableaux 1048709 une insertion rapide comme les listes 1048709 laccegraves agrave un eacuteleacutement en transformant la cleacute en une valeur par lintermeacutediaire dune fonction de hachage H un accegraves en O(1) en moyenne (O(N) pire des cas)
Une table de hachage nrsquoest pas ordonneacutee
H est deacuteterministe Pour une mecircme cleacute k on a toujours la mecircme valeur de H(k)
Deacutefinition
Table de hachage
Deacutefinition
Reacutesolution des collisions
1048709 le chainage ( Listes voire arbre ou tableau dynamique) 1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Facteur de charge et Indicateur des performances
Table de hachage
++- 104 M BENJELLOUN 2015 UMONS
0
H(K1) 1
2
H(K2) 3
H(K3) 4
5
hellip
K1 (nom1) DK1
K2 (nom2) DK2
Cleacutes hacheacutees T[H(Ki)]
Donneacutees Cleacute Cleacute hacheacutee
DK1 (nom1 prenom1hellip)
DK2 (nom2prenom2hellip)
DK3 (nom3prenom3hellip)
K1 (nom1) K2 (nom2) K3 (nom3)
H(K1) = 1 H(K2) = 3 H(K3) = 4
Donneacutees Cleacutes
N-1
Les meacutethodes de recherche drsquoajout et de suppression ressemblent agrave
Etudiant chercher(int H[cle]) return T[ H[cle] ] void ajout( Etudiant E Etudiant T[] ) T[ H[Ecle] ] = E hellip
Table de hachage
Deacutefinition
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
53
++- 105 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 1 K = nomi H[k] = ordre alphabeacutetique de la 1ere lettre =position dans le tableau
Exemple
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
Asteacuterix hellip 0
Bob hellip 1
2
Ducobu hellip 3
hellip hellip
Marsupilami hellip 12
hellip hellip
Tintin hellip
hellip
T[ H[k] ]
H(ki) ne H(kj) pour ki ne kj
H[Bob]
Info Bob
Table de hachage
++- 106 M BENJELLOUN 2015 UMONS
On suppose qursquoil nrsquoy a pas drsquohomonyme comme on ne peut utiliser T[nomi] il faut drsquoabord utiliser une fonction de hachage Solution 2 K = nomi
Asteacuterix Bob Ducobu Lucky Luke Marsupilami Naruto Obeacutelix Tintin
Bobette Natacha Titeuf hellip
hellip 0
Bob hellip 680
hellip
Bobette hellip
hellip hellip
Tintin hellip
hellip
1
0
)])[(( H[k]Len
i
iBinomascii B = 2 10 etc
Bob = B 20 + o21 + b 22 = 661 + 1112 + 984 = 680
Tintin = 84100 +105101 +110102 +116103 +105104 +110105 =12178134
Table de hachage
Exemple
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
54
++- 107 M BENJELLOUN 2015 UMONS
Solution
Pour reacuteduire la taille du tableau appliquer un modulo N (nombre premier ) Construction drsquoune bonne fonction de hachage H(ki) qui associe rapidement une adresse agrave une cleacute
Simple agrave calculer
Distribue uniformeacutement les eacuteleacutements dans le tableau et minimise le
risque de collisions
Traiter les collisions qui se produiront ineacutevitablement
Inconveacutenients
Tableau agrave reacuteserver doit ecirctre tregraves grand Collisions (2 cleacutes diffeacuterentes donnent le mecircme indice dans le tableau)
Table de hachage
++- 108 M BENJELLOUN 2015 UMONS
Exemples de strateacutegies de reacutesolution des collisions 1048709 le chainage ( Listes voire arbre ou tableau dynamique)
1048709 ladressage directe (Hachage lineacuteaire quadratique et double )
Reacutesolution des collisions
Reacutesolution des collisions chainage
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Bob] H[Bobette] H[Batman]
Bobettehellip Batmanhellip null
Titeufhellip
Avantages et Inconveacutenients
Table de hachage
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
55
++- 109 M BENJELLOUN 2015 UMONS
Reacutesolution des collisions adressage directe
Lorsquil y a collision on calcule agrave partir de lrsquoeacuteleacutement une nouvelle place dans la table
A) Hachage lineacuteaire
0 Asteacuterix hellip
1 Bob hellip
2
3 Ducobu hellip
hellip hellip
Tintin hellip
N-1 hellip
H[Bobette]
1+1 mod N libre
0 Asteacuterix hellip
1 Bob hellip
2 Bobette hellip
3 Ducobu hellip
hellip hellip
Tintin hellip
hellip
H[Batman]
1+1 mod N occupeacutee
1+2 mod N occupeacutee
1+3 mod N libre
next(cleacutei) = (hash(cleacute) + i) mod N
B) Hachage quadratique
Les indices des cases augmentent quadratiquement + i + i2 +2 + 6 +12 +20
next(cleacutei) = hash(cleacute) + i + i2) mod N
Si collision agrave la position i on essaie i + 1 mod N
Table de hachage
++- 110 M BENJELLOUN 2015 UMONS
Recherche dun eacuteleacutement k dans T i H ( k ) j 1 TQ (T[ i ] = k ) ET (T[ i ] = v i d e ) ET ( j lt N-1) FRE i ( H ( k ) +j ) mod N FTQ SI T[ i ] == k ALORS t r o u v e SINON pas t r o u v e FSI
Ajout dun eacuteleacutement i H ( k ) SI i occupeacutee ALORS j 1 i ( H ( k) +j ) mod N TQ ( ( i occupeacutee ) ET ( jltN-1)) FRE j j + 1 i ( H (k) +j ) mod N FTQ FSI
Hachage lineacuteaire
Table de hachage
Reacutesolution des collisions adressage directe
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
56
++- 111 M BENJELLOUN 2015 UMONS
- Augmenter la taille du tableau T Nrsquo gt N Les emplacements de N agrave Nrsquo serviront agrave stocker les eacuteleacutements en collisions
- Creacuteer une colonne suppleacutementaire pour geacuterer et suivre les collisions
Brsquo) Autre maniegravere
SI E1 et E2 sont en collisions (H(K1)=H(K2)=i) ALORS on T[i] = E1 et col[i] = irsquo irsquo est lrsquoindice tel que T[irsquo] = E2 Avec irsquo gt N SINON T[i] = E1 et col[i] = -1 FSI
0 Asteacuterix hellip -1
1 Bob hellip 7
2
3 Ducobu hellip -1
4 hellip
5 Tintin hellip 9
6 hellip
7 Bobette hellip 8
8 Batman -1
9 Titeuf -1
10
12 hellip
Avantages et Inconveacutenients
Table de hachage
Reacutesolution des collisions adressage directe
++- 112 M BENJELLOUN 2015 UMONS
C) Double hachage
Pour eacuteviter les regroupements aux alentours de i mod N ladresse de la case est donneacutee par une deuxiegraveme fonction de hachage Hrsquo(k) on utilise donc un double hachage
next(cleacutei) = (hash1(cleacute) + i hash2(cleacute)) mod N
Algorithme i H ( k ) SI i occupee ALORS j 1 i ( H ( k ) + H ( k ) j ) mod N TQ ( ( i occupee ) ET ( jltT-1)) FRE j j + 1 i ( H ( k ) + H ( k ) j ) mod N FTQ FSI
Table de hachage
Reacutesolution des collisions adressage directe
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits
57
++- 113 M BENJELLOUN 2015 UMONS
Exemple de Hachage Double
ndash N = 13 ndash h(k) = k mod 13 ndash hrsquo(k) = 7 - k mod 7 bull Inseacuterer dans cet ordre les cleacutes 18 41 22 44 59 32 31 73
0 1 2 3 4 5 6 7 8 9 10 11 12
31 41 18 32 59 73 22 44
Position
Cleacute k
k H (k) Hrsquo (k) Position
Avantages et Inconveacutenients du Hachage lineacuteaire quadratique et double
Table de hachage
Reacutesolution des collisions adressage directe
++- 114 M BENJELLOUN 2015 UMONS
Un bon facteur de charge (taux de remplissage) nb de positions vides avec le moins de collisions
Facteur de charge = nombre total de positions
nombre de positions occupeacutees =
Indicateur des performances de la table de hachage
C() Lineacuteaire Quadratique Hachage double
Table de hachage
Exemples drsquo applications de tableau de hachage
ndash petite base de donneacutees ndash compilateurs ndash cache des navigateurs ndash hellip
Exemples de fonctions de hachage cryptographiques
MD5 (Message Digest) produit des hacheacutes de 128 bits en travaillant les donneacutees originales par blocs de 512 bits
SHA-1 (Secure Hash Algorithm 1) SHA-2 les tailles de hacheacutes possibles 256 384 ou 512 bits
RIPEMD-160 (Ripe Message Digest) 160 bits