Scheme - Traitement chaîne caractères

Scheme - Traitement chaîne caractères - Langages fonctionnels - Programmation

Marsh Posté le 07-04-2011 à 09:30:08    

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" )

Reply

Marsh Posté le 07-04-2011 à 09:30:08   

Reply

Marsh Posté le 08-04-2011 à 16:39:08    

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
Reply

Marsh Posté le 08-04-2011 à 18:58:10    

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

Reply

Marsh Posté le 08-04-2011 à 22:38:52    

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
Reply

Marsh Posté le 08-04-2011 à 23:40:12    

(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.
 

Reply

Marsh Posté le 09-04-2011 à 09:07:15    

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.
 

Reply

Marsh Posté le 09-04-2011 à 13:39:13    

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

Reply

Marsh Posté le 09-04-2011 à 14:46:27    

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 !!!

Reply

Marsh Posté le 09-04-2011 à 17:13:35    

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  ).

Reply

Marsh Posté le 12-04-2011 à 15:11:03    

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)))))

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed