home *** CD-ROM | disk | FTP | other *** search
- /*********************************************************************
- * CH15_09.C CrΘation de comptes clients *
- * mise α jour et lecture d'un compte α partir de son numΘro *
- *********************************************************************/
-
- #include<stdio.h>
- #include<string.h>
- #include<alloc.h>
- #include<time.h>
-
- #define dim 32
- #define fichier "c:\\albulus\\chap_15\\clients.bin"
-
- typedef struct { int jour,
- mois,
- annee;
- } date;
-
- typedef struct { unsigned long numero;
- char nom[dim];
- double mouvement,
- cumul_debits,
- cumul_credits,
- solde;
- date der_mvt;
- } client;
-
- typedef enum{ Fin, On} etat;
-
- void LitChar( char*);
- void LitInt( int*);
- void LitUL( unsigned long int*);
- void LitDble( double*);
- void LitChaine( char*, int);
-
- void LitDateJour( date*);
- void AfficheDate( date*);
-
- void OuvreClient( void);
- void AfficheClient( void);
- void MajClient( void);
-
- FILE *flux;
- date date_jour;
-
- main( void)
- {
- char choix= 'z';
- LitDateJour( &date_jour);
-
- while( choix!= 'E')
- {
- printf("\n\n\t -------------------------------------------\n"
- "\t Gestion de Comptes Clients\n\n"
- "\t\t Ouverture de comptes:\t\t[ O ]\n"
- "\t\t Affichage de comptes:\t\t[ A ]\n"
- "\t\t Mise α jour de comptes:\t[ M ]\n"
- "\t\t exit: \t\t[ E ]\n"
- "\t -------------------------------------------\n\t Choix: ");
-
- LitChar( &choix);
- if( ( choix> 96) && ( choix< 123) ) choix-= 32;
-
- switch( choix)
- {
- case 'O': OuvreClient();
- break;
-
- case 'A': AfficheClient();
- break;
-
- case 'M': MajClient();
- break;
-
- case 'E': break;
-
- default: printf(" Erreur! composez O, A, M, ou E");
- }
- }
- printf("\n\n\t\t *** Fin du programme ***");
- }
-
- void AfficheClient( void)
- {
- unsigned long num;
- long i;
- etat test= On;
- client c1= { 0ul};
-
- printf("\n Entrez le numero du compte α afficher: ");
- LitUL( &num);
-
- flux= fopen( fichier, "rb");
-
- for( i= 0; test; i+= sizeof( client))
- {
- fseek( flux, i, 0);
- if( fread( &c1, sizeof( client), 1, flux)!= 1 || feof( flux))
- {
- printf("\n Erreur: numΘro de compte inconnu!\n");
- test= Fin;
- }
- else if( c1.numero== num)
- {
- printf("\n Nom: %s\n Numero du compte: %lu",
- c1.nom, c1.numero);
- AfficheDate( &c1.der_mvt);
- printf("\n Cumul des dΘbits: %.2lf ,"
- " Cumul des crΘdits: %.2lf , Solde: %.2lf",
- c1.cumul_debits, c1.cumul_credits, c1.solde);
- test= Fin;
- }
- }
- fclose( flux);
- }
-
- void OuvreClient( void)
- {
- char choix= 'z';
-
- do
- {
- client c0= { 0ul};
-
- printf("\n voulez vous crΘer un nouveau compte? ");
- LitChar( &choix);
- if( ( choix> 96) && ( choix< 123) ) choix-= 32;
- if( choix!= 'O') break;
-
- printf("\n Entrez le numΘro du compte: ");
- LitUL( &c0.numero);
- printf(" Entrez le nom: ");
- LitChaine( c0.nom, sizeof( c0.nom));
- printf(" Entrez le mouvement, positif ou nΘgatif: ");
- LitDble( &c0.mouvement);
- if( c0.mouvement>= 0) c0.cumul_debits+= c0.mouvement;
- else c0.cumul_credits-= c0.mouvement;
- c0.solde= c0.cumul_debits- c0.cumul_credits;
- c0.der_mvt= date_jour;
-
- flux= fopen( fichier, "ab");
- if( fwrite( &c0, sizeof( client), 1, flux)!= 1)
- printf("\n Erreur d'Θcriture!\n");
- fclose( flux);
- }
- while( choix== 'O');
- }
-
- void MajClient( void)
- {
- unsigned long num;
- long i;
- etat test= On;
- client c1, c2;
-
- printf("\n Entrez le numero du compte α mettre α jour: ");
- LitUL( &num);
-
- flux= fopen( fichier, "r+b");
-
- for( i= 0; test; i+= sizeof( client))
- {
- fseek( flux, i, 0);
- if( fread( &c1, sizeof( client), 1, flux)!= 1 || feof( flux))
- {
- printf("\n Erreur: numΘro de compte inconnu!\n");
- test= Fin;
- }
- else if( c1.numero== num)
- {
- c2= c1;
-
- printf("\n Entrez le mouvement, positif ou nΘgatif: ");
- LitDble( &c2.mouvement);
- if( c2.mouvement>= 0) c2.cumul_debits+= c2.mouvement;
- else c2.cumul_credits-= c2.mouvement;
- c2.solde= c2.cumul_debits- c2.cumul_credits;
- c2.der_mvt= date_jour;
-
- fseek( flux, i, 0);
- if( fwrite( &c2, sizeof( client), 1, flux)!= 1)
- printf("\n Erreur d'Θcriture pour la mise α jour!\n");
- test= Fin;
- }
- }
- fclose( flux);
- }
-
- void LitDateJour( date *d)
- {
- time_t timer;
- struct tm *ptr;
-
- timer= time( NULL);
-
- ptr= localtime( &timer);
-
- d->jour= ptr->tm_mday;
- d->mois= ptr->tm_mon+ 1;
- d->annee= ptr->tm_year;
- }
-
- void AfficheDate( date *d1)
- {
- printf("\n Date: %d/%d/%d",
- d1->jour, d1->mois, d1->annee);
- }
-
- void LitChar( char *c0)
- {
- while( ( *c0= getchar() )== '\n');
- while( getchar() != '\n');
- }
-
- void LitInt( int *entier)
- {
- double dble;
- do
- {
- while( scanf("%lf", &dble)!= 1)
- while( getchar() != '\n');
- while( getchar() != '\n');
- }
- while( dble< -32768.0 || dble> 32767.0);
- *entier= (int) dble;
- }
-
- void LitUL( unsigned long int* entierUL)
- {
- double dble;
- do
- {
- while( scanf("%lf", &dble)!= 1)
- while( getchar() != '\n');
- while( getchar() != '\n');
- }
- while( dble< 0.0 || dble> 4294967296.0);
- *entierUL= (unsigned long int) dble;
- }
-
- void LitDble( double *reel)
- {
- while( scanf("%lf", reel)!= 1)
- while( getchar() != '\n');
- while( getchar() != '\n');
- }
-
- void LitChaine( char *chaine0, int dim_chaine0)
- {
- char *chaine1= ( char*) malloc( 2* 256);
- *(chaine0+ dim_chaine0- 1)='\0';
- while( scanf("%255[^\n]", chaine1)!= 1)
- while( getchar() != '\n');
- while( getchar() != '\n');
- strncpy( chaine0, chaine1, dim_chaine0- 1);
- free( chaine1);
- }
-
-