Ordre dans chaine de caractere [Résolu]

Messages postés
16
Date d'inscription
mardi 24 février 2009
Dernière intervention
21 décembre 2009
- - Dernière réponse : RougailSaucisse
Messages postés
118
Date d'inscription
lundi 16 février 2009
Dernière intervention
6 décembre 2010
- 27 févr. 2009 à 11:19
J'aimerai ecrire la fonction booléenne estCache(e : mot, code)
qui renvoie vrai si toutes les lettres du mot apparaissent dans le bon ordre à l'intérieur du code.
Exemples : estCache("demain", "abadabacemopaladin") ) vrai
estCache ("demain", "abadabacmopaladin") ) faux


ma methode est imcomplète pour l'instant


dans l'idée je compare les deux chaines avec une boucle
si égale alors l'ordre est respecté
si pas égale alors pas d'ordre (mais faut il continuer dans la boucle ?)


j'aimerai utiliser length et compareTo


vous avez une idée ?
Afficher la suite 

Votre réponse

16 réponses

Meilleure réponse
Messages postés
118
Date d'inscription
lundi 16 février 2009
Dernière intervention
6 décembre 2010
3
Merci
bon comme l'a dit sharpMao ici c'est l'algo qui importe et pas le langage. Tu devrais poser la question si tu avais un probleme avec le langage plutot (genre tu proposes l'algo et on t'aiderait a traduire en c#).
Enfin bon si vraiment tu ne comprends, je propose une solution qui devrait fonctionner. ce n'est guère la plus simple (je pense que lyle a en tête d'autres choses bcp plus simple mais bon c'est une solution malgré tout):

Appel de la fonction:

bool test = EstCache("EddMddedLdddIdNdEd", "emeline");
if (test)
  MessageBox.Show("L'ordre est respecté");
else
  MessageBox.Show("L'ordre n'est pas respecté");

Fonction :

private bool EstCache(string toParse, string mot)
{
    //pour ne pas prendre en compte la casse
    toParse = toParse.ToLowerInvariant();
    mot = mot.ToLowerInvariant();

    bool ordre = true;

    //le caractere que l'on doit rencontrer pour respecter l'ordre
    char doitRencontrer = mot[0];

    for (int j = 0; j < toParse.Length; j++ )
    {
        //si le caractere est différent de celui que l'on doit rencontrer
        if (toParse[j] != doitRencontrer)
        {
            //et si le caractere fait parti du mot
            if (mot.Contains(toParse[j]))
            {
                //alors l'ordre n'a pas été respecté
                ordre = false;
                break;
            }
        }
        else
        {
            //si le caractere est égal a celui que l'on doit rencontrer alors
           //on recupere le caractere suivant (j'ai utilisé substring ici juste pour ne pas utiliser un autre variable i qui serait un compteur que j'incrementerai pour passer au caractere suivant
            if (mot.Length > 1)
            {
                mot = mot.Substring(1);
                doitRencontrer = mot[0];
            }
        }
    }

    return ordre;
}

Merci RougailSaucisse 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de RougailSaucisse
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
3
Merci
Voici donc ma contribution:

private
static
bool AllContainedInOrder(
string w1,
string w2)
{
  
if (!
String.IsNullOrEmpty(w1))
   {

      int indexOf = -1;
     
if ((indexOf = w2.IndexOf(w1[0])) > -1)
      {
        
return AllContainedInOrder(w1.Substring(1), w2.Substring(indexOf));
      }
     
else
return
false;
   }
  
return
true;
}

Console
.WriteLine(AllContainedInOrder(
"demain",
"abadabacemopaladin"));

Console.WriteLine(AllContainedInOrder(
"demain",
"abadabacmopaladin"));

<hr />
-Blog-
-Site Perso-

Merci cs_Bidou 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de cs_Bidou
Messages postés
240
Date d'inscription
jeudi 1 mai 2008
Dernière intervention
19 juillet 2012
0
Merci
Bonjour,

Une question :
Si tu recherche MAIN sur  une chaine " AtMtuANjIhyN "
Quel devrais être le résultat ?
Commenter la réponse de Lyle56
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
0
Merci
public





class





Program


{
  


public





static





void

Main(


string

[] args)
   {
     


Console

.WriteLine(AllContained(


"demain"

,


"abadabacemopaladin"

));
     


Console

.WriteLine(AllContained(


"demain"

,


"abadabacmopaladin"

));
   }

  


private





static





bool

AllContained(


string

w1,


string

w2)
  {
     


return

w1.ToCharArray().All(c => w2.Contains(c));
  }
}




<hr />
-Blog-
-Site Perso-
Commenter la réponse de cs_Bidou
Messages postés
1025
Date d'inscription
mardi 4 février 2003
Dernière intervention
7 juin 2010
0
Merci
Hello,

Désolé Bidou, mais avec ça, tu ne garantis pas l'ordre.

Quant à la réponse à ce problème, ça me gêne toujours un peu de donner une réponse à ce qui est probablement un problème d'école, et donc qui a pour but de faire réfléchir.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Commenter la réponse de SharpMao
Messages postés
16
Date d'inscription
mardi 24 février 2009
Dernière intervention
21 décembre 2009
0
Merci
lyle..je ne comprend pas ta question
bidou, ce n'est pas l'objet du programme car il faut laisser saisir l'utilisateur et retourner une reponse en fonction des saisies

sharpM ..je ne demande pas forcement le programme mais au moins l'algo.
c'est un univers nouveau pour moi
Commenter la réponse de francouas
Messages postés
1025
Date d'inscription
mardi 4 février 2003
Dernière intervention
7 juin 2010
0
Merci
Mais c'est justement de trouver l'algo le but de l'exercice.
Si on te le donne, tu n'auras pas appris grand chose.

Apprendre la programmation, et l'algorithmique, c'est apprendre une manière de penser, et c'est pas sur des forum que tu vas la trouver.
C'est justement en commençant par ce genre de petit exercice que tu deviendras un bon développeur.

Donc en gros, il faut d'abord apprendre à marcher avant de courir.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Commenter la réponse de SharpMao
Messages postés
240
Date d'inscription
jeudi 1 mai 2008
Dernière intervention
19 juillet 2012
0
Merci
Francouas :

Ton algorithme ne serra pas le même dans le cas ou tu exclus la possibilité qu'une des lettres du mot soit présente avant que son occurrences apparaisse dans ton mot.
Commenter la réponse de Lyle56
Messages postés
16
Date d'inscription
mardi 24 février 2009
Dernière intervention
21 décembre 2009
0
Merci
je ne veux rien exclure.
tu veux dire que je ne peux pas tester lettre par lettre et verifier la condition ?
je m'y perd :-(
Commenter la réponse de francouas
Messages postés
240
Date d'inscription
jeudi 1 mai 2008
Dernière intervention
19 juillet 2012
0
Merci
Tu est sur la bonne voie ;)

Une boucle
2 Tableaux avec 1 pointeur chaqu'un
1 avance tout le temps.
L'autre chaque fois que la lettre sur les deux pointeurs sont identiques ...

Il y as d'autres solutions... de tête j'en vois au moins 2 de plus...
Commenter la réponse de Lyle56
Messages postés
16
Date d'inscription
mardi 24 février 2009
Dernière intervention
21 décembre 2009
0
Merci
oups..pas vu encore les tableaux
pointeurs connais pas non plus

boucle ok
fonction length, compareTo aussi
forcement ce petit programme est sera limité dans sa difficulté.

je ne sais pas comment sortir de la boucle en fait
Commenter la réponse de francouas
Messages postés
240
Date d'inscription
jeudi 1 mai 2008
Dernière intervention
19 juillet 2012
0
Merci
Il y as une solution sans tableau et avec seulement les fonctions de bases des strings mais c'est un peut plus compliqué ... et c'est toujours dans une boucle ;)
Commenter la réponse de Lyle56
Messages postés
16
Date d'inscription
mardi 24 février 2009
Dernière intervention
21 décembre 2009
0
Merci
je sèche la..
Commenter la réponse de francouas
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
0
Merci
SharpMao> Oups, j'avais pas lu qu'il fallait conserver l'ordre, mes excuses donc...

<hr />
-Blog-
-Site Perso-
Commenter la réponse de cs_Bidou
Messages postés
16
Date d'inscription
mardi 24 février 2009
Dernière intervention
21 décembre 2009
0
Merci
merci Rougail
je prend note de ta version même si je n'ai pas encore vu toutes les commandes que tu proposes (comme le break par ex)
j'ai eu une correction hier ..si ca vous interesse je la met en ligne
merci en tout cas pour votre disponibilité a tous
Commenter la réponse de francouas
Messages postés
118
Date d'inscription
lundi 16 février 2009
Dernière intervention
6 décembre 2010
0
Merci
Nan il semblerait que je n'ai pas compris la consigne non plus en fait ^^ (ma faute j'ai mal regardé l'exemple du début).
Ainsi EstCache("demain", "abadabacemopaladin") renverra faux alors que selon ton exo elle devrait renvoyer vrai.
Je pensais qu'il fallait absolument rencontrer les caracteres dans l'ordre, a savoir que si on rencontrait un "a" (caractere présent dans le mot) avant le "d" alors cela renverrait faux.

Désolé pour le misunderstanding! donc valide plutot la solution de bidou et annuler la mienne ^^
Commenter la réponse de RougailSaucisse

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.