jeanpierre691
Messages postés19Date d'inscriptiondimanche 1 novembre 2009StatutMembreDernière intervention 4 novembre 2009
-
3 nov. 2009 à 15:53
jeanpierre691
Messages postés19Date d'inscriptiondimanche 1 novembre 2009StatutMembreDernière intervention 4 novembre 2009
-
4 nov. 2009 à 05:07
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!!
MasterShadows
Messages postés268Date d'inscriptionlundi 1 mars 2004StatutMembreDernière intervention19 avril 201211 3 nov. 2009 à 18:54
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)
MasterShadows
Messages postés268Date d'inscriptionlundi 1 mars 2004StatutMembreDernière intervention19 avril 201211 3 nov. 2009 à 16:14
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 :
jeanpierre691
Messages postés19Date d'inscriptiondimanche 1 novembre 2009StatutMembreDernière intervention 4 novembre 2009 3 nov. 2009 à 16:23
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!!
Vous n’avez pas trouvé la réponse que vous recherchez ?
MasterShadows
Messages postés268Date d'inscriptionlundi 1 mars 2004StatutMembreDernière intervention19 avril 201211 3 nov. 2009 à 17:08
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
jeanpierre691
Messages postés19Date d'inscriptiondimanche 1 novembre 2009StatutMembreDernière intervention 4 novembre 2009 3 nov. 2009 à 17:53
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!!
jeanpierre691
Messages postés19Date d'inscriptiondimanche 1 novembre 2009StatutMembreDernière intervention 4 novembre 2009 3 nov. 2009 à 18:24
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!!
jeanpierre691
Messages postés19Date d'inscriptiondimanche 1 novembre 2009StatutMembreDernière intervention 4 novembre 2009 3 nov. 2009 à 19:49
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!!
jeanpierre691
Messages postés19Date d'inscriptiondimanche 1 novembre 2009StatutMembreDernière intervention 4 novembre 2009 4 nov. 2009 à 01:31
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!!