2. Magatzem de queviures

Un comerciant vol un programa per a realitzar les compres i vendes dels productes que té en estoc al magatzem. A tal fi, hem dissenyat dues classes en Python, que haureu d’implementar.

2.1. Classe Queviures (5 punts)

Dissenyeu la classe Queviures, que heu de desar al fitxer queviures.py, tal com queda especificada a continuació:

class queviures.Queviures(capital)

Representa el contingut d’un magatzem amb un capital inicial i permet realitzar compres i vendes. Inicialment el magatzem és buit.

Atributs:

capital

Euros de què es disposa per a poder fer compres (int).

magatzem

Diccionari (un dict) amb l’estoc magatzem. Les claus són el nom de cada tipus de producte i els valors un enter, sempre positiu: el nombre d’unitats del producte que hi ha al magatzem.

Mètodes:

comprar(nomp, n, pu)

Realitza la compra de n unitats del producte de nom nomp a un preu unitari pu, actualitzant tant el magatzem com el capital disponible. Si no es disposa de prou diners per a comprar les n unitats del producte, no fa res.

vendre(nomp, pu)

Realitza la venda de totes les unitats del producte de nom nomp que hi ha al magatzem a un preu unitari pu, actualitzant tant el magatzem com el capital disponible. Si al magatzem no hi havia el producte nomp, no fa res.

nombre_productes()

Retorna el total d’unitats de tots els productes que hi ha al magatzem.

Operacions:

len(q)

Retorna el nombre de productes diferents que hi ha al magatzem.

q[nomp]

Retorna el nombre d’unitats del producte de nom nomp que hi ha al magatzem. Si no n’hi ha cap, retorna 0.

Exemples d’ús de la classe:


>>> from queviures import Queviures
>>> q = Queviures(100)
>>> q.capital, q.magatzem
(100, {})
>>> q.comprar('emmental', 5, 4)
>>> q.capital, q.magatzem
(80, {'emmental': 5})
>>> q.comprar('cafè', 20, 3)
>>> q.capital, q.magatzem == {'emmental':5, 'cafè':20}
(20, True)
>>> q.nombre_productes()
25
>>> len(q)
2
>>> q['cafè'], q['emmental'], q['llet']
(20, 5, 0)
>>> q.vendre('emmental', 8)
>>> q.capital
60
>>> q['cafè'], q['emmental'], q['llet']
(20, 0, 0)

Trobareu més jocs de proves al fitxer tests-queviures.txt.

2.2. Classe QueviuresLimit (2 punts)

Ara volem que el magatzem de queviures tingui un límit sobre el nombre d’objectes totals que s’hi poden emmagatzemar. A tal efecte, es demana que, al fitxer queviures_limit hi deseu la classe QueviuresLimit que es deriva per herència de Queviures, tal com s’especifica tot seguit:

class queviures_limit.QueviuresLimit(capital, capacitat_total)

Representa el contingut d’un magatzem amb una capacitat total predeterminada i permet realitzar compres i vendes, partint d’un capital inicial. Inicialment el magatzem és buit.

Atributs addicionals:

La classe ha de tenir un atribut que sigui la capacitat total del magatzem, o sigui, nombre d’objectes que hi caben (int). Aquest atribut ha de ser privat per evitar que es modifiqui inadequadament.

Mètodes:

espai_lliure()

Retorna el nombre d’objectes que actualment caben al magatzem.

comprar(nomp, n, pu)

Realitza la compra de n unitats del producte de nom nomp a un preu unitari pu, actualitzant tant el magatzem com el capital disponible. Si no es disposa de prou diners per a comprar les n unitats del producte o bé la compra excedeix l’espai lliure del magatzem, no fa res.

Exemples d’ús de la nova classe:


>>> from queviures_limit import QueviuresLimit
>>> q = QueviuresLimit(100, 50)
>>> q.capital, q.magatzem, q.espai_lliure()
(100, {}, 50)
>>> q.comprar('emmental', 5, 4)
>>> q.capital, q.magatzem, q.espai_lliure()
(80, {'emmental': 5}, 45)
>>> q.comprar('cafè', 20, 3)
>>> q.capital, q.espai_lliure(), q.nombre_productes()
(20, 25, 25)
>>> q.comprar('salmó fumat', 2, 100)  # no hi ha prou capital per comprar-ho
>>> q.comprar('galetes', 30, 0.5)     # no hi ha prou espai lliure
>>> q.capital, q.magatzem == {'emmental':5, 'cafè':20}, q.espai_lliure()
(20, True, 25)
>>> len(q)
2
>>> q['cafè'], q['emmental'], q['galetes'], q['salmó fumat']
(20, 5, 0, 0)
>>> q.vendre('emmental', 8)
>>> q.capital, q.espai_lliure(), q.nombre_productes()
(60, 30, 20)
>>> q['cafè'], q['emmental']
(20, 0)

Trobareu més jocs de proves al fitxer tests-queviuresLimit.txt.