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ébutant] Couper une phrase en mots SANS Str. ...


Sujet :

Caml

  1. #1
    Membre régulier
    Homme Profil pro
    Sécurité
    Inscrit en
    Février 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2011
    Messages : 53
    Points : 106
    Points
    106
    Par défaut [Débutant] Couper une phrase en mots SANS Str. ...
    Bonjour/bonsoir à tous,

    J'ai eu un premier problème qui consistait à découper une phrase en mot. Mon séparateur était l'espace, c'est avec la fonction split de la classe Str que j'ai réussi à le faire.

    Oui mais voilà que je ne peux pas me servir de la classe Str ! Seulement de String et List.

    J'ai le sentiment que c'est tout bête comme problème mais je n'arrive pas à m'en sortir...

    Il faut que je dise que tant que "String.get machaine i" n'est pas un espace j'avance dans machaine et que dés que "String.get machaine i" est un espace alors je fais un String.sub de mon début de mot jusqu'à ma position -1 et je stocke le tout dans une liste. Ensuite je me relance en avançant d'une position.

    Je n'arrive pas du tout à coder ce truc qui m'a l'air tout simple. Je ne suis déjà pas un programmeur hors pair mais en OCAML c'est pire que tout je n'arrive pas à m'habituer!

    Merci de me donner un coup de pouce car je perd énormément de temps sur un truc qui est à coup sur un jeu d'enfant...



    Cordialement,

    Graimbault

  2. #2
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Points : 1 412
    Points
    1 412

  3. #3
    Membre régulier
    Homme Profil pro
    Sécurité
    Inscrit en
    Février 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2011
    Messages : 53
    Points : 106
    Points
    106
    Par défaut Changement de problème
    Mon problème vient d'évoluer, je n'ai pas le droit de me servir de la classe Str mais que de String et List.

    Encore merci pour votre aide précédente mais malheureusement maintenant elle ne m'est plus valable...


    Quelqu'un pourrait-il SVP m'aider ?

    Merci d'avance



    Cordialement,

    Graimbault

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 309
    Points : 933
    Points
    933
    Par défaut
    Comment tu ferais à la main ?

    Travaille sur la chaine "Comment tu ferais à la main". Qu'elles sont les étapes élémentaires pour obtenir la liste ["Comment"; "tu"; "ferais"; "à"; "la"; "main"] ? Prends toi un papier à petit carreau, écris une lettre dans chaque case, et en progressant case par case avec un crayon, demande toi comment tu ferais. Une fois que tu auras l'algo, tu te posera les questions d'implémentations (sans doute avec String.sub entre autre)

  5. #5
    Membre régulier
    Homme Profil pro
    Sécurité
    Inscrit en
    Février 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2011
    Messages : 53
    Points : 106
    Points
    106
    Par défaut
    Bonsoir,

    Voici l'algo en pseudo langage:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    chaine := "comment tu ferais à la main?"
    debut := 0
    fin := String.length chaine
     
    POUR i DE 0 A (fin - 1) FAIRE
       SI (String.get chaine i) = ' ' ALORS
          (String.sub chaine debut i)::[]
          debut := i + 1
       FSI
    FPOUR
    Le truc c'est que pour moi la programmation fonctionnelle est un truc nouveau, voilà ce qui me désarme complètement. Je me retrouve sans cesse avec des erreur de type comme quoi ca devrait être de type unit mais ca l'est pas ou autre...

    Y a t'il un problème avec mon algo ?


    Merci pour votre aide



    Cordialement,

    Graimbault

  6. #6
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 352
    Points
    4 352
    Par défaut
    Je pense que ton
    est mal placé.

    Je vois comment le faire avec une approche fonctionnelle sinon, mais je trouve que c'est plus compliqué dans ce cas précis.

  7. #7
    Membre régulier
    Homme Profil pro
    Sécurité
    Inscrit en
    Février 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2011
    Messages : 53
    Points : 106
    Points
    106
    Par défaut
    Là est tout le problème !

    Je n'ai pas du tout l'approche fonctionnelle.

    En cours nous n'avons jamais travaillé sur les chaines, simplement sur des listes d'entiers avec des "match X with..." à foison.

    Voilà pourquoi je suis bloqué comme pas possible sur un problème comme celui-ci...

    Je ne demande pas la réponse, si vous pouviez me passer ne serait-ce que le bon algo fonctionnel se serait déjà BEAUCOUP !!!

    Merci pour votre aide...



    Cordialement,

    Graimbault

  8. #8
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Points : 1 412
    Points
    1 412
    Par défaut
    Pour info, OCaml permet de faire des boucles et de modifier des variables. L'impératif est tout à fait possible. Si un problème est plus simple à résoudre en impératif, ce n'est pas la peine de s'en priver. Faire une boucle ou modifier une variable locale ne pose aucun problème.

    Cela dit, tu as sûrement pour consigne d'éviter les boucles et de faire du fonctionnel pur.

    Pour convertir ton pseudo-code, voici une première aide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    somme := 0
    for i = 0 to 9 do
        somme := somme + i
    renvoie somme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    let rec loop sum i =
        if i <= 9 then
            loop (sum + i) (i + 1)
        else
            sum
     
    loop 0 0

  9. #9
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 352
    Points
    4 352
    Par défaut
    J'en rajoute un peu.
    Tu dois lire ta chaine caractère par caractère, et tu dois trouver combien de traitements différents tu as (selon le caractère lu).

    Là je vois 3 types de traitements différents.

  10. #10
    Membre régulier
    Homme Profil pro
    Sécurité
    Inscrit en
    Février 2011
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2011
    Messages : 53
    Points : 106
    Points
    106
    Par défaut
    Pffiou...

    Problème réglé!

    Mon binôme a "pondu" cette fonction qui fait parfaitement ce qu'on lui demande (à la fonction), voyez-vous d'éventuelles améliorations ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    let decoup text =
    	let rec dec text deb i =
    		if i < String.length text then
    			match text.[i] with
    				| ' ' -> (String.sub text deb (i-deb)) :: (dec text (i+1) (i+1))
    				| _ -> (dec text deb (i+1))
    		else
    			(String.sub text deb (i-deb)) :: []
    	in
     
    	dec text 0 0
    ;;
     
    decoup "bonjour comment vas tu" ;;

    J'indique que le problème est résolu, l'optimisation éventuelle étant juste un petit bonus au cas où l'un de vous repasserai faire un petit tour par ici



    Cordialement,

    Graimbault

  11. #11
    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
    Bonjour,

    Cette fonction est tout à fait convenable. Les modifications qui peuvent y être apportées sont mineures. Par exemple, la variable text n'a pas besoin d'être passée en argument à la fonction auxiliaire dec. De même, cette version de decoup ajoute des mots vides quand il y a des espaces en fin de chaîne (par exemple "trois mots seulement "). Côté syntaxe, certaines parenthèses sont superflues, mais c'est vraiment du détail. Bravo

    Je donne ci-dessous une version légèrement différente (non testée) qui résout le problème des espaces en fin de chaîne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    let decoup text =
      let len = String.length text in
        let rec decoupe mots deb i =
            if i < len then
                match text.[i] with
                | ' ' -> decoupe (ajoute mots deb i) (i + 1) (i + 1) 
              | _ -> decoupe mots deb (i + 1)
            else List.rev (ajoute mots deb i)
      and ajoute mots deb i =
        let mot = String.sub text deb (i - deb) in
        if String.length mot = 0 then mots else mot :: mots 
      in decoupe [] 0 0
    Cordialement,
    Cacophrène

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 50
    Points : 20
    Points
    20
    Par défaut Autre solution
    Pour info voilà ma méthode :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
            ''' <summary>
            ''' Découpe une chaîne trop longue sans couper les mots
            ''' </summary>
            ''' <param name="chaine">Chaîne à couper</param>
            ''' <param name="longueurMax">Longueur max de la chaîne</param>
            ''' <returns>Chaîne découpée</returns>
            ''' <remarks>Attention il faut que la chaîne soit de type phrase avec plusieurs espaces</remarks>
            Public Shared Function raccourcirChaine(ByVal chaine As String, ByVal longueurMax As Integer) As String
                Dim retour As String = chaine
     
                If (chaine.Length > longueurMax) Then
                    Dim chaineTemp As String = ""
                    Dim splitChaine = chaine.Split(" ")
                    Dim i As Integer = 0
                    While chaineTemp.Length + splitChaine(i).Length <= longueurMax
                        chaineTemp = chaineTemp & " " & splitChaine(i).ToString()
                        i = i + 1
                    End While
                    retour = chaineTemp
                End If
     
                Return retour
            End Function
     
        End Class

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XSLT] Comment couper une phrase "proprement"?
    Par manuds dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 20/12/2007, 09h07
  2. Couper une phrase en 2
    Par nico63vb dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 13/02/2007, 17h21
  3. [Tableaux] Comment decouper une phrase en mots?
    Par Alain15 dans le forum Langage
    Réponses: 3
    Dernier message: 26/06/2006, 10h04
  4. Réponses: 2
    Dernier message: 22/04/2006, 18h05
  5. [Tableaux] Découper une phrase en mots
    Par cmoiscrat dans le forum Langage
    Réponses: 5
    Dernier message: 14/02/2006, 13h29

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