Mobles modulars

Introducció

Volem representar un moble modular, compost per una sèrie de cossos verticals, tots de la mateixa amplada i fondària, cadascun dels quals pot contenir tres tipus d’elements: prestatges, armaris i calaixos. La figura següent mostra un exemple d’un armari d’aquestes característiques, amb quatre cossos verticals i un total de 16 elements (3 armaris, 8 calaixos i 5 prestatges):

../../../_images/moble.svg

A tal fi, al fitxer elems.py disposeu de la implementació de la classe Element, que representa un element d’un armari, especificada tot seguit:

class elems.Element(tipus, alçada)

Construeix un element del tipus i alçada en cm donats.

Atributs públics

tipus

Caràcter que indica de quin tipus d’element es tracta: “P” si és un prestatge, “A” si és un armari o “C” si és un calaix.

alcada

Alçada de l’element en cm (enter).

Disseny de la classe MobleModular

Es demana que, en el mòdul mobles (fitxer mobles.py), hi dissenyeu la classe MobleModular que permeten representar mobles com els descrits, especificada tot seguit:

class mobles.MobleModular(alt, ample, num_cossos)

Construeix un moble modular amb l’alçada, amplada i nombre de cossos verticals donats. Inicialment els cossos no tenen cap element.

Atributs públics

alt

Alçada del moble en cm (enter)

ample

Amplada del moble en cm (enter)

ncossos

Nombre de cossos verticals del moble

Mètodes

afegir(nc, tipus, alçada)

Crea una instaǹcia de la classe element amb els paràmetres donats i l’afegeix al cos nc del moble, sota de tot dels que ja hi ha al cos. El paràmetre tipus és un caràcter que indica de quin tipus d’element es tracta: ‘P’ si és un prestatge, ‘A’ si és un armari o ‘C’ si és un calaix i el paràmetre alçada indica l’alçada de l’element. Si l’alçada indicada és tal que l’element ja no cap al cos tenint en compte els elements ja existents i l’alçada total del cos, aquest mètode no afegeix l’element al moble.

nelems(i)

Retorna el nombre d’elements del cos i-èssim del moble. El valor i ha de satisfer 0 <= i < m.ncossos.

Operacions

Operació

Resultat

len(m)

Retorna el nombre total d’elements del moble m

m[i, j]

Retorna l’element j-èssim del cos i-èssim del moble m (instància de la classe Element), essent 0 líndex de l’element del de més amunt de cada cos (el primer que “hi ha afegit). El valor i ha de satisfer 0 <= i < m.ncossos i el valor j ha de ser com a mínim 0 i inferior al nombre d’elements del cos i-èssim.

Implementació

A més dels atributs públics, la classe MobleModular ha de tenir un atribut privat on s’emmagatzemin les dades dels elements de cada cos. Com que els elements s’afegeixen sempre al final, el més còmode és que aquest atribut sigui una llista de ncossos llistes d’instàncies de la classe Element.

Exemple de funcionament de la classe:

>>> import mobles
>>> m = mobles.MobleModular(160, 200, 4) # Moble com el de la figura de l'exemple
>>> m.alt, m.ample, m.ncossos
(160, 200, 4)
>>> len(m)
0
>>> for i in range(4):
...   print(m.nelems(i), end=',')
0,0,0,0,
>>> m.afegir(0, 'A', 90)
>>> m.afegir(0, 'C', 20)
>>> m.afegir(0, 'C', 20)
>>> m.afegir(0, 'C', 30)  # Primer cos amb un armari i tres calaixos
>>> m.afegir(1, 'A', 90)
>>> m.afegir(1, 'C', 20)
>>> m.afegir(1, 'C', 20)
>>> m.afegir(1, 'C', 30)  # Segon cos, amb un armari i tres calaixos
>>> m.afegir(2, 'P', 30)
>>> m.afegir(2, 'P', 30)
>>> m.afegir(2, 'P', 30)
>>> m.afegir(2, 'P', 40)
>>> m.afegir(2, 'C', 30)  # Tercer cos, amb tres prestatges i un calaix
>>> m.afegir(3, 'P', 60)
>>> m.afegir(3, 'A', 70)
>>> m.afegir(3, 'C', 30)  # Quart cos, amb prestatge, armari i calaix
>>> len(m)
16
>>> for i in range(4):
...   print(m.nelems(i), end=',')
4,4,5,3,
>>> e = m[1, 2]
>>> e.tipus, e.alcada
('C', 20)
>>> e = m[3, 1]
>>> e.tipus, e.alcada
('A', 70)
>>> e = m[2, 4]
>>> e.tipus, e.alcada
('C', 30)

Disposeu de jocs de proves al fitxer test-mobles.txt.

La Classe MobleModularAF

Si us hi heu fixat, la classe anterior no desa informació de la fondària del moble. Per aquest motiu, haureu de dissenyar una nova classe anomenada MobleModularAF, que es derivi per herència de l’anterior, la qual tindrà un atribut addicional i disposarà de dos mètodes per a càlculs volumètrics. Deseu aquesta classe en el mòdul moblesaf (fitxer moblesaf.py):

class moblesaf.MobleModularAF(alt, ample, fons, num_cossos)

Atributs públics

fons

Fondària del moble en cm (enter)

Mètodes

volum()

Retorna el volum total del moble, en cm³ (nombre real).

espai_lliure()

Retorna el volum del moble no ocupat pels seus elements, en cm³ (nombre real).

Observació

En els càlculs volumètrics, com que tots els cossos són de la mateixa amplada, per a calcular l’amplada d’un cos individual cal dividir l’amplada total del moble pel nombre de cossos.

Exemple de funcionament de la classe:

>>> import moblesaf
>>> m = moblesaf.MobleModularAF(160, 200, 40, 4) # Moble com el de la figura de l'exemple
>>> m.alt, m.ample, m.fons, m.ncossos
(160, 200, 40, 4)
>>> len(m)
0
>>> for i in range(4):
...   print(m.nelems(i), end=',')
0,0,0,0,
>>> m.volum()
1280000.0
>>> m.espai_lliure()
1280000.0
>>> m.afegir(0, 'A', 90)
>>> m.afegir(0, 'C', 20)
>>> m.afegir(0, 'C', 20)
>>> m.afegir(0, 'C', 30)  # Primer cos amb un armari i tres calaixos
>>> m.afegir(1, 'A', 90)
>>> m.afegir(1, 'C', 20)
>>> m.afegir(1, 'C', 20)
>>> m.afegir(1, 'C', 30)  # Segon cos, amb un armari i tres calaixos
>>> m.afegir(2, 'P', 30)
>>> m.afegir(2, 'P', 30)
>>> m.afegir(2, 'P', 30)
>>> m.afegir(2, 'P', 40)
>>> m.afegir(2, 'C', 30)  # Tercer cos, amb tres prestatges i un calaix
>>> m.afegir(3, 'P', 60)
>>> m.afegir(3, 'A', 70)
>>> m.afegir(3, 'C', 30)  # Quart cos, amb prestatge, armari i calaix
>>> len(m)
16
>>> for i in range(4):
...   print(m.nelems(i), end=',')
4,4,5,3,
>>> m.espai_lliure()
0.0
>>> e = m[1, 2]
>>> e.tipus, e.alcada
('C', 20)
>>> e = m[3, 1]
>>> e.tipus, e.alcada
('A', 70)
>>> e = m[2, 4]
>>> e.tipus, e.alcada
('C', 30)

Disposeu de jocs de proves al fitxer test-moblesaf.txt.

Solucions

Disposeu de solucions als fitxers mobles.py i moblesaf.py.