Partage
  • Partager sur Facebook
  • Partager sur Twitter

Distributeur de billets et pièces

avec Modulo

    12 janvier 2020 à 0:40:54

    Bonjour à tous,

    Je viens de passer un examen, voici la question : Introduire un montant que le distributeur devra remettre automatiquement. En utilisant au moins une fois modulo dans l'exercice : Exemple 67,10EUR devra rendre 1 billet de 50, 1 billet de 10, 1 billet de 5, une pièce de 2, et une pièce de 10.

    Je ne sais toujours pas s'il est plus préférable de tout calculer avec des entier (int) en calculant en cent (multiplier par 100),

    Vu que j'ai préféré utiliser des double lors de l'examen, je préfère trouver déjà la solution à ma réponse, une fois arrivé à 50 cent des problemes se posent... j'arrive pas à comprendre comment y arriver (multiplier par 100, modifier les modulos, ??)

    Si vous pensez à d'autres manière d'y arriver je suis preneur (PS: je n'ai encore jamais utiliser de methode/fonction)

    ça presse pas du tout, juste pour mon intêret personnel, je n'arrive pas à sortir ça de ma tête !

    Merci d'avance,

    /***
     * Exercice Distributeur bill  pièces
     * version 1
     * M. Haji @ Student Trauma Department
     ***/
    
    import java.util.Scanner;
    
    public class Distributeur {
        public static void main(String args[]) {
    
            Scanner in = new Scanner(System.in);
            double nbdouble=0, nb,
            nb50 = 0,
            nb20,
            nb10,
            nb5,
            nb2,
            nb1,
            nb050,
            nb020,
            nb010,
            nb005,
            nb002,
            nb001;
    		
            int aNbdouble,
            aNb050,
            aNb50,
            aNb010,
            aNb020,
            aNb1,
            aNb10,
            aNb2,
            aNb20,
            aNb5;
    
            System.out.println("Merci d'introduire le montant à rembourser");
            nbdouble = in.nextDouble();
    
            nb50 = nbdouble;
            nb20 = nb50 % 50;
            nb50 = nbdouble / 50;
    
            nb10 = nb20 % 20;
            nb20 = nb20 / 20;
    
            nb5 = nb10 % 10;
            nb10 = nb10 / 10;
    
            nb2 = nb5 % 5;
            nb5 = nb5 / 5;
    
            nb1 = nb2 % 2;
            nb2 = nb2 / 2;
    
            nb050 = (nb1 % 1) * 100;
            nb1 = nb1 / 1;
    
            nb020 = nb050 % (50);
            nb050 = nb050 / (50);
    
            nb010 = nb020 % (20);
            nb010 = nb010 / (10);
    
            aNbdouble = (int)nbdouble;
            aNb50 = (int)nb50;
            aNb20 = (int)nb20;
            aNb10 = (int)nb10;
            aNb5 = (int)nb5;
            aNb2 = (int)nb2;
            aNb1 = (int)nb1;
            aNb050 = (int)nb050;
            aNb020 = (int)nb020;
            aNb010 = (int)nb010;
    
            System.out.println("Pour un montant de " + aNbdouble + "EUR\nVous devez donc rembourser : \n" + aNb50 + " billet de 50  \n" + aNb20 + " billet de 20 \n" + aNb10 + " billet de 10  \n" + aNb5 + "  billet de 5\n" + aNb2 + " piece de 2\n" + aNb1 + " pièce de 1\n" + aNb050 + " piece de 50cent \n" + aNb020 + " piece de 20cent \n" + aNb010 + " piece de 10cent ");
    
        }
    }



    -
    Edité par Redtigerr73 12 janvier 2020 à 0:48:30

    • Partager sur Facebook
    • Partager sur Twitter
      12 janvier 2020 à 1:13:53

      Salut, je trouve que tu as cree plein de variables qui te servent pas vraiment.

      Voila ce que je propose, en supposant qu'on ait les billets de 100, de 50, de 20, et les pieces de 10:

      Scanner lire = new Scanner(System.in);
      System.out.println("Entrez le montant a rembourser: );
      int mt = lire.nextInt();
      
      System.out.print("\nPour ce montant, vous remettrez ");
      if(mt >= 100){
         System.out.print(mt%100 + " billet(s) de 100 ");
         mt = mt - mt%100 * 100;
      }
      if(mt >= 50){
         System.out.print(mt%50 + " billet(s) de 50 ");
         mt = mt - mt%50 * 50;
      }
      if(mt >= 20){
         System.out.print(mt%20 + " billet(s) de 20 ");
         mt = mt - mt%20 * 20;
      }
      if(mt >= 10){
         System.out.print(mt%10 + " piece(s) de 10 ");
         mt = mt - mt%10 * 10;
      }
      if(mt > 0){
         System.out.print(mt + " piece(s).\n";
      }
      


      J'ai pas inclus pour 5 et 2, mais je pense que tu as compris mon principe....

      • Partager sur Facebook
      • Partager sur Twitter
        12 janvier 2020 à 4:16:24

        Si mt = 100 il faut rendre 1 billet de 100
        Si mt = 200 il faut rendre 2 billet de 100
        Si mt = 300 il faut rendre 3 billet de 100

        Si mt = x100 il faut rendre x billet de 100

        x = mt/100

        Si tu as si as 225 euro : 225/100 = 2,25

        soit tu dois rendre (int)(mt/100);

        ensuite tu fait mt=mt%100; mt est maintenant égale a 25.

        pour savoir le nombre de billet de 25 tu fais (int)(mt/25);
        puis mt=mt%25;

        Autrement dit si tu as fait comme as dit Asmitta tu as 0... C'est sympa de répondre mais faut pas raconter n'importe quoi quand même.
        Pour asmitta si on prendre 225euro. 225>100 Affichage 225%100 = 25.
        Tu as 25 billet de 100.
        Après mt= mt - mt%100 * 100 soit 225- 225%100 * 100 donc 225- 25*100= 225-2500
        Tu respecte aucune autre condition. fin du programme.
        Tu demande 225 euro on t'as donné 2500 euro.

        Solution :

        Scanner lire = new Scanner(System.in);
        System.out.println("Entrez le montant a rembourser: );
        int mt = lire.nextInt();
         
        System.out.print("\nPour ce montant, vous remettrez ");
        if(mt >= 100){
           System.out.print((int)(mt/100) + " billet(s) de 100 ");
           mt = mt%100;
        }
        if(mt >= 50){
           System.out.print((int)(mt/50) + " billet(s) de 50 ");
           mt = mt%50;
        }
        if(mt >= 20){
           System.out.print((int)(mt/20) + " billet(s) de 20 ");
           mt = mt%20;
        }
        if(mt >= 10){
           System.out.print((int)(mt/10) + " piece(s) de 10 ");
           mt = mt%10;
        }
        if(mt > 0){
           System.out.print(mt + " piece(s).\n";
        }



        -
        Edité par -Crixus- 12 janvier 2020 à 4:28:03

        • Partager sur Facebook
        • Partager sur Twitter

        "Etre vrai, peu le peuvent."
        Friedrich Nietzsche

          12 janvier 2020 à 21:23:11

          Merci pour vos deux réponses, mais vous ne répondez pas vraiment à ma question.

          Je souhaite introduire un montant avec virgule, donc je suis obligé d’utiliser des double ou flottant (Exemple : 67,13 EUR) au moins une fois,

          Soit du multiplier tout par 100 et passer en entier, soit essayer de comprendre comment calculer avec des doubles et flottant.

          Mon programme fonctionne jusqu'à 1euro. J'aimerais bien pouvoir améliorer le mien avant d'étudier vos propositions.

          Merci !!

          • Partager sur Facebook
          • Partager sur Twitter
            12 janvier 2020 à 22:38:22

            Calculer en entiers (cents) parce que les réels ont des problèmes de représentation.

            Utiliser un tableau des valeurs des billets et pièces. Le code ne fera plus que quelques lignes.

            • Partager sur Facebook
            • Partager sur Twitter
              13 janvier 2020 à 9:56:52

              Asmitta a écrit:

              Salut, je trouve que tu as cree plein de variables qui te servent pas vraiment.

              Voila ce que je propose, en supposant qu'on ait les billets de 100, de 50, de 20, et les pieces de 10:

              Scanner lire = new Scanner(System.in);
              System.out.println("Entrez le montant a rembourser: );
              int mt = lire.nextInt();
              
              System.out.print("\nPour ce montant, vous remettrez ");
              if(mt >= 100){
                 System.out.print(mt%100 + " billet(s) de 100 ");
                 mt = mt - mt%100 * 100;
              }
              if(mt >= 50){
                 System.out.print(mt%50 + " billet(s) de 50 ");
                 mt = mt - mt%50 * 50;
              }
              if(mt >= 20){
                 System.out.print(mt%20 + " billet(s) de 20 ");
                 mt = mt - mt%20 * 20;
              }
              if(mt >= 10){
                 System.out.print(mt%10 + " piece(s) de 10 ");
                 mt = mt - mt%10 * 10;
              }
              if(mt > 0){
                 System.out.print(mt + " piece(s).\n";
              }
              


              J'ai pas inclus pour 5 et 2, mais je pense que tu as compris mon principe....

              Pas convaincu que tu ais testé ton code.

              Si mt vaut 225, alors mt%100 vaut 25. Et tu veux pas donner 25 billets de 100 mais 2. Il faut donc calculer le quotient de la division, et non pas le reste.

              • Partager sur Facebook
              • Partager sur Twitter
                13 janvier 2020 à 10:19:01

                Les boucles c'est bon, mangez-en.

                // en cents
                int[] montants = { 100000, 50000, 20000, 10000, ..... };
                
                int reste = somme;
                
                for (int m : montants) {
                    int n = reste / m;               // nb de billets/pièces
                    reste = reste % m;
                    if (n > 0) {
                         System.out.format("%d de %d cents\n", n, m);
                    }
                }
                

                -
                Edité par michelbillaud 14 janvier 2020 à 6:36:25

                • Partager sur Facebook
                • Partager sur Twitter
                  13 janvier 2020 à 10:20:46

                  Salut,

                  Pourquoi ne pas utiliser un tableau représentant les valeurs possibles ? en cents pour éviter les doubles hasardeux..

                  public static void main(String[] args)
                  {
                  	int lInput = 497878;
                  	String lReturn = "";
                  	int[] lPossibleMoney = new int[]
                  	{
                  		50000, 20000, 10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1
                  	};
                  	int lNbPossibleMoney = lPossibleMoney.length;
                  	int lNb=0;
                  	int lCurrentMoney=0;
                  	DecimalFormat df = new DecimalFormat("0.00");
                  	for (int i = 0; i < lNbPossibleMoney; i++)
                  	{
                  		lCurrentMoney = lPossibleMoney[i];
                  		lNb = (lInput/lCurrentMoney);
                  		lReturn += String.format("%d - %s€\n", lNb,df.format(lCurrentMoney/100.));
                  		lInput = lInput%lCurrentMoney;
                  	}
                  	System.out.println(lReturn);
                  }



                  • Partager sur Facebook
                  • Partager sur Twitter
                  Un petit étudiant chinois perdu ^^'
                    13 janvier 2020 à 18:57:41

                    MohamadHaji a écrit:

                    Merci pour vos deux réponses, mais vous ne répondez pas vraiment à ma question.

                    Je souhaite introduire un montant avec virgule, donc je suis obligé d’utiliser des double ou flottant (Exemple : 67,13 EUR) au moins une fois,

                    Soit du multiplier tout par 100 et passer en entier, soit essayer de comprendre comment calculer avec des doubles et flottant.

                    Mon programme fonctionne jusqu'à 1euro. J'aimerais bien pouvoir améliorer le mien avant d'étudier vos propositions.

                    Merci !!


                    Ton programme fonctionne pas je crois... prend une valeur initiale de 30 euro pour voir.

                    Tu devrais examiner la solution que je t'ai donné parceque pour les centime c'est exactement la même chose.

                    pour les centimes.
                    Pour 0.75centimes. combien de picère de 10 centime ? 0.75/0.10 = 7,5 tu dois rendre (int)(0.75/0.10)
                    0.75%0.10 = 0.05
                    reste 5 centimes. combien de pièce de 2 centime ? 0.05/0.02 = 2.5 tu dois rendre (int)(0.05/0.02)
                    0.05%0.02 = 0.01
                    pièce de 1 centime 0.01/0.01 = 1

                    Fin du programme.

                    -
                    Edité par -Crixus- 13 janvier 2020 à 19:08:28

                    • Partager sur Facebook
                    • Partager sur Twitter

                    "Etre vrai, peu le peuvent."
                    Friedrich Nietzsche

                      14 janvier 2020 à 1:30:42

                      MarcKa a écrit

                      Autrement dit si tu as fait comme as dit Asmitta tu as 0... C'est sympa de répondre mais faut pas raconter n'importe quoi quand même.
                      Pour asmi

                      -
                      Edité par MarcKa 12 janvier 2020 à 4:28:03


                      Dans l'empressement je me suis trompé Merci. Au lieu de % je devais mettre int(mt/...)

                      Tiffado a écrit:

                      Pas convaincu que tu ais testé ton code.

                      Si mt vaut 225, alors mt%100 vaut 25. Et tu veux pas donner 25 billets de 100 mais 2. Il faut donc calculer le quotient de la division, et non pas le reste.


                      J'ai ecris le code direct...et j'ai confondu la division entiere avec le modulo.

                      Je sais, c'est mauvais de ma part ,sorry:euh:





                      -
                      Edité par Asmitta 14 janvier 2020 à 1:33:40

                      • Partager sur Facebook
                      • Partager sur Twitter
                        14 janvier 2020 à 10:09:07

                        Merci à tous pour vos conseils, je check ça dès que possible !!!!!

                        • Partager sur Facebook
                        • Partager sur Twitter
                          22 janvier 2020 à 21:36:32

                          Bonsoir à tous,

                          Merci à tous pour vos réponses, j'ai eu l'occasion d'aller consulter ma copie d'examen.

                          J'ai réussi de justesse grâce à une autre question, mais pour cet algo si mon prof m'indique que le type de variable n'est permet pas de répondre à la question.

                          Ce qui me perturbe vu que j'ai finalement réussi à le faire jusqu'à 50centimes inclus, après j'ai un problème avec les chiffres.

                          Est-ce que une âme charitable voudrait bien m'aider à terminer cet algo, même si il est non-approprié, dégeulasse, moche et trop lourd svp? j'insiste pour terminer avec ma logique.

                          J'aimerais prouver au prof avec une solution qui fonctionne qu'il est bel et bien possible d'utiliser des modulos avec des doubles sous Java.

                          Pour cela il faudrait juste que je puisse clôturer correctement le calcul des pièces de 20 et 10 cent (5,2,1 cent n'étaient pas demandé).

                          J'ai également remarqué que les doubles terminaient pas réduire mes 0,80cent à 0,79999 en fin de code (le problème viendrait-il de la?)

                          Merci beaucoup ! Un dev Java extra junior (3mois d'Xp !)

                          import java.util.Scanner;
                          
                          public class Distributeur {
                              public static void main(String args[]) {
                          
                                  Scanner in = new Scanner(System.in);
                          
                                  //variable billets et pièces en double
                                  double nbdouble = 0,
                                  nb,
                                  nb50 = 0,
                                  nb20,
                                  nb10,
                                  nb5,
                                  nb2,
                                  nb1,
                                  nb050,
                                  nb020,
                                  nb010,
                                  nb005,
                                  nb002,
                                  nb001;
                          
                                  //variable à utiliser pour le transtypage et l'affichage pour des nombres entiers
                                  int aNbdouble,
                                  aNb050,
                                  aNb50,
                                  aNb010,
                                  aNb020,
                                  aNb1,
                                  aNb10,
                                  aNb2,
                                  aNb20,
                                  aNb5;
                          
                                  System.out.println("Merci d'introduire le montant à rembourser");
                                  nbdouble = in.nextDouble();
                          
                                  nb50 = nbdouble;
                                  nb20 = nb50 % 50;
                                  nb50 = nbdouble / 50;
                          
                                  nb10 = nb20 % 20;
                                  nb20 = nb20 / 20;
                          
                                  nb5 = nb10 % 10;
                                  nb10 = nb10 / 10;
                          
                                  nb2 = nb5 % 5;
                                  nb5 = nb5 / 5;
                          
                                  nb1 = nb2 % 2;
                                  nb2 = nb2 / 2;
                          
                          
                                  nb050 = ((nb1 % 1) / 50) * 100;
                                  nb1 = nb1;
                                  System.out.println("test nombre de pièce de 1eur en double   " + nb1);
                          
                          //Problème apparait à partir de 20 centimes, il y a une erreur dans le calcul
                          
                                  nb020 = ((nb050 % 50) / 10);
                                  System.out.println("test nombre de piece de 0,50 en double   " + nb050);
                                  nb050 = nb050;
                          
                                  nb010 = ((100 * nb020 % 20) / 10) * 100;
                                  nb020 = nb020;
                                  System.out.println("test nombre de pièce de 0,20 en double : " + nb020);
                                  nb010 = nb010;
                          
                                  aNbdouble = (int)nbdouble;
                                  aNb50 = (int)nb50;
                                  aNb20 = (int)nb20;
                                  aNb10 = (int)nb10;
                                  aNb5 = (int)nb5;
                                  aNb2 = (int)nb2;
                                  aNb1 = (int)nb1;
                                  aNb050 = (int)nb050;
                                  aNb020 = (int)nb020;
                                  aNb010 = (int)nb010;
                          
                                  System.out.println("Pour un montant de " + aNbdouble + "EUR\n
                          		Vous devez donc rembourser : \n
                          		" + aNb50 + " billet de 50  \n" 
                          		+ aNb20 + " billet de 20 \n" 
                          		+ aNb10 + " billet de 10  \n" 
                          		+ aNb5 + "  billet de 5\n" 
                          		+ aNb2 + " piece de 2\n" 
                          		+ aNb1 + " pièce de 1\n" 
                          		+ aNb050 + " piece de 50cent \n" 
                          		
                          // meme probleme d'affichage et de calcul à partir de 20 centimes
                          		
                          		+ aNb020 + " piece de 20cent \n" 
                          		+ aNb010 + " piece de 10cent ");
                          
                              }
                          }
                          

                          -
                          Edité par Redtigerr73 22 janvier 2020 à 21:42:15

                          • Partager sur Facebook
                          • Partager sur Twitter
                            22 janvier 2020 à 22:41:01

                            Euh, ton prof veut peut être que ça soit TOI qui  continues ton code degueulasse.

                            Et là tu prouves que tu n'en n'est pas capable.

                            Un peu d'éthique, quoi.

                            -
                            Edité par michelbillaud 22 janvier 2020 à 22:42:48

                            • Partager sur Facebook
                            • Partager sur Twitter
                              22 janvier 2020 à 23:48:10

                              L'examen est fait, et j'ai réussi ! c'était juste que je bloquais sur la fin, j'avais besoin de me prouver avant tout à moi même que ça marchait ou pas !

                              Merci pour les conseils sur l'éthique, même si je ne comprends pas en quoi ?!

                              Je trouve gros de parler de manque de moral en demandant de l'aide pour un bout de code ^-^ Sinon pourquoi ce forum existe t-il???????????????

                              Merci pour ta non-aide, j'ai finalement re-trouvé mon éthique en moins d'une heure! (Par magie) Et je me prouve que j'avais bel et bien raison.

                              Même si je l'avoue, c'est vrai que ces modulos et divisions sont assez dégeulasse ! Mais j'ai réussi.

                              Excellente soirée à tous !

                              PS Ton commentaire n'aura servit à rien, heureusement que je ne le lis qu'après avoir bûché sur mon code dégeulasse !

                              /***
                               * Exercice Distributeur bill  pièces
                               * version 1
                               * M. Haji @ Student Trauma Department
                               ***/
                              
                              import java.util.Scanner;
                              
                              public class Distributeur {
                                  public static void main(String args[]) {
                              
                                      Scanner in = new Scanner(System.in);
                              
                                      //variable billets et pièces en double
                                      double nbdouble = 0,
                                      nb,
                                      nb50 = 0,
                                      nb20,
                                      nb10,
                                      nb5,
                                      nb2,
                                      nb1,
                                      nb050,
                                      nb020,
                                      nb010,
                                      nb005,
                                      nb002,
                                      nb001;
                              
                                      //variable à utiliser pour le transtypage et l'affichage à la fin en nombres entiers (cast)
                                      int aNb005,
                                      aNb050,
                                      aNb50,
                                      aNb010,
                                      aNb020,
                                      aNb1,
                                      aNb10,
                                      aNb2,
                                      aNb20,
                                      aNb5;
                              
                                      // le montant introduit par l'utilisateur est en double
                                      System.out.println("Merci d'introduire le montant à rembourser");
                                      nbdouble = in.nextDouble();
                              
                              		//début des modulos
                                      nb50 = nbdouble;
                                      nb20 = nb50 % 50;
                                      nb50 = nbdouble / 50;
                              
                                      nb10 = nb20 % 20;
                                      nb20 = nb20 / 20;
                              
                                      nb5 = nb10 % 10;
                                      nb10 = nb10 / 10;
                              
                                      nb2 = nb5 % 5;
                                      nb5 = nb5 / 5;
                              
                                      nb1 = nb2 % 2;
                                      nb2 = nb2 / 2;
                              
                                      nb050 = ((nb1 % 1) * 100);
                                      nb1 = nb1;
                              		
                              		// début des essais System.out pour le passage vers les centimes et connaitre la valeur en double
                                      System.out.println("test nombre de pièce de 1eur en double   " + nb1);
                              
                                      nb020 = (nb050 % 50);
                                      nb050 = nb050 / 50;
                                      System.out.println("test nombre de piece de 0,50 en double   " + nb050);
                              
                                      nb010 = (nb020 % 20);
                                      nb020 = nb020 / 20;
                                      System.out.println("test nombre de pièce de 0,20 en double : " + nb020);
                              
                                      nb005 = (nb010 % 10);
                                      nb010 = nb010 / 10;
                                      System.out.println("test nombre de pièce de 0,10 en double : " + nb010);
                                      nb005 = nb005 / 5;
                                      System.out.println("test nombre de pièce de 0,05 en double : " + nb005);
                              
                                      //transtypage des doubles en entier
                                      aNb50 = (int)nb50;
                                      aNb20 = (int)nb20;
                                      aNb10 = (int)nb10;
                                      aNb5 = (int)nb5;
                                      aNb2 = (int)nb2;
                                      aNb1 = (int)nb1;
                                      aNb050 = (int)nb050;
                                      aNb020 = (int)nb020;
                                      aNb010 = (int)nb010;
                              		
                                      //arrondir la valeur de fin pour éviter des problemes avec des nombres tel 0,9999999
                                      aNb005 = (int)Math.round(nb005);
                              
                                      //affichage du résulats avec le nombre casté en entier
                                      System.out.println("Pour un montant de " + nbdouble + "EUR\n"
                                           + "Vous devez donc rembourser : \n"
                                           + aNb50 + " billet de 50  \n"
                                           + aNb20 + " billet de 20 \n"
                                           + aNb10 + " billet de 10  \n"
                                           + aNb5 + "  billet de 5\n"
                                           + aNb2 + " piece de 2\n"
                                           + aNb1 + " pièce de 1\n"
                                           + aNb050 + " piece de 50cent \n"
                                           + aNb020 + " piece de 20cent \n"
                                           + aNb010 + " piece de 10cent \n"
                                           + aNb005 + " piece de 5cent ");
                              
                                  }
                              }



                              • Partager sur Facebook
                              • Partager sur Twitter
                                23 janvier 2020 à 0:20:03

                                La réalisation est longue pour rien. Mais si ton professeur voulait cela comme ça, il avait sûrement ses raisons
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  23 janvier 2020 à 7:54:29

                                  L'éthique, ça concerne deux choses

                                  • Faire faire son boulot par les autres (a moins que tu dises à ton prof "j'ai demandé sur internet, voilà ce qu'ils ont ecrit")
                                  • Demander à des programmeurs, ces petits êtres sensibles, d'allonger du code qui est une insulte à la profession. Absence de boucle, utilisation de flottants pour des sommes.

                                  -
                                  Edité par michelbillaud 23 janvier 2020 à 7:55:54

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    23 janvier 2020 à 8:05:53

                                    Ce qui m'énerve le plus dans ce commentaire c'est la prétention de ce que tu avances. Je n'ai jamais demandé à qui que ce soit de coder à ma place, j'avais juste besoin de comprendre le passage des modulos d'unité à centimes.

                                    J'aurais pu tout simplement accepter la solution du prof de multiplier le tout par 100 et calculer en entier.

                                    En ce qui concerne la non utilisation de boucle, excuse moi de ne coder à mi temps que depuis qq semaines, vous avez tous commencé par des programmes, inadéquats, courts, longs, moches et inutiles à ce que je sache. Le plus important étant d'acquérir une logique à mon sens.

                                    Merci pour votre aide à tous, à bientôt !

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      23 janvier 2020 à 10:03:00

                                      Bonjour,

                                      Peut être que tu trouveras que ma réponse n'est pas gentille, mais c'est pas bien grave, je viens pas ici pour qu'on me prenne pour quelqu'un de cool et gentil.

                                      C'est quoi un modulo ? C'est le reste entier de la division euclidienne d'un nombre entier par un autre entier. Donc le principe de base, c'est de bosser avec des entiers. (Sans compter que les doubles ou les float ont un fâcheuse tendance à perdre très vite en précision).

                                      A partir de la, si toi tu veux prouver à ton prof que tu peux faire ton "algo" avec des doubles, j'ai envie de dire que c'est ton problème. On est la pour aider les gens à progresser, à faire du code propre, etc... Pas pour aider une personne qui veut prouver qu'on peut faire un algo de la plus sale des manières.

                                      Pour faire une comparaison, c'est comme si tu demandais à des chef cuisiniers une recette pour faire des pattes. Sauf que tu veux pas utiliser de casseroles, mais uniquement une passoire en inox pour les cuire. Nous on te dit, arrête ça, utilise une casserole. Et toi tu reviens après en disant "Mon prof m'a dit que c'était impossible avec une passoire, mais j'ai réussi à lui prouver que si ! J'ai bouché tous les trous avec de la terre, en chauffant ça fait de la terre cuite, et avec ça, j'ai pu faire mes pattes !"

                                      Euh, ouais cool, tu as prouvé qu'on pouvait faire des pattes dans une passoire sans casserole. Peut être en tires tu une satisfaction, mais ne vient pas nous critiquer parce qu'on a pas voulu t'aider dans ta démarche, car ça serait nous demander de faire une chose "contre nature" pour t'aider (faire un code dégueulasse).

                                      MohamadHaji a écrit:

                                      En ce qui concerne la non utilisation de boucle, excuse moi de ne coder à mi temps que depuis qq semaines, vous avez tous commencé par des programmes, inadéquats, courts, longs, moches et inutiles à ce que JE sache. Le plus important étant d'acquérir une logique à mon sens.

                                      Merci pour votre aide à tous, à bientôt !

                                      Alors, certes, toutes les réponses n'étaient pas forcément correctes. Ça arrive aux gens de faire des erreurs. Mais ce n'est pas parce que le code fournit en réponse est faux qu'il ne faut rien en tirer, il y a toujours (ou presque) du bon à prendre. Honnêtement, à part une réponse qui ne répondait pas à ta question, le code le plus inadéquatlongmoche et inutile, c'est de très loin le tien. Et ce n'est pas un jugement, c'est juste une analyse de ton code en me basant sur différents principes (complexité algorithme, nombre de variables utilisés, nombres de lignes de calcul, complexité cyclomatique, maintenabilité, debug, etc). On passe ton code sous Sonar, on verra bien ce qu'il en pense.
                                      Peut être n'as tu pas aimer la réponse de michelbillaud, mais sa réponse du 13 Janvier était clean, propre, concise, et répondait parfaitement au problème. peut etre as tu des choses à redire dessus parce que son code ne fait pas la différence entre des pièces et des billets, mais bon.

                                      Le problème est simple, et quand on voit que dans ton code, tu utilises 50 variables, fais 50 fois les mêmes calculs, affiche 50 fois la même chose dans la console, et bien c'est à ce moment là que la logique à acquérir comme tu dis, c'est d'utiliser une boucle. Personnellement, je me demande bien quel genre de logique tu as acquis grâce à ton code ? Qu'as tu appris de nouveau ? Que les doubles sont pas fiables, et que donc après un calcul avec il faut faire un Math.round ?

                                      Je pense que tu pouvais vraiment apprendre beaucoup plus que ça.

                                      -
                                      Edité par Tiffado 23 janvier 2020 à 10:21:08

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        23 janvier 2020 à 14:42:59

                                        J'ai pas voulu surcharger, mais les pièces et les billets, c'était simple

                                        si m >= 500
                                           afficher billet
                                        sinon
                                           afficher pièce
                                        

                                        et pendant qu'on y est

                                        si n > 1
                                           mettre au pluriel

                                        ça peut se compliquer un peu pour des monnaies étrangères quand il y a des pièces qui valent autant ou plus que des billets.

                                        << La monnaie vietnamienne est disponible en 5 pièces en métal (200đ, 500đ, 1.000đ, 2.000đ et 5.000đ) et des billets en papier. Mais avec l’inflation galopante, les pièces n’ont plus été mises en circulation, il n’existe aujourd’hui que des billets de 200₫, 500₫, 1000₫, 2000₫, 5000₫, 10,000₫, 20,000₫, 50,000₫, 100,000₫, 200,000₫ et 500,000₫, en coton ou en polymère >>

                                        ---

                                        Pour les nombres flottants qui ne sont pas appropriés pour représenter des sommes, on doit pouvoir construire des exemples.

                                        Dejà, on sait que c'est lié à la taille de la mantisse de la représentation des flottants Si c'est des entiers, on ne peut pas les représenter exactement au dela de 2^{la taille de la mantisse}.

                                        https://stackoverflow.com/questions/3793838/which-is-the-first-integer-that-an-ieee-754-float-is-incapable-of-representing-e

                                        Pour des centiemes, ça risque d'être un peu plus folklo, parce que 0.01, ça n'a pas une représentation exacte http://www.binaryconvert.com/result_double.html?decimal=048046048049

                                        C'est pour ça qu'aucun programmeur même semi-compétent ira compter des sous avec des flottants.  Et que ceux qui apprennent devraient éviter de s'obstiner quand on leur a déjà expliqué que c'était une source d'emmerdements.




                                        -
                                        Edité par michelbillaud 23 janvier 2020 à 15:05:29

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          23 janvier 2020 à 18:32:05

                                          Merci les gars, je n'ai aucun problème à recevoir ce genre de feedback !

                                          Sorry pour Michel je n'avais pas vérifié les pseudo des reponses, je pensais que c'était un premier commentaire et n'avait pas compris qu'une autre solution avait déjà été proposée.

                                          Merci à Tiffado, c'est bien plus clair et imagé comme explication. Tu m'as fait rire de ma propre bêtise!

                                          même si je ne parlais pas du tout de vos codes, je me permettrais pas de juger ceux qui prennent la peine de m'aider, en parlant de long, moche , inexacte... Je parlais bien du mien.

                                          Je garde en mémoire vos réponses et m'atterderait la semaine prochaine à re-etudier chacune des pistes proposées.

                                          Bonne soirée à tous

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            24 janvier 2020 à 9:45:25

                                            Pour le "long, moche , inexacte" etc, my bad, je n'avais pas bien compris.
                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            Distributeur de billets et pièces

                                            × 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