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):
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:
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
iha de satisfer0 <= 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 valoriha de satisfer0 <= i < m.ncossosi el valorjha 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.