IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

[Débutant] Détection si une chaine de caractères est un palindrome


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 132
    Par défaut [Débutant] Détection si une chaine de caractères est un palindrome
    Bonjour,

    je cherche à réaliser un script qui détermine si une chaine est un palindrome, c'est à dire sysmétrique, qui peut se lire de la même façon de gauche à droite ou de droite à gauche. Par exemple, ana, non, rever...

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int palindrome(char *s, int debut, int fin)
    {
      if (fin-debut==0)
        return 1;
      if (s[debut]==s[fin]) 
         palindrome(s, debut+1, fin-1);
      else return 0;
    }
     
    int main()
    {
      char *s;
      int debut=0;
      int fin=2;
      //int lon=strlen(s);
     
      printf("chaine à verifier :");
      scanf("%s",&s);
     
      //printf("chaine :%s",&s);
      //printf("longueur :%d",&fin);
     
      if(palindrome(s,debut,fin))
        printf("c'est un palindrome\n");
      else
        printf("ce n'est pas un palindrome\n");
     
      system("pause");
     
      return EXIT_SUCCESS;
    }
    je rencontre plusieurs problémes:

    - impossible de récupérer correctement la longueur de ma chaine de caractères, c'est pourquoi fin est initialisé à 3 (test de chaines de 3 caractères)

    - lorsque je rentre une chaine de 3 caractères qui est un palindrome certaines fois le programme le détecte, d'autres fois non...
    Là je ne comprends pas vraiment ce qui se passe...

    - Lorsque que la chaine n'est pas un palondrome le programme quitte sans passer par l'affichage qui est prévu dans ce cas

    Je suis débutant et après pas mal de temps à essayer de résoudre ces problèmes, j'ai besoin de quelques éclaircissements.

    Merci pour vos réponses.

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par tomasi
    Bonjour,
    Bonsoir et bienvenue sur les forums de Développez.
    je cherche à réaliser un script
    Il n'y a pas de script en C. C'est un 'programme', tout simplement.
    qui détermine si une chaine est un palindrome, c'est à dire symétrique, qui peut se lire de la même façon de gauche à droite ou de droite à gauche. Par exemple, ana, non, rever...
    OK.
    Voici mon code :
    Euh, avant de coder, il faudrait peut être analyser correctement le problème.

    Déjà, je vois 2 cas :
    • La chaine a une longueur paire
    • La chaine a une longueur impaire

    Le comportement est différent :
    • Si elle est paire, on a N/2 tests à faire du style s[i]= [N-1-i] avec i variant de 0 à (N/2)-1
    • Si elle est impaire, il y a (N-1)/2 tests s[i] = s[N -1-i] avec i variant de 0 à ((N-1)/2)-1.

    Le reste du code est assez horrible...

    Voici un code qui fonctionne selon le principe énoncé ci-dessus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int palindrome (char *s)
    {
       int ok = 1;
       size_t const n = strlen (s);
     
       if ((n % 2) == 0)
       {
          /* pair */
          size_t i;
          for (i = 0; ok && i < n / 2; i++)
          {
             ok = s[i] == s[n - 1 - i];
          }
     
       }
       else
       {
          /* impair */
          size_t i;
          for (i = 0; ok && i < ((n - 1) / 2); i++)
          {
             ok = s[i] == s[n - 1 - i];
          }
       }
       return ok;
    }
     
    int main (void)
    {
       char s[32];
     
       printf ("chaine a verifier :\n");
       scanf ("%31s", s);
     
       if (palindrome (s))
       {
          printf ("c'est un palindrome\n");
       }
       else
       {
          printf ("ce n'est pas un palindrome\n");
       }
     
       return EXIT_SUCCESS;
    }
    Pose des questions si tu ne comprends pas.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 132
    Par défaut
    Tout d'abord merci pour la rapidité de cette réponse

    il y a plusieurs choses que je ne comprends pas (et oui je suis débutant)

    - à quoi correspond la variable ok et à comment comprendre le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ok = s[i] == s[n - 1 - i];
    de plus au sens stricte si la chaine est un palindrome est elle est forcément impaire car un mot de é lettres n'en est pas un (peu importe en fait, c'est une question de définition)

    dernière chose :

    dans à quoi correspond le 31 ?

    Merci pour tout ces conseils

    à la chaine + le caractère \0 ?

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par tomasi
    - à quoi correspond la variable ok
    ok, comme "OK, c'est un palindrome" (1). ou "Pas OK, ce n'est pas un palindrome" (0). C'est un classique quand on écrit une fonction qui retourne un état binaire...
    comment comprendre le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ok = s[i] == s[n - 1 - i];
    En C, une expression retourne un int valant 0 ou 1. L'égalité
    est donc évaluée, et sa valeur est stockée dans ok.
    de plus au sens stricte si la chaine est un palindrome est elle est forcément impaire car un mot de é lettres n'en est pas un
    é ? tu veux dire 2 ? Alors il faut rejeter les mots non conformes.
    (peu importe en fait, c'est une question de définition)
    Absolument.
    dans à quoi correspond le 31 ?
    à la chaine + le caractère \0 ?
    Exactement. Relire la spec de scanf()...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 52
    Par défaut
    "elle" est un palidrome, pourtant nombre de caractères impair, si les deux lettres du mileu sont les mêmes, ça pose pas de soucis.

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Preez
    "elle" est un palidrome, pourtant nombre de caractères impair, si les deux lettres du mileu sont les mêmes, ça pose pas de soucis.
    Peu importe la définition, du moment qu'elle est cohérente et que le code est conforme. La définition, c'est l'affaire du client, pas du codeur.
    (Mais ce dernier peut poser des questions en cas d'incohérences flagrantes...)

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    PS: 4, c'est pair.

    Et pour moi, l'argument de Preez suffirait à fondre les deux cas pair/impair en un seul...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,
    Citation Envoyé par tomasi
    de plus au sens stricte si la chaine est un palindrome est elle est forcément impaire car un mot de é lettres n'en est pas un (peu importe en fait, c'est une question de définition)
    D'où sort ceci ?
    Dans la définition d'un palindrome, il n'y a aucune restriction sur la longueur du mot (ou de la phrase, ou de ce à quoi on veut l'appliquer): pour qu'on puisse parler de palindrome, il suffit qu'en inversant le sens de parcours, on trouve la même succession de lettres, sans tenir compte des signes diacritiques (accents et autres petits symboles complétant une lettre [cédille, tilde...]), ni des espaces et éventuels signes de ponctuation.

    Exemples donnés par "Le Petit Robert" :
    - ressasser
    - élu par cette crapule

Discussions similaires

  1. tester si une chaine de caractère est un entier ?
    Par farid0031 dans le forum C++Builder
    Réponses: 7
    Dernier message: 12/05/2009, 16h32
  2. Réponses: 3
    Dernier message: 12/12/2008, 10h47
  3. Vérifier qu'une chaine de caractère est bien présente
    Par kilian67 dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 28/09/2007, 18h10
  4. Réponses: 3
    Dernier message: 26/12/2006, 09h13
  5. [Débutant]Encodage d'une chaine de caractères
    Par Crazyblinkgirl dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 03/08/2004, 16h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo