Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Java] Classes

Gestion de comptes bancaires

    8 mars 2006 à 14:24:39

    Bonjour, je dois réaliser le programme suivant:

    Citation : Pas de titre

    1. Concevoir et mettre en œuvre un programme Java qui implémente une classe appelée CompteBancaire dont les données membres sont : le nom du client, le numéro de compte normalisé au format IBAN et le montant déposé sur ce compte. Les méthodes sont : ajout(montant), retrait(montant) et virement (compte,montant) et la surcharge de toString.

    On suivra le schéma de programme :
    CompteBancaire C1(1000),C2(50) ;
    System.out.println(C1,C2) ;
    C1.ajout(1000) ;
    C2.retrait(1000) ;
    System.out.println(C1,C2) ;
    Comparaison de C1 et C2 avec == et equals qui a été surchargé ;
    C1 = C2 ;
    System.out.println(C1,C2) ;
    C1.ajout(2000) ;
    System.out.println(C1,C2) ;

    Un deuxième programme met en œuvre une deuxième classe NumeroCompte qui représente un numéro de compte bancaire normalisé IBAN.
    Vous imaginez les données membres et les méthodes.
    Refaire la classe CompteBancaire avec la donnée membre numéro de compte qui est devenue un objet de cette nouvelle classe.



    Voici ce que j'ai réussi à programmer pour le moment avec le peu de bases que j'ai:

    import java.io.*;

    class CompteBancaire {
                    public CompteBancaire (char nom[]‚ char nocompte[]int solde) {
                                    this.nomc = nom;
                                    this.compte = nocompte;
                                    this.soldec = solde;
                    }
                    public CompteBancaire ajout(int montant) {
                                    return new CompteBancaire(this.solde + montant);
                    }
                    public CompteBancaire retrait(int montant) {
                                    return new CompteBancaire(this.solde – montant);
                    }
                    public CompteBancaire virement(CompteBancaire compte‚ int montant) {
                                    return new CompteBancaire(this.solde – montant‚ compte.solde + montant);
                    }
                    public String toString() {
                                    System.out.println("Le titulaire du compte est " + this.nom);
                                    System.out.println("Le no du compte est " + this.nocompte);
                                    System.out.println("Le montant est " + this.solde);
                    }
                   
                    static public void main(String args[]) {
                                    CompteBancaire C1= new CompteBancaire("Herman""BE12345678901234"1000);
                                    CompteBancaire C2= new CompteBancaire("Deom""BE98765432106541"50);
                                    System.out.println( C1‚ C2);
                                    /*C1.ajout(1000);
                                    C2.retrait(1000);
                                    System.out.println(C1‚ C2);*/

                    }
    }

    Je ne vois pas trop comment m'y prendre et ce code ne sert quasi à rien, pourriez-vous me renseigner un tuto bien expliqué qui pourrait m'aider à réaliser ce programme?
    Merci
    • Partager sur Facebook
    • Partager sur Twitter
      8 mars 2006 à 15:21:22

      salut,
      tu vas m'expliquer le bien fonder de retourner a chaque fois une nouvelle instance de comptebancaire a chaque appel d'une methode.

      d'ailleur ton programme ne compile pas car les creations d'objet de correspondent pas au constructeur.

      au passage, ajout, retrait et virement de doivent en aucun cas renvyer quelque chose.
      tu t'es compliqué la vie.

      les attributs de classe ne sont pas declaré (erreur de compilation)
      utilise l'objet string au lien d'un tableau de char aussi.

      je ne te referais pas l'exo, car c'est ton travail. mais corrige deja tout ça.

      mais il n'est pas difficile
      • Partager sur Facebook
      • Partager sur Twitter
        8 mars 2006 à 17:56:51

        J'ai apporté les modifications que je pouvais:

        import java.io.*;

        class CompteBancaire {
                public CompteBancaire(String nom‚ String nocompte‚ int solde)
                {
                                        this.nomc = nom;
                                        this.compte = nocompte;
                                        this.soldec = solde;
                        }
                        public CompteBancaire ajout(int montant) {
                                        this.solde += montant;
                        }
                        public CompteBancaire retrait(int montant) {
                                        this.solde –= montant;
                        }
                        public CompteBancaire virement(CompteBancaire compte‚ int montant) {
                                this.solde –= montant;
                                compte.solde += montant;
                        }
                        public String toString() {
                                        System.out.println("Le titulaire du compte est " + this.nom);
                                        System.out.println("Le no du compte est " + this.nocompte);
                                        System.out.println("Le montant est " + this.solde);
                        }
                       
                        static public void main(String args[]) {
                                        CompteBancaire C1= new CompteBancaire("Herman""BE12345678901234"1000);
                                        CompteBancaire C2= new CompteBancaire("Deom""BE98765432106541"50);
                                        System.out.println( C1‚ C2);
                                        /*C1.ajout(1000);
                                        C2.retrait(1000);
                                        System.out.println(C1‚ C2);*/

                        }
        }

        Désolé de poser des bêtes questions mais c'est mon premier programme en java, peux-tu me dire où déclarer les attributs de classe et comment bien appeler le constructeur?
        Merci pour ta précieuse aide.
        • Partager sur Facebook
        • Partager sur Twitter
          8 mars 2006 à 22:47:37

          hum, il y a un truc qui me tracasse.
          ton ennoncé ressemble pas mal a un ennoncer de cours non?
          C'est un prof qui t'a filé ça non?
          il ne vous a pas appris la syntaxe java avant?
          tu as essayé de compiler ton programme?
          en faite, j'ai l'impression que tu melange C et java (avec un peu de PHP )

          comme je suis un mec sympa, je te donne une exemple.
          ne recopie pas betement ce que tu ne comprend pas
          Cela ne servirais a rien et tu te ferais griller au pres de ton prof :p


          /**
           * Cette classe est un exercice simple pour apprendre quelques notions de java
           * @author Pierrot la lune
           */

          public class CompteBanquaire {
                 
                  /*
                   * le nom du client
                   */

                  private String nom;
                 
                  /*
                   * le numero de compte
                   */

                  private String numeroIBAN;

                  /*
                   * le solde effectif du compte
                   */

                  private float solde;
                 
                  /**
                   * Cette classe permet de definir
                   * un compte bancaire simpliste
                   * @param nom le nom du client
                   * @param numeroIBAN le numero de compte au format IBAN
                   *  (pas de verification du formatage)
                   * @param solde le solde du compte
                   */

                  public CompteBanquaire(String nom‚ String numeroIBAN‚
                                         float solde) {
                          this.nom = nom;
                          this.numeroIBAN = numeroIBAN;
                          this.solde = solde;
                  }
                 
                  /**
                   * cette methode permet d'ajouter de l'argent au compte
                   * @param argent l'argent ajouté
                   */

                  public void ajout(float argent){
                          this.solde += solde;
                  }
                 
                  /**
                   * Cette methode permet de retirer
                   * de l'argent du compte
                   * @param argent l'argent a retirer
                   */

                  public void retrait(float argent){
                          this.solde –= solde;
                  }
                 
                  /**
                   * Cette methode permet de virer
                   * de l'argent du compte effectif           
                   *  vers un autre compte
                   * @param cb le compte destinataire
                   * @param argent l'argent a virer
                   */

                  public void virement(CompteBanquaire cb‚ float argent){
                          this.retrait(argent);
                          cb.ajout(argent);
                  }
                 
                  /**
                   * Redefinition de la methode toString
                   * @return l'affichage des attributs de l'objet
                   */

                  public String toString(){
                          return "Nom "+this.nom+" No: "+this.numeroIBAN
                                 +" Solde: "+this.solde;
                  }
                 

                  /**
                   * Redefinition de la methode equal
                   * @return vrai si l'objet est un
                   * CompteBancaire et possede les
                   * meme attributs‚ faux sinon
                   */

                  public boolean equals(Object arg0) {
                          boolean ret = false;
                          try{
                                  CompteBanquaire cb = (CompteBanquaire)arg0;
                                  ret = (cb.nom == this.nom
                                         && cb.numeroIBAN == this.numeroIBAN
                                         && cb.solde == this.solde
                                  );
                          }catch(ClassCastException e){
                                  ret = false;
                          }
                          return ret;
                  }

                  /**
                   * Permet de recuperer le nom du compte
                   * @return le nom du compte
                   */

                  public String getNom() {
                          return this.nom;
                  }

                  /**
                   * Permet de recuperer le numero de compte
                   * @return le numero de compte
                   */

                  public String getNumeroIBAN() {
                          return this.numeroIBAN;
                  }

                  /**
                   * Permet de recuperer le solde du compte
                   * @return le solde du compte
                   */

                  public float getSolde() {
                          return this.solde;
                  }

          }


          • Partager sur Facebook
          • Partager sur Twitter
            9 mars 2006 à 20:37:19

            Je ne crois pas que ce soit très pédagogique de donner une solution toute faite à raks :) .

            Juste pour le fun et que je ne sais pas par ou commencer pour critiquer le code de raks, je me critiquer le code de pierrot la lune pour que l'exemple soit plus correct:
            -il vaut mieux utiliser des commentaires javadoc (/** */) au lieu de commentaire "classique" (/* */) quand on commente un champ (/**le nom du client*/ au lieu de /*le nom du client*/) sinon le commentaire n'apparait pas dans la javadoc. (La javadoc est un outil pour générer automatiquement une documentation du code pour l'afficher notamment sous format html).
            -Dans le monde réel il vaut mieux se passer des nombres a virgules flottantes non précis du genre double ou float sinon on se retrouve avec des erreurs de d'arrondis qui risque de donner des choses absurbes du genre : "solde de votre compte 143.9999999".
            -la méthode equals est incorrect!
            si le paramètre passé est null à equals est null alors ca renvoit une exception au lieu de renvoyer null.
            De plus tu compare des string (nom et numeroIBAN) avec == au lieu de equals()
            De plus si on redéfinit equals il vaut mieux aussi redéfinir la méthode hashCode() sinon on risque d'avoir des merdes dans certains cas si on utilise des table de hash (hashmap/hashtable), mais c'est vrai qu'ici je vois mal utiliser un compte comme clé d'une hashmap.

            • Partager sur Facebook
            • Partager sur Twitter
              10 mars 2006 à 11:54:11

              hum, pour les commentaires, tu remarquerais que les /* */ sont placé devant des attributs privée qui de toute maniere n'apparaisse pas dans la javadoc. je ne veux en aucun cas les generer :) toute les methodes plublic ont un /** */ ;)
              un solde est un chiffre a virgule, que propose tu pour faire le change alors? il est plus absurde d'utiliser un entier car cela ne refletera encore moins la realité.

              par contre tu a bien fais de le souligner, j'ai omis le cas du null pour le equal, et c'est une erreur de ma part. j'ai aussi mis des == qui compare les adresses et non les chaines et c'est aussi une erreur d'inatention. (a l'utilisation je m'en serais rendu compre rapidement :) )

              et effectivement ce n'est pas forxcement tres pedagogique.
              mai etant developpeur java a la base et ne faisant 8h de php par jours au taf, je crois que je n'ai pas pu resiter :D
              pour hashcode, elle aurait pu etre redefinit mais elle n'etait pas demandé dans l'ennoncer.
              et effectivement un compte en clef ce n'est pas forcement utiliser. :)

              petite correction

                  public boolean equals(Object arg0) {
                              boolean ret = false;
                              try{
                                      if(arg0 != null){
                                           CompteBanquaire cb = (CompteBanquaire)arg0;
                                           ret = (cb.nom.equals(this.nom)
                                             && cb.numeroIBAN.equals(this.numeroIBAN)
                                             && cb.solde == this.solde
                                          );
                                      }
                              }catch(ClassCastException e){
                                      ret = false;
                              }
                              return ret;
                      }
              • Partager sur Facebook
              • Partager sur Twitter
                13 mars 2006 à 22:08:21

                Merci d'avoir le problème. Pour m'expliquer, il s'agit bien d'un exercice pour l'école mais j'ai bien lu et compris la solution avant de me baser dessus. On a appris l'orienté objet en c++ en début d'année et désormais, on est passé au java mais on doit être capable de l'apprendre par soi-même avec nos bases en c++ et quelques exemples dans le syllabus que je trouve pas très utile pour l'exercice alors j'ai quelques difficultés qui désormais s'éclaircissent un peu.
                Un grand merci en tout cas!
                • Partager sur Facebook
                • Partager sur Twitter
                  14 mars 2006 à 11:00:07

                  Au niveau des notions d'objet je te conseille de faire une petite révision ;)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    15 mars 2006 à 10:15:39

                    Il me reste un petit problème avec la surcharge du égal, à la fin, je fais C1=C2, il copie bien C2 dans C1 mais ensuite j'ajoute 1000 à C1 et il ajoute également 1000 à C2, voici mon code:

                    import java.io.*;

                    class CompteBancaire {
                            String nom, nocompte;
                            int solde;
                            public CompteBancaire(String nom, String nocompte, int solde)
                            {
                                    this.nom = nom;
                                    this.nocompte = nocompte;
                                    this.solde = solde;
                            }
                                    public void ajout(int montant) {
                                            this.solde += montant;
                                    }
                                    public void retrait(int montant) {
                                            this.solde -= montant;
                                    }
                                    public void virement(CompteBancaire cpt, int montant)
                                    {
                                            this.retrait(montant);
                                            cpt.ajout(montant);
                                    }
                                    public String toString() {
                                            return "\nLe titulaire du compte est " + this.nom + "\nLe no du compte est " + this.nocompte + "\nLe montant est " + this.solde;
                                    }

                            public boolean equals(Object arg0)
                            {
                                    boolean ret = false;
                                    try
                                    {
                                            if (arg0 != null)
                                            {
                                                    CompteBancaire cpt = (CompteBancaire)arg0;
                                                    ret = (cpt.nom.equals(this.nom)
                                                      && cpt.nocompte.equals(this.nocompte)
                                                      && cpt.solde == this.solde
                                               );
                                            }
                                    }
                                    catch (ClassCastException e)
                                    {
                                            ret = false;
                                    }
                                    return ret;
                            }
                                   
                                    static public void main(String args[]) {
                                                    CompteBancaire C1= new CompteBancaire("Herman", "BE12345678901234", 1000);
                                                    CompteBancaire C2 = new CompteBancaire("Deom", "BE98765432106541", 50);
                                                    System.out.println(C1.toString() + C2.toString());
                                                    C1.ajout(1000);
                                                    C2.retrait(1000);
                                                    System.out.println(C1.toString() + C2.toString());
                                                    C1 = C2;
                                                    System.out.println(C1.toString() + C2.toString());
                                                    C1.ajout(2000);
                                                    System.out.println(C1.toString() + C2.toString());
                                    }
                    }


                    J'ai attaqué la 2ème partie du programme et celle-ci me pose nettement plus de problèmes, je dois faire un modulo 97 sur un long et ceci n'est possible que sur des int et puis j'ai encore des erreurs à l'exécution, pouvez-vous me donner quelques conseils, voici mon code:

                    import java.io.*;

                    class NumeroCompte
                    {
                            String iban;
                            public NumeroCompte(String iban)
                            {
                                    this.iban = iban;
                                    this.verif(iban);
                            }
                            public void verif(String iban)
                            {
                                    String lettre[] = {"A" , "B" , "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
                                    String nb[] = {"10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35"};
                                    int reste, i, longueur;
                                    long ibannum;
                                    String pays;

                                    longueur = iban.length(); //calcul de la longueur du code iban
                                    pays = iban.substring(0, 4);//les 4 premiers caracteres sont deplaces dans un tableau de char temporaire
                                    iban = iban.concat(pays);

                                    for (i = 0; i < longueur; i++)
                                    {
                                            iban = iban.replaceAll (lettre[i], nb[i]);//conversion des lettres en nombre
                                    }

                                    ibannum=Long.parseLong(iban);

                                    reste = ibannum % 97;//modulo 97

                                    if (reste == 1)
                                            System.out.println("Le code IBAN est bon");
                                    else
                                            System.out.println("Le code IBAN est mauvais");
                            }
                    }

                    class CompteBancaire
                    {
                            String nom;
                            NumeroCompte nocompte;
                            int solde;
                            public CompteBancaire(String nom, NumeroCompte nocompte, int solde)
                            {
                                    this.nom = nom;
                                    this.nocompte = nocompte;
                                    this.solde = solde;
                            }
                            public void ajout(int montant)
                            {
                                    this.solde += montant;
                            }
                            public void retrait(int montant)
                            {
                                    this.solde -= montant;
                            }
                            public void virement(CompteBancaire cpt, int montant)
                            {
                                    this.retrait(montant);
                                    cpt.ajout(montant);
                            }
                            public String toString()
                            {
                                    return "\nLe titulaire du compte est " + this.nom + "\nLe no du compte est " + this.nocompte + "\nLe montant est " + this.solde;
                            }

                            public boolean equals(Object arg0)
                            {
                                    boolean ret = false;
                                    try
                                    {
                                            if (arg0 != null)
                                            {
                                                    CompteBancaire cpt = (CompteBancaire)arg0;
                                                    ret = (cpt.nom.equals(this.nom)
                                                      && cpt.nocompte.equals(this.nocompte)
                                                      && cpt.solde == this.solde);
                                            }
                                    }
                                    catch (ClassCastException e)
                                    {
                                            ret = false;
                                    }
                                    return ret;
                            }

                            static public void main(String args[])
                            {
                                    NumeroCompte cpt1 = new NumeroCompte("BE12345678901234");
                                    NumeroCompte cpt2 = new NumeroCompte("BE98765432106541");
                                    CompteBancaire C1 = new CompteBancaire("Herman", cpt1, 1000);
                                    CompteBancaire C2 = new CompteBancaire("Deom", cpt2, 50);
                                    System.out.println(C1.toString() + C2.toString());
                                    C1.ajout(1000);
                                    C2.retrait(1000);
                                    System.out.println(C1.toString() + C2.toString());
                                    C1 = C2;
                                    System.out.println(C1.toString() + C2.toString());
                                    C1.ajout(2000);
                                    System.out.println(C1.toString() + C2.toString());
                            }
                    }

                    L'énoncé se trouve dans mon premier post, merci pour votre aide.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      15 mars 2006 à 11:09:03

                      pas besoin de liree ton code. c'est normal qu'il y est ajout dans C1 et C2, car quand tu fait c1 = c2, tu ne copie pas l'objet tu passe l'adresse de l'objet a c2 et heureusement car si tout passage d'objet ce faisait par copie on perdrait beaucoup en puissance et cela mangera beaucoup plus de menoire.
                      si vraiment tu veux pouvoir copier ton objet il y a une histoire d'implementation de la methode clone (et d'une interface), mais je doute que c'est cela que tu dois faire (un chouilla compliqué pour un debutant)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        17 mars 2006 à 15:32:21

                        Déjà, je commencerais par mettre des commentaires parce que bon...puis aussi, toujours mettre des PRE et des POST à CHACUNE de tes méthodes. Ok, c'est barbant, mais pense à ceux qui utiliseront peut-être tes méthodes plus tard ?

                        Essaie aussi de mettre de l'ordre dans ton code...n'hésite pas à ajouter une ligne vide entre 2 variables d'instance. Regarde le code que pierrot la lune t'as montré, tu trouves pas qu'il est plus sympa à lire que le tien?

                        Bonne continuation.


                        EDIT: pierrot la lune --> tu es le premier que je vois qui comprend qu'une variable ne contient pas l'objet lui-même, mais l'adresse de l'objet. Je me sens moins seul :)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          17 mars 2006 à 18:26:12

                          xtaZy> j'ai 3 ans d'etudes specialisé dans le developpement Java ;)
                          sinon pour les post et pre, il faudrais deja qu'il sache ce qu'est la programmation par contrat qui d'ailleur n'est pas implemter de base dans java (avec la version 1.4, je ne sais pas pour la version 1.5) (il faut utiliser un JVM modifier :) )

                          raks> surtout ne recopie pas un code que tu ne comprends pas. :) (je ne sais pas si c'est le cas ou non ici, mais c'est un conseil pour l'avenir) Tu peux te faire griller par un prof.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            17 mars 2006 à 22:36:37

                            Citation : Pas de titre

                            EDIT: pierrot la lune --> tu es le premier que je vois qui comprend qu'une variable ne contient pas l'objet lui-même, mais l'adresse de l'objet. Je me sens moins seul



                            mais non tu n'est pas seul, mais bon on a pas l'occasion de montrai qu'on sait quand on répond dans la plupart des cas
                            • Partager sur Facebook
                            • Partager sur Twitter
                              19 mars 2006 à 1:39:26

                              Citation : Pas de titre

                              EDIT: pierrot la lune --> tu es le premier que je vois qui comprend qu'une variable ne contient pas l'objet lui-même, mais l'adresse de l'objet. Je me sens moins seul



                              c'est bien reducteur ca!!!
                              tout programmeur c'est ca une foi qu'il a vu et comprit( pas survolé ) ce que c'est un objet, norlament, sa commence avec les tableaux ;)
                              • Partager sur Facebook
                              • Partager sur Twitter

                              [Java] Classes

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown