GESTION PERSONNEL

GESTION PERSONNEL - C - Programmation

Marsh Posté le 29-05-2018 à 04:55:01    

bonjour ou bonsoir.
jai un mini projet gestion personel en c avec une liste chainé que je doit sauvegardé dans un fichier jai fini les fonction nécéssaire et la liste saffiche normalement mais le problem cest lecriture dans le fichier jy arrive pas merci davance pour votre aide....

 
Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. typedef struct date {
  6. int j;
  7. int m;
  8. int a;
  9. }date;
  10. typedef struct personne
  11. {
  12. char prenom[20];
  13. char nom[20];
  14. char sexe;
  15. date d;
  16. int nbrenfant;
  17. char identifiant[5];
  18. personne *suiv ;
  19. personne *precd;
  20. }personne;
  21. typedef personne *liste;
  22. FILE *ps;
  23. struct date saisidate(){
  24. struct date d;
  25. do{
  26.  printf("donnez l'annee \n " );
  27.  scanf("%d",&d.a);
  28. }while(d.a<1915||d.a>2018);
  29. do{
  30.  printf(" donnez le mois " );
  31.  scanf("%d",&d.m);
  32. }while(d.m<0||d.m>12);
  33. switch(d.m){
  34.  case 1:
  35.   case 3:
  36.     case 5:
  37.      case 7:
  38.       case 8:
  39.        case 10 :
  40.         case 12:
  41.          do{
  42.           printf(" donner le jours \n" );
  43.           scanf("%d",&d.j);
  44.           }while(d.j<0||d.j>31);
  45.           break;
  46.           case 4:
  47.            case 6:
  48.             case 9:
  49.              case 11:
  50.               do{
  51.                printf("donnez le jour \n " );
  52.                scanf("%d",&d.j);
  53.               }while(d.j<0||d.j>30);
  54.               break;
  55.           case 2:
  56.            if((d.a%4==0)&&(d.a%100==0)){
  57.             do{
  58.                printf("donner le jour:" );
  59.                scanf("%d",&d.j);
  60.               }while(d.j<=0||d.j>29);break;
  61.              }else
  62.              {
  63.               do{
  64.                printf("donner le jour:" );
  65.                scanf("%d",&d.j);
  66.               }while(d.j<=0||d.j>28);break;
  67.              }
  68.            }
  69.            return(d);
  70.            }
  71. personne*alloue(){
  72. personne*pers=(personne*)malloc(sizeof(personne));
  73. pers->suiv=NULL;
  74. return(pers);
  75. }
  76. void ajoutez(liste tete,personne*p)
  77. {
  78. if(tete==NULL)
  79. {
  80.  tete=p;
  81. }
  82. else
  83. {
  84.  p->suiv=tete;
  85.  tete=p;
  86. }
  87. }
  88. liste charge(FILE*ps)
  89. {
  90. liste l=NULL;
  91. personne *p;
  92. ps=fopen("ps.txt","a" );
  93. if (ps==NULL)
  94. {
  95.  printf("le fichier es vide\n" );
  96. }
  97. while(!feof(ps))
  98. {
  99.    p=alloue();
  100.    fscanf(ps,"%s,%s,%c,%d,%d,%,%d,%s",p->prenom,p->nom,p->sexe,&p->d.j,&p->d.m,&p->d.a,p->nbrenfant,p->identifiant);
  101.    ajoutez(l,p);
  102.  
  103. }
  104. fclose(ps);
  105. return l;
  106. }
  107. liste ajouter(liste l)
  108. {
  109. personne *p=alloue();
  110.  printf("donner le prenom:" );
  111.   scanf("%s",p->prenom);
  112.   printf("donner le nom:" );
  113.   scanf("%s",p->nom);
  114.   printf("donner le sexe" );
  115.   scanf("%s",&p->sexe);
  116.   printf("donner le nombre denfant:" );
  117.   scanf("%d",&p->nbrenfant);
  118.   printf("donner lidentifiant:" );
  119.   scanf("%s",p->identifiant);
  120.   printf("\n" );
  121.   p->d=saisidate();
  122.   ajoutez(l,p);
  123. }
  124. void afficher(personne *p){
  125.  printf("\n le nom %s \n prenom %s \n sexe  %c \n date naissance %d %d %d \n nombre d enfant %d \n identifiant%s \n  ",p->nom,p->prenom,p->sexe,p->d.j,p->d.m,p->d.a,p->nbrenfant,p->identifiant);
  126. }
  127. void afficherliste(liste l){
  128.  liste p;
  129.  p=l;
  130.  if(p==NULL){
  131.   printf(" la liste es vide \n " );
  132.  }
  133.  while(p!=NULL){
  134.   afficher(p);
  135.   p=p->suiv;
  136.  }
  137. }
  138. bool recherche(liste l ,personne *precd ,personne *p ,char nom[20]){
  139. precd=NULL;
  140. p=l;
  141. if(p==NULL){
  142.  printf(" la liste vide \n " );
  143. }
  144. while((p!=NULL)&&(strcmp(nom,p->nom)!=0))
  145. {
  146.  precd=p;
  147.  p=p->suiv;
  148. }
  149. if(strcmp(nom,p->nom)==0){return(true);
  150. }else return false;
  151. }
  152. void modifier_nbrdenfant(liste l, char prenom[20]){
  153.     personne*p,*precd;
  154.      if(recherche(l,precd,p,prenom)==true){
  155.       printf(" donnez le nouveax nombre d enfant" );
  156.       scanf("%d",&p->nbrenfant);
  157.  }
  158.  }
  159.  int affichez_nbrenfant(liste l,char prenom[20])
  160.  {
  161.   personne *p,*precd;
  162.   if(recherche(l,precd,p,prenom)==true)
  163.   {
  164.    return(p->nbrenfant);
  165.   }
  166.   else
  167.   {
  168.    printf("cette personne nexist pas" );
  169.   }
  170.  }
  171. liste supprimer(liste l,char prenom[20]){
  172. personne *p,*precd;
  173. if( recherche(l,precd,p,prenom)==true){
  174.  if(precd==NULL){
  175.   l=l->suiv;
  176.   free(p);
  177.   printf("supprimer avec succe\n " );
  178.   return(l);
  179.  }else{
  180.   precd->suiv=p->suiv;
  181.   free(p);
  182.  }
  183. }else{
  184.  printf("cette perssone nexiste pas" );
  185. }
  186. }
  187. char prenom(liste l ,char prenom[20]){
  188.  personne *p,*precd;
  189. if( recherche(l,precd,p,prenom)==true){return(p->nom[20]);}}
  190. int age(liste l,char prenom[20],int n)
  191. {
  192. personne *p,*precd;
  193. if(recherche(l,precd,p,prenom)==true)
  194. {
  195.  return(n-p->d.a);
  196. }
  197. else
  198. {
  199.  printf("cette personne nexist pas" );
  200. }
  201. }
  202. /*void ercirefichier(liste l,FILE*F)
  203. {
  204. personne *p;
  205. FILE *ps=fopen("ps.txt ","w+" );
  206. if(feof(ps)){
  207.  printf("erreur " );}
  208.  p=l;
  209.  while(p!=NULL){
  210.   fprintf(ps,"%s,%s,%c,%s,%d,%d,%d,%d,%s",p->prenom,p->nom,p->sexe,p->d.j,p->d.m,p->d.a,p->nbrenfant,p->identifiant);
  211.   p=p->suiv;
  212.  
  213.  }
  214.  fclose(ps);
  215.  
  216. }*/
  217. void erciredansfichier(personne *p)
  218. {
  219. FILE *ps;
  220. ps=fopen("ps.txt","w" );
  221. if(ps!=NULL)
  222. {
  223.  personne *suiv=NULL;
  224.  personne *precd=NULL;
  225.  while(p!=NULL)
  226.  {
  227.   fseek(ps,0,SEEK_END);
  228.   fwrite(p,sizeof(personne),1,ps);
  229.   printf("writing:%s to file\n",p->nom);
  230.  p=p->suiv;
  231.  }
  232.  suiv=NULL;
  233.  precd=NULL;
  234. }
  235. else
  236. {
  237.  printf("erreur lors de louverture du fichier" );
  238. }
  239. }
  240. void quitter()
  241. {
  242.     exit(0);
  243. }
  244. int main()
  245. {
  246. FILE* ps;
  247. personne p,*precd;
  248. liste l;
  249. int i,n;
  250.  l=ajouter(l);
  251. afficherliste(l);
  252. erciredansfichier(l);
  253. return(0);
  254. }


 
 


