Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1350 connectés 

  FORUM HardWare.fr
  Programmation
  C

  GESTION PERSONNEL

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

GESTION PERSONNEL

n°2316006
papilex
Posté le 29-05-2018 à 04:55:01  profilanswer
 

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
mood
Publicité
Posté le 29-05-2018 à 04:55:01  profilanswer
 

n°2316224
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 31-05-2018 à 13:45:57  profilanswer
 

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)
n°2316225
rufo
Pas me confondre avec Lycos!
Posté le 31-05-2018 à 14:14:33  profilanswer
 

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
n°2316228
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 31-05-2018 à 14:40:27  profilanswer
 

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)
n°2316238
MaybeEijOr​Not
but someone at least
Posté le 31-05-2018 à 18:03:00  profilanswer
 

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.
n°2316252
papilex
Posté le 01-06-2018 à 06:29:53  profilanswer
 

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.

n°2316258
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 01-06-2018 à 09:44:45  profilanswer
 

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)

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  GESTION PERSONNEL

 

Sujets relatifs
[CNAM-NSY103] Gestion de processus / pthreadGestion d'un planning Python
gestion des collisions dans jeu en 2D javaChoix logiciel de gestion de version pour petite équipe
[Python]Utiliser Socket pour app de gestion réseauGestion des verrous VBA + Base Access
Gestion des accesUWP - Gestion des resources
VBA: Macro avec Outlook pour gestion d'eventsGestion des acces
Plus de sujets relatifs à : GESTION PERSONNEL


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR