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

  1. #1
    Membre averti 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
    Points : 367
    Points
    367
    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 éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    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 630
    Points : 10 556
    Points
    10 556
    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 averti 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
    Points : 367
    Points
    367
    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 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    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
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    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 630
    Points : 10 556
    Points
    10 556
    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 )

  6. #6
    Membre averti 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
    Points : 367
    Points
    367
    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

  7. #7
    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.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    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 630
    Points : 10 556
    Points
    10 556
    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

  9. #9
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    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.

  10. #10
    Membre averti 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
    Points : 367
    Points
    367
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Bonsoir,

    As-tu pensé à consulter la documentation de la fonction fgets ? Si oui, tu aurais pu y lire ceci

    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.
    Malheureusement mon anglais est bien piètre

  11. #11
    Invité
    Invité(e)

  12. #12
    Membre averti 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
    Points : 367
    Points
    367
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    mea culpa

    je cherche priritairement des forum en français pour eviter des traduction trop inexacte

    pour revenir sur ton précédent propos
    en partant de ce que tu m'as dit sur le problème de scanf et fgets,
    la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     printf("Veuillez saisir une chaine de caractère  :\n");
     gets(texte);
    serait-elle plus adapté pour lire avec des espaces ?

  13. #13
    Invité
    Invité(e)
    Par défaut
    Surtout pas la fonction gets malheureux, cette fonction est très fortement dépréciée ! Conserve la fonction fgets et supprime simplement le caractère de nouvelle ligne.

  14. #14
    Membre averti 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
    Points : 367
    Points
    367
    Par défaut
    ha mince
    dans mes recherche je venais de trouver un corriger de cette exercice qui l'utilise

    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
     
    #include <stdio.h>
    main()
    {
     /* Déclarations */
     char CH[101]; /* chaîne donnée    */
     int I,J;      /* indices courants */
     int PALI;     /* indicateur logique:          */ 
                   /* vrai si CH est un palindrome */
     
      /* Saisie des données */
     printf("Entrez une ligne de texte (max.100 caractères) :\n");
     gets(CH);
     /* Placer J sur la dernière lettre de la chaîne */
     for(J=0; CH[J]; J++)
         ;
     J--;
     /* Contrôler si CH est un palindrome */
     PALI=1;
     for (I=0 ; PALI && I<J ; I++,J--)
          if (CH[I] != CH[J])
              PALI=0;
     
      /* Affichage du résultat */
     if (PALI)
        printf("La chaîne \"%s\" est un palindrome.\n", CH);
     else
        printf("La chaîne \"%s\" n'est pas un palindrome.\n", CH);
     return 0;
    }
    du coup je pensais que mon erreur venait de là

    je pensais partir de ça pour comprendre les erreurs que j'ai fait car il se rapproche dans l'idée
    surtout que si je comprend bien mon erreur dans mon code, ce n'ai pas dans la comparaison à la fin du code, mais dans la lecture au début ?
    c'est bien cela ?

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    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

  16. #16
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Surtout pas la fonction gets malheureux, cette fonction est très fortement dépréciée ! Conserve la fonction fgets et supprime simplement le caractère de nouvelle ligne.
    Pour enfoncer le clou et bien comprendre pourquoi : https://gradot.wordpress.com/2013/05...-programmes-c/



    Citation Envoyé par gerald3d Voir le message
    Au temps pour moi. On en apprend tous les jours
    Oui

  17. #17
    Membre averti 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
    Points : 367
    Points
    367
    Par défaut
    je comprends pourquoi ne pas utiliser gets

    du coup je suis perdus

    printf si j'ai bien compris ne lit pas au delà de l'espace ?

    dois je utiliser fgets ?
    si oui comment faire pour que l'espace ne génère pas d'erreur de comparaison ?


    Stdbool.h permet d'utiliser false et true sans utiliser devoir les initialiser en variable ?

  18. #18
    Invité
    Invité(e)
    Par défaut
    Savais-tu que l'on avait une FAQ C, qui plus est en français ?


    scanf et non printf (qui lui sert à l'affichage) ne lit pas forcément jusqu'au premier espace, cela dépend du format qu'on lui passe. Mais c'est bien le cas pour "%s".
    À lire :

  19. #19
    Membre averti 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
    Points : 367
    Points
    367
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Savais-tu que l'on avait une FAQ C, qui plus est en français ?


    scanf et non printf (qui lui sert à l'affichage) ne lit pas forcément jusqu'au premier espace, cela dépend du format qu'on lui passe. Mais c'est bien le cas pour "%s".
    À lire :
    Merci pour toutes ces informations
    Je vais avoir de la lecture et de l'assimilation en perspective

    donc je vais étudier scanf s'il solutionne mon problème

  20. #20
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Si, par hasard, ce n'est pas encore clair.

    gets() est tout à la fois dangereuse, dépréciée, et disparue en C moderne (C11) (du moins, avec mon gcc ).

    Dangereuse, parce qu'elle écrit dans la mémoire, sans contrainte.
    Ainsi, il est possible de profiter d'un programme utilisant gets pour écraser une partie de ses données.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void function() {
    char buffer[256];
    char mot_de_passe_accepte = 0;
    gets(buffer);//je ne sais même plus sa syntaxe, c'est dire...
    //...
    }
    Quand function est appelée, si je donne une réponse de 258 chars, dont le 256° est celui de valeur 1, mot_de_passe_accepte sera écrasé avec ce 1.
    C'est l'une des manières de violer un programme.

    Il est possible de faire pire, parce qu'il se peut que cette mémoire écrasée soit du code exécuté, ouvrant la voie à l'exécution de code arbitraire.

    En résumé, parce que gets n'est pas utilisable parce qu'elle ne possède pas d'argument limitant la taille lue.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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