Partage
  • Partager sur Facebook
  • Partager sur Twitter

palindrome

ma fonction marche de temps en temps

Sujet résolu
    4 novembre 2006 à 14:12:16

    salut a tous

    voila, j'ai fais une fonction pour détécter si un mot est un palindrome. un palindrome est un mot qui se lit pareild ans les deux sens (ex : radar, rotor).

    voici ce que ça donne avec le mot "radar"
    Image utilisateur

    et voici avec le mot "otto" qui est aussi un palindrome même si il veut rien dire
    Image utilisateur

    voici a quoi resemble ma fonction

    int Palindrome(char mot[100])
    {
        char mot2[100];
        int i,j = strlen(mot)-1;

        for (i = 0 ; i < strlen(mot) ; i++)//on copie l'inverse du mot saisi dans mot2
        {
            mot2[j] = mot[i];
            j--;
        }
        printf("\n\nmot 1 : %s   mot 2 : %s\n\n",mot,mot2);
        if (strcmp(mot,mot2) == 0)//on compare les deux chaînes
        {
            return 1;
        }
        else
        {
            return 0;
        }



    }


    en fait je copie l'inverse de la chaine passé en paramétre dans la variable mot2 puis je compare les deux chaines avec strcmp pour savoir si le mot est un palindrome.

    si quelqu'un comprend pourquoi je me retrouve avec des symboles bizare desfois, et d'autres fois non, ca serai sympa de m'expliquer.

    merci de vos réponses éventuelles. ^^
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      4 novembre 2006 à 14:35:16

      Tu oublies le zero terminal dans ta variable mot2 :


      int palindrome(char* mot){
          int taille=strlen(mot)+1;
          char* mot2=malloc(taille*sizeof(char));
          int i,j;
          for(i=0,j=taille-2;i<taille;i++,j--){
              mot2[i]=mot[j];
          }
          mot2[taille-1]=0; // IMPORTANT !!!
          int retour=strcmp(mot,mot2)==0;
          free(mot2);
          return retour;
      }
      • Partager sur Facebook
      • Partager sur Twitter
        4 novembre 2006 à 14:36:01

        Salut. L'Algorithme me semble correct, penses tu à gérer le '\0' Final ? Je vais essayer de concocter une fonction pour essayer ;)

        EDIT: Finalement, simon.arvaux a tout fait
        • Partager sur Facebook
        • Partager sur Twitter
          4 novembre 2006 à 14:39:56

          int Palindrome(char mot[100])
          {
              int is_pal = 1;
              int i,j = (strlen(mot)/2);

              for (i = 0 ; i < j ; i++)
              {
                  if(mot[i] != mot[j-i])
                  {
                      is_pal = 0;
                      break;
                  }
              }
              return is_pal;
          }
          • Partager sur Facebook
          • Partager sur Twitter
            4 novembre 2006 à 16:03:05

            Citation : simon.arvaux

            Tu oublies le zero terminal dans ta variable mot2 :


            int palindrome(char* mot){
                int taille=strlen(mot)+1;
                char* mot2=malloc(taille*sizeof(char));
                int i,j;
                for(i=0,j=taille-2;i<taille;i++,j--){
                    mot2[i]=mot[j];
                }
                mot2[taille-1]=0; // IMPORTANT !!!
                int retour=strcmp(mot,mot2)==0;
                free(mot2);
                return retour;
            }


            ta fonction marche, mais je comprend pas tout.

            pourquoi mettre j=taille-2 dans le for

            et cette ligne là veu dire quoi o_O ?

                int retour=strcmp(mot,mot2)==0;

            enfin c'est surtout pour le ==0, je vois pas ce qu'il fait là

            enfin je vous remerci de vos réponses


            ps : ta fonction marche pas minirop


            • Partager sur Facebook
            • Partager sur Twitter
              4 novembre 2006 à 16:07:18

              Citation : nightcyborg

                  int retour=strcmp(mot,mot2)==0;

              en fait le == 0 va provoquer un booléen, et donc si strcmp renvoie 0, çà fait 1 donc ils sont identiques, sinon çà renvoie 0 (et non plus 1 ou -1)
              • Partager sur Facebook
              • Partager sur Twitter
                4 novembre 2006 à 16:12:30

                bon j'ai réussi en m'aidant du code de simon.arvaux, voila ce que ca donne :


                int Palindrome(char mot[100])
                {
                    char mot2[100];
                    int i,j;

                    for (i = 0,j = strlen(mot)-1 ; i < strlen(mot) ; i++,j--)//on copie l'inverse du mot saisi dans mot2
                    {
                        mot2[j] = mot[i];
                    }

                    mot2[strlen(mot)]=0;

                    printf("\n\nmot 1 : %s   mot 2 : %s\n\n",mot,mot2);
                    if (strcmp(mot,mot2) == 0)//on compare les deux chaînes
                    {
                        return 1;
                    }
                    else
                    {
                        return 0;
                    }


                }


                ca fonctionne parfaitement maintenant

                et merci de m'avoir répondu minirop.
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  4 novembre 2006 à 16:13:19

                  Version C99, plus simple (utilise un Variable Length Array) :


                  int palindrome(char* mot){
                      int taille=strlen(mot)+1;
                      char mot2[taille];
                      int i,j;
                      for(i=0,j=taille-2;i<taille;i++,j--){
                          mot2[i]=mot[j];
                      }
                      mot2[taille-1]=0; // IMPORTANT !!!
                      return strcmp(mot,mot2)==0;
                  }


                  "pourquoi mettre j=taille-2 dans le for"

                  soit la chaine de caractères char otto[]="otto", elle est constitué de 5 cases pour les lettres 'o', 't', 't', 'o' et le '\0' terminal.
                  strlen(otto)==4, donc taille==5
                  et donc dans "otto", le dernier o est en otto[3] cad 5-2 !

                  "enfin c'est surtout pour le ==0, je vois pas ce qu'il fait là"

                  il s'agit d'un test d'égalité tout simple !
                  int i=0;
                  int iEgal0=i==0;
                  i==0 est une expression booléene qui vaut le résultat du test en question.
                  En tant qu'expression booléenne, on peut l'affecter a une autre variable, la retourner directement, etc...
                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 novembre 2006 à 17:05:56

                    Citation : nightcyborg


                    j'ai fais une fonction pour détécter si un mot est un palindrome. un palindrome est un mot qui se lit pareild ans les deux sens (ex : radar, rotor).
                    <...>
                    en fait je copie l'inverse de la chaine passé en paramétre dans la variable mot2 puis je compare les deux chaines avec strcmp pour savoir si le mot est un palindrome.


                    C'est beaucoup trop complexe comme algorithme. Il n'y a rien à copier du tout. On veut analyser les caractères, c'est tout.

                    Comme toujours, il faut commencer par décrire l'algorithme en langage naturel :

                    Citation : Analyse


                    Lire les caractères du mot en partant du début et de la fin en même temps avec 2 indices. On s'arrête dès que les caractères sont différents. La fin est atteinte quand les indices se sont rejoints.

                    Si on a pas été au bout, le mot n'est pas un palindrome.


                    Je te laisse écrire l'algorithme et régler les détails.

                    EDIT : En gros, c'est la solution de minirop.

                    Version mise au point :

                    #include <stdio.h>
                    #include <string.h>

                    int Palindrome (char const *mot)
                    {
                       int is_pal = 1;
                       int i, j = strlen (mot);

                       for (i = 0; i < j; i++)
                       {
                          if (mot[i] != mot[j - 1 - i])
                          {
                             is_pal = 0;
                             break;
                          }
                       }
                       return is_pal;
                    }

                    int main (void)
                    {
                       char const *s = "radar";
                       printf ("%s %s palindrome\n", s,
                               Palindrome (s) ? "est un" : "n'est pas un");

                       return 0;
                    }

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Music only !
                    Anonyme
                      4 novembre 2006 à 17:16:20


                      bool palindrome(const char*const mot){
                          const int longueur=strlen(mot);
                          for(int i=0,j=longueur-1;i<longueur/2;i++,j--){
                              if(mot[i]!=mot[j]){
                                  return false;
                              }
                          }
                          return true;
                      }
                      • Partager sur Facebook
                      • Partager sur Twitter
                        4 novembre 2006 à 17:50:52

                        merc les gars, mais mon algo marche maintenant donc ca me va. je recherche pas la performence lol. c'est qu'un pett prog en console pour le bahu.
                        • Partager sur Facebook
                        • Partager sur Twitter

                        palindrome

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown