http://www.bellamyjc.net/download/dicofr.zip
ou alors , remplacez le fichier par celui de votre choix.
Le code original et les explications se trouvent ici :
http://www.chambily.com/recursivite/ Arbres VII-4
N'hésitez pas à m'indiquer les améliorations possibles .
Code : Tout sélectionner
;Comtois 23/01/05
;Codage d'un dictionnaire
Declare CreateNoeud()
Structure Noeud
lettre.s ; lettre contenue dans ce noeud de l'arbre
entier.b ; flag indiquant si le mot est entier
*Fils.Noeud[26]
EndStructure
;initialise l'arbre
Global *Tete.Noeud
*Tete=CreateNoeud()
;-Procedures
Procedure CreateNoeud()
*Noeud.Noeud=AllocateMemory(SizeOf(Noeud))
If *Noeud
For c=0 To 25
*Noeud\Fils[c]=#Null
Next c
*Noeud\lettre=""
*Noeud\entier=#False
Else
MessageRequester("Erreur","Impossible d'allouer de la mémoire !",0)
End
EndIf
ProcedureReturn *Noeud
EndProcedure
Procedure rajouter_mot(*courant.Noeud,LeMot.s)
If LeMot=""
*courant\entier=#True
ProcedureReturn
EndIf
car.s=Left(LeMot,1)
lettre=Asc(car)-'A'
If *courant\Fils[lettre]<>#Null ; si la lettre existe déjà
*courant=*courant\Fils[lettre] ; alors On se positionne sur la lettre suivante
Else ; sinon il faut créer cette lettre dans l'arbre
*courant\Fils[lettre]=CreateNoeud()
*courant=*courant\Fils[lettre]
*courant\lettre=car
*courant\entier=#False
EndIf
LeMot=Mid(LeMot, 2, Len(LeMot)-1); on efface la lettre du mot puisqu'elle est déjà dans l'arbre
rajouter_mot(*courant,LeMot); et on rajoute le reste
EndProcedure
Procedure Affiche(*courant.Noeud,s.s);
If *courant\entier : Debug s : EndIf
For i= 0 To 25
If *courant\Fils[i]<>#Null
*aux.Noeud=*courant
*courant=*courant\Fils[i]
Affiche(*courant,s+Chr(i+'A'))
*courant=*aux
EndIf
Next i
EndProcedure
Procedure trouve(*courant.Noeud,LeMot.s,OK.l)
If LeMot="" And OK
trouve=#True
Else
car.s=Left(LeMot,1)
lettre=Asc(car)-'A'
LeMot=Mid(LeMot,2,Len(LeMot)-1)
If lettre<0 Or lettre>25 Or *courant\Fils[lettre]=#Null
trouve=#False
Else
*courant=*courant\Fils[lettre]
trouve=trouve(*courant,LeMot,*courant\entier)
EndIf
EndIf
ProcedureReturn trouve
EndProcedure
Procedure.s EpureMot(Mot.s)
Mot=UCase(Trim(Mot))
MotAux.s=""
car.s=""
For i=1 To Len(Mot)
car=Mid(Mot,i,1)
If car="Â" Or car="Ä" Or car="À" Or car="Á"
car ="A"
ElseIf car="Ç"
car="C"
ElseIf car="È" Or car="É" Or car="Ê" Or car="Ë" Or car="Œ"
car="E"
ElseIf car="Î" Or car="Ï" Or car="Ì"
car="I"
ElseIf car="Ô" Or car="Ö"
car="O"
ElseIf car="Ù" Or car="Û" Or car="Ü" Or car="Ú"
car="U"
EndIf
MotAux=MotAux+car
Next i
; suppression des blancs et des tirets et autres trucs qui n'existent pas dans le jeu
Mot=MotAux : MotAux=""
For i=1 To Len(Mot)
car=Mid(Mot,i,1)
If (car <> " ") And (car <> "-") And (car <> "'")
MotAux=MotAux+car
EndIf
Next i
ProcedureReturn MotAux
EndProcedure
Procedure charger(Fichier$)
If OpenFile(0,Fichier$)
While Eof(0)=0
Mot.s=EpureMot(ReadString())
rajouter_mot(*Tete,Mot) ; et on rajoute le mot
Wend
CloseFile(0)
Else
MessageRequester("Erreur","Impossible d'ouvrir le fichier " + Fichier$,0)
EndIf
EndProcedure
;-Charge le dico en mémoire
;Fichier$="dicofr\dicofr.txt" << C'est le dico une fois épuré , ça m'évite de l'épurer à chaque chargement
For i=0 To 25
Fichier$="dicofr\"+Chr(i+'A')+".txt"
charger(Fichier$)
Next i
charger(Fichier$)
;-Valide cette ligne si tu veux afficher le résultat
;Affiche(*Tete,"")
;-et maintenant quelques tests
Repeat
Test$=EpureMot(InputRequester("Test Dictionnaire","Indiquez un mot ",""))
If Test$<>""
If trouve(*Tete,Test$,0)
Rep$="Le mot " + Test$ + " se trouve dans le dictionnaire"
Else
Rep$="Le mot " + Test$ + " ne se trouve pas dans le dictionnaire"
EndIf
MessageRequester("Test Dictionnaire",Rep$,0)
EndIf
Until Test$=""