Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1496 connectés 

  FORUM HardWare.fr
  Programmation
  Langages fonctionnels

  Scheme - Traitement chaîne caractères

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Scheme - Traitement chaîne caractères

n°2068551
debmaths
Posté le 07-04-2011 à 09:30:08  profilanswer
 

Merci pour l'aide déjà apporté. J'ai un nouveau problème que je n'arrive pas à résoudre. Cela fait 5 jours que je suis dessus et pourtant cela devrait être facile, je désespère..
;;; lignes : Paragraphe -> LISTE[Ligne]
;;; (lignes paragraphe) rend la liste des lignes contenues dans
;;; le paragraphe donné
;;; fin de ligne \n, pas la dernière
(define (lignes paragraphe)
  (if (equal? paragraphe "" )
      (list)
      (let ((k (extraire-prem-ligne paragraphe "" )))
      (cons k (lignes (substring paragraphe  (string-length k) (string-length paragraphe)))))))
 
;;; extraire-prem-ligne : Paragraphe * String -> Ligne
;;; (extraire-prem-ligne P acc) rend la première ligne du paragraphe
;;; P, sans le caractère de fin de ligne
(define (extraire-prem-ligne  P acc)
  (if (= (string-length P) 0)  
      acc
      (if (equal? (substring P 0 1) "\n" )
        (extraire-prem-ligne  (substring P 1  (string-length P) ) acc)
        (extraire-prem-ligne (substring P 1 (string-length P)) (string-append acc (substring P 0 1))))))
 
 
 
 (lignes (list "ligne1\nligne2" ))  ; le résultat doit être ( "ligne1" ligne2" )

mood
Publicité
Posté le 07-04-2011 à 09:30:08  profilanswer
 

n°2068912
Trap D
Posté le 08-04-2011 à 16:39:08  profilanswer
 

Le problème est de savoir que lest le type d'argument attendu par lignes est une liste de chaines de caractères ou une seule chaine de caractères.


Message édité par Trap D le 08-04-2011 à 16:42:36
n°2068951
debmaths
Posté le 08-04-2011 à 18:58:10  profilanswer
 

En entrée j'ai une seule chaîne de caractères "ligne1\nligne2\nligne3" et en sortie une liste de chaines de caractères ("ligne1" "ligne2" "ligne3" )
\n sépare chaque chaîne primaire. \n n'est pas en fin de la chaîne en entrée

n°2069010
Trap D
Posté le 08-04-2011 à 22:38:52  profilanswer
 

Cet appel  (lignes (list "ligne1\nligne2" ))  est donc incorrect, il faut faire  (lignes "ligne1\nligne2" )  .
La premiere fonction peut donc s'écrire comme ça :

Code :
  1. (define (lignes paragraphe)
  2.   (extraire-prem-ligne paragraphe "" ))


Il y a trois cas à considérer, à énumérer avec un cond.

  • Le paragraphe est terminé
  • On rencontre le "\n" de fin de ligne
  • Autre cas.


Message édité par Trap D le 08-04-2011 à 22:41:02
n°2069019
debmaths
Posté le 08-04-2011 à 23:40:12  profilanswer
 

(lignes "ligne1\nligne2" )  ; le résultat doit être ( "ligne1" ligne2" )
 
Exact pour la remarque sur la chaîne de caractères. J'ai toujours testé comme ci-dessus mais je ne sais pas pourquoi j'ai mis (list) sur l'exemple que je vous ai envoyé. Je commence à divaguer avec cette toute petite fonction !!!!
 
Pour l'algorithme il me semble ( voir mon code ci-dessus ) que j'essaie de faire ce que vous écrivez mais je me plante constamment.
 

n°2069033
Trap D
Posté le 09-04-2011 à 09:07:15  profilanswer
 

debmaths a écrit :

Pour l'algorithme il me semble ( voir mon code ci-dessus ) que j'essaie de faire ce que vous écrivez mais je me plante constamment.


Non pas tout à fait.

Code :
  1. (if (equal? (substring P 0 1) "\n" )
  2.         (extraire-prem-ligne  (substring P 1  (string-length P) ) acc)

Ici, vous trouvez un '\n' donc vous avez dans acc une ligne complète. et le paragraphe n'est pas terminé.
Vous devez donc renvoyer la concaténation de cette ligne avec l'extraction des lignes du reste du paragraphe.
 

n°2069054
debmaths
Posté le 09-04-2011 à 13:39:13  profilanswer
 

Désolé je ne vous suis pas.
extraire-prem-ligne extrait une ligne et la concaténation se fait (théoriquement ) dans lignes

n°2069059
debmaths
Posté le 09-04-2011 à 14:46:27  profilanswer
 

Je peux me tromper mais mon problème est dans extraire-prem-ligne. Lorsqu'on a "\n" il faut que je réduise le longueur de "paragraphe" dans la fonction lignes de 2 et que je renvoie acc à lignes. Et cela je n'arrive pas à le faire !!!

n°2069068
Trap D
Posté le 09-04-2011 à 17:13:35  profilanswer
 

Citation :

extraire-prem-ligne extrait une ligne et la concaténation se fait (théoriquement ) dans lignes

La concaténation se fait par le renvoi de extraire-prem-ligne.

Citation :

Je peux me tromper mais mon problème est dans extraire-prem-ligne. Lorsqu'on a "\n" il faut que je réduise le longueur de "paragraphe" dans la fonction lignes de 2 et que je renvoie acc à lignes

non, vous sautez simplement le caractère \n, c'est-à-dire que vous continuez l'extraction avec ce qui reste de paragraphe lorsqu'on lui a ôté le caractère '\n'. (Peut-être pensez-vous au fait que la fin de ligne est parfois marquées avec deux caractères CR-LF ?, Scheme s'arrange pour qu'il n'y a pas ce problème, selon l'OS, '\n' correspondra à 1 ou 2 caractères, comme en C  ).

n°2069473
debmaths
Posté le 12-04-2011 à 15:11:03  profilanswer
 

Trap D a écrit :

Citation :

extraire-prem-ligne extrait une ligne et la concaténation se fait (théoriquement ) dans lignes

La concaténation se fait par le renvoi de extraire-prem-ligne.

Citation :

Je peux me tromper mais mon problème est dans extraire-prem-ligne. Lorsqu'on a "\n" il faut que je réduise le longueur de "paragraphe" dans la fonction lignes de 2 et que je renvoie acc à lignes

non, vous sautez simplement le caractère \n, c'est-à-dire que vous continuez l'extraction avec ce qui reste de paragraphe lorsqu'on lui a ôté le caractère '\n'. (Peut-être pensez-vous au fait que la fin de ligne est parfois marquées avec deux caractères CR-LF ?, Scheme s'arrange pour qu'il n'y a pas ce problème, selon l'OS, '\n' correspondra à 1 ou 2 caractères, comme en C  ).


J'ai enfin trouvé, j'étais obnibulé par la fonction "extraire-prem-ligne" je ne pensais pas du tout à modifier la fonction "lignes". Par contre si vous pouviez m'aider pour la création de l'arbre binaire cela me rendrait énormément service. Et pourquoi \n ne compte qu'un caractère ?
Cordialement.
 
;;; lignes : Paragraphe -> LISTE[Ligne]
;;; (lignes paragraphe) rend la liste des lignes contenues dans
;;; le paragraphe donné
;;; fin de ligne \n
(define (lignes paragraphe)
  (if (equal? paragraphe "" )
      (list)
      (let ((k (extraire-prem-ligne  paragraphe "" )))
        (if (string=? (substring paragraphe 0 1) "\n" )
      (lignes (substring paragraphe (+ 1 (string-length k))  (string-length paragraphe)))
      (cons k (lignes (substring paragraphe (string-length k)  (string-length paragraphe))))))))  
 
;;; extraire-prem-ligne : Paragraphe * String -> Ligne
;;; (extraire-prem-ligne P acc) rend la première ligne du paragraphe
;;; P, sans le caractère de fin de ligne
(define (extraire-prem-ligne  P acc)
  (if (or  (= (string-length P) 0) (string=? (substring P 0 1) "\n" ))
      acc
  (extraire-prem-ligne  (substring P 1 (string-length P)) (string-append acc (substring P 0 1)))))


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Langages fonctionnels

  Scheme - Traitement chaîne caractères

 

Sujets relatifs
Traitement de fichiers .xmlTraitement d'une variable tableau
[Resolu] Valider formulaire lorsqu'un champ text a atteind 10 chiffres[C] Traitement d'une trame GPS
Scheme - filterPetit traitement de texte personalisé
[Réglé] Caractères spéciaux BDD vers HTMLAide en Scheme
[RESOLU]Requete sql : comparaison chaine 
Plus de sujets relatifs à : Scheme - Traitement chaîne caractères


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR