Aide Java2

Résolu
Bonjour, je suis étudiant et debutant en Java, j'aurais besoin d'aide pour un appel de fonction:

J'ai céée cette fonction:

public boolean ajouterLivre(Livre livre) {
boolean resultat;
if(nombreLivre<nombreLivresMax) {
livres[nombreLivre]=livre;
nombreLivre++;
resultat=true;
}
else{
resultat=false;
}
return resultat;

Je cherche maintenant a ajouter des livres mais je n'y arrive pas:
public static void main(String[] args) {
ajouterLivre(livre1);
}

ajouterLivre... est soulibné en rouge. Merci pour votre aide !

32 réponses

Résumé de la discussion

Un étudiant débutant en Java cherche à appeler une méthode ajouterLivre(Livre livre) pour ajouter des objets Livre dans une Bibliothèque, mais l'appel dans le main est signalé en rouge. Plusieurs réponses insistent sur l’architecture orientée objet: créer une instance Bibliothèque et appeler la méthode via cet objet (par exemple biblio.ajouterLivre(livre1)) après avoir construit Livre avec un constructeur. Des conseils portent aussi sur l’utilisation d’un objet Livre plutôt que des chaînes, sur l’efficacité des tableaux d’objets et sur l’importance de différencier equals et == lors de comparaisons. En pratique, il est recommandé d’initialiser la bibliothèque et d’utiliser des tests unitaires simples montrant l’ajout et le retour booléen, puis d’élargir progressivement avec des opérations de retrait et de listing.

Bobot (l’IA à votre service)
  1. Voici:

    public void contenuAuteur(String auteur) {
    for(int i=0; i<nombreLivre; i++) {
    if (auteur.equals(livres[i].getAuteur())) {
    System.out.println("livre"+i+": "+livres[i]);
    }
    }
    }

    Je vous remercie pour tout tksteph vraiment ! J'espere que vous reponderez, si vous le voulez, a mes prochaines questions car j'ai encore quelques exos a faire !

    Grace a vous je comprend mieux java. Merci et a bientot
    1. Oublie pas de marquer ton sujet en résolu
  2. Evidemment livre[i].auteur je suis bete, c'est une erreur d'inattention. Merci je test de suite !
    1. Non justement. livres[i] fait reference au titre et a l'auteur et livres.auteur a l'auteur. Qu'ecrire donc pour cette comparaison ? Je vais comprendre ce que vous marquerez maintenant, je progresse ^^.

      Merci
      1. livres[i] fait reference au titre et a l'auteur et livres.auteur a l'auteur
        NON!
        livres[i] c'est l'élément à la ième position du tableau livres[], soit le livre qui se trouve à la ième position;

        et livres.auteur ne represente rien du tout! vu que livres est un tableau.

        Logiquement ton IDE(Eclipse/Netbeans) devrait te l'avoir souligné et si tu approches le curseur dessus il te dit quel est le problème.
        Donc ce que tu dois comparer c'est le paramètre auteur que tu passe à la méthode, avec l'auteru du livre à la position i soit ceci

        (auteur==livre[i].getAuteur()))

        ou encore (auteur==livre[i].auteur)) // si ton attribut auteur est public

        ou alors utiliser des "equals" à la place des"=="
    2. Juste pour la ligne pour tester juste l'auteur je n'ai pas reussi comme vous l'avez fait:

      public void contenuAuteur(String auteur) {
      for(int i=0; i<nombreLivre; i++) {
      if (livres[i]==(livres.auteur)) {
      System.out.println("livre"+i+": "+livres[i]);
      }
      }
      }

      1. (livres[i]==(livres.auteur))


        Trouves tu normal de faire ça?
        (Je pense que ton problème réside au niveau de la manipulation des objets, variables et méthodes: Revoir le cours à ce niveau)
        En attendant essaie de m'expliquer à quoi fait réference livre[i] et à quoi fait réference livres.auteur ?? (Si tu réussis, je pense que tu comprendra beaucoup de choses de là)
    3. Tres bien ! c'est compris.

      Plus qu'une question et je vous laisser tranquille ! si vous permetez:

      et définissez une
      fonction qui prend comme paramètre le nom d'un auteur, et qui renvoie une
      bibliothèque contenant tous les ouvrages présents de cet auteur dans la
      bibliothèque courante.

      Je suis actuellement entrain d'y reflechir. Je me demande comment detecter dans le tableau si certains caracteres sont presents dans une cases (donc le nom de l'auteur)
      1. Il te suffit alors de faire un test sur les caractères en question:

        Supposons par exemple que ton paramètre soit : param
        Alors tu devras vérifier si param est présent parmis les noms d'auteurs des livres de ton tableau, en fesant par exple
        if (param==livre.getAuteur()){
        // Ce livre ci fait parti des livres recherchés

        }

        Je te laisse implémenter la méthode
    4. Dans ton cours on dit:


      Une fois un objet instancié, on peut utiliser toutes ses variables et méthodes
      publiques de la manière suivante :
      Objet o = new Objet();
      o.méthode();


      C'est bien vrai!
      Mais quand tu fais ce ci : Object o = new Object(), du dmande au constructeur de s'executer.

      Donc si dans ton constructeur, tu fais Point P1 = new Point(x,y); Alors tu viens de créer un point dans ton constructeur, que tu ne vas pas utiliser et là dailleurs tu rentre dans une boucle infinie de création de points (A chaque fois que tu vas faire un new Point(x,y); le new Point(x,y) du constructeur sera appelé et ainsi de suite... on s'arrêtera jamais et ta mémoire risque d'être saturée.)

      Et pour ton programme, Retien que les méthodes get/set (Accesseurs et mutateurs) sont utilisées pour modifier les variables privées donc si tes variables sont publiques c'est pas la peine de les utiliser.

      Toute fois il est souvent préférable d'utiliser des variables privées pour éviter qu'on ne puisse les modifier de l'extérieure du programme.

      1. Ok je comprend c'est pour créer le tableau de livre du constructeur. Merci bien.
        Et pour la classe Point ^^" dans le programme que j'ai fait est ce utile de laisser le Point P1 = new Point(x,y); du constructeur ? Et deja mon programme convient il ? ou faut il rajouter les get comme tu l'as fait ?

        PS: Voici la derneire question pour la classe bibliothèque, je vais y reflechir:

        et définissez une
        fonction qui prend comme paramètre le nom d'un auteur, et qui renvoie une
        bibliothèque contenant tous les ouvrages présents de cet auteur dans la
        bibliothèque courante.
        1. Bonjour

          Merci bien. J'aimerais savoir a quoi sert l'instanciation de biblio.

          Et pour la question sur la classe Point ?

          Mercii
          1. J'aimerais savoir a quoi sert l'instanciation de biblio
            ?? A créer une bibliotheque!

            si tu souhaites avoir plusieurs bibliotheques, comment tu les crée?
        2. Tu ne peux pas faire livre1.ajouterLivre() pour ajouter un livre car ta classe Livre n'a pas de méthode ajouterLivre en plus tu n'ajoutes pas des livres à des livres mais à des bibliotheqes plustôt donc logiquement tu dois faire biblio.ajouterLivre(livre1) pour ajouter le livre livre1 à la bibliotheque biblio.

          Voici le code comple de la bibliotheque
          Je viens de modifier les méthodes retirerLivre et contenu (tu peux voir la façon dont elles sont implémentées) mais concentre toi surtout sur la méthode main et tu auras ton exemple d'utilisation.

          
          public class Bibliothèque {
          
              private final int nombreLivresMax = 5;
              private int nombreLivre;
              private Livre[] livres;
          
              /**
               * Creates a new instance of Bibliothèque
               */
              public Bibliothèque() {
                  nombreLivre = 0;
                  livres = new Livre[5];
              }
          
              public boolean ajouterLivre(Livre livre) {
                  boolean resultat;
                  if (nombreLivre < nombreLivresMax) {
                      livres[nombreLivre] = livre;
                      nombreLivre++;
                      resultat = true;
                  } else {
                      resultat = false;
                  }
                  return resultat;
              }
          
              public boolean retirerLivre(Livre livre) {
                  boolean resultat=false;
          
                  int i=0;
                  while ((!resultat)&&(i<nombreLivre)){
                      resultat = (livres[i].equals(livre)) ;
                      i++;
                  }
                  if(resultat){
                      livres[i-1] = new Livre("","");
                  }
                  return resultat;
              }
          
              public void contenu() {
                  Livre livre;
                  for (int i = 0; i < nombreLivre; i++) {
                      livre = this.livres[i];
                      if((livre.getTitre()!="")||(livre.getAuteur()!="")){
                          System.out.println("Live: " +livre.getTitre());
                      }
                  }
              }
          
              /**
               * @param args the command line arguments
               */
              public static void main(String[] args) {
                  
                  //Création de la bibliotheque
                  Bibliothèque biblio = new Bibliothèque();
                  
                  //Création de 5 Livres
                  Livre livre0 = new Livre("TITRE0", "AUTEUR0");
                  Livre livre1 = new Livre("TITRE1", "AUTEUR1");
                  Livre livre2 = new Livre("TITRE2", "AUTEUR2");
                  Livre livre3 = new Livre("TITRE3", "AUTEUR3");
                  Livre livre4 = new Livre("TITRE4", "AUTEUR4");
                  
                  //Ajout des 5 livres dans la bibliotheque
                  
                  biblio.ajouterLivre(livre0);
                  biblio.ajouterLivre(livre1);
                  biblio.ajouterLivre(livre2);
                  biblio.ajouterLivre(livre3);
                  biblio.ajouterLivre(livre4);
                  
                  //Affichage des livres
                  System.out.println("Contenu de Ma bibliotheque");
                  biblio.contenu();
          
                  //Retrait des livres: 1 et 2
                  biblio.retirerLivre(livre1);
                  biblio.retirerLivre(livre2);
                  
                  //On liste une fois de plus pour vérifier qu'on a bien retiré les livres
                  System.out.println("Contenu de Ma bibliotheque après le retrait des deux livres");
                  biblio.contenu();
          
              }
          }
          


          Le résultat en sortie:


          Contenu de Ma bibliotheque
          Live: TITRE0
          Live: TITRE1
          Live: TITRE2
          Live: TITRE3
          Live: TITRE4
          Contenu de Ma bibliotheque après le retrait des deux livres
          Live: TITRE0
          Live: TITRE3
          Live: TITRE4



          Si tu veux être le meilleur, il faut que tu battes le meilleur!
          1. Pour ajouter les livres, il faudrait donc instancier avec cela:
            Livre livre1 = new Livre("titre1","auteur1");
            Livre livre2 = new Livre("titre1","auteur1");
            Puis utiliser la methode avec:
            livre1.ajouterLivre()

            Ou faire cela ? Pourriez vous simplement me montrer un exemple dans Bibliothèque donc pour que je comprenne, comme cela c'est bon ?

            Pour la classe Point, cela suffit il comme j'ai fait, on entrerai x et y dans le main, je supprimerais bien cette ligne avec Point P1 = new Point(x,y);, mais quand on etrerais le x et y ce serait en initialisant simplement: x=3; ou alors avec le constructeur

            (c'est pour cela que j'ai mit dedas l'instanciation, pour creer alors le point... on dit d'ailleur dans mon cours cela:

            Une fois un objet instancié, on peut utiliser toutes ses variables et méthodes
            publiques de la manière suivante :
            Objet o = new Objet();
            o.méthode();

            ). Ou faut il faire des methodes getX comme vous l'avez bien fait ?

            Merci a toi si je peux vous tutoyez !
            1. Commençons par la deuxième question: Peux tu la reformuler?
              Et j'insiste, ta classe Livre ne doit pas avoir des lignes comme

              "Livre livre1 = new Livre("titre1","auteur1");
              Livre livre2 = new Livre("titre1","auteur1"); "

              Ce sont là des lignes ou tu crée 2 livres, et il n'ya aucun intérêt à le faire dans la classe Livre.

              La première questinon (Ta classe Point)

              Si je te suis bien tu as une classe Point qui représente un Point(Affine) avec 2 coordonnées x et y, et tu veux faire une méthode distance qui évalue la distance entre ton point et un autre point qui lui est passé en paramètre.

              --1on utilise un constructeur pour pouvoir recuperer et modifier l'objet
              Non!! Le constructeur comme son nom l'indique, te sert à "construire" un objet et l'initialiser.

              Ci-dessous ta classe modifiée

              
              
              
              /**
               *
               * @author Stephane T
               */
              public class Point {
                  private final int x; //Abscisse
                  private final int y; // Ordonnée
                  /** Creates a new instance of Point */
                  public Point(int x, int y) {
                      this.x=x;
                      this.y=y;
                  }
                  
                  public double distance (Point P) {
                      return  Math.sqrt((this.x-P.getX())*(this.x-P.getX())+(this.y-P.getY())*(this.y-P.getY()));
                  }
                  
                  public void affichage () {
                      System.out.println("Point:: Abscisse x: "+x+" Ordonee y: " +y);
                  }
                  
                  public int getX(){ 
                      return x;
                  }
                  
                  public int getY(){
                      return y;
                  }
                  
                  public static void main(String[] args){
                      Point P1 = new Point(1,2);
                      Point P2 = new Point(4,3);
                      
                      P1.affichage();
                      P2.affichage();
                      
                      System.out.println("Distance entre P1 et P2 : "+ P1.distance(P2));
                      System.out.println("Distance entre P2 et P1 : "+ P2.distance(P1));
                      System.out.println("Distance entre P1 et P1 : "+ P1.distance(P1));
                      System.out.println("Distance entre P2 et P2 : "+ P2.distance(P2));
              
                      
              
                  }
              } 
              
              
              
              
              
              


              Donc voilà une classe point qui fait ce que je décris plus haut.

              Remarque le type de retour de ta méthode distance (Point P);
              Je l'ai remplacé par double (C'est traduit plus la réalité) mais tu peux remettre le int si tu le souhaite et faire un cast.

              Je t'ai aussi rajouté un main pour illustrer ce que je dis
              Voici le résultat en sortie:


              Point:: Abscissex: 1 Ordonee: 2
              Point:: Abscissex: 4 Ordonee: 3
              Distance entre P1 et P2 : 3.1622776601683795
              Distance entre P2 et P1 : 3.1622776601683795
              Distance entre P1 et P1 : 0.0
              Distance entre P2 et P2 : 0.0


              Si tu veux être le meilleur, il faut que tu battes le meilleur!
              1. Bonjour !

                Pour la classe point je comprend mieux: on utilise un constructeur pour pouvoir recuperer et modifier l'objet, objet que l'on initialise par instanciation, et que l'on utilise avec P1.x.

                J'ai modifié le programme est ce mieux ? (il est censé definir un point par raport auquel on mesure une distance a un point variable P1)

                package tp1ex3;

                /**
                *
                * @author 12mi143
                */
                public class Point {
                public int a=1;
                public int b=2;
                public int x;
                public int y;

                /** Creates a new instance of Point */
                public Point(int x, int y) {
                this.x=x;
                this.y=y;
                Point P1 = new Point(x,y);
                }
                public int distance (Point P1) {
                return (int) Math.sqrt((a-P1.x)*(a-P1.x)+(b-P1.y)*(b-P1.y));
                }
                public void affichage () {
                System.out.println("Point:" +x +y);
                }
                }


                Pour la classe blibliothèque, je pense qu'il faut utliser le constructeur de la classe livre et initialiser, est ce ca ? :

                public class Livre {
                private String titre;
                private String auteur;
                /** Creates a new instance of Livre */
                public Livre(String titre, String auteur) {
                this.auteur=auteur;
                this.titre=titre;}
                Livre livre1 = new Livre("titre1","auteur1");
                Livre livre2 = new Livre("titre1","auteur1");

                public String getTitre() {
                return titre;
                }

                public void setTitre(String titre) {
                this.titre = titre;
                }

                public String getAuteur() {
                return auteur;
                }

                public void setAuteur(String auteur) {
                this.auteur = auteur;
                }

                }


                Merciii... !
                1. Attention!!! Je n'ai pas dit d'ajouter dans le main:

                  Livre livre1 = new Livre("titre1","auteur1");
                  Livre livre2 = new Livre("titre1","auteur1");

                  C'était un exemple que je prenais pour illustrer mes propos.

                  Tes livres tu les crée de la même manière en donnant un livre et un auteur.

                  7??? Celà ne devrait pas te poser de problème!

                  Pour ton programme, Et bien distance(Point) est une méhtode appelée distance et qui prend en paramètre un objet de type Point. l'expression en soi n'a aucune signification "en java" mais dans ton programme si.
                  P1.x c'est l'attribut x de ton objet P1.

                  comment cela va marcher si on ne parle pas du x de P1
                  Et bien P1 c'est juste un nom générique, on aurait pu noter X ou Y ou Z ce serait pareil (à la place de P1 biensur).

                  Et quand tu parles de comment ça va mercher, je suppose que tu parles de la méthode affichage,
                  affichage est une méthode de la classe Point et qui utilise des attributs de la classe (notament x et y).

                  Donc x et y sont des attributs de La classe Point et non de l'objet P1 qui est une sorte de point , utilisé dans ta méthode distance (En dehors de distance, P1 n'a plus de sens)
                  La méthode va donc bien "marcher" car par défaut tes attributs x et y ont des valeurs (1 et 2 respectivement)

                  1. Bien ^^. Je vais garder ca pour l'instant et voir avec mon prof si ca suffit.

                    Par contre pour ca je ne sais pas trop comment ajouter les livres, j'ai fait comme vous avez dit pour l'instant avec l'instanciation dans le main

                    Livre livre1 = new Livre("titre1","auteur1");
                    Livre livre2 = new Livre("titre1","auteur1");

                    7) Ajoutez plusieurs Livre d'un même Auteur dans la bibliothèque, et définissez une fonction qui prend comme paramètre le nom d'un auteur, et qui renvoie une
                    bibliothèque contenant tous les ouvrages présents de cet auteur dans la
                    bibliothèque courante.

                    PS: une petite quesion en parallele si vos me l'accordez:

                    Voici un programme dans lequel je ne comprend pas certaines choses:

                    package tp1ex3;

                    /**
                    *
                    * @author 12mi143
                    */
                    public class Point {
                    public int x=1;
                    public int y=2;
                    /** Creates a new instance of Point */
                    public Point(int x, int y) {
                    this.x=x;
                    this.y=y;
                    }
                    public int distance (Point P1) {
                    return (int) Math.sqrt((x-P1.x)*(x-P1.x)+(y-P1.y)*(y-P1.y));
                    }
                    public void affichage () {
                    System.out.println("Point:" +x +y);
                    }
                    }


                    pour la methode distance, que veux dire en java distance(Point P1) et P1.x comment cela va marcher si on ne parle pas du x de P1 ?
                    1. comme ca il me parait retirer le livre si le nom entré est correct, mais ce que j'ai rajouter avec "null" est ce correct


                      ça marchera, mais s'il t'arrive de manipuler ton tableau de livres, alors ton programme va te retourner des erreurs (NullPointerException).

                      Autre chose, avec ça, ne t'attend pas à comparer deux livres qui ont le même titre et le même auteur, si ce n'es le même objet.
                      exemple si tu fais: Livre livre1 = new Livre("titre1","auteur1");
                      Livre livre2 = new Livre("titre1","auteur1");

                      ALors livre1 sera different de livre2.

                      1. Bonjour!

                        Mon programme est il quand meme juste ? Pourriez vous m'en dire plus sur ce qu'il fait par rapport a ce qu'il faut faire ? comme ca il me parait retirer le livre si le nom entré est correct, mais ce que j'ai rajouter avec "null" est ce correct ?

                        voici la question clairement:
                        Dans Bibliothèque, ajoutez une méthode qui permet de retirer un Livre, et qui
                        renvoie un booléen à vrai si le Livre a été trouvé et retiré. (pensez à définir des méthodes pour tester l'égalité entre 2 Auteur et 2 Livre)

                        Merci comme toujours

                        PS: comme indication on a eu qu'il faut utiliser un: for, un livres[i].equals

                        Si il faut utiliser l'autre classe ca devient compliqué pour moi la..
                        1. Bien évidement cette fois ci si tu manipules les Livre, alors pour retirer un livre il faudra cette fois-ci,pas utiliser le == ou equals sur les objets livres, mais plustôt sur leurs auteurs et titres.
                          En gros deux livres qui ont le même auteur et le mêmee titre sont égaux.

                          Et de cette façon tu peux supprimer un livre si tu le retrouves déja dans ta collection.

                          1. Ah j'ai mal lu votre propos, l'erreur etait a la ligne avec le "==" je crois bien.
                            1. Bonsoir,

                              J'ai donc remi le programme precedent, il y en effet une erreur a la ligne:

                              A quelle ligne?

                              Problème: Imagine que tu souhaites retirer le livre à la dernière case du tableau, alors ta méthode va vouloir remplacer par le livre à la case suivante (qui n'existe pas!!) Donc!!! Revoir ça!!!



                              Voici le programme, avec la correction, je ne sais pas trop si c'est juste, pour le retirer livre:

                              package tp1ex2;

                              /**
                              *
                              * @author 12mi143
                              */
                              public class Bibliothèque {
                              private final int nombreLivresMax=5;
                              private int nombreLivre;
                              private Livre[] livres;
                              /** Creates a new instance of Bibliothèque */
                              public Bibliothèque() {
                              nombreLivre=0;
                              livres = new Livre[5];
                              }
                              public boolean ajouterLivre(Livre livre) {
                              boolean resultat;
                              if(nombreLivre<nombreLivresMax) {
                              livres[nombreLivre]=livre;
                              nombreLivre++;
                              resultat=true;
                              }
                              else{
                              resultat=false;
                              }
                              return resultat;
                              }
                              public boolean retirerLivre(String livre) {
                              boolean resultat=false;
                              for (int i = 0; i < nombreLivre; i++) {
                              if (livres[i].equals(livre)){
                              resultat = true;
                              livres[i] = livres[i+1];
                              }
                              if (livres[nombreLivre].equals(livre)) {
                              livres[nombreLivre]=null;
                              }
                              } public void contenu() {
                              for (int i=0; i<nombreLivre; i++) {
                              System.out.println("contenu:" +livres[i]);
                              }
                              }
                              /**
                              * @param args the command line arguments
                              */
                              public static void main(String[] args) {
                              // TODO code application logic here

                              }

                              }

                              Pour la classe Livre, pas de pb, rassure toi juste que tu y as accès depuis ta classe bibliotheque(Si jamais les deux ne sont pas dans le même repertoire, tu devras l'importer : import "chemin de ta classe") Pour la classe Livre, pas de pb, rassure toi juste que tu y as accès depuis ta classe bibliotheque(Si jamais les deux ne sont pas dans le même repertoire, tu devras l'importer : import "chemin de ta classe")

                              Les classes sont toutes les deux dans:: projet tp1ex2 / Source packages / tp1ex2 / et la il y a les 2 fichiers (bibliotheque et livre)
                              1. J'ai donc remi le programme precedent, il y en effet une erreur a la ligne:

                                A quelle ligne?

                                Ta méhtode retirerLivre ainsi écrite ne "Retire" pas vraiment un livre.
                                Elle le remplace par le livre à la position suivante dans ton tableau.

                                Problème: Imagine que tu souhaites retirer le livre à la dernière case du tableau, alors ta méthode va vouloir remplacer par le livre à la case suivante (qui n'existe pas!!) Donc!!! Revoir ça!!!

                                Pour la classe Livre, pas de pb, rassure toi juste que tu y as accès depuis ta classe bibliotheque(Si jamais les deux ne sont pas dans le même repertoire, tu devras l'importer : import "chemin de ta classe")
                                • 1
                                • 2