Partage
  • Partager sur Facebook
  • Partager sur Twitter

Machine à café qui rend la monnaie

    11 avril 2021 à 13:48:12

    Bonjour,

    Je suis débutant en programmation C, et j'aurais besoin d'un petit coup de pouce si possible. Je dois faire fonctionner une machine à café, et en fonction du prix de la boisson, rendre la monnaie du client. La machine à café peut prendre jusqu'à maximum 10 euros. Mon problème réside dans le fait qu'ayant des nombres décimaux, il m'est impossible d'utiliser un modulo pour récupérer mon reste... Je ne vois pas d'autres alternative possible, et c'est pour cela que je solicite votre aide.
    Mon code à pas mal de défauts (je suis vraiment novice ^^'), donc s'il y a quelque chose qui ne se fait pas, ou qui est simplifiable, je suis preneur !!

    Voici les parties de mon code qui posent problème :
    // on a la division  :    B             Q                 R             A
    double calcul_monnaie (double n, double quotient, double reste, double rendu)
    {
    	quotient = rendu / n;
    	reste = rendu - n*quotient;
    	rendu = reste;
    	printf("%.2f x %f\n", quotient, n);
    
    return rendu;
    }

    	rendu = somme - prix;
    	printf("La monnaie à rendre est : %.2f\n", rendu);
    
    	if (rendu < 10 && rendu > 5)
    	{
    		n = 5;
    		calcul_monnaie (n, quotient, reste, rendu);
    
    		if (rendu < 5 && rendu > 2)
    		{
    			n = 2;
    			calcul_monnaie (n, quotient, reste, rendu);
    
    			if (rendu < 2 && rendu > 1)
    			{
    				n = 1;
    				calcul_monnaie (n, quotient, reste, rendu);
    
    				if (rendu < 1 && rendu > 0.5)
    				{
    					n = 0.5;
    					calcul_monnaie (n, quotient, reste, rendu);
    
    					if (rendu < 0.5 && rendu > 0.2)
    					{
    						n = 0.2;
    						calcul_monnaie (n, quotient, reste, rendu);
    
    						if (rendu < 0.2 && rendu > 0.1)
    						{
    							n = 0.1;
    							calcul_monnaie (n, quotient, reste, rendu);
    
    							if (rendu < 0.1 && rendu > 0.05)
    							{
    								n = 0.05;
    								calcul_monnaie (n, quotient, reste, rendu);
    
    								if (rendu < 0.05 && rendu > 0.02)
    								{
    									n = 0.02;
    									calcul_monnaie (n, quotient, reste, rendu);
    
    									if(rendu < 0.02 && rendu > 0.01)
    									{
    										n = 0.01;
    										calcul_monnaie (n, quotient, reste, rendu);
    									}
    								}
    							}
    						}
    					}
    				}
    			}
    		}
    		
    
    	}
    
    
    }
    
    }

    Merci d'avance !!

    -
    Edité par Nessia__ 11 avril 2021 à 14:50:58

    • Partager sur Facebook
    • Partager sur Twitter
      11 avril 2021 à 14:00:49

      Bonjour,

      Il y a toujours un bon réflexe à avoir quand on manipule des sommes d'argent : utiliser la plus petite valeur possible comme unité pour n'avoir à travailler qu'avec des entiers …

      En l'occurrence, on peut actuellement utiliser le centime d'euro comme unité de base. Ça simplifie énormément la vie. Autant refactorer car ton code est tout petit.

      • Partager sur Facebook
      • Partager sur Twitter
        11 avril 2021 à 14:49:44

        J'ai bien fait comme tu me l'as conseillé, seuleument ça ne compile pas car j'utilise double. Et je ne peux pas passer en int car mon exercice m'oblige à utiliser les double pour cette programmation...

        Help please ?

        -
        Edité par Nessia__ 11 avril 2021 à 15:38:04

        • Partager sur Facebook
        • Partager sur Twitter
          11 avril 2021 à 16:48:22

          Hello,

          Nessia__ a écrit:

          Et je ne peux pas passer en int car mon exercice m'oblige à utiliser les double pour cette programmation...

          A mon avis, seul le résultat doit être présenté au format double. Rien ne t'empêche dans ton programme d'utilser des entiers, surtout que des comparaisons entre flottants, c'est plutôt galère.

          -
          Edité par edgarjacobs 11 avril 2021 à 16:49:20

          • Partager sur Facebook
          • Partager sur Twitter

          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

            11 avril 2021 à 16:56:23

            C'est vrai je n'y avait pas pensé, merci beaucoup !!
            • Partager sur Facebook
            • Partager sur Twitter
              11 avril 2021 à 18:02:02

              Même pour l'affichage je ne reviendrais pas aux 'double'. On peut imaginer ce genre de chose :

              void affiche(int somme_centimes, char monnaie[])
              {
                  printf("%d,%02d %s", somme_centimes/100, somme_centimes%100, monnaie);
              }
              • Partager sur Facebook
              • Partager sur Twitter
                11 avril 2021 à 18:27:47

                robun a écrit:

                Même pour l'affichage je ne reviendrais pas aux 'double'. On peut imaginer ce genre de chose :

                void affiche(int somme_centimes, char monnaie[])
                {
                    printf("%d,%02d %s", somme_centimes/100, somme_centimes%100, monnaie);
                }

                Oui tu as raison et c'est ce que j'aurais probablement fait si mon exercice ne m'obligeait pas à respecter le prototype de la fonction avec pour paramètres uniquement des variables de type double. Mais merci, j'ignorais que l'on pouvait directement diviser, faire un modulo etc dans un printf ^^.
                • Partager sur Facebook
                • Partager sur Twitter
                  12 avril 2021 à 2:50:39

                  Dans tous les appels de fonctions, tu peux mettre une expression à la place d'une variable.
                  Tu peux même y mettre un appel à une autre fonction, etc.
                  • Partager sur Facebook
                  • Partager sur Twitter

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

                    12 avril 2021 à 10:33:51

                    Salut,

                    Je ferais un tableau des monnaies à rendre en centimes et une boucle pour le parcourir, une machine ne rend que des pièces, ça ne va pas chercher loin. Il faut toujours penser tableaux, imagine la tête de ton code s'il y avait 5000 pièces différentes...

                    La question à se poser est : "Comment mon code gère 2 ou 100000000 éléments sans avoir à le modifier".

                    Un modulo sur des réels, ça se fait, il faut juste le faire soi-même. Mais c'est inutile ici, il faut penser entier dès que c'est possible.

                    Bonne continuation.

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Bonhomme !! | Jeu de plateforme : Prototype.

                      12 avril 2021 à 11:59:04

                      Bonjour,

                      J'ai essayé de modifier mon code en prenant compte de vos avis, seuleument dans le else après la condition switch, ça ne m'affiche pas la monnaie rendue. Par exemple, j'aimerais pouvoir afficher en sortie, (mais j'ignore comment m'y prendre) :

                      1 x 5 euro

                      2 x 2 euro

                      1 x 0.2 euro

                      Désolé j'ai un peu de mal ^^', merci encore !

                      #include <stdio.h>
                      #include <stdlib.h>
                      #include <time.h>
                      #include <unistd.h>
                      #include <math.h>
                      
                      // partie A *******************************************************************************
                      
                      void affichage_boisson ()
                      {
                      	printf("╔════════════════════════╦═══════╦═══════╗\n");
                      	printf("║        BOISSONS        ║ PRIX  ║ CHOIX ║\n");
                      	printf("╠════════════════════════╬═══════╬═══════╣\n");
                      	printf("║ Café court ----------- ║  0.70 ║   0   ║\n");
                      	printf("║ Café long ------------ ║  0.80 ║   1   ║\n");
                      	printf("║ Café au lait --------- ║  0.60 ║   2   ║\n");
                      	printf("║ Chocolat ------------- ║  0.50 ║   3   ║\n");
                      	printf("║ Lait ----------------- ║  0.50 ║   4   ║\n");
                      	printf("║ Thé au citron -------- ║  0.60 ║   5   ║\n");
                      	printf("║ Thé à la menthe ------ ║  0.90 ║   6   ║\n");
                      	printf("║ Thé au gingembre ----- ║  1.20 ║   7   ║\n");
                      	printf("║ Thé au miel ---------- ║  1.40 ║   8   ║\n");
                      	printf("║ Zlatan tea ----------- ║  8.75 ║   9   ║\n");
                      	printf("╚════════════════════════╩═══════╩═══════╝\n");
                      }
                      
                      
                      void achat_boisson (double monnaie_dispo [], double prix_boisson[], int choix, double somme)
                      {
                      
                      	double prix, rendu, quotient, reste, n;
                      	double tab_monnaie [10];
                      	int i;
                      
                      // initialisation du tableau des différentes monnaies de la machine
                      	monnaie_dispo [0] = 0.01;
                      	monnaie_dispo [1] = 0.02;
                      	monnaie_dispo [2] = 0.05;
                      	monnaie_dispo [3] = 0.10;
                      	monnaie_dispo [4] = 0.20;
                      	monnaie_dispo [5] = 0.50;
                      	monnaie_dispo [6] = 1;
                      	monnaie_dispo [7] = 2;
                      	monnaie_dispo [8] = 5;
                      	monnaie_dispo [9] = 10;
                      
                      // initialisation des prix des différentes boissons
                      	prix_boisson [0] = 0.70;
                      	prix_boisson [1] = 0.80;
                      	prix_boisson [2] = 0.60;
                      	prix_boisson [3] = 0.50;
                      	prix_boisson [4] = 0.50;
                      	prix_boisson [5] = 0.60;
                      	prix_boisson [6] = 0.90;
                      	prix_boisson [7] = 1.20;
                      	prix_boisson [8] = 1.40;
                      	prix_boisson [9] = 8.75;
                      
                      printf("Quel est votre choix ? - tapez '10' pour quitter -\n");
                      scanf ("%d", &choix);
                      
                      if (choix >= 10)
                      {
                      	printf("Veuillez saisir une boisson comprise dans le choix...\n");
                      	scanf ("%d", &choix);
                      }
                      
                      
                      	printf("Donnez votre montant : ");
                      	scanf("%lf", &somme);
                      
                      // en fonction du choix de l'utilisateur, donne le prix à payer
                      switch (choix)
                      {
                      	case 0 : 
                      		prix = prix_boisson [0]; 
                      		break;
                      
                      	case 1 : 
                      		prix = prix_boisson [1];
                      		break; 
                      
                      	case 2 : 
                      		prix = prix_boisson [2]; 
                      		break; 
                      
                      	case 3 : 
                      		prix = prix_boisson [3];
                      		break;
                      
                      	case 4 : 
                      		prix = prix_boisson [4];
                      		break; 
                      
                      	case 5 : 
                      		prix = prix_boisson [5];
                      		break;
                      
                      	case 6 :
                      		prix = prix_boisson [6];
                      		break;
                      
                      	case 7 : 
                      		prix = prix_boisson [7];
                      		break;
                      
                      	case 8 :
                      		prix = prix_boisson [8];
                      		break; 
                      
                      	case 9 : 
                      		prix = prix_boisson [9]; 
                      		break;
                      
                      	default : 
                      		exit(-1);
                      		break;
                      }
                      
                      if (somme < prix)
                      {
                      	printf("Vous n'avez pas assez de monnaie...");
                      	printf("\n");
                      	sleep (3);
                      	system ("clear");
                      	affichage_boisson ();
                      	achat_boisson (monnaie_dispo, prix_boisson, choix, somme);
                      }
                      
                      else 
                      {
                      	rendu = somme - prix;
                      	printf("La monnaie à rendre est : %.2f\n", rendu);
                      
                      	while (rendu > 0)
                      	{
                      		for (i = 0; i <= 9; i++)
                      		{
                      
                      			if (rendu >= monnaie_dispo [i])
                      			{
                      				rendu = rendu - monnaie_dispo [i];
                      				tab_monnaie [i] = rendu;
                      			}
                      		}
                      	} 
                      	
                      	for (i = 0; i <= 9; i++)
                      	{
                      		printf("La monnaie : %.2f", tab_monnaie[i]);
                      	}
                      }	
                      
                      
                      
                      }
                      
                      int main ()
                      {
                      	int choix;
                      	double monnaie_dispo [10], prix_boisson[10], somme;
                      
                      	affichage_boisson ();
                      	achat_boisson (monnaie_dispo, prix_boisson, choix, somme);
                      }



                      • Partager sur Facebook
                      • Partager sur Twitter
                        12 avril 2021 à 12:05:53

                        drx a écrit:

                        Un modulo sur des réels, ça se fait, il faut juste le faire soi-même.

                        Il y a une fonction 'fmod' dans <math.h> qui fait ça, je crois.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          12 avril 2021 à 13:52:12

                          robun a écrit:

                          Il y a une fonction 'fmod' dans <math.h> qui fait ça, je crois.

                          Mmm, effectivement, comme quoi les choses sont parfois plus simples qu'elles n'y paraissent. Par contre fmod, je pense tout de suite à autre chose, il y en a qui n'ont pas bien choisi le nom de leur lib...

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Bonhomme !! | Jeu de plateforme : Prototype.

                            12 avril 2021 à 18:08:33

                            Hello,

                            Je n'ai jamais vu une machine à café qui rendait des billets :)

                            Et tu peux te passer du switch de la ligne 73, il suffit d'écrire prix=prix_boisson[choix]; Et boum, un code plus court de 45 lignes ;)

                            • Partager sur Facebook
                            • Partager sur Twitter

                            On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                              12 avril 2021 à 20:02:58

                              edgarjacobs a écrit:

                              Hello,

                              Je n'ai jamais vu une machine à café qui rendait des billets :)

                              Et tu peux te passer du switch de la ligne 73, il suffit d'écrire prix=prix_boisson[choix]; Et boum, un code plus court de 45 lignes ;)


                              Oui, c'est vrai que tout compte fait, une machine qui rend des billets... Mais c'est mon exercice qui l'exige ^^'

                              Ton tour de magie est incroyable, je n'y avait pas du tout pensé, merci !!

                              • Partager sur Facebook
                              • Partager sur Twitter
                                13 avril 2021 à 0:33:33

                                Tu peux avantageusement remplacer toutes ces lignes

                                switch (choix)
                                {
                                    case 0 :
                                        prix = prix_boisson [0];
                                        break;
                                 
                                    case 1 :
                                        prix = prix_boisson [1];
                                        break;
                                 
                                    case 2 :
                                        prix = prix_boisson [2];
                                        break;
                                 
                                    case 3 :
                                        prix = prix_boisson [3];
                                        break;
                                 
                                    case 4 :
                                        prix = prix_boisson [4];
                                        break;
                                 
                                    case 5 :
                                        prix = prix_boisson [5];
                                        break;
                                 
                                    case 6 :
                                        prix = prix_boisson [6];
                                        break;
                                 
                                    case 7 :
                                        prix = prix_boisson [7];
                                        break;
                                 
                                    case 8 :
                                        prix = prix_boisson [8];
                                        break;
                                 
                                    case 9 :
                                        prix = prix_boisson [9];
                                        break;
                                 
                                    default :
                                        exit(-1);
                                        break;
                                }

                                par

                                if ((choix < 0) || (choix > 9)
                                   exit (-1);
                                else
                                   prix = prix_boisson[choix];

                                C'est plus simple, non?


                                -
                                Edité par zoup 13 avril 2021 à 0:33:47

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  13 avril 2021 à 2:23:16

                                  Si on t'oblige à donner le montant en double, on peut faire:
                                  donneEntier = (int) donneDouble * 100;
                                  Voici un petit bout de code qui dit comment retourner la monnaie. À toi de l'adapter pour afficher des "soi-disant" doubles ...
                                  -
                                  #include <stdio.h>
                                  int main() {
                                   int donne;
                                   printf("Montant donné: ");
                                   scanf("%d", &donne);
                                   int machine[] = {100, 50, 20, 10, 5, 2, 1};
                                   int l = sizeof machine / sizeof(int);   // dimension du tableau
                                   for(int i=0; i < l; i++) {
                                   int pieces = donne / machine[i];
                                   donne = donne % machine[i];
                                   if(pieces != 0) printf("%d pièces de %d centimes\n", pieces, machine[i]);
                                   } // for
                                  } // main

                                  • Partager sur Facebook
                                  • Partager sur Twitter

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

                                    13 avril 2021 à 17:56:08

                                    Merci Zoup, c'est vrai que c'est largement plus efficace ^^' !

                                    PierrotLeFou a écrit:

                                    Si on t'oblige à donner le montant en double, on peut faire:
                                    donneEntier = (int) donneDouble * 100;
                                    Voici un petit bout de code qui dit comment retourner la monnaie. À toi de l'adapter pour afficher des "soi-disant" doubles ...
                                    -
                                    #include <stdio.h>
                                    int main() {
                                     int donne;
                                     printf("Montant donné: ");
                                     scanf("%d", &donne);
                                     int machine[] = {100, 50, 20, 10, 5, 2, 1};
                                     int l = sizeof machine / sizeof(int);   // dimension du tableau
                                     for(int i=0; i < l; i++) {
                                     int pieces = donne / machine[i];
                                     donne = donne % machine[i];
                                     if(pieces != 0) printf("%d pièces de %d centimes\n", pieces, machine[i]);
                                     } // for
                                    } // main

                                    Je vais voir ce que ça donne, il ne m'est pas venu à l'esprit que j'aurais pu utiliser des sizeof. Je vais essayer et l'adapter, merci beaucoup !!!!
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      13 avril 2021 à 18:55:08

                                      Comme je n'ai pas accès au bouton code avec ma synthèse vocale, j'ai précédé chaque ligne par un point pour préserver l'indentation.
                                      Le code suivant affiche en "pseudo" double et s'occupe des pluriels.
                                      Tu verras qu'on peut mettre une fonction comme paramètre d'une autre fonction.
                                      -
                                      .#include <stdio.h>
                                      .char *euros(int c) {
                                      .    static char str[20];   // devrait suffire pour une machine à café
                                      .    char *s = "";
                                      .    if(c/100 > 1) s = "s";
                                      .    sprintf(str, "%d.%02d euro%s", c/100, c%100, s);
                                      .    return(str);
                                      .}
                                      .int main() {
                                      .    int donne;
                                      .    printf("Montant donné: ");
                                      .    scanf("%d", &donne);
                                      .    int machine[] = {100, 50, 20, 10, 5, 2, 1};
                                      .    int l = sizeof machine / sizeof(int);   // dimension du tableau
                                      .    for(int i = 0; i < l; i++) {
                                      .        int pieces = donne / machine[i];
                                      .        donne = donne % machine[i];
                                      .        char *s = "";
                                      .        if(pieces > 1)s = "s";
                                      .        if(pieces != 0) printf("%d pièce%s de %s\n", pieces, s, euros(machine[i]));
                                      .    } // for
                                      .} // main
                                      • Partager sur Facebook
                                      • Partager sur Twitter

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

                                      Machine à café qui rend la monnaie

                                      × 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