Substitution string string dans une phrase [debutant] [Résolu]

Signaler
Messages postés
19
Date d'inscription
dimanche 1 novembre 2009
Statut
Membre
Dernière intervention
4 novembre 2009
-
Messages postés
19
Date d'inscription
dimanche 1 novembre 2009
Statut
Membre
Dernière intervention
4 novembre 2009
-
Salut

Bon voilà, je fais actuellement un projet très simple sur C#, je l'ai commencé il n'y a pas longtemps, et pourtant, je rencontre quelques difficultés.

Voici ce que j'ai fait jusqu'à présent.
        public static void SubstitutionStringParString () {
            string message = "";
            message += "\nSubstitution d'un string x par un string y dans un string p.\n";
            message += "Donner le string p : ";
            Console.Write (message);
            string p = Console.ReadLine();
            Console.Write ("Donner le string x à substituer : ");
            string x = Console.ReadLine();
            Console.Write ("Donner le string y <sa substitution> : ");
            string y = Console.ReadLine();
            Console.WriteLine();
            Console.WriteLine ("Résultats:\n==========");
            Console.WriteLine ("Avant la substitution de x par y dans p on a:");
            Console.WriteLine ("=============================================");
            Console.WriteLine ("x = "{0}"", x);
            Console.WriteLine ("y = "{0}"", y);
            Console.WriteLine ("p = "{0}"", p);
            Console.WriteLine ();
            Console.WriteLine ("Après la substitution de x par y dans p on a:");
            Console.WriteLine ("=============================================");
            string z = p;
            Console.WriteLine ("p = "{0}"", z);
        } // Fin méthode SubstitutionStringParString ()



Rien de mieux que la joie ressentit lors d'une simple et bonne programmation!!
A voir également:

13 réponses

Messages postés
268
Date d'inscription
lundi 1 mars 2004
Statut
Membre
Dernière intervention
19 avril 2012
10
Pour la deuxième c'est normal, cela implique de coder l'algo de boyer moore dans la méthode AllOccurrences...

Pour la 1ère c'est une idée à l'arrache, l'implémentation d'une méthode simple serait de tester une par une les lettres contenues dans P avec celles de X.

Dès que tu trouve dans P la première lettre de X tu testes la suite de P avec celle de X.
Des que tu as vu le motif de X dans P tu sauvegarde la position de X dans P.
Puis grâce à ces positions tu es à même de récupérer ce qui t'interesse de P en y intégrant Y.

Voici l'algo :

static private string Substitute(string phrase, string motifATrouve, string motifDeRemplacement)
        {
            // Contiendra le résultat
            StringBuilder result = new StringBuilder();

            // Liste toutes les positions du motif à trouver dans la phrase
            List positions = new List();

            // Indice de boucle de motifATrouve
            int j = 0;

            // Nouvelle position du pointeur dans phrase
            int newPos = 0;

            if (!phrase.Contains(motifATrouve))
                return phrase;

            for (int i = 0; i < phrase.Length; ++i)
            {
                if (phrase[i] == motifATrouve[0])
                {
                    // Ici on va tester chaque caractère du motif  dans la phrase
                    for (j = 1; j < motifATrouve.Length; ++j)
                    {
                        // Si une lettre est fausse, alors on quitte la boucle
                        if (phrase[i + j] != motifATrouve[j])
                            break;
                    }

                    // Ici on teste si j vaut la longueur du motif à trouver cela nous permet de savoir si le mot est trouvé
                    // si c'est le cas alors on ajoute l'index de début du motif
                    if (j == motifATrouve.Length)
                        positions.Add(i);

                    i += motifATrouve.Length - 1;
                }
            }

            // Maintenant on a toutes nos positions du motif dans la phrase
            // donc on va remplir notre stringbuilder du mot en remplacant le motif par le motif de remplacemen
            for (int i = 0; i < positions.Count; ++i)
            {
                // Prend la position actuelle du motif
                int pos = positions[i];

                // Ajoute toutes les lettres avant celles du motif
                for(j=newPos;j<pos;++j)
                    result.Append(phrase[j]);

                // Ajoute y
                result.Append(motifDeRemplacement);

                // Nouvelle position du curseur
                newPos = positions[i] + motifATrouve.Length;
            }

            // Copie le reste de la phrase si necessaire
            // Pour cela, on prend le dernière indice du motif dans la phrase et on lui ajoute la taille du motif sinon on ne récupère la fin de phrase
            for (int i = positions[positions.Count - 1] + motifATrouve.Length; i < phrase.Length; ++i)
                result.Append(phrase[i]);

            return result.ToString();
        }


Après si tu veux avoir plus simple, garde la méthode Replace... (je ne pense pas qu'on puisse faire plus simple que la méthode présentée au dessus)
Messages postés
268
Date d'inscription
lundi 1 mars 2004
Statut
Membre
Dernière intervention
19 avril 2012
10
Si j'ai bien saisi ta question, il s'agirait de faire ceci :

phrase p = coucou
phrase x = ou
phrase y = on

Ainsi avant substitution, on a: coucou et après concon...

En ce cas, la classe string possède une méthode Replace, qui remplace justement une portion de lettres par une autre portion et qui justement gère pour toi le cas ou le mot source n'existe pas dans la phrase. Il te suffit donc de remplacer ce bout de code :

string z = p;


par

string z = p.Replace(x, y);
Messages postés
268
Date d'inscription
lundi 1 mars 2004
Statut
Membre
Dernière intervention
19 avril 2012
10
Juste pour info, evite les concaténations de string comme ceci :

string a ="";
a+="fjkdjfkdsl";
a+="dlskqmlfk";

c'est mauvais...

Joue plutôt avec string.Format() ou un StringBuilder (inutile pour ton cas mais utile de connaitre)

donc avec le string.Format cela donnerait :

string a = string.Format("\n{0}\n{1}", "Substitution d'un string x par un string y dans un string p.", "Donner le string p : ");

Voili voilou
Messages postés
19
Date d'inscription
dimanche 1 novembre 2009
Statut
Membre
Dernière intervention
4 novembre 2009

Ouais j'avais déjà pensé à cette réponse. Je l'ai fait et ça marche pour moi. Mais imaginons juste un instant que je ne puisse utiliser la méthode Replace de la classe string. Que me conseillerais tu de faire? C'est justement pour cette raison que mon problème devient plus compliqué que ce qu'il en a l'air.

Merci pour le tips avec string.Format, je remplacerais mon string message = ""; par string.Format().


Rien de mieux que la joie ressentit lors d'une simple et bonne programmation!!
Messages postés
268
Date d'inscription
lundi 1 mars 2004
Statut
Membre
Dernière intervention
19 avril 2012
10
Salut, alors en soit tu voudrais reprogrammer la fonction Replace de l'objet string.
Alors pour cela, il faut :

- regarder si x est contenu dans p (if p.Contains(x))
- créer un tableau de string qui contient toutes les mots exepté x (string[] k = p.Split(x))
- puis ajouter ajouter y entre chaque string

(StringBuilder b=new StringBuilder();
foreach(string s in k)
{
b.Append(s);
b.Append(y);
})

Maintenant une meilleure manière de faire serait d'utiliser l'algorithme de boyer moore pour récupérer toutes les occurrences de X dans P.

Puis de faire quelque chose comme ceci :

int[] occurrences = AllOccurrences(p, x);
StringBuilder b=new StringBuilder();
int lastPos = 0;

// Pour chaque occurrence
foreach(int i in occurrences)
{
  // Ajouter au string builder le morceau de phrase en partant de la place
  // de la dernière occurrence jusqu'à l'occurrence actuelle
  b.Append(p.Substring(lastPos, i));

  // Ajouter la phrase de substitution
  b.Append(y);

  // Calculer la dernière position de l'ocurrence
  lastPos = i + x.Length; 
}

return b.ToString();


Et ainsi tu auras quelque part réécrit la méthode Replace de la classe string
Messages postés
19
Date d'inscription
dimanche 1 novembre 2009
Statut
Membre
Dernière intervention
4 novembre 2009

wow lol!! T'a oublier que je suis débutant en C#. Je suis aller faire une petite recherche sur algorithme de boyer moore et franchement c'est pas un truc facile a comprendre. Ben je sais pas si tu n'aurais pas une méthode bien plus facile pour le faire. J'ai essayer les deux soluces que tu m'as donné sans succès. Pour la première j'obtiens un erreur, et pour la deuxième, plusieurs!!!


Rien de mieux que la joie ressentit lors d'une simple et bonne programmation!!
Messages postés
19
Date d'inscription
dimanche 1 novembre 2009
Statut
Membre
Dernière intervention
4 novembre 2009

hmm je viens de créer un autre forum pour un autre programme C# que j'ai commencé il y a deux jour (j'ai en tête plein de projet que j'aimerais faire pour me familiariser avec C#). Ce programme fonctionne très bien et il n'y a dessus aucune erreur. c'est juste ma méthode qui laisse un peu a désirer. Si vous pourriez aller y jeter un coup d'œil, ça m'aiderais énormément.Voici le lien.

Pour le string, je verrais si je peux régler l'erreur, qui se trouve en fait a la ligne suivante : string[] k = p.Split(x)
Il me dit que l'instruction incorporée ne peut pas être une déclaration ni une instruction étiquetée.


Rien de mieux que la joie ressentit lors d'une simple et bonne programmation!!
Messages postés
19
Date d'inscription
dimanche 1 novembre 2009
Statut
Membre
Dernière intervention
4 novembre 2009

Salut.

Il est raffiné ton affaire, mais j'obtiens 4 erreurs minime que je pense tu pourras m'expliquer en deux trois mouvements.

substitution2.cs(8,5): error CS0246: Le type ou le nom d'espace de noms 'StringBuilder' est introuvable (une directive using ou une r‚f‚rence d'assembly est-elle manquanteÿ?)
substitution2.cs(8,32): error CS0246: Le type ou le nom d'espace de noms 'StringBuilder' est introuvable (une directive using ou une r‚f‚rence d'assembly est-elle manquanteÿ?)
substitution2.cs(11,5): error CS0246: Le type ou le nom d'espace de noms 'List' est introuvable (une directive using ou une r‚f‚rence d'assembly est-elle manquanteÿ?)
substitution2.cs(11,31): error CS0246: Le type ou le nom d'espace de noms 'List' est introuvable (une directive using ou une r‚f‚rence d'assembly est-elle manquanteÿ?)



