Passage automatique en caisse⚓︎
D'après 2022, Centres étrangers, J1, Ex. 2
Un supermarché met en place un système de passage automatique en caisse. Un client scanne les articles à l'aide d'un scanner de code-barres au fur et à mesure qu'il les ajoute dans son panier.
Les articles s'enregistrent alors dans une structure de données. La structure de données utilisée est une file définie par la classe Panier
, avec les primitives habituelles sur la structure de file.
Pour faciliter la lecture, le code de la classe Panier
n'est pas écrit.
class Panier():
def __init__(self):
"Initialise la file comme une file vide."
def est_vide(self):
"Renvoie True si la file est vide, False sinon."
def enfile(self, e):
"Ajoute l'élément e en dernière position de la file, ne renvoie rien."
def defile(self):
"Retire le premier élément de la file et le renvoie."
Le panier d'un client sera représenté par une file contenant les articles scannés.
Les articles sont représentés par des tuples (code_barre, designation, prix, horaire_scan)
où
code_barre
est un nombre entier identifiant l'article ;designation
est une chaine de caractères qui pourra être affichée sur le ticket de caisse ;prix
est un nombre décimal donnant le prix d'une unité de cet article ;horaire_scan
est un nombre entier de secondes permettant de connaitre l'heure où l'article a été scanné.
1. On souhaite ajouter un article dont le tuple est le suivant (31002, "café noir", 1.50, 50525)
.
Écrire le code utilisant une des quatre méthodes ci-dessus permettant d'ajouter l'article à l'objet de classe Panier
appelé panier_1
.
Réponse
panier_1.enfile((31002, "café noir", 1.50, 50525))
2. On souhaite définir une méthode remplir
de paramètre panier_temp
dans la classe Panier
permettant de transférer vers la file tout le contenu d'un autre panier panier_temp
qui est aussi un objet de type Panier
. Recopier et compléter le code de la méthode remplir
.
def remplir(self, panier_temp):
while not panier_temp. ... :
article = panier_temp. ...
self. ... (article)
Réponse
def remplir(self, panier_temp):
while not panier_temp.est_vide():
article = panier_temp.defile()
self.enfile(article)
3. Pour que le client puisse connaitre à tout moment le montant de son panier, on souhaite ajouter une méthode prix_total
(sans paramètres) à la classe Panier
qui renvoie la somme des prix de tous les articles présents dans le panier.
Écrire le code de la méthode prix_total
.
Attention, après l'appel de cette méthode, le panier devra toujours contenir ses articles.
Réponse
def prix_total(self):
cumul = 0
panier_temp = Panier()
while not self.est_vide():
article = self.defile()
code_barre, designation, prix, horaire_scan = article
# ou alors prix = article[2]
cumul += prix
panier_temp.enfile(article)
while not panier_temp.est_vide():
article = panier_temp.defile()
self.enfile(article)
return cumul
4. Le magasin souhaite connaitre pour chaque client la durée du passage en caisse. Cette durée sera obtenue en faisant la différence entre le champ horaire_scan
du dernier article scanné et le champ horaire_scan
du premier article scanné dans le panier du client. Un panier vide renverra une durée égale à None
. On pourra accepter que le panier soit vide après l'appel de cette méthode.
Écrire une méthode duree_passage_en_caisse
de la classe Panier
qui renvoie cette durée.
Réponse
def duree_passage_en_caisse(self):
if self.est_vide():
return None
else:
article = self.defile()
code_barre, designation, prix, horaire_scan = article
h_mini = h_maxi = horaire_scan
while not self.est_vide():
article = self.defile()
code_barre, designation, prix, horaire_scan = article
if horaire_scan > h_maxi:
h_maxi = horaire_scan
if horaire_scan < h_mini:
h_mini = horaire_scan
return h_maxi - h_mini
Si on est certain que la file est dans l'ordre croissant des horaires de scan, on peut proposer le code plus simple
def duree_passage_en_caisse(self) :
if self.est_vide() :
return None
else :
article = self.defile()
debut = article[3]
while not self.est_vide() :
article = self.defile()
duree = article[3] - debut
return duree