chargement

chargement - C - Programmation

Marsh Posté le 10-05-2011 à 21:46:00    

bonjour,
j'essais de charger à partir d'un fichier de données un arbre,j'ai utilisé une fonction récursive mais ça ne marche pas et j'ignore vraiment la reson si vous pouvez verifier avec moi, merci :)  
voici mon code

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. struct a_arbre
  5. {
  6. int code;
  7. char designation[15];
  8. char code_famille[5];
  9. char prix_achat[10];
  10. char code_fournisseur[5];
  11. char quantite_stock[5];
  12. struct a_arbre * gauche;
  13. struct a_arbre * droit;
  14. };
  15. typedef struct a_arbre ar_arbre;
  16. void ouvrir(FILE **fp);
  17. void insertion(ar_arbre** noeud,int v,char s[],char f[]);
  18. void view(ar_arbre *racine);
  19. void charger(ar_arbre** noeud,char f[],char s[]);
  20. int main()
  21. {FILE *fp;
  22.     char s[100];
  23.     char f[100];
  24.     int v;
  25.     ar_arbre *noeud;
  26.    ouvrir(&fp);
  27.    while(fgets(f,100,fp))
  28.    {insertion(&(noeud),v,s,f);
  29. }
  30. fclose(fp);
  31. view(noeud);
  32. system("pause" );
  33. return(0);
  34. }
  35. void ouvrir(FILE **fp)
  36. {
  37. if(!(*fp=fopen("test.txt","r" )))
  38. {
  39. printf("le fichier est inexistant" );
  40. exit(0);
  41. }
  42. else printf("ouverture du fichier... \n" );
  43. }
  44. void insertion(ar_arbre** noeud, int v,char s[],char f[])
  45. {
  46. if (*noeud==NULL) /* si le noeud n’existe pas, on le cr´ee */
  47. {
  48. *noeud=(ar_arbre*) malloc(sizeof(ar_arbre));
  49. charger((noeud),f,s);
  50. (*noeud)->gauche=NULL;
  51. (*noeud)->droit=NULL;
  52. }
  53. else
  54. {
  55. if (v>(*noeud)->code)
  56. insertion(&(*noeud)->droit,v,f,s); /* aller a droite */
  57. else
  58. insertion(&(*noeud)->gauche,v,f,s); /* aller a gauche */
  59. }
  60. }
  61. void view(ar_arbre *racine)
  62. {if (racine)
  63. view(racine->gauche);
  64. printf("%d\n",racine->code);
  65. view(racine->droit);
  66. }
  67. void charger(ar_arbre** noeud,char f[],char s[])
  68. {int v;
  69.     strncpy(s,f,5);
  70. sscanf(s,"%5d",&v);
  71. (*noeud)->code=v;
  72. strncpy(s,f+6,15);
  73. strncpy((*noeud)->designation,s,strlen(s)+1);
  74. strncpy(s,f+21,5);
  75. strncpy((*noeud)->code_famille,s,strlen(s)+1);
  76. strncpy(s,f+26,10);
  77. strncpy((*noeud)->prix_achat,s,strlen(s)+1);
  78. strncpy(s,f+36,5);
  79. strncpy((*noeud)->code_fournisseur,s,strlen(s)+1);
  80. strncpy(s,f+41,5);
  81. strncpy((*noeud)->quantite_stock,s,strlen(s)+1);
  82. }

Reply

Marsh Posté le 10-05-2011 à 21:46:00   

Reply

Marsh Posté le 10-05-2011 à 22:18:14    

Citation :

void view(ar_arbre *racine)
{
    if (racine)
         view(racine->gauche);
    printf("%d\n",racine->code);
    view(racine->droit);
}


ça m'a l'air plantogène, ça.
C'est pas:
void view(ar_arbre *racine)
{
    if (racine) {
        view(racine->gauche);
        printf("%d\n",racine->code);
        view(racine->droit);
    }
}
que tu voulais faire?
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 10-05-2011 à 22:42:01    


Hmm, tu devrais aussi commencer par initialiser proprement tes variables locales dans main(), ça évitera que ça te pête à la figure dans insertion().
 

Reply

Marsh Posté le 10-05-2011 à 22:44:39    

oui mais ce n'est pas ça la faute,ça se bloque toujours

Reply

Marsh Posté le 10-05-2011 à 22:45:59    

@tpierron: comment ça mieux initialiser mes variables??

Reply

Marsh Posté le 10-05-2011 à 23:18:31    

Ben relis ton code, en particulier ce qui risque de se passer au premier appel de insertion, dans le main, si une certaine initialisation n'est pas effectuée...
De toute façon, plus je relis l'algo, moins je vois de raison pour qu'il marche, vu qu'a aucun moment, v (pas initialisé) ne change de valeur dans le insertion(&(noeud),v,s,f) de la boucle de lecture.
A+,


Message édité par gilou le 10-05-2011 à 23:31:50

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 10-05-2011 à 23:25:06    

de l'aide serai la bienvenue....

Reply

Marsh Posté le 10-05-2011 à 23:40:24    

Le premier appel de insertion(&(noeud),v,s,f)
noeud est pas initialisé, donc il n'y a aucune raison que *noeud vaille nul et que ton premier test, if (*noeud==NULL) fonctionne
d'autre part, tu appelles systématiquement insertion dans la boucle avec l'entier v qui n'est pas initialisé (et ne changera pas de valeur, car passage par valeur de v) donc le test if (v>(*noeud)->code) est fait avec une valeur de v constante (et sans doute incohérente).
 
Donc à toi de rectifier cela.
comme il n'y a pas de commentaire expliquant le role de v, je n'ai pas de boule de cristal pour deviner son role exact.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 11-05-2011 à 10:13:10    

bonjour,
j'ai trouvé la solution,ce n'était pas une question d'initialisation mais de positionnement dans le fichier.En tt cas je vous remercie pour votre aide :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed