Discussion:
algo pour lecture de palindrome cette fois... desespéré (à chaque fois, vous me direz...)
(trop ancien pour répondre)
Mehdi Saada
2017-12-07 15:43:22 UTC
Permalink
Je galère vraiment à tenter les exo seul, même avec les corrections. De fait, si je ne comprend pas où se trouvent les différences d'avec le corrigé, ça ne rime à rien.
Ici, j'ai un bout de programme qui:
ouvre un fichier texte, la lit dans un UNBOUNDED_STRING phrase par phrase, stocke la même chaîne filtrée (ne garde que les lettres, une fois accentuées et mises en petit) dans une autre chaine et dans une pile, caracère par caractère, puis compare les 2 pour savoir si c'est ou non un palindrome. J'y arrive pas seul, vous pourez sûrement m'aiguiller un peu...
Ceci:

Fich_In : File_Type;
Ligne : Unbounded_String; -- pour lire la phrase
Chaine : Unbounded_String; -- pour stocker la phrase filtrée
La_Pile : T_Pile (100); -- pour stocker aussi la phrase filtrée
PALINDROME : BOOLEAN := TRUE;
COMPARE: CHARACTER;
while not End_Of_File (Fich_In) loop
Ligne := Get_Line(Fich_In); -- lire une ligne
TRANSLATE(LIGNE, BASIC_MAP);
TRANSLATE(LIGNE, LOWER_CASE_MAP);
for Ind in 1..Length(Ligne) loop
if IS_BASIC(ELEMENT(LIGNE,IND)) then
APPEND(CHAINE, ELEMENT(LIGNE,IND));
EMPILER(LA_PILE, ELEMENT(LIGNE,IND));
end if;
end loop;
for IND in 1..LENGTH(CHAINE)/2 loop
DEPILER(LA_PILE, COMPARE);
if COMPARE /= ELEMENT(CHAINE,IND) then PALINDROME := FALSE; end if;
end loop;
PUT(HAUT_PILE(LA_PILE));
if PALINDROME then PUT_LINE('"' & LIGNE & '"' & " est un palindrome."); end if;
VIDER_PILE(LA_PILE);
end loop;

donne ce message d'erreur:
sraised TS_PILE.P_PILE.EXC_PILE_VIDE : D�piler

tandis que le fichier pile.in contient :

"Votre entête ici (ce ne sera pas un palindrome !)
Tu l'as trop écrasé, César, ce port salut.
Je suis en train de faire des tests
Noël à Lyon.
, ?? .

Laval"

Voilà... j'en ai passé du temps avant de me résoudre à demander ici, croyez-moi.
Niklas Holsti
2017-12-07 18:18:23 UTC
Permalink
Post by Mehdi Saada
Je galère vraiment à tenter les exo seul, même avec les corrections. De fait, si je ne comprend pas où se trouvent les différences d'avec le corrigé, ça ne rime à rien.
ouvre un fichier texte, la lit dans un UNBOUNDED_STRING phrase par phrase, stocke la même chaîne filtrée (ne garde que les lettres, une fois accentuées et mises en petit) dans une autre chaine et dans une pile, caracère par caractère, puis compare les 2 pour savoir si c'est ou non un palindrome. J'y arrive pas seul, vous pourez sûrement m'aiguiller un peu...
Fich_In : File_Type;
Ligne : Unbounded_String; -- pour lire la phrase
Chaine : Unbounded_String; -- pour stocker la phrase filtrée
La_Pile : T_Pile (100); -- pour stocker aussi la phrase filtrée
PALINDROME : BOOLEAN := TRUE;
COMPARE: CHARACTER;
while not End_Of_File (Fich_In) loop
Ligne := Get_Line(Fich_In); -- lire une ligne
TRANSLATE(LIGNE, BASIC_MAP);
TRANSLATE(LIGNE, LOWER_CASE_MAP);
Ajoute ici:

CHAINE := Null_Unbounded_String;

pour éviter l'accumulation des lignes successives en CHAINE.
Post by Mehdi Saada
for Ind in 1..Length(Ligne) loop
if IS_BASIC(ELEMENT(LIGNE,IND)) then
APPEND(CHAINE, ELEMENT(LIGNE,IND));
EMPILER(LA_PILE, ELEMENT(LIGNE,IND));
end if;
end loop;
for IND in 1..LENGTH(CHAINE)/2 loop
DEPILER(LA_PILE, COMPARE);
if COMPARE /= ELEMENT(CHAINE,IND) then PALINDROME := FALSE; end if;
end loop;
PUT(HAUT_PILE(LA_PILE));
if PALINDROME then PUT_LINE('"' & LIGNE & '"' & " est un palindrome."); end if;
VIDER_PILE(LA_PILE);
end loop;
sraised TS_PILE.P_PILE.EXC_PILE_VIDE : D�piler
"Votre entête ici (ce ne sera pas un palindrome !)
Tu l'as trop écrasé, César, ce port salut.
Je suis en train de faire des tests
Noël à Lyon.
, ?? .
Laval"
Voilà... j'en ai passé du temps avant de me résoudre à demander ici, croyez-moi.
--
Niklas Holsti
Tidorum Ltd
niklas holsti tidorum fi
. @ .
Mehdi Saada
2017-12-08 14:38:55 UTC
Permalink
Merci. Il me fallait aussi réinitialiser PALINDROME au même endroit.
J'ai vu un drôle de comportement :
exécuter à chaque boucle, " PUT_LINE(LIGNE) " fonctionne bien,
Mais remplacer PUT_LINE par PUT n'affiche que les 5 dernières lettres de chaque ligne lue ?
Et la ligne d'instruction "PUT(LIGNE); PUT_LINE(" a ÉCHOUÉ.");" échoue: LIGNE n'est pas affiché du tout, tandis qu'une ligne avec simplement PUT_LIEN(LIGNE) fonctionne. FLUSH ne change rien, c'est un beau bug de GNAT. Aidez moi à cerner mieux le bug, je n'ai jamais fait ça. Je connais pas assez gnat pour ça.
Mehdi Saada
2017-12-08 20:21:40 UTC
Permalink
-- C'est un beau bug de GNAT --
... ou du terminal, ou du shell, ou de tput, ou de ... la liste est longue, c'est vrai.
Continuer la lecture sur narkive:
Loading...