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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 130
    Points : 146
    Points
    146
    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 sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    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 habitué
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 130
    Points : 146
    Points
    146
    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 sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    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 à l'essai
    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
    Points : 18
    Points
    18
    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 sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    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...

  8. #8
    Membre à l'essai
    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
    Points : 18
    Points
    18
    Par défaut
    PS: 4, c'est pair
    Oups, désolé

  9. #9
    Membre régulier Avatar de O( N )
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2006
    Messages : 126
    Points : 120
    Points
    120
    Par défaut
    Pardon de m'excuser, il me semble presque correct ton code de départ et clair en plus !

    J'ai mis entre ' ' les modifs et je les un peu commenté pour que tu saississent tes manques

    Enlève les ' ' avant de compiler

    Voilà, il me semble, ton code et sans erreurs
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    'ifndef SIZEMAX'
    '#define SIZEMAX 80' // (ce que tu veux en fait)
    '#endif'
    int palindrome(char *s, int debut, int fin)
    {
      if ('debut-fin >= 0) ; // le cas ou fin <= debut => (>= 0) et tu vérifies les deux cas ici pairs et impairs'
        return 1;
      if (s[debut]==s[fin]) 
         'return' palindrome(s, debut+1, fin-1);
      else return 0;
    }
     
    int main()
    {
      char *s;// s est un pointeur vers un espace mémoire => il faut allouer (prendre) de l'espace mémoire
      's = (char*)  malloc(sizeof(char)*SIZEMAX);
      if (! s) { printf ("erreur dans l'allocation mémoire de s\n"); return (-1); } // gestion d'erreur après allocation (toujours)
      '//int debut=0; // début est toujours à 0 => inutile, tu mets 0 dans l'appel directement ;) '
      int fin='0'; // tu l'initialises à 0;// au cas où l'utilisateur distrait appuie sur entrée avant de rentrer une lettre.
     // int lon=strlen(s);// tu ne connaît pas la longueur de s ici!
     
      printf("chaine à verifier :");
      scanf("%s",&s);// comme tu as alloué SIZEMAX caractère pour s => tu peux rentrer jusqu'à SIZEMAX caractères ici ^^'
      'fin = strlen(s);' // maintenant tu connaît s donc sa longeur aussi ;) !
     
      //printf("chaine :%s",&s);
      //printf("longueur :%d",&fin);
     
      if(palindrome(s,'0',fin))
        printf("c'est un palindrome\n");
      else
        printf("ce n'est pas un palindrome\n");
     
      system("pause");
     
      return EXIT_SUCCESS; // ou return 0; c moins long à écrire :D
    }
    VALA

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

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    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