Partage
  • Partager sur Facebook
  • Partager sur Twitter

Avis sur un programme

Programme de loto relativement basique

Sujet résolu
    20 octobre 2010 à 2:16:40

    Voilà je programme un peu à mes heures, et je m'intéresse grandement au langage JAVA. Après avoir lu divers cours par-ci par-là, je me suis attelé à la production d'un programme en mode console de loto.
    J'aimerais votre avis sur le code source de la classe principale (il n'y a que celle-là) et éventuellement quelques conseils d'amélioration si vous pouviez m'en donner. Merci d'avance.
    Je précise que j'ai fait le code sous l'IDE NetBeans et que le projet s'appelait "loto".
    Voici le code source :
    package loto;
    
    import java.util.Scanner;
    
    public class Main {
    
        public static void main(String[] args) {
            
            /* LES VARIABLES DU PROGRAMME
             * SONT DECLAREES ICI POUR PLUS
             *        DE CLARTE
             */
            
            int tableau_nombres_loto[] = {0,0,0,0,0};   // Le tableau des nombres du loto
            int tableau_nombres_entres[] = {0,0,0,0,0}; // Le tableau des nombres entrés par l'utilisateur
            int compteur = 0;   // Le compteur de boucle while
            Scanner scan = new Scanner (System.in); // De quoi prendre les entrées clavier
            int i, d, e;    // diverses variables pour les boucles for, et "e" pour les numéros trouvés
            int a = 0;  // pour la première boucle while, je l'initialise à 0.
            boolean occurence = false;  // Booléen pour occurences loto
            double nombre_aleatoire;    // Un intermédiaire pour tronquer en castant
            
            // L'afficheur de bienvenue
            
            System.out.println("Bienvenue dans le programme LOTO !");
               
            // On va générer le tableau de nombres LOTO
           
            while (compteur <=4)    // tant qu'il n'y a pas 5 nombres pour le tirage
                {
                    nombre_aleatoire = Math.random() * 100;                     //generation d'un nombre aléatoire
                    tableau_nombres_loto[compteur] = (int)nombre_aleatoire;     // on le stocke dans le tableau loto
                    
                    /*
                     * COMME LA METHODE RANDOM N'EST PAS SI RANDOMISEE QUE CA
                     * JE FABRIQUE SI IL Y A OCCURENCE DANS LES NOMBRES DU LOTO
                     * UN NOMBRE RELATIVEMENT PROCHE (idées bienvenues sinon)
                     */
                    
                    for (i=0;i<5;i++)
                    {
                        for(d=0;d<5;d++)    
                        {
                            if ((tableau_nombres_loto[i]==tableau_nombres_loto[d]) && (i!=d))
                                if (tableau_nombres_loto[d] != 99)
                                    tableau_nombres_loto[d]++;
                                else if (tableau_nombres_loto[d] != 1)
                                    tableau_nombres_loto[d]--;
                        }
                    }
                            compteur++;
                }
            while (a<5) // tant qu'on a pas tapé 5 nombres
            {
                    System.out.print("\nEntrez le nombre " + (a+1) + " : ");
                    tableau_nombres_entres[a] = scan.nextInt();
                    
                    // là je teste si le nombre est dans les bornes du loto
                    
                    while (tableau_nombres_entres[a] <0 || tableau_nombres_entres[a] > 99)
                    {
                        System.out.print("\nAllez, entrez un nombre entre 1 et 100 : ");
                        tableau_nombres_entres[a] = scan.nextInt();
                    }
                    
                    /*
                     * LORS DE LA PREMIERE ENTREE DANS LA BOUCLE, ON NE PEUT PAS COMPARER
                     * LE PREMIER NOMBRE A LUI-MEME : ON INCREMENTE a POUR PASSER AU SUIVANT
                     */
                    
                    if (a==0)
                        a++;
                    else if(a > 0) // on regarde à partir de 2 entrées s'il y en a 2 pareils
                    {
                        for (i=0;i<=a;i++)
                        {
                            for (d=0;d<=a;d++)
                            {
                                if ((tableau_nombres_entres[i] == tableau_nombres_entres[d])&& (i!=d))
                                    occurence = true;
                            }
                        }
                        if(occurence == false) // tant que pas 2 pareils, on continue
                            a++;
                        else    // on affiche l'occurence à l'utilisateur
                            System.out.println("\nVous avez déjà choisi le nombre \"" + tableau_nombres_entres[a] + "\" ; recommencez S.V.P");
                            occurence = false;
                    }
                    
            }
            System.out.print("Vous avez entre les nombres "); // on récapitule les nombres choisis
                for (i=0;i<5;i++)
                {
                    if (i == 4)
                        System.out.print(tableau_nombres_entres[i] + ".");
                    else
                        System.out.print(tableau_nombres_entres[i] + " ; ");
                }
    
            System.out.println("\nJe vais maintenant vous dévoiler la combinaison gagnante !");
                
            /*
             * LA ON VA SE BALADER DANS LE TABLEAU DU LOTO POUR RETROUVER LES NUMEROS QUI
             * SONT SORTIS AU TIRAGE, POUR FINALEMENT LES COMPARER AVEC LES NUMEROS DE L'USAGER
             */
            
            for(e=0;e<5;e++)
            {
                System.out.println("Numéro "+ (e+1) + " : " + tableau_nombres_loto[e]);
            }
            System.out.print("\n\n La combinaison gagnante était donc : ");
            for (i=0;i<=4;i++)
            {
                if (i == 4)
                {
                    System.out.print(tableau_nombres_loto[i] + ".");
                }
                else
                    System.out.print(tableau_nombres_loto[i] + " ; ");
    
            }
            System.out.print("\n\n Et votre combinaison était : ");
            for (i=0;i<=4;i++)
            {
                if (i ==4)
                    System.out.print(tableau_nombres_entres[i] + ".");
                else
                    System.out.print(tableau_nombres_entres[i] + " ; ");
            }
            System.out.println("\n\nVoyons votre resultat...");
            
            e = 0;  // en fait la variable "e" stocke les occurences entre numéros tirés et ceux choisis par l'usager
            for (i=0;i<5;i++)
            {
                for (d=0;d<5;d++)
                {
                    if (tableau_nombres_loto[i] == tableau_nombres_entres[d])
                    e++;
                }
    
            }
            if (e == 5)
                System.out.println("\nVous gagnez, bravo à vous !!!!");
            else
                System.out.println("\nVous perdez... \n\nVous aviez " + e + " occurences avec le tirage du loto...");
            
            System.out.println("\n\n Au revoir et en vous souhaitant bonne chance pour la prochaine fois !!");
            System.out.println("\n Appuyez sur Enter pour quitter...");
            scan.nextLine();    // vidage de la ligne ci-dessus
            scan.nextLine();    // Attente Entrée
        }
    
    }
    
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      20 octobre 2010 à 4:27:36

      Pour un début c'est bien par contre je crois que l'utilisation de certains types d'objet de Java pourrait améliorer grandement l'efficacité de ton programme pour tout ce qui concerne les doublons.

      Java possède des genres de tableaux qui ne permettent pas les doublons dedans (tout ce qui est de type Set).
      Ces classes sont déjà conçues(et optimisée) afin d'éliminer les doublons.
      Au lieu de réinventer la roue (avec des while ou autre chose) on utilise ce que les vrais pros on fait.

      j'ai commenté ton code à deux endroit pour te montrer comment implémenter ces classes.



      package loto;
      
      import java.util.Scanner;
      
      public class Main {
      
          public static void main(String[] args) {
              
              /* LES VARIABLES DU PROGRAMME
               * SONT DECLAREES ICI POUR PLUS
               *        DE CLARTE
               */
              
              int tableau_nombres_loto[] = {0,0,0,0,0};   // Le tableau des nombres du loto
              int tableau_nombres_entres[] = {0,0,0,0,0}; // Le tableau des nombres entrés par l'utilisateur
              int compteur = 0;   // Le compteur de boucle while
              Scanner scan = new Scanner (System.in); // De quoi prendre les entrées clavier
              int i, d, e;    // diverses variables pour les boucles for, et "e" pour les numéros trouvés
              int a = 0;  // pour la première boucle while, je l'initialise à 0.
              boolean occurence = false;  // Booléen pour occurences loto
              double nombre_aleatoire;    // Un intermédiaire pour tronquer en castant
              
              // L'afficheur de bienvenue
              
              System.out.println("Bienvenue dans le programme LOTO !");
                 
              // On va générer le tableau de nombres LOTO
             
             /************************************************************************* */
             /* POUR ÉVITER L'HISTOIRE DE TOUS LES DOUBLONS ON PEUT FAIRE SIMPLE CECI.
              * Set<Integer>  set_nombres_loto = new HashSet<Integer>(); // un HashShet est un genre de tableau mais qui ne permet pas les doublons à l'intérieur
              * while( set_nombres_loto.size() != 5){
              *     set_nombres_loto.add(new Random().nextInt(100))) // le random va te générer un int aléatoire entre 0 et 100
              *     //ici, si le nombre généré aléatoirement est déja dans "set_nombres_loto", il ne sera pas ajouté tout simplement
              * }//while tant que la liste n'as pas 5 nombres.
              
              ensuite tu eux recopier ce HashSet vers ton tableau tu fais
                  int x=0; //variable bidon utile juste ici
                  for(int i : set_nombres_loto)
                      tableau_nombres_loto[x++]=i;
             
              et tu reprends ton code à  : while (a<5)
             *******************************************************************************/
             
              while (compteur <=4)    // tant qu'il n'y a pas 5 nombres pour le tirage
                  {
                      nombre_aleatoire = Math.random() * 100;                     //generation d'un nombre aléatoire
                      tableau_nombres_loto[compteur] = (int)nombre_aleatoire;     // on le stocke dans le tableau loto
                      
                      /*
                       * COMME LA METHODE RANDOM N'EST PAS SI RANDOMISEE QUE CA
                       * JE FABRIQUE SI IL Y A OCCURENCE DANS LES NOMBRES DU LOTO
                       * UN NOMBRE RELATIVEMENT PROCHE (idées bienvenues sinon)
                       */
                      
                      for (i=0;i<5;i++)
                      {
                          for(d=0;d<5;d++)    
                          {
                              if ((tableau_nombres_loto[i]==tableau_nombres_loto[d]) && (i!=d))
                                  if (tableau_nombres_loto[d] != 99)
                                      tableau_nombres_loto[d]++;
                                  else if (tableau_nombres_loto[d] != 1)
                                      tableau_nombres_loto[d]--;
                          }
                      }
                              compteur++;
                  }
                  
              /***********************************************************************
               * ICI TU POURRAIS RÉPÉTER L'EXPÉRIENCE DU HASHSET POUR TOUTE TA BOUCLE WHILE ...AIDE-TOI DE LA JAVADOC POUR L'IMPLÉMENTER.
               ************************************************************************/
              while (a<5) // tant qu'on a pas tapé 5 nombres
              {
                      System.out.print("\nEntrez le nombre " + (a+1) + " : ");
                      tableau_nombres_entres[a] = scan.nextInt();
                      
                      // là je teste si le nombre est dans les bornes du loto
                      
                      while (tableau_nombres_entres[a] <0 || tableau_nombres_entres[a] > 99)
                      {
                          System.out.print("\nAllez, entrez un nombre entre 1 et 100 : ");
                          tableau_nombres_entres[a] = scan.nextInt();
                      }
                      
                      /*
                       * LORS DE LA PREMIERE ENTREE DANS LA BOUCLE, ON NE PEUT PAS COMPARER
                       * LE PREMIER NOMBRE A LUI-MEME : ON INCREMENTE a POUR PASSER AU SUIVANT
                       */
                      
                      if (a==0)
                          a++;
                      else if(a > 0) // on regarde à partir de 2 entrées s'il y en a 2 pareils
                      {
                          for (i=0;i<=a;i++)
                          {
                              for (d=0;d<=a;d++)
                              {
                                  if ((tableau_nombres_entres[i] == tableau_nombres_entres[d])&& (i!=d))
                                      occurence = true;
                              }
                          }
                          if(occurence == false) // tant que pas 2 pareils, on continue
                              a++;
                          else    // on affiche l'occurence à l'utilisateur
                              System.out.println("\nVous avez déjà choisi le nombre \"" + tableau_nombres_entres[a] + "\" ; recommencez S.V.P");
                              occurence = false;
                      }
                      
              }
              System.out.print("Vous avez entre les nombres "); // on récapitule les nombres choisis
                  for (i=0;i<5;i++)
                  {
                      if (i == 4)
                          System.out.print(tableau_nombres_entres[i] + ".");
                      else
                          System.out.print(tableau_nombres_entres[i] + " ; ");
                  }
      
              System.out.println("\nJe vais maintenant vous dévoiler la combinaison gagnante !");
                  
              /*
               * LA ON VA SE BALADER DANS LE TABLEAU DU LOTO POUR RETROUVER LES NUMEROS QUI
               * SONT SORTIS AU TIRAGE, POUR FINALEMENT LES COMPARER AVEC LES NUMEROS DE L'USAGER
               */
              
              for(e=0;e<5;e++)
              {
                  System.out.println("Numéro "+ (e+1) + " : " + tableau_nombres_loto[e]);
              }
              System.out.print("\n\n La combinaison gagnante était donc : ");
              for (i=0;i<=4;i++)
              {
                  if (i == 4)
                  {
                      System.out.print(tableau_nombres_loto[i] + ".");
                  }
                  else
                      System.out.print(tableau_nombres_loto[i] + " ; ");
      
              }
              System.out.print("\n\n Et votre combinaison était : ");
              for (i=0;i<=4;i++)
              {
                  if (i ==4)
                      System.out.print(tableau_nombres_entres[i] + ".");
                  else
                      System.out.print(tableau_nombres_entres[i] + " ; ");
              }
              System.out.println("\n\nVoyons votre resultat...");
              
              e = 0;  // en fait la variable "e" stocke les occurences entre numéros tirés et ceux choisis par l'usager
              for (i=0;i<5;i++)
              {
                  for (d=0;d<5;d++)
                  {
                      if (tableau_nombres_loto[i] == tableau_nombres_entres[d])
                      e++;
                  }
      
              }
              if (e == 5)
                  System.out.println("\nVous gagnez, bravo à vous !!!!");
              else
                  System.out.println("\nVous perdez... \n\nVous aviez " + e + " occurences avec le tirage du loto...");
              
              System.out.println("\n\n Au revoir et en vous souhaitant bonne chance pour la prochaine fois !!");
              System.out.println("\n Appuyez sur Enter pour quitter...");
              scan.nextLine();    // vidage de la ligne ci-dessus
              scan.nextLine();    // Attente Entrée
          }
      
      }
      


      La javadoc te sera utilise afin de mieux comprendre ces structures
      • Partager sur Facebook
      • Partager sur Twitter
        20 octobre 2010 à 10:50:43

        Merci pour ta réponse rapide.

        Alors j'ai regardé cette classe HashSet dans la javadoc, mais j'avoue que son fonctionnement m'échappe un peu :
        Prenons cette ligne que tu m'as mis en guise de commentaire,
        Set<Integer>  set_nombres_loto = new HashSet<Integer>();
        


        Je ne comprends pas le Set<Integer> du début : tu demandes la création d'un nouvel objet juste après, alors pourquoi ce Set<Integer> ?

        D'autre part, je ne comprends pas trop comment je vais pouvoir m'y prendre pour que le programme rende comme réponse, quand l'usager donne un nombre qui existe déjà dans le tableau qu'il complète, qu'il y a une occurence et qu'il reprenne sa frappe.

        Si on regarde la javadoc, j'ai trouvé ceci :

        Citation : javadoc

        contains

        public boolean contains(Object o)
        



        Returns true if this set contains the specified element. More formally, returns true if and only if this set contains an element e such that (o==null ? e==null : o.equals(e)).

        Specified by:
        contains in interface Collection<E>
        Specified by:
        contains in interface Set<E>
        Overrides:
        contains in class AbstractCollection<E>

        Parameters:
        o - element whose presence in this set is to be tested
        Returns:
        true if this set contains the specified element

        add

        public boolean add(E e)
        



        Adds the specified element to this set if it is not already present. More formally, adds the specified element e to this set if this set contains no element e2 such that (e==null ? e2==null : e.equals(e2)). If this set already contains the element, the call leaves the set unchanged and returns false.

        Specified by:
        add in interface Collection<E>
        Specified by:
        add in interface Set<E>
        Overrides:
        add in class AbstractCollection<E>

        Parameters:
        e - element to be added to this set
        Returns:
        true if this set did not already contain the specified element



        Donc, je rentre le nombre dans le HashSet, et je fais tester avec le booléen si il n'y est pas déjà ? Mais si il y a une occurence, le HashSet l'ignorera en ne l'incluant pas : donc le booléen serait inutile ???

        Je me débrouille pas trop mal en anglais, mais je manque d'exemples pour bien comprendre...

        Autre chose : je ne comprends pas cette ligne de code
        set_nombres_loto.add(new Random().nextInt(100)))
        

        En fait, je crois qu'il y a une parenthèse ")" de trop, et moi j'aurais fait comme ça :
        set_nombres_loto.add((int)(new Random()*100))
        


        Pourrais-tu m'expliquer la syntaxe que tu as employé, d'autant que .nextInt ressemble beaucoup à ce qu'on utilise avec Scanner pour prendre le prochain entier au clavier.
        • Partager sur Facebook
        • Partager sur Twitter
          20 octobre 2010 à 11:22:17

          salut,
          déjà si tu utilise plusieurs random créer toi un seul Random, c'est a dire avant les boucles tu fait
          Random randGen = new Random();
          //ta boucle
          while(taCondition){
              rendGen.nextInt(100);//génère un nombre en 0 et 100 et évite un cast inutile!
          }
          

          Citation : MMACORP


          Je ne comprends pas le Set<Integer> du début : tu demandes la création d'un nouvel objet juste après, alors pourquoi ce Set<Integer> ?



          Un set ou plus generalement une Collection est une liste d'element, un peu comme un tableau mais que tu peu agrandir comme tu veux et qui possede deja plein de fonctionnalité d'implanté, donc inutile de réinventer la roue ;) .

          Donc utilise la méthode contain c'est pas mal mieux que de le faire a la main!.
          pour vérifier si sa contient un élément tu fait juste tonSet.contain(tonElement);
          pour ajouter fait tonSet.Add(tonElement);
          etc...


          Sinon pour le reste je trouve ton code trop compacte!
          utilise des fonctions pour que chacune fasse son travaille de manière plus distinct, sa sera plus lisible.
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            20 octobre 2010 à 19:13:41

            Set<Integer>  set_nombres_loto = new HashSet<Integer>();
            


            Cette ligne de code déclare un Set qui contiendra uniquement des Integer (pour l'instant dis toi que le type int=Integer) qui s'appelera set_nombres_loto et dans la même instruction j'en crée un instance dans la JVM.

            C'est équivalent à dire
            int[] tableau = new int[5]();
            


            comme je te l'expliquais un Set interdit les doublons. La vérification de doublons se fait lors de l'ajout d'un nouvel élément dans le Set (à l'aide de la méthode add). Si l'élément que l'on veut ajouter est déjà présent dans le Set alors la méthode add n'ajouteras même pas le nouvel élément.

            donc pour valider l'entrée utilisateur, on peut stocker les nombre dans un HashSet et faire comme ceci


            //Set qui va enregistrer la combinaison choisi par l'utilisateur.
            Set<Integer> liste_nombre_utilisateur = new HashSet<Integer();
            
            //l'usager choisi sa combinaison.
            while(liste_nombre_utilisateur.size() != 5){ //ici on boulcle tant qu'il n'y pas 5 nombre dans ta liste. La méthode size() retourne le nombre d'élément contenu dans le Set
                //on demande à l'utilisateur d'entrer un nombre.
                System.out.println("Veuillez entrer un nombre entre 0 et 100");
                int nombreInscrit = scan.nextInt();
                
                //ici on boucle jusqu'à temps que l'utilisateur entre un nombre qui n'est pas déjà dans la liste
                /**    explication de la condition while :
                *    1) le Set (sans que tu lui demande) vérifie si "nombreInscrit" est déjà dans le Set
                *    2) si nombreInscrit est déjà présent l'ajout est refusé et la méthode retourne false (et le ! dans la condition fait virer le bool en true pour aller redemander un autre nombre)
                *    3) si nombreInscrit n'est pas présent dans la liste alors, il est ajouté et la méthode retourne true
                */
                while(!liste_nombre_utilisateur.add(nombreInscrit)){
                    //on affiche le message d'erreur et redemande un autre nombre.
                    System.out.println("Le nombre est déjà dans votre combinaison. \nVeuillez entrer un autre nombre.");
                    nombreInscrit = scan.nextInt();
                }//while
                
            }//while
            


            Concernant ceci :


            set_nombres_loto.add(new Random().nexInt(100))
            


            • 1)un nouvel objet Random est crée
            • 2) A partir de ce nouvel objet j'appelle la méthode nextInt en lui donnant 100 en paramètre.
              Cette méthode nous génère un entier(donc un int) entre 0 et le nombre fourni en parenthèses -1 (donc entre 0 et 99 ici)
            • 3) Ce nombre aléatoire, je l'ajoute à set_nombre_loto(toujours suivant les mêmes principes d'ajout dans un Set que je te mentionnais plus haut)


            Si tu as d'autres interrogations n'hésites pas!
            • Partager sur Facebook
            • Partager sur Twitter
              20 octobre 2010 à 23:20:24

              Ok je crois que je commence à comprendre. J'ai tapé ce code java, il devrait générer une liste aléatoire non occurencée, l'afficher, puis vous demander d'entrer 5 nombres, dont il affichera la liste.

              Le code est argumenté, j'y ai glissé quelques interrogations auxquelles j'aimerais solliciter une réponse de votre part (sans vous commander bien sûr).

              J'ai cependant une question : l'ordre n'a-t-il pas d'importance dans les objets Set ?

              package hashsetetlistes;
              
              import java.util.Random;
              import java.util.HashSet;
              import java.util.Scanner;
              import java.util.Set;
              
              public class Main {
              
                  
                  public static void main(String[] args) {
              
                      /*
                       * Ici, je crée les variables, et les HashSet. Je crois que ça marche.
                       * Si on change <Integer>, on change alors donc le type de liste. 
                       */
                      
                      Set<Integer> liste_nombres_generes = new HashSet<Integer>();
                      Set<Integer> set_nb_entr = new HashSet<Integer>();
                      Random nombre_random = new Random();    // déclaration nbre aléatoire
                      Scanner scan = new Scanner(System.in);  // entrée Scanner
                      
                      
                      while (liste_nombres_generes.size() != 5)   // tant que l'on a pas 5 nombres sur la grille
                                                                  // on en génère un nouveau qui est différent 
                                                                  // des autres, entre 1 et 100.
                      {
                          liste_nombres_generes.add(nombre_random.nextInt(100));
                      }
              
                      System.out.println("\nParcours liste");
                      System.out.println("-----------------------------------");
              
                              Object[] obj = liste_nombres_generes.toArray();     // je crée un tableau d'objets
                                                                                  // la méthode toArray() renvoie
                                                                                  // la liste dans le tableau d'
                                                                                  // objets
                              for(Object o : obj)         // J'ai déjà vu cette syntaxe, mais j'avoue ne pas
                                  System.out.println(o);  // très bien la comprendre : je suis plutôt du style
                                                          // for(i=0;i<5;i++)...    
                              
                              while(set_nb_entr.size() !=5)   // tant que pas 5 nb entrés on boucle
                              {
                                  System.out.print("\n\nVeuillez entrer le nombre "+ (set_nb_entr.size()+1)+ " : ");
                                  int nb_entr = scan.nextInt();
              
                                  while (!set_nb_entr.add(nb_entr))   // tant que add() renvoie true, on a une
                                  {                                   // occurence à corriger.
                                      System.out.print("\n\nOccurence detectee, recommencez : ");
                                      nb_entr = scan.nextInt();
                                  }
                                      
                              }
              
                              Object[] obj2 = set_nb_entr.toArray();
                              System.out.print("Vous avez tape la liste suivante : ");
                              for(Object o : obj2)
                                  System.out.print(o + " ");
              
              
              }
              }
              


              Si ce code est bon (j'ai fait l'effort de le taper sous bloc notes), alors je crois que je pourrais m'atteler sérieusement à l'amélioration. Merci encore pour vos conseils !!
              • Partager sur Facebook
              • Partager sur Twitter
                21 octobre 2010 à 8:35:07

                salut,
                un set se parcours aussi dans un foreach ta pas besoin de faire toArray! c'est meme mieux de pas le faire comme sa sa te garde le type sans cast!

                ensuite le for(Integer val : monSet) fait comme un for i, en gros sa dit pour chaque élément de mon set fait se qui suit.
                • Partager sur Facebook
                • Partager sur Twitter
                  21 octobre 2010 à 14:57:55

                  Donc au lieu de :
                  Object[] obj2 = set_nb_entr.toArray();
                  System.out.print("Vous avez tape la liste suivante : ");
                  for(Object o : obj2)
                       System.out.print(o + " ");
                  


                  Je pourrais faire :
                  System.out.print("Vous avez tape la liste : ");
                  
                  for (int i : set_nb_entr)
                  	System.out.print(i+" ");
                  



                  Et donc, comme tu l'as dit, on n'a pas de cast comme quand on passe par la méthode toArray(). Si c'est bon alors c'est super car ça évite pas mal de lignes de code, et c'est plus clair !

                  Donc je récapitule :
                  - Un Set est une collection qui n'admet pas de doublons;
                  - la méthode add(a) ajoute a et renvoie true, sauf si doublon et renvoie false;
                  - la méthode contain(a) revoie true si a est dans le set, sinon renvoie false;
                  - pour parcourir un set, on utilise un for(Integer val : mon_set).

                  Merci à tous ! Je vais donc pouvoir améliorer le programme loto !

                  J'aurais néanmoins une question : est-il préférable d'utiliser des tableaux ou des tables de hachage du genre Hashtable avec une méthode toArray(), ou avec un itérateur (je crois que c'est une sorte de pointeur dans la table de hachage) ?


                  --- EDIT 21/10 ; 22:11 ---

                  Voilà j'ai terminé l'amélioration du programme ! Je vous le poste :

                  package loto;
                  
                  import java.util.HashSet;
                  import java.util.Scanner;
                  import java.util.Set;
                  import java.util.Random;
                  
                  public class Main {
                  
                      public static void main(String[] args) {
                  
                          /* Déclaration des variables en groupe comme ça on est
                           * débarassé pour clarifier le code source.
                           */
                  
                          // la table de hachage qui contiendra les nombres tirés au loto
                          Set<Integer> set_nb_loto = new HashSet<Integer>();
                  
                          // la table de hachage qui contiendra les nombres choisis par l'usager
                          Set<Integer> set_nb_choix = new HashSet<Integer>();
                  
                          // Pour récupérer les entrées clavier, on crée un objet scanner
                          Scanner scan = new Scanner(System.in);
                  
                          //On déclare un nombre aléatoire
                          Random nb_alea = new Random();
                  
                          // On commence par afficher le message de bienvenue
                          System.out.println("BIENVENUE AU LOTO !!!");
                  
                          // On génère le tirage du loto
                          while(set_nb_loto.size()!=5)
                          {
                              set_nb_loto.add(nb_alea.nextInt(100 - 1));
                          }
                  
                          // On fait patienter
                          System.out.println("\n\nVeuillez patienter, tirage du loto en cours ...\n");
                          // boucle bidon qui fait perdre du temps au programme, et donc fait patienter l'usager
                          for (int i=0;i<1000000000;i++) {}
                          System.out.println("Tirage effectué !");
                  
                          // On va demander à l'usager d'entrer les nombres qu'il veut :
                          while(set_nb_choix.size()!=5)   // tant qu'on a pas 5 nombres dans la liste de l'usager
                          {
                              System.out.print("\nVeuillez entrer le nombre " + (set_nb_choix.size()+1) + " : ");
                              int nb_entr = scan.nextInt();
                  
                              while(!set_nb_choix.add(nb_entr))   // tant qu'on a une occurence dans la liste usager
                              {
                                  System.out.print("\n\nVous avez déjà entré ce nombre, entrez-en un autre : ");
                                  nb_entr = scan.nextInt();
                              }//while occurence
                          }//while 5 nb liste usager
                  
                          // boucle bidon qui fait perdre du temps au programme
                          for (int i=0;i<1000000000;i++) {}
                  
                          // On affiche la liste du tirage du loto
                          System.out.print("\n\nLe tirage du loto est : ");
                          for (int i : set_nb_loto)
                              System.out.print(i+" ");
                  
                          // On affiche la liste qu'a choisi l'usager
                          System.out.print("\n\nVotre tirage est :");
                          for (int i : set_nb_choix)
                              System.out.print(i+" ");
                  
                          // On affiche le résultat
                          System.out.print("\n\nVotre résultat : ");
                  
                          /* Pour comparer les set, je vais utiliser la méthode contains().
                           * Si elle revoie "true" alors on aura une occurence entre les 2 set
                           * Et on incrémentera le compteur d'occurences !
                           */
                  
                          int count = 0;
                          for (int i : set_nb_choix)  // on parcourt set_nb_choix
                              {
                                  if (set_nb_loto.contains(i)) // Si contains() renvoie true (occurence)
                                    {
                                      count++;             // On incrémente le compteur d'occurences
                                    }
                              }
                          
                          // boucle bidon pour patienter
                          for (int i=0;i<1000000000;i++) {}
                  
                          // On teste les occurences
                          if (count < 5 && count !=1)
                              System.out.println("PERDU !!! Vous aviez " + count + " numéros sur les 5 du tirage du loto. A la prochaine !");
                          else if (count == 1)
                              System.out.println("PERDU !!! Vous aviez 1 numéro sur les 5 du tirage du loto. A la prochaine ! ");
                          else
                          {
                              System.out.println("GAGNE !!! Vous avez trouvé le tirage du loto !!! La super cagnotte est à vous !!!");
                              System.out.println("\nProfitez bien de vos gains !!!");
                          }
                  
                          // On crée une pause artificielle, après avoir vidé la ligne du scanner
                          scan.nextLine();    // on vide la ligne de scanner
                          System.out.print("\n(Appuyez sur Enter pour quitter) ");
                          scan.nextLine();    // pause artificielle
                  
                      }
                  }
                  


                  J'ai essayé de ne pas réinventer la roue avec la javadoc et vos conseils ! Qu'en pensez-vous ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    23 octobre 2010 à 16:47:48

                    C'est déjà pas mal mieux. :)

                    Quand tu commences à trouver que tu tapes beaucoup de code pour faire simplement une action cherche dans google et dans la Javadoc...à 99% les outils sont déjà développé dans Java.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 octobre 2010 à 3:47:35

                      Ça c'est bien, mais je peux pas résister de temps en temps à l'idée de réinventer la roue, même si de temps en temps elle se révèle plutôt carrée qu'autre chose...

                      En fait, c'est presque tout le temps le cas =)


                      Sinon je suis à la recherche de petites améliorations éventuelles, genre quelques nouvelles fonctionnalités : des idées ?

                      Je suis un peu à court d'idées en ce moment )-;
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Avis sur un programme

                      × 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