[Pascal] Palindrome
Résolu/Fermé
nadal1991
Messages postés
268
Date d'inscription
Statut
Membre
Dernière intervention
-
Uly410 Messages postés 319 Date d'inscription Statut Membre Dernière intervention -
Uly410 Messages postés 319 Date d'inscription Statut Membre Dernière intervention -
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.
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:
- Palindrome pascal
- Turbo pascal - Télécharger - Édition & Programmation
- My pascal - Télécharger - Édition & Programmation
- Dev pascal - Télécharger - Édition & Programmation
- Le protocole assure que la communication entre l'ordinateur de pascal et le serveur de visiodoct est car les informations seront avant d'être envoyées. - Forum Pascal
- Probleme en pascal - Forum Pascal
10 réponses
Salut,
Tu peux aussi faire le test par récusivité:
Voilà, j'espère que ça t'aidera.
A.
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.
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);
Tu va m'excuser les erreurs de syntaxe (ça fait un siècle depuis que j'ai touché la dernière fois à Pascal).
++
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).
++
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.
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
en tous cas merci beaucoup
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.
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.
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******************
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******************
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