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 :

Fichier,pile et verification des accolades


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Par défaut Fichier,pile et verification des accolades
    salut
    j'essaye de vérifier est ce que les accolades dans un programme sont correctes autrement dit vérifier que tous les accolades ouverts ont été fermés .

    pour cela,j'utilise une pile ,l'idée est simple à chaque fois qu'on a accolade ouvert on empile et si on a un accolade fermé ont depiler , à la fin du programme on doit(normalement ) trouvé la pile vide :
    Nombre accolade ouvert = Nombre accolade fermé.

    en outre,j'utilise un fichier.c.
    mais le programme lorsqu'il s'exécute il cessé de fonctionner !!
    voici mon essai:
    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
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    typedef struct element
            {
                   char c;
                   struct element *suivant;
            }elt;
    void  empiler(char c,elt **Tete)
          {
                        elt  *nv=(elt *)malloc(sizeof(elt));
                        nv->c ='c';
                        nv->suivant=(*Tete);
                        (*Tete)=nv;
          }
    void   depiler(elt **Tete)
          {
                       elt *teteLiberer;
                       teteLiberer=(*Tete);/*recuper le pointeur à libere*/
                       (*Tete)=(*Tete)->suivant;/*chager la tête */
                       free(teteLiberer);/*libere les element */
          }
     
    int  verifier_prog(FILE *f)
         {
                            char c;
                            f=fopen("a.c","r");
                            elt *tete=NULL;/*c la pile*/
                            while(!feof(f))/*tant qu'on n'est pas arriver à la fin */
                                {
                                                  fread(&c,1,1,f);
                                                 if(!feof(f))
                                                           {
     
                                                                 if(c=='{')
                                                                           empiler(c,&tete);/*tete=NULL*/
                                                                 else
                                                                     {
                                                                           if(c=='}')
                                                                              if(tete!=NULL)
                                                                                            depiler(&tete);
                                                                     }
                                                           }
                                }
                                fclose(f);
                                if(tete==NULL)
                                              return 1;
                                else
                                              return 0;
     
         }
     
    int main()
    {
        FILE *f;
        int b=1;
        b=verifier_prog(f);
        if(b==1)
                printf("le programme est correct ");
        else
                printf("le programme est incorrect ");
     
       getch();
       return 0;               
    }
    je serais trés reconnaissante si quelqu'un peut m'aider à trouver l'erreur

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Pourquoi tu t'embêtes avec une liste chaînée ? Il suffit de les compter. Tu déclares une variable de type int, tu l'initialises à zéro, tu lis ton fichier de manière linéaire et tu comptes +1 à chaque accolade ouvrante et -1 pour chaque fermante.

    À la fin de ton fichier, tu dois être à zéro, sinon, il y a une erreur.

    Si tu veux être puriste, tu vérifies que tu ne te trouves pas dans une chaîne.

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Par défaut
    salut
    l'énoncé de l'exercice m'impose d'utiliser une pile

    merci pour votre participation

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Par défaut
    j'ai fait une erreur c'est que j'ai mis .c au lie de .cpp.
    mais ce donne au programme ,un prog là où les accoldes sont incorrectes il m'affiche qu'ils sont correctes

  5. #5
    Membre éclairé Avatar de mikhailo
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 78
    Par défaut
    J'ai lu ton code un peu en diagonale, mais il faut que tu vérifies aussi l'ordre des accolades: il faut qu'à chaque moment le nombre d'accolades ouvertes soit supérieur ou égal au nombre d'accolades fermées:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    { { } } } {   //pas correct
    Donc au niveau de la pile, il faut gérer le cas où tu essaies de dépiler alors que ta pile est vide... ou mettre un compteur pour éviter ça. Ou p'tet' que je n'ai pas compris et tu le faisais déjà =)

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

Discussions similaires

  1. verification des données d'un fichier texte
    Par tek.csharp dans le forum C#
    Réponses: 1
    Dernier message: 17/05/2010, 14h03
  2. Registre Fichiers systemes et barre des tâches
    Par cartonis dans le forum Autres Logiciels
    Réponses: 16
    Dernier message: 21/08/2009, 03h45
  3. [XML] validation de fichier XML:l'ordre des balises compte ?
    Par longbeach dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 04/09/2005, 18h53
  4. fichier .bat : problèmes avec des sous-répertoires
    Par aymron dans le forum Windows
    Réponses: 4
    Dernier message: 23/06/2005, 09h33
  5. Verification des champs d'un formulaire
    Par 164emie dans le forum ASP
    Réponses: 5
    Dernier message: 19/11/2003, 14h03

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