Projet : la caisse d'une boutique
Découper un programme en fonctions
Un vrai programme n'est pas une longue suite de lignes : c'est un assemblage de petites fonctions, chacune avec un seul rôle, chacune testée. On les assemble ensuite comme des briques de Lego.
Dans ce projet, tu vas construire la caisse d'une petite boutique, brique par brique :
prix_ligne: le prix d'une ligne du panier ;total_panier: le total de tout le panier ;appliquer_remise: une remise selon le montant ;ticket: le ticket de caisse complet, qui assemble tout.
Le panier est représenté par deux listes parallèles : les quantités et les prix unitaires.
Chaque brique est testée seule par le correcteur. Si une brique est juste, celles qui l'utilisent ont de bonnes chances de l'être aussi : c'est toute la force du découpage.
Exercice : Brique 1 : le prix d'une ligne
Définis prix_ligne(quantite, prix_unitaire) qui renvoie le prix de la ligne. Ajoute une docstring.
Si la quantité est négative, c'est une erreur de saisie : renvoie 0.
Voir une solution
def prix_ligne(quantite, prix_unitaire):
"""Renvoie le prix d'une ligne du panier, 0 si la quantité est négative."""
if quantite < 0:
return 0
return quantite * prix_unitaireDans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice
Exercice : Brique 2 : le total du panier
La fonction prix_ligne est donnée. Définis total_panier(quantites, prix) qui renvoie le total du panier, en réutilisant prix_ligne pour chaque ligne.
Voir une solution
def prix_ligne(quantite, prix_unitaire):
"""Renvoie le prix d'une ligne du panier, 0 si la quantité est négative."""
if quantite < 0:
return 0
return quantite * prix_unitaire
def total_panier(quantites, prix):
"""Renvoie le total du panier."""
total = 0
for q, p in zip(quantites, prix):
total += prix_ligne(q, p)
return totalDans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice
Exercice : Brique 3 : la remise
La boutique fait une remise selon le montant :
- à partir de 50 000 FCFA : 10 % ;
- à partir de 20 000 FCFA : 5 % ;
- en dessous : pas de remise.
Définis appliquer_remise(montant) qui renvoie le montant après remise, arrondi à l'entier.
Voir une solution
def appliquer_remise(montant):
"""Renvoie le montant après la remise de fidélité, arrondi au franc."""
if montant >= 50000:
return round(montant * 0.90)
if montant >= 20000:
return round(montant * 0.95)
return montantDans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice
Exercice : Brique 4 : le ticket de caisse
Les trois briques sont données. Définis ticket(articles, quantites, prix) qui affiche le ticket ligne par ligne, puis le total avant et après remise, et renvoie le montant à payer :
3 x savon : 1500 FCFA
2 x riz : 2400 FCFA
20 x huile : 30000 FCFA
Sous-total : 33900 FCFA
À payer : 32205 FCFA
C'est le seul endroit du projet où une fonction affiche : c'est son rôle, produire le ticket.
Voir une solution
def prix_ligne(quantite, prix_unitaire):
"""Renvoie le prix d'une ligne du panier, 0 si la quantité est négative."""
if quantite < 0:
return 0
return quantite * prix_unitaire
def total_panier(quantites, prix):
"""Renvoie le total du panier."""
total = 0
for q, p in zip(quantites, prix):
total += prix_ligne(q, p)
return total
def appliquer_remise(montant):
"""Renvoie le montant après la remise de fidélité, arrondi au franc."""
if montant >= 50000:
return round(montant * 0.90)
if montant >= 20000:
return round(montant * 0.95)
return montant
def ticket(articles, quantites, prix):
"""Affiche le ticket de caisse et renvoie le montant à payer."""
for a, q, p in zip(articles, quantites, prix):
print(f"{q} x {a} : {prix_ligne(q, p)} FCFA")
sous_total = total_panier(quantites, prix)
final = appliquer_remise(sous_total)
print(f"Sous-total : {sous_total} FCFA")
print(f"À payer : {final} FCFA")
return final
a_payer = ticket(["savon", "riz", "huile"], [3, 2, 20], [500, 1200, 1500])Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice