TP banque
Auteur : Xavier Coelembier
On se propose d'utiliser la classe Compte (cf. TP Comptes) afin de gérer également les mouvements bancaires.
Pour commencer, vous aller récupérer la classe Compte (légèrement modifiée). Une classe AppBanque est présente également, elle servira à tester les différentes classes.
Nouvelles règles de gestion
1) Construction du diagramme de Classes.
- La banque regroupe les différents comptes.
Travail à faire
Question 1.1 Proposer un diagramme de classes dans lequel figurent les deux classes, Compte et Banque. Vous ferez figurer les attributs de la classe Compte (à partir de l'analyse du fichier), les relations, les valeurs de multiplicité ainsi qu'une proposition de navigabilité.
- Un mouvement bancaire est une opération concernant un compte. Un mouvement a une date de réalisation, un montant (en crédit ou en débit) et est d'un certain type. Un compte n'est réellement modifié par un mouvement que le jour correspondant à la date de valeur du mouvement. Ainsi par exemple, un dépot de chèque peut être fait le 2 novembre 2004, mais le compte ne sera crédité que le 6 novembre, soit 4 jours plus tard. Si le compte est débiteur (solde inférieur à 0), le titulaire doit payer des aggios sur le montant du débit pendant la durée du solde débiteur et à un taux fixé par la banque. La durée des soldes débiteurs dépend des dates de valeurs des mouvements.
- Un type de mouvement caractérise une opération, et détermine ainsi la date de valeur de ce mouvement. Nous prendrons en compte qu'un nombre limité de mouvements :
Type | Code | Délais en nb de jours pour la mise en valeur | Commentaire |
Prélèvement | pre | 0 | |
Chèque débité | ch | 0 | |
Chèque déposé | dch | 4 | |
Dépot d'espèce | des | 0 | |
Virement | vir | 0 | En débit ou en crédit |
Retrait distributeur | dab | -1 | |
Intérêt des aggios | int | 0 | Sont toujours débités |
Retrait en guichet | ret | -1 |
Travail à faire.
Question 1.2 Compléter le diagramme de classe en faisant figurer les nouvelles classes (avec les attributs) et leurs relations.
L'objectifs de la nouvelle application est de gérer les mouvements et de calculer les éventuels aggios.
On vous fournit le diagramme de classe dans lequel figurent toutes les classes.
Travail à faire
Question 1.3 A qui sert la classe Ecran? Quel est son intérêt ? Quelles relations a-t-elle avec les autres classes ?
Question 1.4 La classe Paramètre ne contient qu'une seule méthode statique GetTaux() -le taux ext fixé à 0.0021-. Ecrire le code de cette classe ainsi qu'un appel à sa méthode dans une classe extérieure, fonction Main par exemple.
Remarque : dans le diagramme de classes on peut voir une association entre la classe Banque et la classe Type ; ce choix de conception est nécessaire pour la suite du TP.
2) Etude du code des classes
On vous fournit un extrait de la classe Banque :
class Banque{
public Banque() {
mesComptes=
new ArrayList();
mesTypes
= new ArrayList();
}
public void
AjouteType(string libel , int nbJour) {
Type
t = new Type(libel, nbJour);
AjouteType(t);
}
public void
AjouteType(Type unType) {
mesTypes.Add(unType);
}
// les attributs classe Banque
private ArrayList mesComptes;
private ArrayList mesTypes;
}
Travail à faire
Question 2.1 Quels sont les attributs de la classe ? Quels rôles jouent ils ?
Question 2.2 En utilisant l'aide MSDN (touche F1 sur ArrayList), indiquer en quelques phrases les services rendus par cette classe. Quels sont ses avantages comparés avec la classe tableau?
Question 2.3 Que font les méthodes AjouteType ?
3) Codage des classes
Intégrer le code qui crée la banque et lui ajoute des types.
using System;
using System.Collections;
class AppBanques {
static
void Main() {
//
*********A àjouter*****************
Banque
b = new Banque();
b.AjouteType("ch",0);
b.AjouteType("pre",0);
b.AjouteType("dab",-1);
b.AjouteType("ret",-1);
b.AjouteType("vir",0);
b.AjouteType("dch",4);
b.AjouteType("des",0);
b.AjouteType("int",0);
//
**********Fin ajout*****************
}
}
Travail à faire
Question 3.1 Ecrire la classe Type ; elle proposera un constructeur à deux arguments et
deux accesseurs sur ses attributs privés. Compiler.
Question 3.2 Ecrire la méthode publique AjouteCompte(
)
de la classe Banque qui permet de créer un Compte et de l'ajouter
à la collection mesComptes de la classe Banque. Tester
en écrivant :
DateTime
d1 = Convert.ToDateTime( "02/01/2004");
b.AjouteCompte(12345,"toto",0,-5000,d1);
Question 3.3 Gestion de l'affichage. Ecrire la classe Ecran qui contiendra une méthode statique surchargée :
Tester dans le Main avec :
Compte c = new Compte(123, "Bison",100,-1000,d1);
Ecran.Affiche(c);
Vous devez obtenir :
Tester dans le Main avec :
d1
= Convert.ToDateTime( "06/04/2004");
b.AjouteCompte(45657,
"titi",0,-1000,d1);
d1
= Convert.ToDateTime( "02/02/2004");
b.AjouteCompte(32345,"dupond",0,-1500,d1);
d1
= Convert.ToDateTime( "03/03/2004");
b.AjouteCompte(11633,
"durand",0,-500,d1);
d1
= Convert.ToDateTime( "05/04/2004");
b.AjouteCompte(2568,"dubois",0,-500,d1);
d1
= Convert.ToDateTime( "06/06/2004");
b.AjouteCompte(8978,
"duval",0,-2000,d1);
d1
= Convert.ToDateTime("01/09/2004");
b.AjouteCompte(1245,
"dutronc",0,-500,d1);
Ecran.Affiche(b,6);
Vous devez obtenir :
Question 3.4 Ecrire une méthode publique RendCompte( ) de la classe Banque qui retourne un Compte en fonction de son numéro. La Fonction retourne null si le compte n'est pas trouvé. Tester en écrivant :
Ecran.Affiche(b.RendCompte(1245));
Vous devez obtenir :
4) Les méthodes des classes Mouvement et Banque
La classe Mouvement se présente ainsi :
class Mouvement : IComparable {
public
int CompareTo(object obj) {
if
(obj == null)
return
1;
if
(obj.GetType() != this.GetType())
throw
new ArgumentException("Comparaison invalide");
Mouvement
mvt1 = (Mouvement)obj;
int
result = this.GetValeur().CompareTo(mvt1.GetValeur());
return
result;
}
// les
attributs classe Mouvement
private
float Montant;
private
float SoldeAvant;
private
DateTime DateMvt;
private
Type monType;
}
Remarque : ne vous attardez pas sur ce qui est encore un peu obscur !! regardez seulement pour l'instant les attributs.
Travail à faire
Question 4.1 Ecrire un constructeur à 4 arguments ainsi que les accesseurs. Créer un Mouvement, compiler.
Question 4.2 Ecrire la méthode Affiche(Mouvement) de la classe Ecran. Vous écrirez au préalable un accesseur GetType(int indiceType) dans la classe Banque.
Tester avec :
d1 = Convert.ToDateTime("02/11/2004");
Mouvement m = new Mouvement(100,1000,b.GetType(1), d1);
Ecran.Affiche(m);
Question 4.3 Surchargez (écrire une nouvelle méthode de même nom) la méthode GetType(string libType) de la classe Banque permettant de récupérer le type connaissant son libellé. Tester après avoir écrit une nouvelle méthode Affiche de la classe Ecran permettant d'afficher les informations d'un objet de la classe Type.
Tester avec :
Ecran.Affiche(b.GetType("vir"));
C'est la classe Banque qui déclenchera les mouvements grâce à la méthode EffectuerMvt :
public void EffectuerMvt(int num,DateTime dMvt,float montant,String TMvt)
{
Type t1 =
this.GetType(TMvt);
Compte c1
= this.RendCompte(num);
if (c1!=null)
if
(montant < 0)
c1.Debiter(montant,t1,dMvt);
else
c1.Crediter(montant,t1,dMvt);
}
Travail à faire
Question 4.4 Après avoir intégré la méthode EffectuerMvt dans le code, écrire les méthodes Crediter et Debiter de la classe Compte.
Tester avec :
d1 = Convert.ToDateTime("01/09/2004");
b.EffectuerMvt(12345,d1,1000,"des");
b.EffectuerMvt(12345,d1,-3000,"ch");
d1 = Convert.ToDateTime("02/09/2004");
b.EffectuerMvt(12345,d1,1000,"dch");
d1 = Convert.ToDateTime("04/09/2004");
b.EffectuerMvt(12345,d1,3000,"vir");
d1 = Convert.ToDateTime("05/09/2004");
b.EffectuerMvt(12345,d1,-1000,"dab");
d1 = Convert.ToDateTime("10/09/2004");
b.EffectuerMvt(12345,d1,-5000,"dab");
d1 = Convert.ToDateTime("02/01/2004");
b.EffectuerMvt(12345,d1,1000,"dch");
d1 = Convert.ToDateTime("27/10/2004");
b.EffectuerMvt(12345,d1,-1500,"dab");
Ecran.Affiche(b.RendCompte(12345));
Ceci doit produire :
Méthode GetValeur de la classe Mouvement
Question 4.5 Ecrire la méthode GetDateValeur() : DateTime de la classe Mouvement qui va permettre de calculer la date de valeur d'un mouvement. Elle s'obtient en ajoutant le nombre de jour à la date du mouvement.
Ce nombre est présent dans l'occurrence de la classe Type rattachée
au mouvement.
Si ce nombre est positif et la date obtenue est un dimanche alors la date de
valeur est le lundi suivant.
Si ce nombre est négatif et la date obtenue est un dimanche alors la
date de valeur est le vendredi précédent.
Si ce nombre est négatif et la date obtenue est un samedi alors la date
de valeur est le vendredi précédent.
Remarque : vous regarderez dans MSDN la classe DateTime
Modifier la méthode Affiche (unMvt Mouvement) de la classe écran
pour afficher cette date de valeur.
Tester en écrivant :
Ecran.Affiche(b.RendCompte(12345));
Vous devez obtenir :
5) le calcul des aggios.
Méthode CalculAgios (DtDébut, DtFin : DateTime) : réel de la classe Compte.
Un calcul d'agios s'effectue pour une période donnée (date début date de fin), il consiste à recalculer le solde du compte en date de valeur et si le solde est négatif calculer pendant combien de jours voici ses principales phases :
Question 5.1 Ecrire une méthode CalculAgios(
) de la classe
banque qui :
Calcule les agios
pour le compte passé en paramètre
Génère
le mouvement et le débit des agios sur le compte avec le type de mouvement
" int "
Testez avec :
DateTime debutA = Convert.ToDateTime("01/09/2004");
DateTime finA = Convert.ToDateTime("30/09/2004");
b.CalculAgios(12345,debutA,finA,"int");
Ecran.Affiche(b.RendCompte(12345));
Vous devez obtenir :
Question 5.2 Ecrire une méthode CalculAgios(…) de la classe Banque pour calculer les agios de tous les comptes
Testez avec :
d1 = Convert.ToDateTime("01/09/2004");
b.EffectuerMvt(45657,d1,2000,"des");
b.EffectuerMvt(32345,d1,1500,"des");
b.EffectuerMvt(11633,d1,1200,"des");
d1 = Convert.ToDateTime("01/09/2004");
b.EffectuerMvt(8978,d1,750,"des");
b.EffectuerMvt(8978,d1,-1750,"ret");
DateTime debutA
= Convert.ToDateTime("01/09/2004");
DateTime finA =
Convert.ToDateTime("30/09/2004");
b.CalculAgios(debutA,finA,"int");
int nbCompte = b.getNbComptes();
// il faut écrire cette nouvelle méthode qui renvoie le nombre de comptes dans
la collection
Ecran.Affiche(b,nbCompte);
Vous devez obtenir :