Source:Dictionnaire.pb
Vous trouverez les fichiers nécessaires pour le dico à cette adresse.
Ou alors, remplacez le fichier par celui de votre choix.
Le code original et les explications se trouvent ici : Arbres VII-4
N'hésitez pas à proposer d'autres solutions ou à améliorer ce code., ça peut être utile pour des jeux de lettres comme le scrabble, etc.
;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$ = ""

