[Pascal] Palindrome

Résolu/Fermé
nadal1991 Messages postés 268 Date d'inscription mercredi 5 septembre 2007 Statut Membre Dernière intervention 2 octobre 2011 - 20 août 2008 à 11:00
Uly410 Messages postés 319 Date d'inscription mercredi 14 janvier 2015 Statut Membre Dernière intervention 2 février 2015 - 14 janv. 2015 à 19:29
Bonjour,
je suis en premiere anné universitaire informatique et j'ai voulu realiser un programe qui dit si le nom entrer est un palindrome ou non

le programme marche tres bien et il determine tres bien la nature de tous les nom ,
mais voila il ya un probleme ,c'est que plus le mot est grand plus il envoie beaucoup de copie du resultat PAR EXE:

j'ecrit : radar
le programe m'envoie a la fin :
" radar est un palindrome
radar est un palindrome"
il m'envoie deux copie du resultat et si on ecrit un mot de 50 lettre il revoie plus de 20 copie du resultat , je sais qu'il ya une faute dans ma fonction "for" mais je ne sais pas quoi toucher
donc voila le code pascal de mon prog :

program palindrome(output);
uses crt ;
var nom : string ; i, m :integer ;
begin
clrscr ;
writeln('ceci est un programme qui determine si le nom entré est un palindrome ou non ') ;
readln(nom);
m:=length(nom)
for i:=1 to m div 2
begin
if nom[i] = nom[m+1-i]
begin
writeln(' ',nom,' est un palindrome' );
end
else
begin
writeln(' ',nom,' n''est pas un palindrome ');
end;
end;
readln
end.



je sais qu'on peut faire le programe en iutilisant un boucle repeat ce qui evitera ceci mais je voudrait savoir comment fair avec une boucle for , ca permetra de m'aider pour l'avenir

merci braucoup d'avance.
A voir également:

10 réponses

alfnet Messages postés 2 Date d'inscription mercredi 20 août 2008 Statut Membre Dernière intervention 27 septembre 2008
20 août 2008 à 22:19
Salut,

Tu peux aussi faire le test par récusivité:

program Palindrome;

VAR s:string;

FUNCTION palyn (s: string):boolean;
   BEGIN
      IF (length(s) = 1) THEN palyn := TRUE
      ELSE
         IF s[1]=s[length(s)] THEN
            palyn := palyn (COPY(s,2,length(s)-2))
         ELSE
            palyn := FALSE;
   END;

begin
   WRITE ('Entrez une chaine de caractere(s): ');
   READLN (s);
   IF palyn(s) THEN
      WRITE ('Cette chaine est un palindrome.')
   ELSE
      WRITE ('Cette chaine n''est pas un palindrome.');
   READLN ();
end.


Voilà, j'espère que ça t'aidera.

A.
8
Uly410 Messages postés 319 Date d'inscription mercredi 14 janvier 2015 Statut Membre Dernière intervention 2 février 2015 24
Modifié par Uly410 le 14/01/2015 à 19:37
Bonjour,

Je ne sais pas si le programme est juste mais la forme est brillante ! Je suis ébloui. Je vois là que j'ai à faire à un connaisseur costaud.

Au fait alfnet, comment et avec quel OS vous tester vos programmes écrits en TP ?

Bravo !

Uly
0
sandul Messages postés 3927 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 723
20 août 2008 à 11:21
Salut,

Dans ta boucle for, il faut attendre la fin des comparaisons de lettres avant d'afficher quoi que ce soit. Exemple:

nambn ==>
il compare le 1er caractère (n) et le dernier (n) et il affiche est un palindrome
il compare par la suite le 2ème (a) et le 4ème (b) et il affiche n'est pas un palindrome

Manifestement, ce n'est pas ce que tu cherches.

Initialise donc une variable booléenne avant la boucle for (genre estPalindrome, valeur à true);

program palindrome(output);
uses crt ;
var nom : string ; i, m :integer, estPalindrome:boolean ;
begin
clrscr ;
writeln('ceci est un programme qui determine si le nom entré est un palindrome ou non ') ;
readln(nom);
m:=length(nom);
estPalindrome := true;
for i:=1 to m div 2
begin
  if nom[i] != nom[m+1-i]
    begin
      estPalindrome := false;
      break;
    end;
end;

if estPalindrome
begin
  writeln(' ',nom,' est un palindrome' );
end
else
begin
  writeln(' ',nom,' n'est pas un palindrome' ); 
end;

readln
end. 


Tu va m'excuser les erreurs de syntaxe (ça fait un siècle depuis que j'ai touché la dernière fois à Pascal).
++
3
ftiercel Messages postés 119 Date d'inscription dimanche 24 septembre 2006 Statut Membre Dernière intervention 8 février 2014 61
20 août 2008 à 11:43
Pour chercher du code sur internet, je te conseille Google Search Code ( http://www.google.com/codesearch ). C'est Google mais pour les développeurs, très utile. Il te suffit de commencer ta recherche par "lang:pascal " pour qu'il ne cherche que du code en langage Pascal.
3
ftiercel Messages postés 119 Date d'inscription dimanche 24 septembre 2006 Statut Membre Dernière intervention 8 février 2014 61
20 août 2008 à 11:13
Non seulement il écrit plusieurs fois le message mais en plus, le message peut être faux. Par exemple, pour un terme comme "abcdefdcba", il va écrire plusieurs vrai alors que c'est faux.

Chaque boucle de l'instruction for est une itération. A chaque itération tu compares deux lettres. Tu ne peux pas dire si c'est vrai ou pas après avoir comparé que deux lettres. Il faut que le message ne s'affiche qu'après avoir comparé toutes les lettres, autrement dit, après la boucle for.

Tu as besoin de rajouter un booléen dans ton programme. Il doit être initialisé à vrai (i.e. tant qu'on a pas trouvé d'erreur, le mot est supposé être un palindrome). Ensuite, à chaque itération, le booléen reste vrai si les deux lettres comparées sont les mêmes, sinon, il passe à faux. Tu afficheras un message ou l'autre selon si le booléen est resté à vrai ou pas.
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nadal1991 Messages postés 268 Date d'inscription mercredi 5 septembre 2007 Statut Membre Dernière intervention 2 octobre 2011 11
20 août 2008 à 20:53
ok je verrai , ca m'aidera certainement

merci a vous tous
1
nadal1991 Messages postés 268 Date d'inscription mercredi 5 septembre 2007 Statut Membre Dernière intervention 2 octobre 2011 11
20 août 2008 à 11:36
ok j'ai pas penser , desoler mais je debute en programation ,et je voudrait juste en aprendre un peu pour le debut de la premiere anner

en tous cas merci beaucoup
0
cpapacheikh Messages postés 9 Date d'inscription mardi 15 juillet 2008 Statut Membre Dernière intervention 22 mai 2009
20 août 2008 à 21:03
Fodra remarké ke ta mis le message ',nom,' est un palindrome' à l'intérieur de la boucle for. De ce fait puisque la boucle est parcourue NBRE DE LETTRES MODULO DEUX fois, c'est à dire si ta un mot de 50 lettres tora 24 fois le message inscrit. je te propose d'utiliser une boucle WHILE.
0
mais on écrit uses wincrt non pas uses crt
c'est vrai ou nn
0
crt pour free pascal
et wincrt pour tpw
0
salut voila la solution ;)


program palindrome;
uses wincrt ;
var ch : string ; i:integer;v:boolean;
begin

writeln('ceci est un programme qui determine si le nom entré est un palindrome ou non ') ;
readln(ch);
clrscr;
for i:=1 to length(ch) div 2 do
begin
if ch[i] = ch[length(ch)+1-i] then

v:=true
else
v:=false;
end;

if (v=true) then


writeln(ch,' est palaindrome')
else
writeln(ch, ' n''est pas palaindrome');

readln

end.
0
Utilisateur anonyme
18 déc. 2014 à 16:38
program palindrome;
uses wincrt;
var
l,i,x:integer;
ch:string;
begin
writeln('donner une chaine');
readln(ch);
l:=length(ch);

for i:=1 to l do
x:=0;
begin
if ord(ch[i])=ord(ch[l-i+1]) then
x:=1;
end;

if x=1 then
writeln(' palindrome')
else writeln('n ''est pas palindrome');
end.
**************by sadek******************
0