Aller au contenu

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.

🐍 Script Python
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)

  • 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.

🐍 Script Python
def remplir(self, panier_temp):
    while not panier_temp. ... :
        article = panier_temp. ...
        self. ... (article)
Réponse
🐍 Script Python
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
🐍 Script Python
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
🐍 Script Python
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

🐍 Script Python
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