Corrigé Examen 2 Algorithmique/Structures de données / 2011 2012 Exercice 1 : Arbre de recherche binaire
SOIT
A , P DES ARB ;
Une_pile UNE PILE DE ARB ;
Afficher , Tr , Recherche DES ACTIONS ; Top , Rotg , Rotd DES FONCTIONS ( ARB ) ;
DEBUT
CREER_ARB ( A , [ 55 , 23 , 18 , 17 , 40 , 45 , 66 , 60 , 77 ] ) ; APPEL Recherche ( A , 45 , P ) ;
ECRIRE ( INFO ( P ) , '***' ) ; APPEL Tr ( A , P ) ;
APPEL Afficher ( A ) ;
FIN
ACTION Recherche ( A , Val , P ) ; SOIT
A , P DES ARB ; Trouv UN BOOLEEN ; Val UN ENTIER ;
DEBUT
CREERPILE ( Une_pile ) ; Trouv := FAUX ;
P := A ;
TQ ( P <> NIL ) ET NON Trouv SI INFO ( P ) = Val
Trouv := VRAI SINON
EMPILER ( Une_pile , P ) ; SI Val < INFO ( P )
P := FG ( P ) SINON
P := FD ( P ) FSI
FSI FTQ FIN
ACTION Afficher ( A ) SOIT
A UN ARB ;
DEBUT SI A <> NIL
ECRIRE ( INFO ( A ) ) ; APPEL Afficher ( FG ( A ) ) ; APPEL Afficher ( FD ( A ) ) ;
FSI FIN
ACTION Tr ( A , N ) ; SOIT
A , N , P DES ARB ;
DEBUT
TQ NON PILEVIDE ( Une_pile ) DEPILER ( Une_pile , P ) ;
ECRIRE ( '******depilement' , INFO ( P ) ) ; SI FG ( P ) = N
N := Rotd ( P ) SINON
N := Rotg ( P ) FSI ;
FTQ ; A := N FIN
FONCTION Top ( Une_pile ) : ARB ; SOIT
Une_pile UNE PILE DE ARB ; V UN ARB ;
DEBUT
DEPILER ( Une_pile , V ) ; EMPILER ( Une_pile , V ) ; Top := V
FIN
FONCTION Rotg ( P ) : ARB SOIT
P , N , Q DES ARB ;
DEBUT
N := FD ( P ) ;
AFF_FD ( P , FG ( N ) ) ; AFF_FG ( N , P ) ;
SI NON PILEVIDE ( Une_pile ) Q := Top ( Une_pile ) ; SI FG ( Q ) = P
AFF_FG ( Q , N ) SINON
AFF_FD ( Q , N ) FSI
FSI ; Rotg := N FIN
FONCTION Rotd ( P ) : ARB SOIT
P , N , Q DES ARB ;
DEBUT
N := FG ( P ) ;
AFF_FG ( P , FD ( N ) ) ; AFF_FD ( N , P ) ;
SI NON PILEVIDE ( Une_pile ) Q := Top ( Une_pile ) ; SI FG ( Q ) = P
AFF_FG ( Q , N )
SINON
AFF_FD ( Q , N ) FSI
FSI ; Rotd := N ;
FIN Exercice 2
(a) Fichier LOVC
Soit F UN FICHIER DE typeblocD ENTETE typeblocE TypeblocD = structure
Tab : Tableau[1..B] de caractère Suiv : Entier
fin
DEBUT Lire (N, D)
LIREDIR ( F , Buf , N )
Longueur := Buf.Tab[D] + Buf.Tab[D+1]
Long := Convert ( Longueur) Article := '' ;
SI Long <= B - D + 1
POUR I := D + 2 , D + Long - 2 Article := Article + Buf.Tab[I]
FPOUR SINON
POUR I := D + 2 , B
Article := Article + Buf.Tab[I]
FPOUR ;
LIREDIR ( F , Buf , Buf.Suiv ) POUR I := 1 , B - ( D + Long - 2 ) Article := Article + Buf.Tab[I]
FPOUR FSI ;
ECRIRE ( Article ) FIN
(b) Fichier TOF
Soit F UN FICHIER DE typeblocD ENTETE typeblocE TypeblocD = structure
Tab : Tableau[1..B] de caractère Suiv : Entier
fin
// Charger les blocs I, I+1 et I+2 dans un tableau (Table) J := 0 ;
Pour K :=I, I+2
LIREDIR ( F , Buf , K ) ; Pour M :=1, Buf.Nb
J := J+1 ;
Table[J] := Buf.Tab[M]
Fpour Fpour
Quot := J/3 ; Reste := Mod(J, 3) // Ecriture premier bloc M := 0 :
Pour K :=1, Quot M := M + 1 ;
Buf.Tab[M] := Table[K]
Fpour
Si (Reste= 1) ou (Reste = 2) M := M + 1 ;
Buf.Tab[M] := Table[Quot+1]
Fsi
Buf.Nb := M Ecriredir(F, Buf, I) // Ecriture deuxième bloc N := 0
Pour K :=M+1, M+1+ Quot - 1 N := N + 1
Buf.Tab[N] := Table[K]
Fpour
Si (Reste = 2) N := N + 1
Buf.Tab[N] := Table[M+1+ Quot – 1 + 1] // OU Table[K]
Fsi
Buf.Nb := N
Ecriredir(F, Buf, I+1) // Ecriture troisième bloc M := 0
Pour K :=N+1, J M := M + 1
Buf.Tab[M] := Table[K]
Fpour
Buf.Nb := M
Ecriredir(F, Buf, I+1)