Palindrome ou pas ?

Signaler
Messages postés
6
Date d'inscription
samedi 30 septembre 2006
Statut
Membre
Dernière intervention
31 octobre 2006
-
Messages postés
3
Date d'inscription
lundi 16 janvier 2006
Statut
Membre
Dernière intervention
1 avril 2007
-
Salut, je dois faire une pour tester si un nombre est un palindrome.
pour cela, je ne dois pas utiliser d'autre bibliothèque que iostream.
j'ai pensé a faire l'inversion de la moitié d'un tableau puis tester l'égalité avec la seconde moitié.

pour inverser j'ai fait cela:

bool estPalindrome(int TMot[],int TMot2[],int taille)
{
     int i,a;    
     a=0;
     if (taille%2 == 0)
                       for (i=0 ; i < (taille/2) ; i++)
                       {
                         TMot2[i]=TMot[(taille/2) - i];
                       }
     else
                       for (i=0 ; i < ((taille/2)-1) ; i++)
                       {
                         TMot2[i]=TMot[((taille/2)-1)-i];
                       }
}

est ce que ca marche ??  pour la suite jvois pas comment faire.
aidez moi svp 

12 réponses

Messages postés
6
Date d'inscription
samedi 30 septembre 2006
Statut
Membre
Dernière intervention
31 octobre 2006

#include
using namespace std;

void saisieMot(int TMot[],int taille)
{
     int i;
     cout<<"Entrer la taille du mot"<<endl;
     cin >> taille;
     for (i = 0; i < taille ; i++)
     {
     cout << " Entrez les lettres " << endl;
     cin >> TMot[i];
     }
}

void afficherMot(int TMot[],int taille)
{
     int i;
     for (i = 0; i < 10 ; i++)
     {
         cout << TMot[i];
     }
     cout << endl;
}

void extraireSousMot(int TMot[],int taille)
{
     int indice,LongueurExtrait,i;
     cout << "A partir de quel indice faut-il couper ?";
     cin >> indice;
     cout << "Combien de lettres doit-on prendre ?";
     cin >> LongueurExtrait;
     for (i = indice; i < indice + LongueurExtrait; i++)
     {
         cout << TMot[i];
     }
     cout << endl;
}

 bool estPalindrome(int TMot[],int TMot2[],int taille)
{
     int i,a;     
     a=0;
     if (taille%2 == 0)
                       for (i=0 ; i < (taille/2) ; i++)
                       {
                         TMot2[i]=TMot[(taille/2) - i];
                       }
     else
                       for (i=0 ; i < ((taille/2)-1) ; i++)
                       {
                         TMot2[i]=TMot[((taille/2)-1)-i];
                       }
}
          

int main()
{
    int taille;
    const int TAILLE = 100;
    int TMot[TAILLE];
    int TMot2[TAILLE];
    saisieMot(TMot,taille);
    afficherMot(TMot,taille);
    extraireSousMot(TMot,taille);
    estPalindrome(TMot,TMot2,taille);
    system ("PAUSE");
    
}
Messages postés
6
Date d'inscription
samedi 30 septembre 2006
Statut
Membre
Dernière intervention
31 octobre 2006

dans la boucle for de la fonction afficherMot, il faut remplacer 10 par taille  
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
bool estPalindrome(int TMot[],int TMot2[],int taille)
la signature me semble bizarre.
Je verrais plutot
bool estPalindrome(char* mot, int taille)

Un seul tableau est utile.
Je prend un pointeur du début qui avance, et un pointeur de la fin qui recule:
bool estPalindrome(char* mot, int taille)
{
  char* debut = mot;
  char* fin = mot + taille - 1;
  while(debut < fin)
  {
    if(*debut++ != *fin--) return false;
  }
  return true;
}

Et voila, ca devrait suffire

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
6
Date d'inscription
samedi 30 septembre 2006
Statut
Membre
Dernière intervention
31 octobre 2006

le probleme est que je n'ai pas appris les pointeurs, donc je n'ai pas le droit de m'en servir, et mon mot est un nombre dont les chiffres sont dans les cases d'un tableau  
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
bool estPalindrome(int mot[], int taille)
{  int debut 0, fin taille - 1;
  while(debut < fin)
  {
    // pareil qu'avant, mais avec des tableaux
  }
  return true;
}

En tous cas la fonction estPalindrome de mickpiet ne peut pas être correcte, vu qu'elle ne retourne rien

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
20
Si ta partie est bonne,
ne faut il pas juste compter le premier tableau puis le deuxieme et les comparer ?

Ou alors j'ai pas bien compris ta question...
Esceque c'est les valeurs additionnées le palindrome ou alors que chaque nombre du premier apparaissent dans le deuxieme tab ?

Sinon c'est aussi simple, une boucle imbriquée, pour chaque valeur du tab1, on regarde chaque valeur du tab2, si elle n'y ai pas, break et renvoi faux, si elles y sont toutes renvoi vrai.

TAILLE_MOITIE = taille/2
bool match = false;
bool isPalindrome = true;

boucle1 avec i jusqu'à tailleMoitie
{
   nbr=tab1[i]
   boucle2 avec j jusqu'à tailleMoitie
   {
      si ( nbr==tab2[j] ) alors match=true et break;
   }

   si ( match == false)
      isPalindrome = false; et break
   else
      match = false; // pour prochain
}        

return isPalindrome;
Messages postés
6
Date d'inscription
samedi 30 septembre 2006
Statut
Membre
Dernière intervention
31 octobre 2006

bon, je vais taper mon sujet en entier.

un palindorme est un mot (ou nombre) se lisant dans les deux sens.

