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 :

Mettre les mots palindromes d'un fichier dans un autre fichier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 21
    Par défaut Mettre les mots palindromes d'un fichier dans un autre fichier
    Bonsoir ,
    Soit un fichier « mots.txt » contenant des mots, écrire un programme qui permet de trouver les palindromes, de les écrire dans un autre fichier « palindrome.txt » et d’afficher leur nombre.
    J'ai écrit un programme pour cet exercice mais l'exécution bloque comme l'indique cette image
    Nom : Sans titre.png
Affichages : 951
Taille : 116,6 Ko
    Pourriez vous m'aider à trouver le problème s'il vous plait et merci .
    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    #include <stdio.h>
    #include <stdlib.h>
    int nombre(FILE *f1)// retourne le nombre de mots dans un fichier
    { int a=0;
      int b=0;
      int i=0;
         do
          {
              a=fgetc(f1);
              b=fgetc(f1);
              fseek(f1,-1,SEEK_CUR);
     
              if(((a == ' ')||(a == '\n'))&&(b!=' ')&&(b!='\n'))
              {
                  i++;
     
              }
          }while(b!=EOF);
          i++;
         return i;
       }
    int palindrome(int n,char ch[n])//retourne 1 si le mot est palindrome 0 sinon
    {
    int a=1;
    for (int i=0;i<(n/2);i++)
    {
        if (ch[i]!=ch[n-i-1])
        {
     
            a=0;
     
        }
    }
    return a;
    }
     
     
     
    int main()
    {
        int c=0;
        FILE *f1=NULL;
        FILE *f2=NULL;
        f1=fopen("mots.txt","r");
        f2=fopen("palindrome.txt","a");
        if ((f1==NULL)||(f2==NULL))
        {
            printf("erreur d'ouverture");
        }
        else
        {
         do
          {
            int j=0;
     
            do  //cette boucle permet de déterminer la longeur de chaqu'un des mots du fichier
              {
                  c=fgetc(f1);
                  j++;
              }while ((c!=' ')||(c!='\n'));
     
            fseek(f1,-j,SEEK_CUR);//Pour faire retourner le cursor vers le début du mot qui précede le 1er espace ou retour à la ligne rencontré.
            char *T=malloc(j*sizeof(char));
     
            for(int i=0;i<j;i++)//mettre le mot trouvé dans un tableau et remettre le cursor à la position avec laquelle il a quitté la boucle do
              {
                  T[i]=fgetc(f1);
              }
     
             if(palindrome(j,T)==1)// vérifier si le mot est palindrome et le mettre dans f2 si c'est le cas
              {
                  fputs(T,f2);
              }
     
          }while (c!=EOF);
        printf("Le nombre des mots palindromes est %d \n :",nombre(f2));
        }
        fclose(f1);
        fclose(f2);
     
    }

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    ligne 60, le code reboucle pour les caractère différent de espace ou bien différent de retour chariot. Tous les caractères du monde vérifient cela (y compris espace et retour chariot!).
    Il y a des malloc() mais jamais de free ...

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 21
    Par défaut
    Citation Envoyé par dalfab Voir le message
    Bonjour,

    (y compris espace et retour chariot!).
    Il y a des malloc() mais jamais de free ...
    Vous avez raison j'oublier toujours de libérer mes allocations dynamiques mais même en faisant cela le programme ne fonctionne pas par contre en ce qui concerne la ligne 60 si on suppose que le fichier ne contient que des caractères alphabétiques ,des espaces et des retours à la ligne la sortie de la boucle do sera faite seulement si le caractère est un espace ou un retour à la ligne.
    update du 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
    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    #include <stdio.h>
    #include <stdlib.h>
    int nombre(FILE *f1)// retourne le nombre de mots dans un fichier
    { int a=0;
      int b=0;
      int i=0;
         do
          {
              a=fgetc(f1);
              b=fgetc(f1);
              fseek(f1,-1,SEEK_CUR);
     
              if(((a == ' ')||(a == '\n'))&&(b!=' ')&&(b!='\n'))
              {
                  i++;
     
              }
          }while(b!=EOF);
          i++;
         return i;
       }
    int palindrome(int n,char ch[n])//retourne 1 si le mot est palindrome 0 sinon
    {
    int a=1;
    for (int i=0;i<(n/2);i++)
    {
        if (ch[i]!=ch[n-i-1])
        {
     
            a=0;
     
        }
    }
    return a;
    }
     
     
     
    int main()
    {
        int c=0;
        FILE *f1=NULL;
        FILE *f2=NULL;
        f1=fopen("mots.txt","r");
        f2=fopen("palindrome.txt","a");
        if ((f1==NULL)||(f2==NULL))
        {
            printf("erreur d'ouverture");
        }
        else
        {
         do
          {
            int j=0;
     
            do  //cette boucle permet de déterminer la longeur de chaqu'un des mots du fichier
              {
                  c=fgetc(f1);
                  j++;
              }while ((c!=' ')||(c!='\n'));
     
            fseek(f1,-j,SEEK_CUR);//Pour faire retourner le cursor vers le début du mot qui précede le 1er espace ou retour à la ligne rencontré.
            char *T=malloc(j*sizeof(char));
     
            for(int i=0;i<j;i++)//mettre le mot trouvé dans un tableau et remettre le cursor à la position avec laquelle il a quitté la boucle do
              {
                  T[i]=fgetc(f1);
              }
     
             if(palindrome(j,T)==1)// vérifier si le mot est palindrome et le mettre dans f2 si c'est le cas
              {
                  fputs(T,f2);
              }
              free(T);
     
          }while (c!=EOF);
        printf("Le nombre des mots palindromes est %d \n :",nombre(f2));
        }
        fclose(f1);
        fclose(f2);
     
    }

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Citation Envoyé par kerrons Voir le message
    en ce qui concerne la ligne 60 si on suppose que le fichier ne contient que des caractères alphabétiques ,des espaces et des retours à la ligne la sortie de la boucle do sera faite seulement si le caractère est un espace ou un retour à la ligne.
    Non, on ne sortira de la boucle que si le caractère est à la fois une espace et un retour à la ligne. Ce qui est évidemment impossible. relis toi bien.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 21
    Par défaut
    J'ai changé la condition de sortie toujours même problème .
    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    #include <stdio.h>
    #include <stdlib.h>
    int nombre(FILE *f1)// retourne le nombre de mots dans un fichier
    { int a=0;
      int b=0;
      int i=0;
         do
          {
              a=fgetc(f1);
              b=fgetc(f1);
              fseek(f1,-1,SEEK_CUR);
     
              if(((a == ' ')||(a == '\n'))&&(b!=' ')&&(b!='\n'))
              {
                  i++;
     
              }
          }while(b!=EOF);
          i++;
         return i;
       }
    int palindrome(int n,char ch[n])//retourne 1 si le mot est palindrome 0 sinon
    {
    int a=1;
    for (int i=0;i<(n/2);i++)
    {
        if (ch[i]!=ch[n-i-1])
        {
     
            a=0;
     
        }
    }
    return a;
    }
     
     
     
    int main()
    {
        int c=0;
        FILE *f1=NULL;
        FILE *f2=NULL;
        f1=fopen("mots.txt","r");
        f2=fopen("palindrome.txt","a");
        if ((f1==NULL)||(f2==NULL))
        {
            printf("erreur d'ouverture");
        }
        else
        {
         do
          {
            int j=0;
     
            do  //cette boucle permet de déterminer la longeur de chaqu'un des mots du fichier
              {
                  c=fgetc(f1);
                  j++;
              }while ((64<c<91)||(96<c<123));
     
            fseek(f1,-j,SEEK_CUR);//Pour faire retourner le cursor vers le début du mot qui précede le 1er espace ou retour à la ligne rencontré.
            char *T=malloc(j*sizeof(char));
     
            for(int i=0;i<j;i++)//mettre le mot trouvé dans un tableau et remettre le cursor à la position avec laquelle il a quitté la boucle do
              {
                  T[i]=fgetc(f1);
              }
     
             if(palindrome(j,T)==1)// vérifier si le mot est palindrome et le mettre dans f2 si c'est le cas
              {
                  fputs(T,f2);
              }
              free(T);
     
          }while (c!=EOF);
        printf("Le nombre des mots palindromes est %d \n :",nombre(f2));
        }
        fclose(f1);
        fclose(f2);
     
    }

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    On veut sortir de la boucle si le caractère est une espace ou bien un retour chariot.
    Donc on veut rester dans la boucle si le caractère n'est pas une espace et n'est pas non plus un retour chariot.

    Le test était faux, maintenant while ((64<c<91)||(96<c<123)); n'a plus aucun sens et est illisible mais maintenant il faut bien un ou car on boucle si minuscule ou majuscule. Il faudrait while ( ('a'<=c && c<='z') || ('A'<=c && c<='Z') ); ou bien while ( c !=' ' && c != '\n' );.

    Cette boucle va lire un caractère de plus que la longueur du mot; Valeur qui est dans j. Il donc bien reculer de j et réserver un caractère de plus pour le terminateur dans le malloc. Mais après avoir lu j caractères il faut remplacer le dernier par un '\0' sinon le puts(T) ne fonctionnera pas. Et la longueur à passer à palindrome est la longueur du mot donc j-1;

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

Discussions similaires

  1. [Batch] Copier les X premieres lignes d'un fichier dans un autre fichier
    Par Elwess26 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 16/03/2016, 14h22
  2. Réponses: 2
    Dernier message: 27/04/2009, 23h14
  3. Réponses: 4
    Dernier message: 28/08/2007, 17h11
  4. Réponses: 1
    Dernier message: 15/05/2007, 16h55
  5. include fichier dans une autre fichier
    Par MSM_007 dans le forum C
    Réponses: 3
    Dernier message: 07/04/2007, 09h11

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