Mobles modulars ================ Introducció ----------- .. py:module:: elems 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): .. figure:: moble.svg :align: center A tal fi, al fitxer :download:`elems.py` disposeu de la implementació de la classe :py:class:`Element`, que representa un element d'un armari, especificada tot seguit: .. py:class:: Element(tipus, alçada) Construeix un element del tipus i alçada en cm donats. .. rubric:: Atributs públics .. py:attribute:: 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. .. py:attribute:: alcada Alçada de l'element en cm (enter). Disseny de la classe MobleModular --------------------------------- .. py:module:: mobles Es demana que, en el mòdul :py:mod:`mobles` (fitxer :file:`mobles.py`), hi dissenyeu la classe :py:class:`MobleModular` que permeten representar mobles com els descrits, especificada tot seguit: .. py:class:: 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. .. rubric:: Atributs públics .. py:attribute:: alt Alçada del moble en cm (enter) .. py:attribute:: ample Amplada del moble en cm (enter) .. py:attribute:: ncossos Nombre de cossos verticals del moble .. rubric:: Mètodes .. py:method:: 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. .. py:method:: nelems(i) Retorna el nombre d'elements del cos `i`-èssim del moble. El valor ``i`` ha de satisfer ``0 <= i < m.ncossos``. .. rubric:: 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 :py:class:`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 :py:class:`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 :py:attr:`ncossos` llistes d'instàncies de la classe :py:class:`Element`. Exemple de funcionament de la classe: .. literalinclude:: test-mobles.txt :language: python :end-before: --fi-enunciat Disposeu de jocs de proves al fitxer :download:`test-mobles.txt`. La Classe MobleModularAF ------------------------ .. py:module:: moblesaf 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 :py:class:`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 :py:mod:`moblesaf` (fitxer :file:`moblesaf.py`): .. py:class:: MobleModularAF(alt, ample, fons, num_cossos) .. rubric:: Atributs públics .. py:attribute:: fons Fondària del moble en cm (enter) .. rubric:: Mètodes .. py:method:: volum() Retorna el volum total del moble, en cm³ (nombre real). .. py:method:: 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: .. literalinclude:: test-moblesaf.txt :language: python :end-before: --fi-enunciat Disposeu de jocs de proves al fitxer :download:`test-moblesaf.txt`. .. rubric:: Solucions Disposeu de solucions als fitxers :download:`mobles.py` i :download:`moblesaf.py`.