Scheme - Traitement chaîne caractères - Langages fonctionnels - Programmation
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.
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
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 :
|
Il y a trois cas à considérer, à énumérer avec un cond.
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.
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 :
|
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.
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
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 !!!
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 ).
Marsh Posté le 12-04-2011 à 15:11:03
Trap D a écrit :
La concaténation se fait par le renvoi de extraire-prem-ligne.
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)))))
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" )