IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Caml Discussion :

[Débutante]Fonction qui découpe un "string" et le met dans une liste


Sujet :

Caml

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 10
    Points : 8
    Points
    8
    Par défaut [Débutante]Fonction qui découpe un "string" et le met dans une liste
    bonjours,
    je cherche à définir une fonction qui découpe un "string" en prenant comme separateur ',' (tout d'abord on doit vérifier pour les parenthèses, parcequ'on ne concidère pas les virgules qui suivent les parenthèses ouvertes, mais seulement celles qui sont aprés les parenthèses fermantes )
    exemple:
    "ent(maj,min),ent2,ent3(maj)"
    on aura dans la nouvelle liste : [ent(maj,min); ent2; ent3(maj)]

    voila ce que j'ai essayé de faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    let rec decouper m  = let r=ref(0) in( for i=0 to ((String.length m)-1) do match (String.get m i) with
    								  | '(' -> r:= !r+1 ;
    								  |')'->  r:= !r-1 ;
    								  |','->  begin match !r with
    								      | 0 ->  (String.sub m 0 (i-1)):: ( decouper (String.sub m (i+1) ((String.length m)-i-1)))
    								    end
    				       done);;
    Est ce que vous avez des idées, je suis prenante

  2. #2
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Méthode naïve : tu parcours la string et tu tiens à jour le nombre de parenthèses ouvertes en cours (int ref initialisé à 0, incr pour chaque '(' et decr pour chaque ')'). Lorsque le caractère actuel est une virgule et que le compteur est à zéro, tu ajoutes le début de ta string à ta liste résultat.

    Le mieux ici est d'utiliser une fonction terminale récursive qui construit la liste résultat au fur et à mesure. Je vois quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    decoupe_chaine chaine index parentheses resultat : string -> int -> int -> string list
    -- Yankel Scialom

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    au fait, c'est la première méthode que j'ai essayé de faire, mais je bloque puisque quand je compile j'ai des erreurs de type!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Warning P: this pattern-matching is not exhaustive.
    Here is an example of a value that is not matched:
    1
    Characters 175-302:
      ..............begin match !r with
      					 | 0 ->  (String.sub m 0 (i-1)):: ( decouper (String.sub m (i+1) ((String.length m)-i-1)))
      					   end
    This expression has type string list but is here used with type unit

  4. #4
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Je verrai plutôt quelque chose comme (je sais pas pourquoi j'ai parlé d'int ref ... je suis fatigué)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    let decoupe_chaine s =
       let rec decoupe_chaine_aux chaine index parentheses resultat =
          if (String.length chaine) <= index
          then chaine::resultat
          else match (String.get chaine index, parentheses) with
             | ('(',_) -> decoupe_chaine_aux chaine (succ index) (succ parentheses) resultat
             | (')',_) -> decoupe_chaine_aux chaine (succ index) (pred parentheses) resultat
             | (',',0) -> decoupe_chaine_aux (String.sub chaine (succ index) (String.length chaine - index - 1)) 0 0 ((String.sub chaine 0 index)::resultat)
             | _       ->  decoupe_chaine_aux chaine (succ index) parentheses resultat
       in
       decoupe_chaine_aux s 0 0 []
    À tester.
    -- Yankel Scialom

  5. #5
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Bonsoir,

    Ou bien quelque chose comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    let decoupe str =
      let buf = Buffer.create 16 in
      let rec loop acc state i =
        match try Some str.[i]  with _ -> None with
        | None -> List.rev (Buffer.contents buf :: acc)
        | Some '(' -> Buffer.add_char buf '(';
          loop acc (state + 1) (i + 1)
        | Some ')' -> Buffer.add_char buf ')';
          loop acc (state - 1) (i + 1)
        | Some ',' when state = 0 -> let elt = Buffer.contents buf in
          Buffer.clear buf;
          loop (elt :: acc) 0 (i + 1)
        | Some chr -> Buffer.add_char buf chr;
          loop acc state (i + 1)
      in loop [] 0 0
    C'est une idée comme une autre, je ne dis pas que c'est la meilleure solution. La fonction parcourt la chaîne str en comptant les parenthèses ouvrantes et fermantes (argument state). Quand elle rencontre une virgule, elle ajoute le mot à la liste si l'état est à 0. Quand toute la liste est parcourue, l'appel de str.[String.length str] renvoie une erreur qui est rattrapée et convertie en None (le cas d'arrêt). La fonction est tail-rec.

    Cordialement,
    Cacophrène

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/04/2014, 21h26
  2. Réponses: 10
    Dernier message: 26/04/2008, 13h14
  3. Réponses: 31
    Dernier message: 25/10/2005, 18h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo