Partage
  • Partager sur Facebook
  • Partager sur Twitter

programme en C sur ma monaie

    6 octobre 2021 à 19:03:23

    Bonjour j'aimerai écrir

    #include <stdio.h>
    #include <stdlib.h>
    
    int main (void){
    	int e, c;
    	printf("entrez une somme en euros: ");
    	scanf(" %d", &e);
    	scanf(" %d", &c);
      
      e = c / 100;
      c = c % 100;
      
    
    	printf("le nombre de pieces est :_%d\n", c);
    	
    	return EXIT_SUCCESS;
    
    }
    


    e un programme qui demande à l’utilisateur de saisir une somme en euros et qui dit le nombre de pièce (minimal) à donner pour payer cette somme. Par exemple, si l’utilisateur saisit 3.15, alors le programme affichera : Vous devez donner 4 pieces pour payer 3.15 euros. 

    j'ai commencé ... mais je ne sais pas vraiment ou donner de la tete, si quelqu'un peux m'aider svp .

    • Partager sur Facebook
    • Partager sur Twitter
      6 octobre 2021 à 19:25:12

      Bonjour ! Ce n'est pas simple. Voici une idée.

      Si on suppose que toutes les pièces sont disponibles, on peut les parcourir de la plus grande à la plus petite. Exemple : pour 4,69 €. Déjà, je convertis en centimes pour faire des calculs de modulo avec des nombres entiers (et éviter les erreurs d'arrondi, genre 4,69 = 4,6899999). Donc j'ai 469 centimes.

      − La pièce maxi est 5 € = 500 c. On regarde combien il y en faut : 469 / 500 = 0 et 469 % 500 = 469. Il faut 0 pièce de 5 € et il reste 469 c.

      − La pièce suivante est 2 € = 200c. On calcule 469 / 200 = 2 et 469 % 200 = 69. Il faut 2 pièces de 2 € et il reste 69 c.

      − La pièce suivante est 1 €= 100 c Etc. etc. Il faut 0 pièce de 1 € (on les examine quand même afin d'avoir un algorithme général) et il reste toujours 69 c.

      − La pièce suivante est 50 c. On calcule 69 / 50 = 1 et 69 % 50 = 19. Il faut 1 pièce de 50 c et il reste 19 c.

      Et ainsi de suite jusqu'à la pièce de 1 centime. Il restera ensuite à compter les pièces.

      Si tu as besoin de gérer un stock de pièces, il faudra ajouter à chaque étape un test sur le nombre de pièces restantes. Par exemple s'il faut 2 pièces de 2 € mais qu'il en reste une seul, alors on dira : il faut 1 pièce de 2 € et il reste 269 c.

      Bon, c'est juste une réflexion rapide. Il me semble que ça devrait marcher, mais je n'ai pas essayé.

      -
      Edité par robun 6 octobre 2021 à 19:25:58

      • Partager sur Facebook
      • Partager sur Twitter
        6 octobre 2021 à 19:39:57

        Une méthode triviale:

        Convertis la somme en centime.

        Boucle sur chaque pièce possible (convertie en centime) par ordre décroissant de leur valeur.

        - trouve le diviseur entier positif ou nul entre la somme et la valeur de la pièce, et mémorise ce diviseur.

        - pour la pièce suivante, utilise le reste de la division précédente au lieu de la somme initiale.

        - arrête toi dès que le reste est nul

        - à la fin, somme les diviseurs de chaque pièce.

        • Partager sur Facebook
        • Partager sur Twitter
          6 octobre 2021 à 22:58:00 - Message modéré pour le motif suivant : Merci d'utiliser le bouton code du forum pour insérer votre code


            7 octobre 2021 à 1:16:59

            VindexLegamer a écrit:
            > e un programme qui demande à l’utilisateur de saisir une somme en euros et qui dit le nombre de pièce (minimal) à donner pour payer cette somme. Par exemple,
            >si l’utilisateur saisit 3.15, alors le programme affichera : Vous devez donner 4 pieces pour payer 3.15 euros.
            D'autres avant moi ont discuté du problème des double et des arrondi.
            Tu ne parles pas de centimes, donc tu n'as que des euros.
            Je suggère de lire le montant en centimes et en int plutôt que double et d'arrondir à l'euro suivant.
            e = (e + 99) / 100;   // tu auras des euros, pas des euros multipliés par 100.
            dans ton exemple, tu n'as besoin que de 2 pièces de 2 euros.
            La méthode de GérardBouchard10 est correcte, mais je n'aime pas l'idée d'arrondir des double (goût personnel)
            • Partager sur Facebook
            • Partager sur Twitter

            Le Tout est souvent plus grand que la somme de ses parties.

              7 octobre 2021 à 2:42:05

              Notons par ailleurs que round() est disponible en C99, et que l'exemple donné ci-dessus est du C99 du fait l'initialisation de la variable i dans la boucle, donc la fonction arrondi est inutile.

              Enfin là je crois que tout le travail a été mâché, ce qui fait que l'op n'aura eu aucune démarche d'apprentissage.

              • Partager sur Facebook
              • Partager sur Twitter
                7 octobre 2021 à 3:39:27

                Ça dépend si VindexLegamer ne cherche qu'une réponse, ou s'il va se donner la peine de lire les différents posts.

                • Partager sur Facebook
                • Partager sur Twitter

                Le Tout est souvent plus grand que la somme de ses parties.

                  7 octobre 2021 à 9:43:20

                  Hello,juste pour noter que le système de pièces (1,2,5,10,20,50,100,200 en centimes) permet l'utilisation d'un algorithme glouton qui donnera toujours le nombres minimum de pièces. Cela n'est pas toujours le cas … par exemple avec des pièces de (1,3,4), l'algo glouton donnera 6=4+1+1 alors que le rendu minimum est 6=3+3.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    7 octobre 2021 à 20:42:05

                    Le code a été "modéré"car je n'ai pas utilisé les conventions d'usage... Désolé j'suis béotien.

                    @SpaceIn, je repasse en C ANSI

                    #include <stdio.h>
                    #include <stdlib.h>
                    #include <math.h>
                     
                    double arrondi(double a);
                    
                    int main (void)
                    {
                      int valeur_piece[8]={200,100,50,20,10,5,2,1};  
                      int nbre_pieces[8];
                    int i; double somme_d; int somme; printf("entrez une somme en euros: "); scanf(" %lf", &somme_d); somme = (int ) arrondi(100.0*somme_d); // arrondi des centimes (et de l'erreur sur la multiplication flottante...) for(i=0;i<8;i++) { nbre_pieces[i] = somme/valeur_piece[i]; somme = somme%valeur_piece[i]; if(nbre_pieces[i]>0) printf("\r\n %d piece(s) de %0.2lf euro(s)",nbre_pieces[i],((double ) valeur_piece[i])/100.0); } return EXIT_SUCCESS; } double arrondi(double a) { if(ceil(a)-a<a-floor(a)) return ceil(a); else return floor(a); }



                    • Partager sur Facebook
                    • Partager sur Twitter
                      7 octobre 2021 à 20:56:34

                      @GérardBouchard11 Ton code ne fait pas ce qui est demandé !
                      • Partager sur Facebook
                      • Partager sur Twitter
                      ...
                        8 octobre 2021 à 1:19:43

                        @GérardBouchard11:
                        On demande le nombre total de pièces, pas le nombre de pièces par devise.
                        Comme je l'ai dit, on n'a pas de centimes, je suggère donc d'utiliser  (int)ceil(...)
                        @White Crow: heureusement, les monaies de plusieurs pays ne contiennent jamais de pièces de 3 ou 4 unités.
                        On dirait que c'est arrangé pour ne pas avoir d'ambigüité.
                        1x, 2x, 5x, 10x, 20x, 50x, ...
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Le Tout est souvent plus grand que la somme de ses parties.

                          8 octobre 2021 à 9:52:21

                          PierrotLeFou a écrit:

                          Comme je l'ai dit, on n'a pas de centimes

                          Je pense que tu interprètes mal l'énoncé. « Saisir une somme en euros » ne signifie pas qu'on ne saisit pas les centimes, mais que la devise est l'euro, pas le dollar ni le rouble ou autre. Par exemple 3,65 € est bien une somme en euros (comme indiqué par le symbole). Et si on donne la somme correspondante en dollars canadiens, ce sera avec les cents.

                          Et puis, sans les centimes, il n'y a quasiment plus rien. L'exercice n'aurait pas d'intérêt.

                          Concernant la solution de GérardBouchard11, ce n'est pas la solution exacte et encore heureux puisqu'il n'y a pas d'intérêt à fournir une réponse exacte. VindexLegamer devra l'adapter, ce qui ne sera pas difficile.

                          -
                          Edité par robun 8 octobre 2021 à 9:54:42

                          • Partager sur Facebook
                          • Partager sur Twitter
                            8 octobre 2021 à 20:25:41

                            En fait, il faut gérer des nombres avec fractions.
                            On peut supposer que c'est le client qui n'a que des billets en euros et pas de centimes et qui se demande ce qu'il doit donner.
                            Si je fais bêtement:
                            double x = 3.65;
                            int n = x * 100;
                            j'obtiens 365
                            ceil() me garantit peut-être un résultat plus certain.
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Le Tout est souvent plus grand que la somme de ses parties.

                              8 octobre 2021 à 21:16:06

                              Si c'est moi qui fait cet exercice, la saisie se fera sous forme d'une chaîne de caractères. Mais à aucun moment je ne passerais pas des nombres en virgule flottante (juste par principe, hein ! :) )

                              Avec une chaîne de caractères, il faut juste vérifier que ce ne sont que des chiffres et éventuellement une virgule (ou point) placée en dernière, avant-dernière ou avant-avant-dernière position.

                              Avec un nombre en virgule flottante, il va falloir gérer un tas de cas particulier (que le nombre soit valide, puis gérer les -1.0e+37 et compagnie...)

                              Après, je copie la chaîne dans une autre, je remplace la virgule par un espace, j'utilise 'sscanf' pour lire les deux entiers, je multiplie le premier par 100 et je les additionne.

                              C'est compliqué ? Oui mais c'est plus amusant ! :D (Et puis j'adore 'sscanf', c'est ma fonction préférée.)

                              -
                              Edité par robun 8 octobre 2021 à 21:18:21

                              • Partager sur Facebook
                              • Partager sur Twitter

                              programme en C sur ma monaie

                              × 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