Vous êtes sur la page 1sur 9

Gestion des Comptes : Correction

Marc Zonzon.
23 f vrier 2004
e

Table des mati` res


e
1 En t te de Compte
e

2 Corps des fonctions de Compte

3 Programme de test

1 En t te de Compte
e

c l a s s Compte
public :
t y p e d e f s t d : : s t r i n g NumeroCompte ;
struct Erreur
E r r e u r ( NumeroCompte num , s t d : : s t r i n g mess ) ;
s t d : : ostream & p u t ( s t d : : ostream & os ) c o n s t ;
NumeroCompte numM ;
s t d : : s t r i n g messageM ;
;
struct MontantNegatif : public Erreur
M o n t a n t N e g a t i f ( NumeroCompte num ) ;
;
struct ErreurConstruction : public Erreur
E r r e u r C o n s t r u c t i o n ( NumeroCompte num ) ;
;
s t r u c t Bloque : p u b l i c E r r e u r
B l o q u e ( NumeroCompte num ) ;
;
struct Seuil : public Erreur
S e u i l ( NumeroCompte num ) ;
;
s t r u c t NonVide : p u b l i c E r r e u r
NonVide ( NumeroCompte num , Money m ) ;
Money m o n t a n t ;
;
Compte ( NumeroCompte num , Money d e b i t =Money ( 0 ) ) throw ( E
Compte ( ) throw ( NonVide ) ;
NumeroCompte numero ( ) c o n s t ;
bool estBloque ( ) const ;
Money s e u i l ( ) c o n s t ;
Money s o l d e ( ) c o n s t ;
Compte & d e p o s e r ( Money m ) throw ( B l o q u e , M o n t a n t N e g a t i f ) ;
Compte & r e t i r e r ( Money m ) throw ( B l o q u e , S e u i l , M o n t a n t N e g

10

15

20

25

30

v o i d v i r e r ( Compte & s o u r c e , Money m o n t a n t ) throw ( B l o q u e , S


v o i d n o u v e a u S e u i l ( Money m ) throw ( B l o q u e , S e u i l , M o n t a n t N
35
void bloquer ( ) ;
void debloquer ( ) ;
s t d : : ostream & p u t ( s t d : : ostream & os ) c o n s t ;
private :
40
Money s e u i l D e b i t M ;
Money p o s i t i o n M ;
bool estBloqueM ;
NumeroCompte numeroM ;
;
45 s t d : : o s t r e a m & o p e r a t o r
( s t d : : o s t r e a m & o s , c o n s t Compte & c )
s t d : : ostream & operator
( s t d : : o s t r e a m & o s , c o n s t Compte : : E r r

2 Corps des fonctions de Compte

# i n c l u d e Compte0 . hh
/ / I d p o u r l e programme i d e n t .
namespace c o n s t char I d [ ] = $ I d : Compte0 . c c , v 1 . 1 2 0 0 4 / 0 2 / 0 8
Compte : : E r r e u r : : E r r e u r ( Compte : : NumeroCompte num , s t d : : s t r i n g m
5
numM( num ) ,
messageM ( mess )

s t d : : o s t r e a m & Compte : : E r r e u r : : p u t ( s t d : : o s t r e a m & o s ) c o n s t


10
o s Compte numM :
messageM ;
return os ;

/ / Compte : : NumeroCompte
15 Compte : : M o n t a n t N e g a t i f : : M o n t a n t N e g a t i f ( NumeroCompte num ) :

E r r e u r ( num , U t i l i s a t i o n d un m o n t a n t n e g a t i f )

Compte : : E r r e u r C o n s t r u c t i o n : : E r r e u r C o n s t r u c t i o n ( s t d : : s t r i n g num

E r r e u r ( num , E r r e u r de c o n s t r u c t i o n , l e d e b i t d o i t e t r e p o
20

Compte : : B l o q u e : : B l o q u e ( NumeroCompte num ) : E r r e u r ( num , compte

Compte : : S e u i l : : S e u i l ( NumeroCompte num ) : E r r e u r ( num , s o l d e i n

25 Compte : : NonVide : : NonVide ( NumeroCompte num , Money m ) :


E r r e u r ( num , d e s t r u c t i o n du compte non v i d e ) , m o n t a n t (m)

Compte : : Compte ( NumeroCompte num , Money d e b i t ) throw ( E r r e u r C


30
seuilDebitM ( debit ) ,
positionM ( 0 ) ,
estBloqueM ( f a l s e ) ,
numeroM ( num )
/ / a l o u e un n o u v e a u numero
4

35

if ( debit
Money ( 0 ) )
throw E r r e u r C o n s t r u c t i o n ( num ) ;

Compte : : NumeroCompte Compte : : numero ( ) c o n s t r e t u r n numeroM ;


40

estBloqueM= true ;

estBloqueM= f a l s e ;

v o i d Compte : : d e b l o q u e r ( )

v o i d Compte : : b l o q u e r ( )

return positionM ;

Money Compte : : s e u i l ( ) c o n s t

45 Money Compte : : s o l d e ( ) c o n s t

return seuilDebitM ;

b o o l Compte : : e s t B l o q u e ( ) c o n s t
50
return estBloqueM ;

55
Compte & Compte : : d e p o s e r ( Money somme ) throw ( B l o q u e , M o n t a n t N
i f ( somme Money ( 0 ) ) throw M o n t a n t N e g a t i f ( numeroM ) ;
i f ( e s t B l o q u e M ) throw B l o q u e ( numeroM ) ;
60
p o s i t i o n M + = somme ;
return t h i s ;

65
Compte & Compte : : r e t i r e r ( Money somme ) throw ( B l o q u e , S e u i l , M
i f ( somme Money ( 0 ) ) throw M o n t a n t N e g a t i f ( numeroM ) ;

i f ( e s t B l o q u e M ) throw B l o q u e ( numeroM ) ;
i f ( positionM + seuilDebitM
somme ) throw S e u i l ( numeroM )
positionM
= somme ;
return t h i s ;

70

v o i d Compte : : n o u v e a u S e u i l ( Money n o u v S e u i l ) throw ( B l o q u e , S e u i


75
i f ( n o u v S e u i l Money ( 0 ) ) throw M o n t a n t N e g a t i f ( numeroM ) ;
i f ( e s t B l o q u e M ) throw B l o q u e ( numeroM ) ;
i f ( positionM
n o u v S e u i l ) throw S e u i l ( numeroM ) ;
seuilDebitM = nouvSeuil ;

80

Compte : : Compte ( ) throw ( NonVide )


i f ( s o l d e ( ) ! = Money ( 0 ) ) throw NonVide ( numeroM , s o l d e ( ) ) ;

85

s t d : : o s t r e a m & Compte : : p u t ( s t d : : o s t r e a m & o s ) c o n s t


os
numero ()
[
s e u i l ()
] :
solde ( ) ;
90
return os ;

s t d : : ostream & operator


c . p u t ( os ) ;
return os ;

( s t d : : o s t r e a m & o s , c o n s t Compte & c )

95

v o i d Compte : : v i r e r ( Compte & s o u r c e , Money m o n t a n t ) throw ( B l o q u e


i f ( m o n t a n t Money ( 0 ) ) throw M o n t a n t N e g a t i f ( numeroM ) ;

/ / i l e s t n e c e s s a i r e de v e r i f i e r que b u t n e s t p a s b l o q u e
/ / a v a n t de r e t i r e r d a n s s o u r c e .
100
i f ( e s t B l o q u e ( ) ) throw B l o q u e ( numeroM ) ;
source . r e t i r e r ( montant ) ;

deposer ( montant ) ;

s t d : : ostream & operator


105
return e r r . p u t ( os ) ;

( s t d : : o s t r e a m & o s , c o n s t Compte : : E r r

3 Programme de test

# i n c l u d e Compte0 . hh
# include
iostream
/ / I d p o u r l e programme i d e n t .
namespace c o n s t char I d [ ] = $ I d : C o m p t e 0 T e s t . c c , v 1 . 1 2 0 0 4 / 0 2
5 using s t d : : cout ; using s t d : : cin ; using s t d : : c e r r ; using s t d : :

/ / Les m o n t a n t s n e g a t i f s s o n t i n t e r c e p t e s i c i e t ne d o i v e n t p
/ / d exception
v o i d l i r e ( Money& m)
while ( true )
10
cout
Montant : ;
cin
m;
i f ( m =Money ( 0 ) ) break ;

cout
Le m o n t a n t d o i t e t r e p o s i t i f ;

15

i n t main ( )
try
Compte c ( Compte : : NumeroCompte ( XXX0 ) , Money ( 0 ) ) ;
/ / le
20
for ( i n t i ( 0 ) ; i ++ 80;) cout
; cout
endl ;
cout

m a n i p u l a t i o n du compte
c . numero ()
Money somme ;

char c h o i x ;
/ / operatio
do
25
try
cout
R somme : p o u r un r e t r a i t n ;
cout
D somme : p o u r un d e p o t n ;
cout
S
: pour l e solde n ;
cout
Q
: pour q u i t t e r n ;
30
cin
choix ;
switch ( choix )
case r :
// retrait
case R :

l i r e ( somme ) ;
c . r e t i r e r ( somme ) ;
break ;
case d :
/ / depot
case D :
l i r e ( somme ) ;
c . d e p o s e r ( somme ) ;
break ;
case s :
/ / solde
case S :
s o l d e =
c . solde ()
n;
cout
break ;
case q :
// quitter
case Q :
cout
Au r e v o i r e n d l ;
break ;
default : cout
c h o i x non v a l i d e e n d l ;

50

45

40

35

c a t c h ( Compte : : E r r e u r e r r )
cerr
err
endl ;
c h o i x =S ;

55

w h i l e ( c h o i x ! = Q & & c h o i x ! = q ) ;
c a t c h ( Compte : : NonVide e r r )
cerr
err
endl ;

`
cerr
Le compte e s t d e t r u i t de m a n i e r e i n c o r r e c t e
cerr
I l r e s t a i t e r r . montant endl ;
return 1 ;

return 0 ;

60

Vous aimerez peut-être aussi