IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

danielhagnoul

Python. Solution d'un exercice de base en POO

Noter ce billet
par , 07/04/2020 à 15h17 (802 Affichages)
Énoncé

Dans un supermarché un produit est caractérisé par son code à barre (un entier), son nom et son prix.
Un caissier est caractérisé par son identifiant (un entier), son nom, l’ensemble des produits achetés par les clients et que le caissier a enregistrés.

  • Écrire une fonction saisir_produit qui permet à l’utilisateur de saisir le nom, le prix et le code à barre d’un produit et retourne ce produit;
  • Écrire une fonction saisir_caissier qui permet à l’utilisateur de saisir l’identifiant et le nom d’un caissier et retourne le caissier avec un ensemble vide pour les produits enregistrés ;
  • Écrire une fonction afficher_produit qui prend en paramètre un produit et l’affiche à l’écran ;
  • Écrire une fonction enregistrer_produit qui prend en paramètre un caissier et un produit et permettant au caissier d’enregistrer la vente du produit ;
  • Écrire une fonction lister_les_produits qui prend un caissier en paramètre et permet d’afficher l’ensemble des produits enregistrés par le caissier ;
  • Écrire une fonction solde_caisse qui prend un caissier en paramètre et retourne le solde final de la caisse (la somme des prix des produits vendus par le caissier) ;
  • Écrire une fonction changer_prix qui prend un produit en paramètre et permettant de changer son prix ;
  • Écrire une fonction plus_cher qui prend en paramètre un caissier et retourne le produit le plus cher enregistré par le caissier ;
  • Écrire une fonction chercher_produit qui prend un caissier et un produit en paramètre et retourne un booléen indiquant que le produit a été vendu ou non par le caissier (recherche suivant le code à barre du produit).



Solution proposée

EDIT : modifiée le 2020-04-08 suite aux critiques constructives, voir commentaires.

Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
#! python3
# coding: utf-8
 
 
class Produit:
    def __init__(self, code, nom, prix):
        self._code = code
        self._nom = nom
        self._prix = prix
 
    @property
    def code(self):
        return self._code
 
    @property
    def nom(self):
        return self._nom
 
    @property
    def prix(self):
        return self._prix
 
    @prix.setter
    def prix(self, prix):
        self._prix = prix
 
    def __str__(self):
        return 'Produit {}, code = {}, prix = {}'.format(
            self._nom, self._code, self._prix)
 
 
class Caissier:
    def __init__(self, code, nom):
        self._code = code
        self._nom = nom
        self._produits = []
        self._caisse = 0.0
 
    @property
    def code(self):
        return self._code
 
    @property
    def nom(self):
        return self._nom
 
    @property
    def produits(self):
        return self._produits
 
    @property
    def caisse(self):
        return self._caisse
 
    def add_produit(self, obj_produit):
        self._produits.append(obj_produit)
        self._caisse += obj_produit.prix
 
 
def saisir_produit():
    print("Saisie d'un nouveau produit")
 
    while True:
        try:
            code = int(input('code (un entier unique) du produit : '))
        except ValueError:
            print("Ce n'est pas un entier ! Recommencer.")
            continue
        else:
            break
 
    while True:
        nom = input('Nom du produit : ')
        if nom.isdigit():
            print("Ce n'est pas un texte ! Recommencer.")
            continue
        else:
            break
 
    while True:
        try:
            prix = float(input('Prix (un réel) du produit : '))
        except ValueError:
            print("Ce n'est pas un réel ! Recommencer.")
            continue
        else:
            break
 
    return Produit(code, nom, prix)
 
 
def saisir_caissier():
    print("Saisie d'un nouveau caissier")
 
    while True:
        try:
            code = int(input('code (un entier unique) du caissier : '))
        except ValueError:
            print("Ce n'est pas un entier ! Recommencer.")
            continue
        else:
            break
 
    while True:
        nom = str(input('Nom du caissier : '))
        if nom.isdigit():
            print("Ce n'est pas un texte ! Recommencer.")
            continue
        else:
            break
 
    return Caissier(code, nom)
 
 
def afficher_produit(obj_produit):
    print(obj_produit)
 
 
def enregistrer_produit(obj_caissier, obj_produit):
    obj_caissier.add_produit(obj_produit)
 
 
def lister_les_produits(obj_caissier):
    for obj_produit in obj_caissier.produits:
        print(obj_produit)
 
 
def solde_caisse(obj_caissier):
    return obj_caissier.caisse
 
 
def changer_prix(obj_produit, prix):
    obj_produit.prix = prix
 
 
def plus_cher(obj_caissier):
    prix_max = 0
    obj_produit = None
    for produit in obj_caissier.produits:
        if produit.prix > prix_max:
            prix_max = produit.prix
            obj_produit = produit
    return obj_produit
 
 
def chercher_produit(obj_caissier, obj_produit):
    r = False
    for produit in obj_caissier.produits:
        if produit.code == obj_produit.code:
            r = True
            break
    return r
 
 
produit1 = saisir_produit()
 
afficher_produit(produit1)
 
caissier1 = saisir_caissier()
 
enregistrer_produit(caissier1, produit1)
 
lister_les_produits(caissier1)
 
produit2 = saisir_produit()
 
enregistrer_produit(caissier1, produit2)
 
lister_les_produits(caissier1)
 
produit2.prix = 2.91
 
afficher_produit(produit2)
 
obj_produit = plus_cher(caissier1)
 
print(chercher_produit(caissier1, obj_produit))
 
produit3 = saisir_produit()
 
print(chercher_produit(caissier1, produit3))
 
enregistrer_produit(caissier1, produit3)
 
print(chercher_produit(caissier1, produit3))

Licence Creative Commons Attribution 2.0 Belgique

Envoyer le billet « Python. Solution d'un exercice de base en POO » dans le blog Viadeo Envoyer le billet « Python. Solution d'un exercice de base en POO » dans le blog Twitter Envoyer le billet « Python. Solution d'un exercice de base en POO » dans le blog Google Envoyer le billet « Python. Solution d'un exercice de base en POO » dans le blog Facebook Envoyer le billet « Python. Solution d'un exercice de base en POO » dans le blog Digg Envoyer le billet « Python. Solution d'un exercice de base en POO » dans le blog Delicious Envoyer le billet « Python. Solution d'un exercice de base en POO » dans le blog MySpace Envoyer le billet « Python. Solution d'un exercice de base en POO » dans le blog Yahoo

Mis à jour 09/04/2020 à 11h48 par danielhagnoul

Catégories
Programmation , Python , Python

Commentaires

  1. Avatar de dourouc05
    • |
    • permalink
    Tu devrais nommer les variables d'instance tout en bas de casse (https://www.python.org/dev/peps/pep-...variable-names), vu que tout le code Python respecte la norme PEP8 (l'un des très rares langages avec un guide stylistique commun !). Aussi, pour cacher ces variables d'instance, ça serait mieux de commencer leur nom avec un _, histoire d'indiquer clairement que ces variables ne sont pas censées accessibles en dehors de la classe elle-même : en dehors du module, ça devient difficile d'y accéder directement, il ne reste que l'interface que tu définis.

    Ça donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    class Produit:
        def __init__(self, code, nom, prix):
            self._code = code
            self._nom = nom
            self._prix = prix
     
        @property
        def code(self):
            return self._code
     
        @property
        def nom(self):
            return self._nom
     
        @property
        def prix(self):
            return self._prix
     
        @Prix.setter
        def prix(self, prix):
            self._prix = prix
    Ensuite, pour le reste de la solution, je ne suis pas du tout convaincu par tes fonctions saisir_. En fait, il s'agit juste d'appeler un constructeur, alors que ta spécification de ces fonctions est : "Écrire une fonction saisir_ qui permet à l’utilisateur de saisir…" Je m'attendrais plus à l'utilisation de input(), vu la spécification.

    afficher_produit ne devrait pas être une fonction indépendante, mais plutôt une méthode de la classe Produit, plus précisément nommée __str__ pour suivre les normes de Python (https://stackoverflow.com/a/2626364/1066843). Ainsi, afficher le produit avec un print te donnera directement la bonne chaîne. D'ailleurs, ton implémentation ne correspond pas à ta spécification : tu devrais afficher une chaîne de caractères et non en retourner une.
  2. Avatar de danielhagnoul
    • |
    • permalink
    @dourouc05 : bonjour mon ami, un grand merci pour tes critiques constructives. J'en ai tenu compte dans la nouvelle version de la solution proposée.

    L'énoncé de l'exercice est réel, les fonctions et leurs ordres de test sont explicitement demandés (voir : https://www.developpez.net/forums/d2.../#post11464396)