Une caisse automatique rend la monnaie en billets de 10 € et de 5 € et en pièces de 2 € et de 1 €. Elle utilise toujours la plus grande valeur possible, pour rendre le moins de billets et de pièces. Les montants sont des nombres entiers d’euros.
def nombre_pieces(r):
n = 0
while r >= 10:
r = r - 10
n = n + 1
while r >= 5:
r = r - 5
n = n + 1
while r >= 2:
r = r - 2
n = n + 1
n = n + r
return n
def caisse(prix, donne):
if donne < prix:
return -1
r = donne - prix
return nombre_pieces(r)nombre_pieces(r) renvoie le nombre de billets et de pièces rendus pour une somme r ; caisse(prix, donne) renvoie −1 quand le client n’a pas donné assez.- 1.
nombre_pieces(18)renvoier vaut 18 : un billet de 10 € (reste 8), un billet de 5 € (reste 3), une pièce de 2 € (reste 1). Après les trois boucles, n vaut 3, et la lignen = n + rajoute la pièce de 1 € : , soit 4 billets et pièces. - 2. Avec r = 47, nombre de tours de la première boucle
while:r vaut 47, 37, 27, 17 puis 7 : après 4 tours, est faux et la boucle s’arrête. - 3.
nombre_pieces(47)renvoie4 billets de 10 €, puis il reste 7 € : un billet de 5 € (reste 2), une pièce de 2 € (reste 0). La dernière ligne ajoute : . - 4.
caisse(50, 33)renvoieLes arguments sont pris dans l’ordre : prix = 50 et donne = 33. Le test est vrai : la fonction renvoie −1 et s’arrête, le client n’a pas donné assez. - 5.
caisse(33, 50)renvoieLe test est faux : la fonction renvoienombre_pieces(17). : 3 billets et pièces. - 6. Justifier que la première boucle
whilepeut être remplacée par les deux instructionsn = r // 10etr = r % 10. Contrôle : pour r = 83, valeur de r après ces deux instructions :Rédaction attendue. On note la valeur de départ et le nombre de tours. Chaque tour retire 10 à r et ajoute 1 à n, qui valait 0 : à la sortie, n vaut et r vaut . La boucle s’arrête dès que . Elle n’a jamais rendu r négatif, car on ne retire 10 que si . Donc avec : est le quotient et r le reste de la division euclidienne de par 10, c’est-à-direr // 10etr % 10. Pour 83 : , donc n vaut 8 et r vaut 3.