Problems with results

169 Views Asked by At

hello ? please this is my Code in Java , It works but the categorie of the word do not appear in the console :

So , I am follwing the exercices so that the methode categorie shoulb be private but i am wondering if i have failed somewhere

package packageSdz1;



// portée de la classe : public 
/* private :  méthode utilisée 
*que dans la classe où elle est mentionnée
public class Ville {
*/

public class Ville {


    // public sans ajout de portée

       //Les variables de classe : celles-ci sont communes à 
        //toutes les instances de votre classe.

    private String nomVille;
    private String nomPays;
    private int nbreHabitants;
    private char categorie;



    //Variables publiques qui comptent les instances
    public static int nbreInstances = 0;

      //Variable privée qui comptera aussi les instances
    private static int nbreInstancesBis = 0;   




    //Constructeur par défaut , es variables d'instance : ce sont elles 
    // qui définiront les caractéristiques de notre objet.
      public Ville(){

        System.out.println("Création d'une ville !");      
        nomVille = "Inconnu";
        nomPays = "Inconnu";
        nbreHabitants = 0;


        //On incrémente nos variables à chaque appel aux constructeurs
        nbreInstances++;
        nbreInstancesBis++;          
        //Le reste ne change pas.
      } 


          //Constructeur avec paramètres
          //J'ai ajouté un « p » en première lettre des paramètres.
          //Ce n'est pas une convention, mais ça peut être un bon moyen de les repérer.
          public Ville(String pNom, int pNbre, String pPays)
          {

            System.out.println("Création d'une ville avec des paramètres !");
            nomVille = pNom;
            nomPays = pPays;
            nbreHabitants = pNbre;



            nbreInstances++;
            nbreInstancesBis++;  
          }        




        //*************   ACCESSEURS *************


          public static int getNombreInstancesBis()
          {
            return nbreInstancesBis;
          }  
          //Le reste du code est le même qu'avant




          //Retourne le nom de la ville
          public String getNom()  {  
            return nomVille;
          }

          //Retourne le nom du pays
          public String getNomPays()
          {
            return nomPays;
          }

          // Retourne le nombre d'habitants
          public int getNombreHabitants()
          {
            return nbreHabitants;
          } 
          //Retourne la catégorie de la ville
              public char getCategorie()
              {
                return categorie;
              } 

          //*************   MUTATEURS   *************

          //Définit le nom de la ville
          public void setNom(String pNom)
          {
            nomVille = pNom;
          }

          //Définit le nom du pays
          public void setNomPays(String pPays)
          {
            nomPays = pPays;
          }

          //Définit le nombre d'habitants
          public void setNombreHabitants(int nbre)
          {
            nbreHabitants = nbre;
            this.setCategorie();
          }  


        //*******************************

          //Définit la catégorie de la ville
          private void setCategorie() {

            int bornesSuperieures[] = {0, 1000, 10000, 100000, 500000, 1000000, 5000000, 10000000};
            char categories[] = {'?', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'};

            int i = 0;
            while (i < bornesSuperieures.length && this.nbreHabitants > bornesSuperieures[i])
              i++;

            this.categorie = categories[i];
          }

          //Retourne la description de la ville
          public String decrisToi(){
            return "\t"+this.nomVille+" est une ville de "+this.nomPays+ ", elle comporte : "
                    +this.nbreHabitants+" habitant(s) => elle est donc de catégorie : "+this.categorie;
          }

          //Retourne une chaîne de caractères selon le résultat de la comparaison
          public String comparer(Ville v1){
            String str = new String();

            if (v1.getNombreHabitants() > this.nbreHabitants)
              str = v1.getNom()+" est une ville plus peuplée que "+this.nomVille;

            else
              str = this.nomVille+" est une ville plus peuplée que "+v1.getNom();
            return str;  


}
}

And

        Ville v = new Ville();
        Ville v1 = new Ville("Marseille", 123456, "France");       
        Ville v2 = new Ville("Rio", 321654, "Brésil");



            System.out.println("\n\n"+v1.decrisToi());
            System.out.println(v.decrisToi());
            System.out.println(v2.decrisToi()+"\n\n");
            System.out.println(v1.comparer(v2));

Do you know why , the categorie do not appear at the result ?

Création d'une ville !
Création d'une ville avec des paramètres !
Création d'une ville avec des paramètres !


    Marseille est une ville de France, elle comporte : 123456 habitant(s) => elle est donc de catégorie : 
2

There are 2 best solutions below

1
On

You are never calling setCategorie().

Try adjusting your constructor to:

    public Ville(String pNom, int pNbre, String pPays) {

        System.out.println("Création d'une ville avec des paramètres !");
        nomVille = pNom;
        nomPays = pPays;
        nbreHabitants = pNbre;
        // Add this !!!
        setCategorie();

        nbreInstances++;
        nbreInstancesBis++;
    }

Although a better solution would be to not have a categorie instance variable as it solely depends on nbreHabitants so you could better do it as:

    //Retourne la catégorie de la ville
    public char getCategorie() {

        int bornesSuperieures[] = {0, 1000, 10000, 100000, 500000, 1000000, 5000000, 10000000};
        char categories[] = {'?', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'};

        int i = 0;
        while (i < bornesSuperieures.length && this.nbreHabitants > bornesSuperieures[i])
            i++;

         return categories[i];
    }
1
On

Your issue lies in that you never call setCategorie() so the categorie char is never initialised. You could call this in the constructor for the method to ensure that categorie has a value when you call decrisToi().

You'll also have to change the while loop in the method setCategorie() as below to ensure that when nbreHabitants is 0 categorie still gets initialised. Make sure you increment i after setting categorie.

    while (i < bornesSuperieures.length && this.nbreHabitants >= bornesSuperieures[i])

As a future tip, try and use a standard format for your code so it is easier to read! Most IDEs can do this for you very easily.