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 :

Mon texte est-il un palindrome ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Par défaut Mon texte est-il un palindrome ?
    Bonjour à tous
    je dois faire un code qui vérifie si mon texte est un palindrome (phrase qui se lit dans les deux sens : engage le jeu que je le gagne)
    j'ai donc fait un code pour saisir, une phrase, ensuite convertit les majuscules en minuscule, supprimer les espaces.

    la dernière partie qui compare les lettres ne fonctionne pas.

    Si quelqu'un comprend où est le problème, merci de m'aider

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
     
    #include<stdio.h>
    #include<stdlib.h>
    unsigned int longueur_chaine(char *texte);
    int main()
    {
        /*declaration des variables*/
     
        int longueur = 0;
        char texte[128] = "" ;
        int i;
        int j = -1;
        int palindrome = 0;
     
        /*saisie du texte*/
        printf("Veuillez saisir une chaine de caractère chaine\n");
        if(fgets(texte, 128, stdin)==NULL)
        {
            printf("Erreur dans la saisie.\n") ;
            return EXIT_FAILURE ;
        }
     
     
        /* conversion des majuscule en minuscule*/
        for(i=0;texte[i]!='\0';i++)
        {
            if(texte[i]>='A' && texte[i]<='Z')
                texte[i]=(texte[i]-'A')+'a';
    }
     
    /*>Supression des espaces*/
        for (i = 0; texte[i]; i++)
           if (texte[i] != ' ')
               texte[++j] = texte[i];
         texte[++j] = '\0';
     
     
     
    /*comparaison du texte*/
         for (i = 0, j = strlen (texte) - 1; i <= j; i++, j--)
         {
             if (texte[i] == texte[j])
               palindrome = 1;
             else {
                 palindrome = 0;
                 break;
             }
         }
     
         /*resultat*/
             if (palindrome == 1)
                 printf ("%s est un palindrome\n", texte);
               else
                 printf ("%s n'est pas un palindrome\n", texte);
     
     
     
         printf("%s\n", texte);
     
     
    return 0;
    }

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 769
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 769
    Par défaut
    Tu es débutant et cela se voit puisque c'est une erreur de débutant (2) ... avec du code de débutant (1).

    1 -> Pas la peine de changer la valeur de ta variable palindrome à chaque tour de boucle: soit tu l'initialises à vrai ou à faux et tu la changes que lorsque c'est nécessaire

    2 -> Il faut inclure ta variable palindrome dans ta condition: tant que c'est un palindrome. Dans ton cas tu testes juste les 2 caractères "centraux" (ou le caractère central si ta chaîne à un nombre impair de caractères)

    Pseudo Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    boolean is_palindrome = true;
    unsigned short len = strlen(str);
     
    // XXX Test: case i == j
    for (i = 0, j = len; (is_palindrome && (i < j)); ++i, --j) {
        if (str[i] != str[j]) { is_palindrome  = false; }
    }

  3. #3
    Membre éclairé Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Par défaut
    Merci pour ton aide
    effectivement je prend note de ta remarque sur "Pas la peine de changer la valeur de ta variable palindrome "

    j'ai donc pris ton code mais je me retrouve avec des erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      boolean is_palindrome = true;
    1) unknown type name boolean
    2) 'true' undeclared boolean palindrome = true

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (texte[i] != texte[j]) { is_palindrome  = false; }
    3) 'false' undeclared (first use in the function)

    je n'ai jamais utilisé de boolean sur C, et si je comprend bien les message d'erreur tout d'abord j'ai un problème car true et false ne sont pas compris nativement ?? il faut les déclarer


    j'ai donc ajouter dans mes déclaration de variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int true = 1;
    int false=0;
    et les erreurs 2 et 3 n'y sont plus
    il me reste la première erreur

    en quoi dois-je déclarer boolean ?

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 312
    Billets dans le blog
    5
    Par défaut
    boolean n'existe pas en C, ni false ou true d'ailleurs.

    Un simple #define int boolean; suffit je pense.

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    boolean n'existe pas en C, ni false ou true d'ailleurs.

    Un simple #define int boolean; suffit je pense.
    Cela existe à partir de C99. Voir stdbool.h.

  6. #6
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 312
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Cela existe à partir de C99. Voir stdbool.h.
    Au temps pour moi. On en apprend tous les jours

  7. #7
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 769
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 769
    Par défaut
    Citation Envoyé par bosk1000 Voir le message
    j'ai donc pris ton code mais je me retrouve avec des erreur
    C'est du pseudo code (et je l'ai précisé) je voulais le faire en algo pur, mais avec la boucle POUR je lorgne vers du C (plus rapide à écrire)
    En algo pur il faudrait utiliser une boucle TANT QUE

    Citation Envoyé par bosk1000 Voir le message
    en quoi dois-je déclarer boolean ?
    Moi je prends des unsigned char avec 0 pour false et 1 pour true (même si en C toute valeur différente de 0 est vrai )

  8. #8
    Membre éclairé Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Par défaut
    Misère je tourne en rond depuis hier

    j'ai fait des tas de test
    et je tourne en rond en m'eparpillant sur plusieurs piste

    exemple
    en utilisant scanf au lieu de gets

    il fonctionne seulement si j'utilise des mots sans espace

    donc j'utilise gets
    mais la ça ne fonctionne plus

    ici le test avec scanf qui fonctionnera sur un mot, mais ne fonctionnera pas avec une phrase
    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
     
    #include <stdio.h>
    #include<string.h>
     
    int main (int argc, char **argv)
    {
      char mot[20];
      int i, j, palindrome;
      palindrome = 1;
     
      printf ("Entrez un mot : ");
      scanf ("%s", mot);
     
     
      /* conversion des majuscule en minuscule*/
      for(i=0;mot[i]!='\0';i++)
      {
          if(mot[i]>='A' && mot[i]<='Z')
              mot[i]=(mot[i]-'A')+'a';
    }
     
        printf ("%s est a comparer\n", mot);
     
     
      for (i = 0, j = strlen (mot) - 1; i <= j; ++i, --j){
          if (mot[i] != mot[j])
            palindrome = 0;
              break;
          }
      if (palindrome == 1)
        printf ("%s est un palindrome\n", mot);
      else
        printf ("%s n'est pas un palindrome\n", mot);
     
      return 0;
    }



    la j'utilise fgets mais impossible de faire la comparaison
    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
    50
    51
     
    #include<stdio.h>
    #include<stdlib.h>
    unsigned int longueur_chaine(char *texte);
    int main()
    {
        /*declaration des variables*/
     
     int longueur = 0;
     char texte[128] = "" ;
     int i, j=-1 , palindrome;
     int true = 1;
    int false=0;
     
        /*saisie du texte*/
        printf("Veuillez saisir une chaine de caractère chaine\n");
       fgets(texte, 128, stdin);
     
        /* conversion des majuscule en minuscule*/
        for(i=0;texte[i]!='\0';i++)
        {
            if(texte[i]>='A' && texte[i]<='Z')
                texte[i]=(texte[i]-'A')+'a';
    }
     
    /*>Supression des espaces*/
        for (i = 0; texte[i]; i++)
           if (texte[i] != ' ')
               texte[++j] = texte[i];
         texte[++j] = '\0';
     
    printf ("test pour verifier le texte %s \n", texte);
     
     
          palindrome = true;
     
     
         for (i = 0, j = strlen(texte)-1 ; (palindrome = false && (i < j)); ++i, --j)
         {
     
             if (texte[i] != texte[j]) { palindrome  = false; }
     
         }
         if (palindrome == true)
                      printf ("%s est un palindrome\n", texte);
                    else
                      printf ("%s n'est pas un palindrome\n", texte);
     
     
    return 0;
    }
    ici le texte est conforme avant la comparaison mais ça ne fonctionne pas

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    As-tu pensé à consulter la documentation de la fonction fgets ? Si oui, tu aurais pu y lire ceci
    Reads at most count - 1 characters from the given file stream and stores them in str. The produced character string is always null-terminated. Parsing stops if end-of-file occurs or a newline character is found, in which case str will contain that newline character.
    Il en est de même pour le format %s avec scanf qui s'arrête au premier caractère "blanc" rencontré.

    Sans parler du forum qui fourmille de membres ayant déjà rencontré ces soucis.

  10. #10
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 769
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 769
    Par défaut
    Dans le premier code (scanf) tu ne testes pas la variable palindrome dans le test ta boucle for.
    Et dans le deuxième code (fgets) tu fais une affectation et non pas une comparaison dans le test ta boucle for.

    Sinon, tu peux faire un truc tout simple pour tester ton code.
    Si ton programme s'appelle test_palindrome.exe, tu peux le lancer à la ligne de commande (ou il faut configurer son IDE) ainsi: test_palindrome.exe "ma chaîne de caractère"

    argc vaudra 2 et argv[1] sera ta chaîne à tester à laquelle tu dois supprimer les guillemets (ou alors tu peux les laisser )

    Édit: gcc sous cygwin supprime les guillemets

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mon texte est pixelisé
    Par vocal94130 dans le forum Webdesign & Ergonomie
    Réponses: 2
    Dernier message: 22/12/2011, 20h35
  2. Mon texte n'est plus justifier
    Par mayite dans le forum Mise en forme
    Réponses: 3
    Dernier message: 13/08/2011, 13h25
  3. Mon image de fond est au dessus de mon texte
    Par herzak dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 27/06/2009, 14h50
  4. [Access] Mon application est détruite !!!
    Par mathias dans le forum Access
    Réponses: 4
    Dernier message: 26/06/2003, 14h14

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