Message édité par Harkonnen le 29-05-2018 à 09:21:18
Reply

Marsh Posté le 29-05-2018 à 04:55:01   

Reply

Marsh Posté le 31-05-2018 à 13:45:57    

Je comprends rien à ta fonction saisidate(). En effet, toutes tes boucles do...while {} s'arrêtent avec une condition totalement à coté de la plaque.

 

Exemple :

Code :
  1. do{
  2. printf(" donnez le mois " );
  3. scanf("%d",&d.m);
  4. }while(d.m<0||d.m>12);


Je passe sur l'utilisation du scanf() qui est à proscrire. Cette boucle demande à l'utilisateur de saisir un mois, tant que le mois saisi est inférieur à 0 ou supérieur à 12. Qu'est ce que c'est que ce délire d'obliger l'utilisateur à saisir un mois non valide ? Ton while() ne devrait-il pas plutôt ressembler à ceci ?

 
Code :
  1. do {
  2. ...
  3. }
  4. while (d.m >= 1 && d.m <= 12);
 

quand à ton switch pour déterminer l'année bissextile, il est inutile, un "if" suffit largement.

 

essaie de faire aussi un effort sur le nom de tes variables, évite les tailles fixes du style "nom[20]" (si le nom dépasse 20 caractères => BOUM)...

