[Pascal] Palindrome

Résolu/Fermé
nadal1991 Messages postés 280 Statut Membre -  
Uly410 Messages postés 361 Statut Membre -
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. alfnet Messages postés 2 Statut Membre
     
    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. Uly410 Messages postés 361 Statut Membre 25
       
      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. sandul Messages postés 4013 Statut Membre 723
     
    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
  3. ftiercel Messages postés 120 Statut Membre 61
     
    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
  4. ftiercel Messages postés 120 Statut Membre 61
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. nadal1991 Messages postés 280 Statut Membre 11
     
    ok je verrai , ca m'aidera certainement

    merci a vous tous
    1
  7. nadal1991 Messages postés 280 Statut Membre 11
     
    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
  8. cpapacheikh Messages postés 9 Date d'inscription   Statut Membre
     
    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
  9. samsouma
     
    mais on écrit uses wincrt non pas uses crt
    c'est vrai ou nn
    0
    1. ping
       
      crt pour free pascal
      et wincrt pour tpw
      0
  10. Nadim
     
    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
  11. MoohamedSadek
     
    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