Rien de mieux que la joie ressentit lors d'une simple et bonne programmation!!
Messages postés
268
Date d'inscription
lundi 1 mars 2004
Statut
Membre
Dernière intervention
19 avril 2012
10
en fait c"est parce qu'il faut que tu ajoute ces espaces de noms dans le programme :

using System.Text; // pour le stringbuilder
using System.Collections.Generic; // pour la liste

et boum ça roule...
Messages postés
19
Date d'inscription
dimanche 1 novembre 2009
Statut
Membre
Dernière intervention
4 novembre 2009

Merci...

Sujet Clos. Tout Marche a merveille.


Rien de mieux que la joie ressentit lors d'une simple et bonne programmation!!
Messages postés
19
Date d'inscription
dimanche 1 novembre 2009
Statut
Membre
Dernière intervention
4 novembre 2009

Sinon, peux tu m'aider pour le poste (le lien) que j'ai mis avant la réponse qui a été accepté?


Rien de mieux que la joie ressentit lors d'une simple et bonne programmation!!
Messages postés
19
Date d'inscription
dimanche 1 novembre 2009
Statut
Membre
Dernière intervention
4 novembre 2009

EDIT : Si on rentre la phrase suivante :
- Je mange et je mange
Et qu'on veux remplacer "mange" par "dort" afin d'obtenir :
- Je dors et je dors
Ben ça ne marche pas. Il ne me donne pas la phrase final, c'est a dire la phrase écrite ci dessus dans le cas de mon exemple.

Est-ce normal?


Rien de mieux que la joie ressentit lors d'une simple et bonne programmation!!
Messages postés
19
Date d'inscription
dimanche 1 novembre 2009
Statut
Membre
Dernière intervention
4 novembre 2009

EDIT :

Comme je l'ai dit avant, tout marche a merveille merci. J'avais juste oublier de demander a l'ordinateur d'écrire le string final de sortie.

Encore merci MasterShadows!


Rien de mieux que la joie ressentit lors d'une simple et bonne programmation!!