un sous mot palindrome d'un mot est un sous-mot qui est un palindrome:
ex: "121" est un sous mot palindrome de "21213121". un sous-mot palindrome est maximal lorsqu'il n'est pas contenu dans un sous-mot palindrome plus grand. "121" n'est pas maximal car il est contenu dans 1213121. L'ensemble des sous-mots palindromes maximaux de 21213121 est 212 et 1213121.
L'objectif de cet exercice est la recherche des sous-mots maximaux d'un mot donné.
Nous considérons dans la suite de mot sur l'alphabet A= {0,1,2,3,4,5,6,7,8,9}. nous nous baserons sur le type TMot

const int TAILLE = 100
Type : TMot = tableau [TAILLE] d'entiers

1-Ecrire une fonction saisieMot qui permet de saisir un mot. L'utilisateur entre la taille du mot puis les diférentes lettres. (faite)
2-Ecrire une fonction afficherMot. (faite)
3-Ecrire une fonction motAleatoire qui permet de générer un mot aléatoire d'une longueur longueur sur l'alphabet {0,...,valeurMax}  (je ne l'ai pas encore faite)
4-Ecrire une fonction extraireSousMot qui permet d'extraire un sous mot extrait de longueur longueurExtrait à partir de l'indice indice du mot source de longueur longueur
ex: si le mot est 1234121, indice = 2, longueurExtrait=3. alors extrait = 341 (faite)
5-Ecrire une fonction estPalindrome qui renvoie vrai si le mot m de longueur longueur est un palindrome, et faux sinon.
6-Afin de stocker l'ensemble des sous palindromes maximaux d'un mot donné, définissez une ou plusieurs structures de données qui permet de stocker l'ensemble des sous-mots palindromes maximaux.
7-écrire une fonction afficherEnsemblePalindromesMaximaux qui permet d'afficher l'ensemble des sous palindromes maximaux
8-Ecrire une fonction recopierMot qui étant donné un mot source de longueurS le recopie dans un mot destination.
9-Ecrire une fonction recherchePalindromeMaximaux qui étant donné un mot m de longueur longueur, permet de récupérer l'ensemble des sous-mots palindromes maximaux de m
Messages postés
6
Date d'inscription
samedi 30 septembre 2006
Statut
Membre
Dernière intervention
31 octobre 2006

pour mon code, j'en suis là

#include
using namespace std;

void saisieMot(int TMot[],int taille)
{
     int i;
     cout<<"Entrer la taille du mot"<<endl;
     cin >> taille;
     for (i = 0; i < taille ; i++)
     {
     cout << " Entrez les lettres " << endl;
     cin >> TMot[i];
     }
}

void afficherMot(int TMot[],int taille)
{
     int i;
     for (i = 0; i < 10 ; i++)
     {
         cout << TMot[i];
     }
     cout << endl;
}

void extraireSousMot(int TMot[],int taille)
{
     int indice,LongueurExtrait,i;
     cout << "A partir de quel indice faut-il couper ?";
     cin >> indice;
     cout << "Combien de lettres doit-on prendre ?";
     cin >> LongueurExtrait;
     for (i = indice; i < indice + LongueurExtrait; i++)
     {
         cout << TMot[i];
     }
     cout << endl;
}

bool estPalindrome(int TMot[],int TMot2[],int taille)
{
     int i,a,tmp;    
     a=0;
     for (i=0 ; i < taille ; i++)
     {
         tmp = TMot2[i];
         TMot2[i]=TMot[taille-i-1];
         TMot[taille-i-1]=tmp;
         if (TMot[i] == TMot2[i])
         a=1;
     }
     if (a==0)
     return false;
     else
     return true;
}
         

int main()
{
    int taille;
    const int TAILLE = 100;
    int TMot[TAILLE];
    int TMot2[TAILLE];
    saisieMot(TMot,taille);
    afficherMot(TMot,taille);
    extraireSousMot(TMot,taille);
    estPalindrome(TMot,TMot2,taille);
    system ("PAUSE");
   
}
Messages postés
1
Date d'inscription
mercredi 23 juin 2004
Statut
Membre
Dernière intervention
8 novembre 2006

Le devoir est à faire en binôme. Tu triches.
Messages postés
3
Date d'inscription
lundi 16 janvier 2006
Statut
Membre
Dernière intervention
1 avril 2007

Bjr à tous
J'suis nouve au sur ce site et novice en programmation. J'essaie d'écrire un code ki teste si une chaine de caractère dont la limite est fixée est un palindrome. Voici ma function

int est_palindrome(chaine ch)
{
    int palindrome=0;
    int debut= 0;
    int fin=L-1;
   
   while(debut<=fin )
    {
        if(ch[debut]==ch[fin])
        {
                              palindrome=1;
                              debut=debut+1;
                              fin=fin-1;
                              }
                             
        else palindrome=0;break;
              
      
     }
        
       
        return palindrome;
           
}

Mais ce qui est bizar c'est que elle retourne à chak vrai même kan le mot n'est pas un palindrome. Et je ne vois pas ce qui peut occasionner ça! MErci pr votre aide
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
20
Avec ce code, tu ne testes qu'UN seul caractère, le premier.
Puisque le break te fais sortir de la boucle dès le premier passage.

else { palindrome=0; break; }

Pour le reste, afin d'éviter des affectations inutiles, on peut inverser le test, et faire :

while(debut <= fin )
{
   if(ch[debut++] != ch[fin--])
   {
      return FALSE;
   }
}
return TRUE;
Messages postés
3
Date d'inscription
lundi 16 janvier 2006
Statut
Membre
Dernière intervention
1 avril 2007

Merci ça marche nickel!