57
1 ++- 1 M. BENJELLOUN : 2015 UMONS Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons [email protected] 2015 ++- 2 M. BENJELLOUN : 2015 UMONS Objectifs Être capable de construire des bons programmes Des programmes : corrects, efficaces, robustes, relativement faciles à comprendre, à modifier et à maintenir. Qualités attendues d'un programme Clarté, Simplicité, Efficacité, Modularité, Extensibilité. Programmer de manière modulaire Lors des séances d'exercices, où la présence est obligatoire comme aux TPs, un complément de matière sera abordé. On ne peut donc considérer, le syllabu et ce document comme complets. Pré-requis : Aucun

Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons [email protected]

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 2: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 3: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 4: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 5: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 6: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 7: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 8: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 9: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 10: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 11: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 12: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 13: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 14: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 15: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 16: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 17: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 18: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 19: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 20: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 21: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 22: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 23: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 24: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 25: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 26: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 27: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 28: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 29: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 30: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 31: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 32: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 33: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 34: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 35: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 36: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 37: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 38: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 39: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 40: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 41: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 42: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 43: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 44: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 45: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 46: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 47: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 48: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 49: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 50: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 51: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 52: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 53: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 54: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 55: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 56: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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

Page 57: Présentation PowerPoint C++ : Transp 1er Bac · 2015. 2. 16. · 1 M. BENJELLOUN: 2015 UMONS ++ - 1 Mohammed BENJELLOUN Service d’Informatique Faculté Polytechnique de Mons Mohammed.Benjelloun@umons.ac.be

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