home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 17 / CD_ASCQ_17_101194.iso / dos / prg / alb_c10 / chap_15 / ch15_09.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-09-29  |  5.7 KB  |  259 lines

  1. /*********************************************************************
  2. *  CH15_09.C                     CrΘation de comptes clients  *
  3. *         mise α jour et lecture d'un compte α partir de son numΘro  *
  4. *********************************************************************/
  5.  
  6. #include<stdio.h>
  7. #include<string.h>
  8. #include<alloc.h>
  9. #include<time.h>
  10.  
  11. #define dim 32
  12. #define fichier "c:\\albulus\\chap_15\\clients.bin"
  13.  
  14. typedef struct     {   int  jour,
  15.              mois,
  16.              annee;
  17.         } date;
  18.  
  19. typedef struct     {   unsigned long numero;
  20.                     char nom[dim];
  21.             double mouvement,
  22.                cumul_debits,
  23.                            cumul_credits,
  24.                solde;
  25.                     date der_mvt;
  26.         } client;
  27.  
  28. typedef enum{ Fin, On} etat;
  29.  
  30. void LitChar( char*);
  31. void LitInt( int*);
  32. void LitUL( unsigned long int*);
  33. void LitDble( double*);
  34. void LitChaine( char*, int);
  35.  
  36. void LitDateJour( date*);
  37. void AfficheDate( date*);
  38.  
  39. void OuvreClient( void);
  40. void AfficheClient( void);
  41. void MajClient( void);
  42.  
  43. FILE *flux;
  44. date date_jour;
  45.  
  46. main( void)
  47. {
  48.    char choix= 'z';
  49.    LitDateJour( &date_jour);
  50.  
  51.    while( choix!= 'E')
  52.    {
  53.     printf("\n\n\t -------------------------------------------\n"
  54.     "\t       Gestion de Comptes Clients\n\n"
  55.     "\t\t  Ouverture de comptes:\t\t[ O ]\n"
  56.     "\t\t  Affichage de comptes:\t\t[ A ]\n"
  57.     "\t\t  Mise α jour de comptes:\t[ M ]\n"
  58.     "\t\t  exit:        \t\t[ E ]\n"
  59.     "\t -------------------------------------------\n\t Choix:  ");
  60.  
  61.     LitChar( &choix);
  62.     if( ( choix> 96) && ( choix< 123) )   choix-= 32;
  63.  
  64.     switch( choix)
  65.     {
  66.       case 'O':     OuvreClient();
  67.             break;
  68.  
  69.       case 'A':     AfficheClient();
  70.             break;
  71.  
  72.       case 'M':     MajClient();
  73.             break;
  74.  
  75.       case 'E':    break;
  76.  
  77.       default:    printf(" Erreur! composez O, A, M, ou E");  
  78.     }
  79.    }
  80.    printf("\n\n\t\t *** Fin du programme ***");
  81. }
  82.  
  83. void AfficheClient( void)
  84. {
  85.     unsigned long num;
  86.     long i;
  87.         etat test= On;
  88.     client c1= { 0ul};
  89.  
  90.     printf("\n Entrez le numero du compte α afficher: ");
  91.     LitUL( &num);
  92.  
  93.     flux= fopen( fichier, "rb");
  94.  
  95.     for( i= 0; test; i+= sizeof( client))
  96.     {
  97.        fseek( flux, i, 0);
  98.        if( fread( &c1, sizeof( client), 1, flux)!= 1 || feof( flux))
  99.        {
  100.           printf("\n Erreur: numΘro de compte inconnu!\n");
  101.           test= Fin;
  102.        }
  103.        else if( c1.numero== num)
  104.            {
  105.           printf("\n Nom:  %s\n Numero du compte: %lu",
  106.           c1.nom, c1.numero);
  107.           AfficheDate( &c1.der_mvt);
  108.           printf("\n Cumul des dΘbits: %.2lf ,"
  109.                " Cumul des crΘdits: %.2lf , Solde: %.2lf",
  110.                 c1.cumul_debits, c1.cumul_credits, c1.solde);
  111.           test= Fin;
  112.        }
  113.     }
  114.     fclose( flux);
  115. }
  116.  
  117. void OuvreClient( void)
  118. {
  119.     char choix= 'z';
  120.  
  121.     do
  122.     {
  123.     client c0= { 0ul};
  124.  
  125.     printf("\n voulez vous crΘer un nouveau compte?  ");
  126.     LitChar( &choix);
  127.     if( ( choix> 96) && ( choix< 123) )   choix-= 32;
  128.     if( choix!= 'O') break;
  129.  
  130.     printf("\n Entrez le numΘro du compte:  ");
  131.     LitUL( &c0.numero);
  132.     printf(" Entrez le nom:     ");
  133.     LitChaine( c0.nom, sizeof( c0.nom));
  134.     printf(" Entrez le mouvement, positif ou nΘgatif:  ");
  135.     LitDble( &c0.mouvement);
  136.     if( c0.mouvement>= 0) c0.cumul_debits+= c0.mouvement;
  137.             else  c0.cumul_credits-= c0.mouvement;
  138.     c0.solde= c0.cumul_debits- c0.cumul_credits;
  139.     c0.der_mvt= date_jour;
  140.  
  141.     flux= fopen( fichier, "ab");
  142.     if( fwrite( &c0, sizeof( client), 1, flux)!= 1)
  143.        printf("\n Erreur d'Θcriture!\n");
  144.     fclose( flux);
  145.     }
  146.     while( choix== 'O');
  147. }
  148.  
  149. void MajClient( void)
  150. {
  151.     unsigned long num;
  152.     long i;
  153.     etat test= On;
  154.     client c1, c2;
  155.  
  156.     printf("\n Entrez le numero du compte α mettre α jour: ");
  157.     LitUL( &num);
  158.  
  159.     flux= fopen( fichier, "r+b");
  160.  
  161.     for( i= 0; test; i+= sizeof( client))
  162.     {
  163.        fseek( flux, i, 0);
  164.        if( fread( &c1, sizeof( client), 1, flux)!= 1 || feof( flux))
  165.        {
  166.           printf("\n Erreur: numΘro de compte inconnu!\n");
  167.           test= Fin;
  168.        }
  169.        else if( c1.numero== num)
  170.            {
  171.            c2= c1;
  172.  
  173.            printf("\n Entrez le mouvement, positif ou nΘgatif:  ");
  174.            LitDble( &c2.mouvement);
  175.            if( c2.mouvement>= 0) c2.cumul_debits+= c2.mouvement;
  176.                    else  c2.cumul_credits-= c2.mouvement;
  177.            c2.solde= c2.cumul_debits- c2.cumul_credits;
  178.            c2.der_mvt= date_jour;
  179.  
  180.           fseek( flux, i, 0);
  181.           if( fwrite( &c2, sizeof( client), 1, flux)!= 1)
  182.               printf("\n Erreur d'Θcriture pour la mise α jour!\n");
  183.           test= Fin;
  184.        }
  185.     }
  186.     fclose( flux);
  187. }
  188.  
  189. void LitDateJour( date *d)
  190. {
  191.     time_t timer;
  192.     struct tm *ptr;
  193.  
  194.         timer= time( NULL);
  195.  
  196.     ptr= localtime( &timer);
  197.  
  198.     d->jour= ptr->tm_mday;
  199.     d->mois= ptr->tm_mon+ 1;
  200.     d->annee=  ptr->tm_year;
  201. }
  202.  
  203. void AfficheDate( date *d1)
  204. {
  205.     printf("\n Date: %d/%d/%d",
  206.             d1->jour, d1->mois, d1->annee);
  207. }
  208.  
  209. void LitChar( char *c0)
  210. {
  211.      while( ( *c0= getchar() )== '\n');
  212.     while( getchar() != '\n');  
  213. }
  214.  
  215. void LitInt( int *entier)
  216. {
  217.     double dble;
  218.     do
  219.         {
  220.        while( scanf("%lf", &dble)!= 1)
  221.         while( getchar() != '\n');
  222.        while( getchar() != '\n');
  223.     }
  224.     while( dble< -32768.0 || dble> 32767.0);
  225.         *entier= (int) dble;
  226. }
  227.  
  228. void LitUL( unsigned long int* entierUL)
  229. {
  230.     double dble;
  231.     do
  232.         {
  233.        while( scanf("%lf", &dble)!= 1)
  234.         while( getchar() != '\n');
  235.        while( getchar() != '\n');
  236.     }
  237.     while( dble< 0.0 || dble> 4294967296.0);
  238.         *entierUL= (unsigned long int) dble;
  239. }
  240.  
  241. void LitDble( double *reel)
  242. {
  243.     while( scanf("%lf", reel)!= 1)
  244.         while( getchar() != '\n');
  245.     while( getchar() != '\n');
  246. }
  247.  
  248. void LitChaine( char *chaine0, int dim_chaine0)
  249. {
  250.     char *chaine1= ( char*) malloc( 2* 256);
  251.     *(chaine0+ dim_chaine0- 1)='\0';
  252.     while( scanf("%255[^\n]", chaine1)!= 1)
  253.         while( getchar() != '\n');
  254.        while( getchar() != '\n');              
  255.     strncpy( chaine0, chaine1, dim_chaine0- 1);
  256.     free( chaine1);  
  257. }
  258.  
  259.