/// <summary> /// Permet de vérifier que la construction ou la modification ont été correctement exécutées, utile principalement en débug, et pour la démo /// </summary> private void ComparerListeMotsEtDAWG() { //chrono.Restart(); AnnonceEtape("Comparaison entre la liste de mots et le DAWG"); List <string> lesMotsDansLeDawg = RetournerTouslesMots(); List <string> lesMotsEnTropDansleDAwg = lesMotsDansLeDawg.Except(Mots).ToList(); List <string> lesMotsPerdusDansLeDawg = Mots.Except(lesMotsDansLeDawg).ToList(); if (lesMotsPerdusDansLeDawg.Count != 0 || lesMotsEnTropDansleDAwg.Count != 0) { AnnonceEtape("La liste de mots et le DAWG sont différents."); } else { AnnonceEtape("La liste de mots et le DAWG sont identiques"); } //chrono.Stop(); }
/// <summary> /// Ajoute un mot au dictionnaire /// </summary> /// <param name="mot">Mot à ajouté</param> /// <remarks>On vérifie d'abord que le mot n'est pas déjà présent</remarks> public void AjouterUnMot(string mot) { //chrono.Restart(); TravailEnCours = DawgResolver.TravailEnCours.AjoutMot; mot = mot.ToUpper();//au cas ou il soit en minuscule if (!MotAdmis(mot)) { Noeud aRejoinde = DAWG; string suffixe = mot; List <Arc> prefixe = ExtrairePrefixeCommun(mot, DAWG); int longueur = prefixe.Count; if (longueur > 0)//si un suffixe existe, on continue à partir de là { AnnonceEtape(string.Format("Préfixe trouvé \"{0}\".", Arc.RetourneMot(prefixe))); aRejoinde = prefixe.Last().Destination; suffixe = mot.Substring(longueur); } else { AnnonceEtape("Pas de préfixe trouvé");//théoriquement ça n'est pas possible, en effet, il n'existe aucune lettre qui ne commence aucun mot dans le dictionnaire ASCII } List <Arc> arcsSuffixe = new List <Arc>(); //On part du noeud terminal sans enfants et on remonte le graphe pour trouver le suffixe commun Noeud enCours = dawg.Single(n => n.Sortants.Count == 0 && n.IsTerminal); int i; for (i = suffixe.Length - 1; i > -1; i--) { char lettre = suffixe[i]; Arc arc = enCours.Entrants.SingleOrDefault(a => a.Lettre == lettre && !a.Origine.IsTerminal && a.Origine.Sortants.Count == 1); if (arc == null)//il n'y a plus de chemin possible { break; } arcsSuffixe.Insert(0, arc); enCours = arc.Origine; } AnnonceEtape(string.Format("Suffixe trouvé \"{0}\".", Arc.RetourneMot(arcsSuffixe))); JoindreLesChemins(aRejoinde, enCours, suffixe.Take(i + 1).ToArray()); Mots.Add(mot); AnnonceEtape("Ecriture du nouveau fichier DAWG."); Noeud.Serialize(dawg, Mots.Count, "DawgEn2Temps.txt"); AnnonceEtape("Mot ajouté et fichier enregistré."); } else { AnnonceEtape(string.Format("Le mot \"{0}\" existe déja.", mot)); } //chrono.Stop(); //==================Ici l'ajout du mot est fini //Cette étape n'est utile que pour la démo et le débug ComparerListeMotsEtDAWG(); TravailEnCours = DawgResolver.TravailEnCours.Aucun; }