コード例 #1
0
        /// <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();
        }
コード例 #2
0
        /// <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;
        }