Message cité 1 fois
Message édité par Harkonnen le 31-05-2018 à 13:46:25

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 31-05-2018 à 14:14:33    

Au passage, la construction de la liste implique que chaque nom est unique. Le cas des homonymes n'est donc pas traité. Il faudrait a minima faire une recherche sur l'unicité nom/prénom et pas juste sur le nom.
 
Par ailleurs, la fonction modifier_nbrdenfant() prend en paramètre le prénom et non le nom. Mais c'est le prénom qui est utilisé pour la recherche de la personne. Or, recherche() fait une recherche sur le nom. Tu recherches donc un prénom dans le champ "nom" :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 31-05-2018 à 14:40:27    

Et j'avais pas vu ça aussi :

Code :
  1. fseek(ps,0,SEEK_END);


Bravo, tu écris ta structure à partir du dernier caractère du fichier, pas étonnant que ça ne marche pas [:bien]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 31-05-2018 à 18:03:00    

Harkonnen a écrit :

Je comprends rien à ta fonction saisidate(). En effet, toutes tes boucles do...while {} s'arrêtent avec une condition totalement à coté de la plaque.
 
Exemple :

Code :
  1. do{
  2. printf(" donnez le mois " );
  3. scanf("%d",&d.m);
  4. }while(d.m<0||d.m>12);


Je passe sur l'utilisation du scanf() qui est à proscrire. Cette boucle demande à l'utilisateur de saisir un mois, tant que le mois saisi est inférieur à 0 ou supérieur à 12. Qu'est ce que c'est que ce délire d'obliger l'utilisateur à saisir un mois non valide ? Ton while() ne devrait-il pas plutôt ressembler à ceci ?
 

Code :
  1. do {
  2. ...
  3. }
  4. while (d.m >= 1 && d.m <= 12);



 
Euh soit c'est moi, soit c'est toi qui est fatigué mais cela me semble logique que ce soit tant que le mois est inférieur à ou supérieur à. Néanmoins je te l'accorde que sur le signe exacte c'est inférieur ou égale :

Code :
  1. do {
  2. printf(" donnez le mois " );
  3. scanf("%d",&d.m);
  4. } while (d.m <= 0 || d.m >= 13);


ou :

Code :
  1. do {
  2. printf(" donnez le mois " );
  3. scanf("%d",&d.m);
  4. } while (d.m < 1 || d.m > 12);


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 01-06-2018 à 06:29:53    

RE mrc pour votre aide et vos remarques..
en effet au debut jai dit "la liste saffiche" alors les pro sauront que la fonctions de saisie de date marche parfaitement....
pour ta part Harkonnen avec fseek end etant donné quen ajoujant dans ma liste je veu quel le fasse en fin de liste ta ue autre soluce??  
mrc rufo je pense aussi que le probleme vient de la.

Reply

Marsh Posté le 01-06-2018 à 09:44:45    

MaybeEijOrNot a écrit :


 
Euh soit c'est moi, soit c'est toi qui est fatigué mais cela me semble logique que ce soit tant que le mois est inférieur à ou supérieur à.


non non, c'est moi qui était fatigué [:petrus75]
mais tu as quand même de la chance que ça marche, car quand tu déclares ta structure comme ceci :

Code :
  1. typedef struct date {
  2.    int j;
  3.    int m;
  4.    int a;
  5. }   date;


 
puis que plus loin tu créées une variable de type date sans l'initialiser, tu n'as aucune garantie que les membres de ta structure date soient initialisés par défaut comme tu le souhaites (par exemple avec un mois<0 ou >12. du coup, il serait parfaitement possible que tu ne passes jamais dans tes do... while().
le mieux serait d'initialiser toutes tes structures, par exemple :
 

Code :
  1. typedef struct date {
  2.    int j;
  3.    int m;
  4.    int a;
  5. }   date = {0, 0, 0};


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Sujets relatifs:

Leave a Replay

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