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 :

Exo sur graphe


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Par défaut Exo sur graphe
    Bonjour,

    Je voudrai svoir si le code que j'ai écrit est correct car dans le cadre de l'exo il n'y a que le prototype des fonctions et pas leur code.

    Merci par avance

    Dans le problème, nous manipulons des graphes, dont les noeuds sont des entiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef struct noeud {
      int n;
      struct noeud **tab; /*Tableau de pointeurs sur d'autres noeuds 
    			transitions sortantes du noeud)*/
    }Noeud;
     
    typedef struct {
      Noeud *racine;//Designe un noeud du graphe
    }Graphe;
    On supposera que tous les noeuds du graphe sont accessibles à partir de celui désigné par par le pointeur racine de la structure Graphe.
    Sur la figure, le noeud racine contient 1 (montré par la flèche entrante). Même si ce n'est pas le cas sur la figure, deux noeuds différents peuvent contenir le me entier.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
       --------|
      |          |
      |  5---->4
      | ^ \   ^^
      v/   \ / |
    ->1     /  |
       \   / \ |
        v /   vv
         3---->2
    Dans la suite du problème on supposera que tous les graphes ont un nombre de noeuds majorés par MAXNOEUDS.
    On souhaite sauvegarder et relire la structure de graphe dans un fichier texte. Les noeuds y sont décrits en parenthèses. L'entier contenu dans le noeud est écrit après la parenthèse ouvrante. Ensuite, chacun des noeuds fils(peu importe l'ordre), à nouveau entre parenthèse. La sauvegarde est réalisée en effectuant un parcours en profondeur du graphe. Au fur et à mesure que les noeuds sont rencontrés pendant le parcours, ils sont mis dans une table de hachage, qui permet :
    -de savoir qu'on est déjà passé par le noeud
    -de lui associer un numéro de passage(le premier noeud par lequel le parcours en profondeur est passé a numéro 1, le second 2, etc)
    Quand le fils d'un noeud a déjà été rencontré lors du parcours en profondeur, on le remplace par son numéro de passage, écrits entre crochets, dans le fichier.
    Par exemple, si le parcours en profondeur passe dans l'ordre par les noeuds contenant 1,3,2,4 et 5, le contenu du fichier sera (1(3(2(4[3][1]))[4])(5[2][4])

    Pour éviter d'implanter les tables de hachages, on fait une recherche sur le Web, et on trouve un module C implantant les tables de hachages de manière générique. Le module est composé de 2 fichiers,
    tableHachage.h et tableHachage.c. Le fichier tableHachage.h est le suivant :
    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
    #ifndef _TABLEHACHAGE_H
    #define _TABLEHACHAGE_H
     
    /* Ici pleins de typedef qui ne nous interessent pas, y compris celui 
    pour un type s'appelant _tableHachage, que nous n'utiliserons jamais
    */
    ...
     
    /* Le type pour les tables de hachage: c'est un pointeur, mais on ne sait pas 
    exactement comment sont implantées les tables de hachage, et d'ailleurs on s'en moque
    */
     
    typedef _tableHachage * tableHachage;
     
    /* Cette fonction crée une table de hachage dont on précise la taille.
    Retourne 1 si tout se passe bien, 0 sinon;
    Au retour de la fonction, *th désigne la table de hachage crée
    */
    extern int creerTableHachage(size_t taille,
                                             unsigned int (*fonctionHachage)(void *clef),
                                             unsigned int (*cmpClefs)(void *clef1, void *clef2),
                                             tableHachage *th);
     
    /*Cette fonction insère l'association entre clef et valeur dans la table de hachage th.
    Si la clef était déjà présente dans la table, l'ancienne valeur qui lui était associée est écrasé
    par la nouvelle.
    Elle retourne 1 si l'insertion s'est bien déroulé, 0 sinon
    */
    extern int insereDansTableHachage(const void *clef,
                                      const void *valeur,
                                      tableHachage th);
     
    /*Cette fonction retourne un pointeur sur la valeur associée à clef si elle existe, NULL sinon
    */
    extern void *rechercheDansTableHachage(const void *clef, 
                                           const tableHachage th);
     
    /*Libération de l'espace mémoire pris par une table de hachage
    Au retour de la fonction, *th vaut NULL 
    */
    extern void libereTableHachage(tableHachage *th);
     
    #endif
    Dans la suite, nous nous interdisons de modifier les fichiers récupérés sur le Web

    Exercices :
    -Ecrire une fonction int ecrireGraphe(const Graphe *g, FILE *fdo) qui écrit le graphe désigné par g dans le flot fdo qu'on suppose ouvert dans le bon mode
    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
    /*0:OK, 1:erreur*/
    int ecrireGraphe(const Graph *g, FILE *fdo)
    {
      tableHachage th;/*table de hachage*/
      int i;/*indice de boucle*/
      char *val;/*valeur associee a une cle*/
     
      /*Creation de la table hachage*/
      if((creerTableHachage(MAXNOEUDS, (*fonctionHachage)(void *), 
    			(*cmpClefs)(void *, void *), &th)) == 0)
        return 1;
     
      val = recherche(g->racine->n,th);
      /*le noeud n'a pas encore ete visite*/
      if(val == NULL)
        {
          /*on insere dans la table car non present*/
          if(insereDansTableHachage(g->racine->n,val,th) == 0)
    	return 1;
          /*affichage du noeud dans le flux*/
          fprintf(fdo,"(%d",g->racine->n);
        }
      /*le noeud a deja ete visite*/
      else
        {
          /*affichage du numero de passage*/
          fprintf(fdo,"[%d]",val);
        }
      /*parcours des fils*/
      for(i=0; i<MAXNOEUDS; i++)
        return ecrireGraphe(g->racine->tab[i], fdo);
      fprintf(fdo,")");
     
      /*liberation de la memoire*/
      libereTableHachage(&th);
     
      return 0;
    }

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Tu ne réalises même pas de fonctions de tests pour essayer de vérifier que ton code et correct ou pas ?

    Avant de demander si le code est correct, tu pourrais au moins réaliser un programme qui teste chaque spécification de chaque fonction, et si l'une n'est pas verifiée, tu pourras dire laquelle.

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Par défaut
    Citation Envoyé par millie
    Tu ne réalises même pas de fonctions de tests pour essayer de vérifier que ton code et correct ou pas ?

    Avant de demander si le code est correct, tu pourrais au moins réaliser un programme qui teste chaque spécification de chaque fonction, et si l'une n'est pas verifiée, tu pourras dire laquelle.
    L'exo que j'essaye de faire, doit en principe être fait sur papier sans avoir à être tester sur machine car l'énoncé donne des prototypes de fonctions et on a pas à connaitre la manière dont elles ont été implémentées.
    Je voudrais juste savoir si j'ai appelé les fonctions correctement et si à la lecture de mon code, on aurait ce qu'il faut

Discussions similaires

  1. BO V5 : Affichage chiffres sur graphe 3D ?
    Par scalpa63 dans le forum Débuter
    Réponses: 1
    Dernier message: 06/09/2007, 14h05
  2. Etiquette sur graphe ne s'affiche pas en Acc2003
    Par micniv dans le forum Access
    Réponses: 3
    Dernier message: 25/09/2006, 10h27
  3. Cherche exos sur SQL
    Par mosstu126 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 08/02/2006, 16h59
  4. algos sur graphes non orientés
    Par lechewal dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 05/01/2006, 14h06
  5. des exos sur les boocles
    Par zeyd dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 27/11/2005, 18h03

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