retour vers la page d'accueil

STS IG 2 - année 2002/2003
TD n°1 : Rendre la monnaie
éléments de correction

Hypothèses - Algo de principe - Algo principal

Hypothèses

SommeClient > SommeTotale
Cette hypothèse n'est pas à conserver car elle est simple à implémenter.

Fonctionnement dans la zone EURO
La monnaie en vigueur est donc l'Euro,
qui offre donc 15 valeurs différentes : de 0,01E à 500,00E
Réfléchir à ce qu'il faudrait faire pour rendre l'application internationale.

Monnaie en caisse inépuisable
Cette hypothèse est peu réaliste pour un commerçant.
Néanmoins, elle pourra être retenue dans un premier temps.
Il faudra trouver une solution pour la fin du TD.

SommeClient - Somme Totale <= 500
Cette hypothèse n'a en fait aucune incidence sur l'algorithme lui même,
donc il n'est pas nécessaire de la retenir

Algorithme de principe

Il faut connaître :
la SommeTotale, celle dûe par le client
la SommeClient, celle versée par le client

Si il faut rendre la monnaie :
Calculer la SommeARendre

Regarder dans la caisse quelle est la plus grande valeur qui peut être rendue
et déterminer la quantité
Il faut déduire de la SommeARendre le montant qui va être rendue

on recommence avec la valeur suivante à rendre
et ce, jusqu'à ce qu'il n'y ait plus rien à rendre.

Algorithmes

Données globales :

SommeTotale, SommeClient sont réels

NbValeurs est une constante entière qui vaut 15
// Nombre de pièces et billets

Caisse est un tableau [1 à NbValeurs, 1 à 2] d'entiers
// La 1ère colonne contient les valeurs
// La 2nde colonne contient le nombre à rendre

FinBoucle est un booléen

ALGORITHME PRINCIPAL

début
  Initialisation // autre version de l'initialisation

  FinBoucle <-- FAUX
  REPETER
    SaisirInformations (SommeTotale, SommeClient)

    SI (SommeClient < SommeTotale)
    ALORS
      Afficher "La somme versée par le client est insuffisante"
    SINON
      SI (SommeClient = SommeTotale)
      ALORS
        Afficher "Il n'y a pas de monnaie à rendre. Merci."

        FinBoucle <-- VRAI
      SINON
        TraiterInformations (SommeTotale, SommeClient)
        AfficherInformations

        FinBoucle <-- VRAI
      FIN SI
    FIN SI
  JUSQU'A FinBoucle
fin

Algorithme Initialisation

Donnée : IndexMonnaie est un entier

début
  POUR IndexMonnaie <- 1 à NbValeurs FAIRE
    Caisse [IndexMonnaie, 2] <-- 0
  FIN POUR

// La caisse contient les valeurs en CENTIMES d'EUROS
  Caisse [ 1, 1] <-- 50000 // 500 Euros
  Caisse [ 2, 1] <-- 20000
  Caisse [ 3, 1] <-- 10000
  Caisse [ 4, 1] <-- 5000
  Caisse [ 5, 1] <-- 2000
  Caisse [ 6, 1] <-- 1000
  Caisse [ 7, 1] <-- 500
  Caisse [ 8, 1] <-- 200
  Caisse [ 9, 1] <-- 100
  Caisse [10, 1] <-- 50
  Caisse [11, 1] <-- 20
  Caisse [12, 1] <-- 10
  Caisse [13, 1] <-- 5
  Caisse [14, 1] <-- 2
  Caisse [15, 1] <-- 1 // 1 centime d'Euro
fin

Algorithme Initialisation // - longue, + complexe

Donnée : IndexMonnaie est un entier

début
  POUR IndexMonnaie <- 1 à NbValeurs FAIRE
    Caisse [IndexMonnaie, 1] <-- (5 DIV (((IndexMonnaie-1) MOD 3) + 1)) * 10^(4-((IndexMonnaie-1) DIV 3))
    Caisse [IndexMonnaie, 2] <-- 0
  FIN POUR
fin

Algorithme SaisirInformations (S : Total, Paiement sont réels)

début
  Afficher "Montant à payer par le client : "
  Saisir Total

  Afficher "Montant versé par le client : "
  Saisir Paiement
fin

Algorithme TraiterInformations (E : MontantTotal, MontantPaye sont réels)

Données : MontantARendre, IndexValeur sont entiers

// On suppose ici qu'il faut toujours rendre de la monnaie

début
  MontantARendre <-- (MontantPaye - MontantTotal) * 100
// MontantARendre est un entier,
// ce qui garantit l'absence de décimales

  SI (MontantARendre < 0) // On s'assure ici d'avoir un entier positif
  ALORS
     MontantARendre <-- 0
  FIN SI

  POUR IndexValeur <-- 1 à NbValeurs FAIRE
    Caisse [IndexValeur, 2] <-- MontantARendre DIV Caisse [IndexValeur, 1]
    MontantARendre <-- MontantARendre - Caisse [IndexValeur, 2]*Caisse [IndexValeur, 1]
  FIN POUR
fin

Jeu de test de l'algorithme TraiterInformations

Valeur 1 : 0 ou 1 fois
Valeur 2 : 0, 1 ou 2 fois
Valeur 5 : 0 ou 1 fois

MontantTotal
MontantPaye
MontantARendre
Caisse
Situation
10
5,00
0,00
Toutes les valeurs à 0
< 0
10
10,00
0,00
Toutes les valeurs à 0
= 0
10
1009,99
999,99
rendre 0 x 1, 2 x 2 et 1 x 5
10
121,11
111,11
rendre 1 x 1, 0 x 2 et 0 x 5
10
232,22
222,22
rendre 0 x 1, 1 x 2 et 0 x 5

Algorithme AfficherInformations

Donnée : IndexValeur est entier

début
  Afficher "Il faut rendre : "

  POUR IndexMonnaie <-- 1 à NbValeurs FAIRE
    SI (Caisse [IndexValeur, 2] <> 0)
    ALORS
      Afficher Caisse [IndexValeur, 2], " pièce(s) ou billet(s) de ", Caisse [IndexValeur, 1]/100, " Euro(s)"
    FIN SI
  FIN POUR

  Afficher "Merci."
fin


Auteur : Jean HENRI - septembre 2002 - copyright SeieS