// MODULE: CompteTest.java // AUTEUR: felipe // OBJET: une étude de cas: compte bancaire, composition // NOTE: ce code contient des petits trucs tels que l'affichage formate de valeurs réelles // ou la recuperation de la date systeme // premiere rencontre avec la notion de package import java.text.DecimalFormat; // pour le formatage des decimaux import java.util.*; // pour le calendrier // --------------------------------------------------------------------- // illustre quelques fonctionalites concernant le formatage d'impression // plus des "facilites" pour acceder a la date du jour // --------------------------------------------------------------------- class Transaction { private static int nb = 0; private boolean retrait; // true si retrait, false sinon private double montant; private GregorianCalendar date; // composition private DecimalFormat df_date = new DecimalFormat("00"); // composition private DecimalFormat df_montant = new DecimalFormat("0.00"); // composition private String getDate() { int m = date.get(Calendar.MONTH); return df_date.format(date.get(Calendar.DATE))+ "/"+ df_date.format(m+1)+"/" + date.get(Calendar.YEAR)+" "+ df_date.format(date.get(Calendar.HOUR))+ "h" + df_date.format(date.get(Calendar.MINUTE)) + ":"+ df_date.format(date.get(Calendar.SECOND)) ; } // le constructeur principal de la classe public Transaction(boolean typeOperation, double montant) { nb++; this.montant = montant; retrait = typeOperation; date = new GregorianCalendar(); // range dans date la date du jour } // juste pour illustrer un point de cours, voici un autre constructeur // qui prend comme argument une reference sur un objet de la classe Transaction, // ceci afin de la copier // ce point de Java n'est pas simple à comprendre, il peut etre ignore pour le moment public Transaction(Transaction aCopier) { nb++; this.retrait = aCopier.retrait; this.montant = aCopier.montant; this.date = (GregorianCalendar) aCopier.date.clone(); } // conversion appropriee d'un objet vers une String public String toString() { return getDate() + ((retrait)? " retrait ":" dépot ") + df_montant.format(montant) + " "+nb; } } // ------------------------------------------------------------------- // une classe definissant un type abstrait gerant un compte bancaire // un compte bancaire est caracterise par un solde et des transactions // ------------------------------------------------------------------- class Compte { private String nom; // le detenteur du compte private final boolean DEPOT = false; private final boolean RETRAIT = true; private double solde; private final int MAX_OPERATION = 1000; private Transaction table [] = new Transaction [MAX_OPERATION]; private int nbOperations = 0; private DecimalFormat df = new DecimalFormat("0.00"); // code factorise (appele depuis plusieurs methodes de cette classe) // permet d'ajouter une transaction dans la table des transactions private void ajoute(boolean type, double montant) { if (nbOperations < MAX_OPERATION) { table[nbOperations++] = new Transaction (type,montant); } else System.err.println("la table des operations est pleine"); } // deux constructeurs, l'un avec un solde initial public Compte(String name, double soldeInitial) { nom = new String (name); // note sur nom = name; solde = soldeInitial; ajoute(DEPOT,soldeInitial); } // l'autre sans solde initial public Compte(String name) { nom = name; solde = 0.; } // --------------------------------------------- // les methodes appelables par l'utilisateur // --------------------------------------------- public void depot(double montant) { ajoute(DEPOT,montant); solde += montant; } public void retrait(double montant) { ajoute(RETRAIT,montant); solde -= montant; } public String getNom() {return nom;} public String getSolde() {return df.format(solde);} public void afficheReleve() { System.out.println("Compte de " + getNom() + " solde= " + getSolde()); for (int i=0; i