Bonsoir tout le monde, je dois ecrire le programme qui détermine si une chaîne de caractère est un palindrome.
On rappelle qu’une chaîne de caractère se termine par le caractère ‘\0’.
Je fais donc appel à votre aide sans utiliser la fonction ispalindrome mais simplement avec des tableaux et des for!
voici mon programme qui ne marche pas représentant le fruit de mon vain travail
int main(void){
char T[51];
int i=0,j=0,test=0;
fgets(T,50,stdin);
for(j=0; T[j]!=0; j++)
{j=j-1;
}
for(i=0;i<j;i++,j--)
{
if(T[i]==T[j])
{
test=1;
}
}
if(test==1){
printf("c´est un palindrome");
}
else{
printf("ce n´est pa un palindrome");
}
system("pause");
return (0);
}
à tous ceux qui voudront m´aider.
ca ne marceh pas n´est pas une explication suffisante. Qu´est ce qui ne marche pas ?
Tu rentres un palindrome et il te dit que ce n´est pas un palindrome ? l´inverse ? Ton programme ne compile pas ? provoque une erreur de mémoire ?
ben en fait je rentre le mot et rien ne se passe aprés le programme n´avance plus.
C´est pas tout à fait etonnant : tu fait une boucle sur j de 0 à j tel que T[j]==0 et à chaque pas tu incremente j. Mais dans le corps de la boucle, tu diminue j de 1. donc tu fait une boucle infinie.
En parlant de palindrôme, je me rappelle d´un morceau de code qui écrivait en sortie sur l´imprimante et le code tout entier faisait un palindrôme, c´était du C je crois, et assez impressionnant ^^
Heu que veux-tu dire par " le code tout entier faisait un palindrome" ? o_O
"le code tout entier faisait un palindrôme"
Je demande a voir !
Soit le fichier n´incluais aucun .h, soit il se finissait par un #
Comment un code C peut il se finir par # ?
Ben le code tout entier faisait un palyndrôme quoi, si on lisait le code un endroit ben on avait un code, et si on le lisait à l´envers et ben on avait le même code, un palyndrôme quoi ^^
Vous connaissez pas les petits concours du code le plus illisible ? Ben y´a aussi le code le plus poétique etc.
Mais bon je l´ai vu y´a longtemps et je serai incapable de vous retrouver l´adresser :-/
Ce code là :
http://www.ioccc.org/1987/westley.c
?
Oui c´était celui-là ![]()
la c´est chaque ligne qui est un palindrome.
tu peux toujours tricher en mettant des commentaires fvirtman
//"h.otot" edulcni#
il faut que tu vois le palindrome comme étant symétrique.. tu vérifie que le premier caractère de ta chaîne soit égale au dernier, que les 2e est égale à l´Avant-dernier, etc...
ca donne à peu près ceci:
bool estUnPalindrome = true;
for (int i = 0; i != T.lenght()/2; ++i)
{
if (T[i] != T[T.lenght()-i])
estUnPalindrome = false;
}
bool palindrome(char unMot[], int uneTaille);
int main(int argc, char* argv[])
{
char leMot[50];
char laLettre;
int i = 0;
printf("Entrez un mot (termine par un .) : ");
laLettre = getchar();
while (laLettre != ´.´)
{
leMot[i] = laLettre;
i++;
laLettre = getchar();
}
i--;
if (palindrome(leMot, i) == true)
printf("\nC´est un palindrome\n\n");
else
printf("\nCe n´est pas un palindrome\n\n");
return 0;
}
bool palindrome(char unMot[], int uneTaille)
{
int j = 0;
while ((unMot[uneTaille] != unMot[j]) && (uneTaille < j))
{
j++;
uneTaille--;
}
if (unMot[uneTaille] == unMot[j])
return true;
else
return false;
}
Bonjour.
Perso, bien que ca soit à faire en C, je le verrais purement dans un style fonctionnel.
Qu´est-ce qu´un palindrome ?
Une chaine de caractère qui peut se lire dans les deux sens.
Nottons qu´une la chaine vide et la chaine formée d´un seul caractère est un palindrome.
Bien, comment vérifier alors qu´une chaine (ou tableau) est un palindrome ?
Et bien il suffit que sa tete et sa queue soient identiques, et que ce qui est entre soit aussi un palindrome.
DOnc cela s´écrie très naturellement de manière recursive
Voila du code C++
bool Palindrome(int monTableau[], int min, int max)
{
if(max-1 >= min+1)
{
if ((monTableau[min] == monTableau[max]) && (Palindrome(monTableau, min+1, max-1)))
{
return(true);
}
else
{
return(false);
}
}
else
{
return(true);
}
}
J´espere avoir pu t´aider un peu
ton code est étrange et pas optimisé..
personnelement, le fait que ca ne soit pas optimisé, je ne parierai pas dessus. Les compilateurs sont tres fort parfois.
Par contre, l´interet de l´ecrire en fonctionnel me parait douteux. Ce n´est pas vraiment plus simple.
je trouvais juste que cela était vraimment naturel.
Puisque il faut successivement vérifier que la tete et la queue soient identiques puis vérifier que le reste qoit aussi un palindrome.
Enfin c´est comme ca que je le vois.
Mais c´est peut etre ces quelques mois passés que haskell et caml qui m´amènent à penser (enfin) comme ca.
J´en arrive presque à etre dégouté quand je code en C++.
J´en ai parfois reellement mare du abs niveau.
Je veux des fonctions de premier ordre, du filtrage, une recursivité naturelle induite par ems données.... haaaa...
Tiens, je testerais demain une différence de perfs entre une implémentation fonctionnelle et une impérative.
Bien sur, si c´était une liste avec ocaml ca serait bien plus joli...
c´ets dur de faire du fonctionnel joli en C++ ![]()
Bon en meme temps c´est pas fait pour mais bon...
Bonne soirée all
en remplaçant toute tes lignes du milieu par :
return ((monTableau[min] == monTableau[max]) && (Palindrome(monTableau, min+1, max-1)))
tu ne gagne pas en perf, mais ça devient bien plus claire.
Écrire :
"if b then true else false" est une abération, surtout en programmation fonctionnel.
"J´en arrive presque à etre dégouté quand je code en C++. "
C´est marrant, ça m´est arrivé l´autre jour : je devais écrire un petit programme (disons de moins de 100 lignes) avec une bibliothèque en C++. Je commence, et très vite je m´arrache les cheveux sur le C++ qui est trop moche (en plus la bibliothèque est un truc de physiciens donc particulièrement mal écrit) et qui ne permet pas d´écrire ce à quoi je pense de manière simple. Qu´à cela ne tienne me dis-je, je vais faire un binding Caml de cette bibliothèque et ensuiteje coderais en Caml.
Bon, donc pour écrire ce programme (ce qui est le boulot d´une demi heure), ça fait trois jours que je code ce binding, j´en suis à plus d´un millier de lignes de code d´un mélange assez infâme de Caml et de C, et je n´ai toujours pas écrit mon programme.
Par contre, je ré-écrit les exemples qui viennent avec la bibliothèque et là, je m´aperçois que même si j´ai beaucoup plus de facilité à écrire du Caml que du C++, le code produit n´est, objectivement, pas vraiment plus joli, ni même particulièrement plus court.
en fait, ce que je voulais dire c´est que l´algorithme iteratif de palindrome est parfaitement clair. C´est meme comme que tu vérifie les longs palindromes a la main.
Tu met un doigt de chaque coté de la ligne et tu raproches tes doigts d´une position apres avoir vérifier qu´ils pointent bine sur la meme valeur.
And now something completly different:
Au niveau des bindings caml/C, parfois ca se passe vraiment tres mal. Tu as des problemes d´allocations mémoire qui peuvent venir assez rapidement. Une fonction prends un void* en parametre, et va faire des choses obscure dessus. Ton garbage collector est dans les choux, il ne peut pas savoir quand désallouer la mémoire. En l´occurence, le port caml a été abandonner parceque personne ne voyait comment l´écrire sans refactoré la moitié du moteur en C.
Heureusement avec cette lib je n´ai pas eu ce genre de problème (c´est pas non plus mon premier binding) vu que même si le code est très sale, les "objets" utilisés par le code C++ sont globalement des struct avec plein de variables membres et toutes les fonctions sont constantes, donc rien ne bouge pendant l´exécution du programme.
Et c´est là l´avantage du C++ sur le C, comme qu´il n´y a pas trop d´arithmétique de pointeur tu peut sans problème mettre un pointeur vers un objet dans une value avec une fonction de finalisation et pour peu que le destructeur n´ait pas besoin d´être appelé à un moment précis, tout ce passe bien.