guillaume_00
Messages postés18Date d'inscriptiondimanche 19 septembre 2004StatutMembreDernière intervention19 mars 2009 19 déc. 2007 à 09:44
Sinon juste pour info le plus long palindrome de la langue française (et qui veux dire quelque chose ;p) est : Tu l'as trop écrasé César ce port salut. Mais je ne suis pas sur que cette source le détect comme un palindrome (enfin j'ai pas testé).
cs_lopz
Messages postés5Date d'inscriptiondimanche 7 novembre 2004StatutMembreDernière intervention17 janvier 2005 2 févr. 2005 à 18:31
oui vous avez raison mais ce que joublie c'est :
n=strlen(test);
avant le for
:)
cs_Kirua
Messages postés3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 décembre 2008 2 févr. 2005 à 16:05
cs_lopz
Messages postés5Date d'inscriptiondimanche 7 novembre 2004StatutMembreDernière intervention17 janvier 2005 2 févr. 2005 à 13:55
int pal(char test[100])
{
int i,n;
for(i=0;i<n;i++,n--)
{
if(test[i]==' ')while(test[i]==' ')++i;
if(test[n]==' ')while(test[n]==' ')--n;
if(test[i]!=test[n])return 0;
}
return 1;
}
voila une autre avec un test sur les blancs
cs_Kirua
Messages postés3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 décembre 2008 2 févr. 2005 à 00:25
c'est dommage parce que ça demande de faire deus boucles et de copier la chaîne sans blanc. il vaut mieux zapper les blancs avec une conditionnelle dans la boucle que propose lopz, m'enfin on a sûrement déjà dit ça.
cs_lopz
Messages postés5Date d'inscriptiondimanche 7 novembre 2004StatutMembreDernière intervention17 janvier 2005 2 févr. 2005 à 00:23
bon bruNews ton remarque est just mais vous oubliez que dambi est déja enlever les blanc
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 1 févr. 2005 à 23:38
lopz > on ne laisse pas strlen dans une boucle sinon on parcourt la chaine des milliers de fois. Autre chose, ton test ne saura pas gerer les blancs.
cs_lopz
Messages postés5Date d'inscriptiondimanche 7 novembre 2004StatutMembreDernière intervention17 janvier 2005 1 févr. 2005 à 23:23
ben pour koi pas une fonction boolean
int pal(char test[100])
{
int i;
for( i=0;i<strlen(test)/2;i++)
if(test[i]==test[strlen(test)-i])
return 0;
return 1;
}
xaxa66
Messages postés6Date d'inscriptionjeudi 23 décembre 2004StatutMembreDernière intervention 8 février 2006 17 janv. 2005 à 11:43
heu, jviens de voir la source de dambi, et il suffit de mettre un mot quelconque avec la première et la dernière lettre identiques poour que le prog nous renvoie: "est un palindrome", par contre, je ne saurais pas améliorer la condition,jsais juste capter ce qui ne va pas, je débute tt juste.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 13 nov. 2004 à 18:18
Un bon point a Kirua pour avoir signale ce lien fort judicieux. Il n'y a pas que des rustres primaires dans la prog...
cs_Kirua
Messages postés3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 décembre 2008 13 nov. 2004 à 18:04
c'est une vieille question, tout forum qui se respecte a un topic sur le sujet ^^
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 13 nov. 2004 à 15:19
Kirua> en quoi 'autant pour moi' ne te semble pas convenable ? Je crois par contre ceci fort juste.
Que voudrais dire 'au temps pour moi' ???
cs_Kirua
Messages postés3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 décembre 2008 13 nov. 2004 à 14:53
au temps pour moi *
je ne relève pas les fautes sur CS d'habitude, mais celle-là étant courante, autant répandre la bonne ortho ;)
kod32
Messages postés46Date d'inscriptionmercredi 5 mai 2004StatutMembreDernière intervention13 novembre 2004 13 nov. 2004 à 13:00
autant pour moi.
la fonction is_palindrome corrigee:
----
int is_palindrome(char *s)
{
char *p = revstr(strdup(s));
if (strcmp(s, p) == 0)
return 1;
return 0;
}
----
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 12 nov. 2004 à 20:22
Le code est faux,
strcmp(s, revstr(s))
revstr sera appelée avant strcmp et sa mauvaise conception fait qu'elle modifira s, soit la comparaison de la même chaine.
Il faut réfléchir avant de coder.
Arnaud16022
Messages postés1329Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention16 juin 20102 12 nov. 2004 à 18:45
;)
cs_Kirua
Messages postés3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 décembre 2008 12 nov. 2004 à 18:31
mais ça n'est en rien plus efficace que le code de BruNews. si tu dois copier une chaîne de 17000 mots des milliers de fois pdt l'algo, tu peux aller te coucher et tu peux même oublier de brancher ton réveil.
kod32
Messages postés46Date d'inscriptionmercredi 5 mai 2004StatutMembreDernière intervention13 novembre 2004 12 nov. 2004 à 12:22
bien vu :D
Merci, j'ai pas eu le temps de tester. Le prob vient en effet des espaces, il suffit de faire une fonction prototypee comme suit
char *del_space(char *s);
qui duplique la chaine en ignorant les espaces et ensuite l'appeller avec is_palindrome(del_zero(str));
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 12 nov. 2004 à 11:57
kod32> essaie ton code avec "esope reste et se repose".
kod32
Messages postés46Date d'inscriptionmercredi 5 mai 2004StatutMembreDernière intervention13 novembre 2004 12 nov. 2004 à 11:51
oups desole, on preferera remplacer les write par des printf pour plus de portabilite...
kod32
Messages postés46Date d'inscriptionmercredi 5 mai 2004StatutMembreDernière intervention13 novembre 2004 12 nov. 2004 à 11:50
Et pour ce code, pourquoi pas un truc du style :
---------------
char *revstr(char *str)
{
int i;
int n;
char *res;
char save;
res = str;
n = my_strlen(str);
for (i = 0; i < (n / 2); i++)
{
save = str[i];
str[i] = str[n - (i + 1)];
str[n - (i + 1)] = save;
}
return (res);
}
int is_palindrome(char *s)
{
if (strcmp(s, revstr(s)) == 0)
return 1;
return 0;
}
int main(int ac, char **av)
{
if (ac < 2)
return 1;
if (is_palindrome(av[1]))
write(1, "Et oui c bien un palindrome !", strlen("Et oui c bien un palindrome !"));
else
write(1, "Et non :(", strlen("Et non :("));
return 0;
}
------------
C'est plus simple et plus rapide non ?
Arnaud16022
Messages postés1329Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention16 juin 20102 11 nov. 2004 à 23:07
oui.
yen a aussi qui veulent faire la plus grosse omelette du monde.
A chacun son but dans la vie ;)
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 11 nov. 2004 à 23:03
L'enjeu était sans doute de battre le record du monde.
Ca se tient, je vois rien d'anormal.
Arnaud16022
Messages postés1329Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention16 juin 20102 11 nov. 2004 à 22:57
yen a vraiement qui s'embetent pour non seulement faire un truc comme ca, mais en plus prendre le temps dee le faire référencer.
qui sait, il a peut etre fait sa thèse là-dessus? ^^
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 11 nov. 2004 à 22:55
ok, il faut aussi des vrais mots, la forcement c'est nettement + long a faire. Vaut mieux avoir une bonne base de donnees de mots alors.
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 11 nov. 2004 à 22:53
oui
BruNews, c'est fais à partir d'un dico et ca semble plutôt complexe comme algo
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 11 nov. 2004 à 22:52
enfin je vois ainsi, tu crees un buffern un pointeur a la fin et un au debut, tant que deb < fin, tu affectes une lettre aleatoire la meme a chacun, ne te semble pas ?
cs_Kirua
Messages postés3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 décembre 2008 11 nov. 2004 à 22:49
non, c'est pas si simple apparemment. le type en question avec ces 17xxx mots a battu le record de 15xxx mots précédent. ça doit être plus tricky qu'on ne le pense (même si ça n'a pas l'air, c'est clair)
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 11 nov. 2004 à 22:43
ah oui ok, c'est franchement debile comme truc.
Un debutant avec 1 mois de C peut pondre un algo qui sort un Go de cela en rien de temps.
Y a vraiment nimporte quoi sur le net....
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 11 nov. 2004 à 22:40
d'ailleur c'est ecris, un palindrome de 17000 mots
cs_Kirua
Messages postés3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 décembre 2008 11 nov. 2004 à 22:39
la liste entière est un palindrome :) bon, ça n'a pas de sens, on est d'accord, mais c'est amusant :)
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 11 nov. 2004 à 22:30
c'est quoi cette page, je ne vois pas de palindrome dans cette liste.
cs_Kirua
Messages postés3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 décembre 2008 11 nov. 2004 à 22:08
Arnaud16022
Messages postés1329Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention16 juin 20102 11 nov. 2004 à 18:03
laval, non,...???
azertyuioppoiuytreza ;)
un peu d'imagination que diable lol
juki_webmaster
Messages postés947Date d'inscriptionmercredi 19 novembre 2003StatutMembreDernière intervention 5 avril 20083 11 nov. 2004 à 17:49
Ta d'autres palindrome à nous donner ?
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 11 nov. 2004 à 12:59
mais personne n'a compris le passage de paramètre ici ?
"sizeof text" (attention aux paranthèses) retourne 256 si texte est un tableau de char, par définition en C on ne peut pas passer un tableau en paramètre (on passe un pointeur).
C'est quand même niveau débutant ce que je dis, il serait bon de revoir les bases.
cs_Kirua
Messages postés3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 décembre 2008 11 nov. 2004 à 12:13
Palind(char text[256])
si ta chaînes dépasse 256 caréactères, y aura pas un souci ?? déjà si on fait un sizeof(text) ça va retourner 256 sauf erreur, ce qui peut ne pas être le cas souhaité.
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 11 nov. 2004 à 00:01
ces 3 syntaxes sont équivalentes, dans tout les cas c'est un pointeurs qui est passé à la fonction
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 10 nov. 2004 à 17:10
qui parle de RAM ? le char* pourrait aussi bien pointer sur 1 Go alloue par VirtualAlloc() et rempli ensuite donc tout ceci ne serait surement pas dispo au complet en RAM mais irait toujours auss bien.
Arnaud16022
Messages postés1329Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention16 juin 20102 10 nov. 2004 à 16:57
pourquoi pas? et c'est pas un chouïa plus long comme ca?
ya vraiment pas d'autre limite que la taille de la ram?
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 10 nov. 2004 à 16:46
pourquoi voudrais tu declarer un param ainsi alors que va si bien en pointeur ? ce sera utilisable idem en C ou C++ sans limite de longueur.
Arnaud16022
Messages postés1329Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention16 juin 20102 10 nov. 2004 à 16:27
hou ben ca c'et du code court optimisé et clair BruNews!!
sinon comment on fait si c'est pas du c++ mais du c, je veux dire si la fonction est Est Palind(char text[256])? on ne peut pas utiliser de pointeur la, si? et dans ce cas ta methode reste valable en remplacant les pointeurs par des index de tableau non?
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 10 nov. 2004 à 12:17
Salut, il n'y a pas besoin de recopier le buffer pour verifier un palindrome, 2 pointeurs sur le buffer suffisent, meme en tenant compte des blancs.
Exemple (a tester mais devrait aller):
int __stdcall EstPalindrome(char *psz)
{
char *c, *d;
c d psz;
while(*d) d++;
d--; // SUR DERNIER CHAR
while(c < d) {
while(*d == 32) d--; // SAUTE ESPACES
if(c >= d) break; // OK
while(*c == 32) c++; // SAUTE ESPACES
if(c >= d) break; // OK
if(*c != *d) return 0; // NON PALINDROME
c++; d--;
}
return 1;
}
19 déc. 2007 à 09:44
2 févr. 2005 à 18:31
n=strlen(test);
avant le for
:)
2 févr. 2005 à 16:05
if(test[n]==' ')while(test[n]==' ')--n;
peut s'écrire:
while(test[i++]==' ');
while(test[n--]==' ');
2 févr. 2005 à 13:55
{
int i,n;
for(i=0;i<n;i++,n--)
{
if(test[i]==' ')while(test[i]==' ')++i;
if(test[n]==' ')while(test[n]==' ')--n;
if(test[i]!=test[n])return 0;
}
return 1;
}
voila une autre avec un test sur les blancs
2 févr. 2005 à 00:25
2 févr. 2005 à 00:23
1 févr. 2005 à 23:38
1 févr. 2005 à 23:23
int pal(char test[100])
{
int i;
for( i=0;i<strlen(test)/2;i++)
if(test[i]==test[strlen(test)-i])
return 0;
return 1;
}
17 janv. 2005 à 11:43
13 nov. 2004 à 18:18
13 nov. 2004 à 18:04
c'est une vieille question, tout forum qui se respecte a un topic sur le sujet ^^
13 nov. 2004 à 15:19
Que voudrais dire 'au temps pour moi' ???
13 nov. 2004 à 14:53
je ne relève pas les fautes sur CS d'habitude, mais celle-là étant courante, autant répandre la bonne ortho ;)
13 nov. 2004 à 13:00
la fonction is_palindrome corrigee:
----
int is_palindrome(char *s)
{
char *p = revstr(strdup(s));
if (strcmp(s, p) == 0)
return 1;
return 0;
}
----
12 nov. 2004 à 20:22
strcmp(s, revstr(s))
revstr sera appelée avant strcmp et sa mauvaise conception fait qu'elle modifira s, soit la comparaison de la même chaine.
Il faut réfléchir avant de coder.
12 nov. 2004 à 18:45
12 nov. 2004 à 18:31
12 nov. 2004 à 12:22
Merci, j'ai pas eu le temps de tester. Le prob vient en effet des espaces, il suffit de faire une fonction prototypee comme suit
char *del_space(char *s);
qui duplique la chaine en ignorant les espaces et ensuite l'appeller avec is_palindrome(del_zero(str));
12 nov. 2004 à 11:57
12 nov. 2004 à 11:51
12 nov. 2004 à 11:50
---------------
char *revstr(char *str)
{
int i;
int n;
char *res;
char save;
res = str;
n = my_strlen(str);
for (i = 0; i < (n / 2); i++)
{
save = str[i];
str[i] = str[n - (i + 1)];
str[n - (i + 1)] = save;
}
return (res);
}
int is_palindrome(char *s)
{
if (strcmp(s, revstr(s)) == 0)
return 1;
return 0;
}
int main(int ac, char **av)
{
if (ac < 2)
return 1;
if (is_palindrome(av[1]))
write(1, "Et oui c bien un palindrome !", strlen("Et oui c bien un palindrome !"));
else
write(1, "Et non :(", strlen("Et non :("));
return 0;
}
------------
C'est plus simple et plus rapide non ?
11 nov. 2004 à 23:07
yen a aussi qui veulent faire la plus grosse omelette du monde.
A chacun son but dans la vie ;)
11 nov. 2004 à 23:03
Ca se tient, je vois rien d'anormal.
11 nov. 2004 à 22:57
qui sait, il a peut etre fait sa thèse là-dessus? ^^
11 nov. 2004 à 22:55
11 nov. 2004 à 22:53
BruNews, c'est fais à partir d'un dico et ca semble plutôt complexe comme algo
11 nov. 2004 à 22:52
11 nov. 2004 à 22:49
11 nov. 2004 à 22:43
Un debutant avec 1 mois de C peut pondre un algo qui sort un Go de cela en rien de temps.
Y a vraiment nimporte quoi sur le net....
11 nov. 2004 à 22:40
11 nov. 2004 à 22:39
11 nov. 2004 à 22:30
11 nov. 2004 à 22:08
11 nov. 2004 à 18:03
azertyuioppoiuytreza ;)
un peu d'imagination que diable lol
11 nov. 2004 à 17:49
11 nov. 2004 à 12:59
"sizeof text" (attention aux paranthèses) retourne 256 si texte est un tableau de char, par définition en C on ne peut pas passer un tableau en paramètre (on passe un pointeur).
C'est quand même niveau débutant ce que je dis, il serait bon de revoir les bases.
11 nov. 2004 à 12:13
si ta chaînes dépasse 256 caréactères, y aura pas un souci ?? déjà si on fait un sizeof(text) ça va retourner 256 sauf erreur, ce qui peut ne pas être le cas souhaité.
11 nov. 2004 à 00:01
Palind(char text[256])
Palind(char text[])
Palind(char *text)
ces 3 syntaxes sont équivalentes, dans tout les cas c'est un pointeurs qui est passé à la fonction
10 nov. 2004 à 17:10
10 nov. 2004 à 16:57
ya vraiment pas d'autre limite que la taille de la ram?
10 nov. 2004 à 16:46
10 nov. 2004 à 16:27
sinon comment on fait si c'est pas du c++ mais du c, je veux dire si la fonction est Est Palind(char text[256])? on ne peut pas utiliser de pointeur la, si? et dans ce cas ta methode reste valable en remplacant les pointeurs par des index de tableau non?
10 nov. 2004 à 12:17
Exemple (a tester mais devrait aller):
int __stdcall EstPalindrome(char *psz)
{
char *c, *d;
c d psz;
while(*d) d++;
d--; // SUR DERNIER CHAR
while(c < d) {
while(*d == 32) d--; // SAUTE ESPACES
if(c >= d) break; // OK
while(*c == 32) c++; // SAUTE ESPACES
if(c >= d) break; // OK
if(*c != *d) return 0; // NON PALINDROME
c++; d--;
}
return 1;
}