Palindrome
salut .svp qqn peut trouver la faute que j ai commis dans ce code ..il m'affiche à chaque fois il m'affiche que c'est un palindrome mêm si c n est pas le cas
#include <iostream>
#include <string>
using namespace std;
int palindrome(string T, int a, int b)
{
if (a>=b)
{
return 1;
}
else if (T[a]!=T[b])
{
return 0;
}
else
{
return palindrome(T,a+1,b-1);
}
}
int main()
{
int n;
string tab;
n=tab.size();
cout<< "donnez un mot ou une phrase"<<endl;
cin>>tab;
int q=palindrome(tab,0,n-1);
if (q)
{ cout<< "c'est un palindrome "<<endl;
}
else
{
cout<< "ce n'est pas un palindrom"<<endl;
}
return 0;
}
1 réponse
-
Bonjour,
Ah c'est ce qu'on appelle une erreur d'étourderie :-)
Comment trouver ton erreur ?
Dans ce genre de situation, il ne faut pas hésiter à utiliser un debogueur (par exemplegdb
si tu es sous linux) ou à afficher les valeurs des variables à des endroits stratégiques du programme pour s'en sortir.
Exemple :
#include <iostream>
#include <string>
using namespace std;
int palindrome(string T, int a, int b)
{
std::cout << "T = " << T << " a = " << a << " b = " << b << std::endl;
if (a>=b)
{
return 1;
}
else if (T[a]!=T[b])
{
return 0;
}
else
{
return palindrome(T,a+1,b-1);
}
}
int main()
{
string tab;
int n=tab.size();
cout<< "donnez un mot ou une phrase"<<endl;
cin>>tab;
std::cout << "n = " << n << " n-1 = " << (n-1) << std::endl;
int q=palindrome(tab,0,n-1);
if (q)
{ cout<< "c'est un palindrome "<<endl;
}
else
{
cout<< "ce n'est pas un palindrom"<<endl;
}
return 0;
}
Explication de l'erreur
Au moment où tu initialisesn
, la chaîne est vide, doncn
vaut 0. Le fait que la chaîne change par la suite n'a pas d'impact, carn
est un simple entier : il ne fait pas référence à la taille de la chaîne.
Il suffit dans ton programme d'initialisern
après avoir lu la chaîne.
cout << "donnez un mot ou une phrase" << endl;
cin >> tab;
int n = tab.size();
Améliorations possibles
Bon ensuite il y a quelque points améliorables pour ton programme. Notamment :
- les int devraient être desstd::size_t
(entiers non signés),
- la fonction palyndrome devrait retourner unbool
- même si ce n'est pas gênant dans un fichier cpp, garde à l'esprit queusing namespace std;
ne doit jamais être utilisé dans un fichier hpp.
- on réserve généralement les noms en majuscule (par exemple ici T) aux constantes,
- le programme pourrait s'écrire en O(1) (en une passe) et sans appel récursif.
Intuitivement, il suffit de lire jusqu'au milieu du mot, et comparer le i-ème caractère avec le (n-1-i)-ème caractère. Dès qu'on observe une différence, on retournefalse
. Si on n'a observé aucune différence, on retournetrue
.
En effet, un appel récursif est plutôt "cher" d'un point de vue performance, car on empile des appels de fonctions, et pire, s'il y en a vraiment beaucoup, on peut provoquer un débordement de pile (ceci dit là il faudrait vraiment un texte extrêmement long !).
Bonne chance