[Pascal] Palindrome

Résolu/Fermé
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.
Configuration: Windows XP
Firefox 3.0.1

10 réponses

  1. 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
    1. 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
  2. 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
    1. 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
      1. 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
        1. ok je verrai , ca m'aidera certainement

          merci a vous tous
          1
          1. 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
            1. 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
              1. mais on écrit uses wincrt non pas uses crt
                c'est vrai ou nn
                0
                1. crt pour free pascal
                  et wincrt pour tpw
                  0
              2. 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
                1. 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