==================== Classes: Restaurants ==================== Implementeu les 3 classes especificades a continuació. .. py:module:: taules Classe Taula ============ La classe :py:class:`Taula` representa una taula d'una restaurant. .. py:class:: Taula(capac) Crea una instància de la classe que representa la capacitat i l'ocupació d'una taula de restaurant. .. rubric:: Atributs: .. py:attribute:: capacitat Nombre màxim de persones que poden seure a la taula (:py:class:`int`). .. py:attribute:: nlliures Nombre de places lliures de la taula (:py:class:`int`), inicialment totes les de la taula. .. rubric:: Mètodes: .. py:method:: ocupacio() Retorna el nombre de places ocupades de la taula (:py:class:`int`). .. py:method:: ocupar(npers) Ocupa `npers` places de la taula sempre que la taula estigui buida i la seva capacitat ho permeti. En aquest cas, retorna `True`. En cas contrari, no ocupa cap plaça de la taula i retorna `False`. .. py:method:: alliberar() Allibera la taula de manera que totes les seves places siguin lliures. Vegeu un exemple d'ús de la classe: .. literalinclude:: test-taules.txt :language: python :end-before: --fi-enunciat Per implementar aquesta classe cal tenir en compte que els dos atributs :py:attr:`capacitat` i :py:attr:`nlliures` s'inicialitzen amb el valor del paràmetre de la instanciació `capac`. Observeu que el mètode :py:meth:`ocupar` només modifica la ocupació de taules lliures, és a dir que no es poden afegir clients a taules ja parcialment ocupades. Tampoc es pot ocupar una taula per sobre de la seva capacitat. Implementeu la classe en el fitxer :file:`taules.py`. Disposeu de jocs de prova de l'exercici al fitxer :download:`test-taules.txt`. .. py:module:: restaurants Classe Restaurant ================= La classe :py:class:`Restaurant` especificada a continuació representa un restaurant. .. py:class:: Restaurant(nom_resto, nombre_taules) Crea una instància de la classe que representa un restaurant amb el nom donat *nom_resto* i format per *nombre_taules* instàncies de la classe :py:class:`Taula`. Inicialment tant la capacitat de les taules com el seu nombre de places lliures és 0. .. rubric:: Atributs: .. py:Attribute:: nom El nom del restaurant (:py:class:`str`). .. rubric:: Mètodes: .. py:method:: modif_taula(idt, novacap) Modifica la capacitat de la taula d'índex `idt` del restaurant assignant-li el valor `novacap`. També allibera totes les places de la taula. .. py:method:: capacitat() Retorna el nombre màxim de places que pot oferir el restaurant. .. py:method:: ocupacio() Retorna el nombre de places ocupades del restaurant. Aquesta classe ha de suportar les **operacions** següent: +----------------------+-----------------------------------------------+ | Operació | Resultat | +======================+===============================================+ | ``r[idt]`` | Retorna el nombre de places ocupades de la | | | taula `idt` del restaurant `r`. | | | :math:`0 \leq idt \lt len(r)` | +----------------------+-----------------------------------------------+ | ``r[idt] = npers`` | Ocupa `npers` places de la taula `idt` del | | | restaurant `r`, sempre que la capacitat de la | | | taula ho permeti i que aquesta sigui lliure. | | | En cas contrari no fa res. | | | :math:`0 \leq idt \lt len(r)` | +----------------------+-----------------------------------------------+ La classe suporta la funció :py:func:`len` que retorna el nombre de taules del restaurant i la funció :py:func:`str` que retorna el string "Restaurant *nom*". Per implementar aquesta classe cal tenir en compte que l'atribut :py:attr:`nom` s'inicialitza amb el valor del paràmetre de la instanciació `nom_resto`. La classe té, a més d'aquest atribut públic, un atribut **privat** que representa les taules. El restaurant té `nombre_taules` taules. En implementar el mètode :py:meth:`__setitem__`, és **obligatori** utilitzar el mètode :py:meth:`ocupar` de la classe :py:class:`Taula`. Vegeu un exemple d'ús de la classe: .. literalinclude:: test-restaurants.txt :language: python :end-before: --fi-enunciat Implementeu aquesta classe en el fitxer :file:`restaurants.py`. Disposeu de jocs de prova de l'exercici al fitxer :download:`test-restaurants.txt`. .. py:module:: restaurants_covid Classe RestaurantCovid ====================== Les restriccions d'aforament imposades durant la pandèmia del COVID-19 han modificat el reglament de funcionament del restaurant. Ara, hi ha un aforament màxim i, encara que hi hagi llocs lliures, si es supera aquest aforament, no es poden acceptar nous clients. La classe :py:class:`RestaurantCovid` hereta de la classe :py:class:`Restaurant` i li afegeix un nou atribut :py:attr:`maxafor` (l'aforament màxim). .. py:class:: RestaurantCovid(nom_resto, ntaules, maxafor) Crea una instància de la classe que representa un restaurant de nom *nom_resto* format per *ntaules* instàncies de la classe :py:class:`Taula` amb una restricció d'aforament de `maxafor`. Com en la classe base, inicialment tant la capacitat com l'ocupació de les taules és 0. .. rubric:: Atributs: (a més dels de la classe base) .. py:attribute:: maxafor Màxim aforament permès, inicialitzat amb el valor del paràmetre `maxafor` de la instanciació. Per implementar aquesta classe cal tenir en compte que és necessari reescriure el mètode :py:meth:`capacitat` de la classe base per tal que retorni el mínim entre la capacitat real del restaurant (nombre de places totals) i l'aforament permès. Per calcular la capacitat real del restaurant cal invocar el mètode :py:meth:`capacitat` de la classe base. Per exemple: .. literalinclude:: test-restaurants_covid.txt :language: python :end-before: --fi-enunciat Implementeu aquesta classe en el fitxer :file:`restaurants_covid.py`. Disposeu de jocs de prova de l'exercici al fitxer :download:`test-restaurants_covid.txt`. Disposeu d'una solució dels 3 exercicis a :download:`taules.py`, :download:`restaurants.py` i :download:`restaurants_covid.py`.