.. py:module:: menjador Menjador ======== Una escola de primària organitza l'alumnat que es queda al menjador en grups reduïts vigilats per un o una monitora. Per la gestió de la comptabilitat del menjador, per cada grup, es disposa d'informació sobre qui n'és la monitora, quins són els alumnes que el composen i, per cada alumne, el nombre de dies en que ha fet ús del servei. La classe :py:class:`GrupMenjador` que representa un grup de menjador seguint l'especificació següent: .. py:class:: GrupMenjador(nom_monitora) Construeix un grup de menjador a partir del nom del monitor o monitora i sense cap alumne inicialment. .. rubric:: Atributs .. attribute:: nom_moni El nom del o la monitora del grup Aquesta classe ha de suportar les **operacions** següents: +--------------------------+-----------------------------------------------------+ | Operació | Resultat | +==========================+=====================================================+ | ``g[nom]`` | Retorna el nombre de dies que l'alumne de nom `nom` | | | s'ha quedat al menjador. Es compleix: `nom in g`. | +--------------------------+-----------------------------------------------------+ | ``g[nom] = dies`` | Assigna el nombre de dies `dies` a l'alumne de nom | | | `nom` del grup de menjador `g`. Si l'alumne no era | | | al menjador `g`, l'afegeix. | +--------------------------+-----------------------------------------------------+ A més, aquesta classe ha de suportar la funció :py:func:`len` que retorna el nombre d'alumnes del grup`de menjador i l'operador `in` que indica si un alumne pertany al grup de menjador. Vegeu per exemple: .. literalinclude:: test-menjador.txt :language: python :start-after: --ini-enunciat :end-before: --fi-enunciat Per implementar aquesta classe cal tenir en compte que ha de tenir un atribut **privat**. Us aconsellem que sigui un diccionari amb clau el nom de l'alumne i valor el nombre de dies que aquest s'ha quedat al menjador. #. En el mòdul :py:mod:`menjador` (fitxer :file:`menjador.py`), dissenyeu la classe :py:class:`GrupMenjador`. #. Comproveu si la classe és iterable per noms d'alumne. Si no ho és, implementeu el mètode necessari per a que ho sigui. Per exemple: .. literalinclude:: test-menjador.txt :language: python :start-after: --ini-enunciat-2 :end-before: --fi-enunciat-2 #. Implementeu el mètode :py:meth:`iter_valids` que crea un iterador de tuples `(alumne, dies)` per tots els alumnes que s'han quedat com a mínim 1 dia al menjador. Per exemple: .. literalinclude:: test-menjador.txt :language: python :start-after: --ini-enunciat-3 :end-before: --fi-enunciat-3 #. En un altre mòdul, anomenat :py:mod:`gestio` (fitxer :file:`gestio.py`), dissenyeu les funcions següents: .. py:module:: gestio :noindex: .. function:: fusionar(grup, llista) :param grup: una instància de la classe :class:`~menjador.GrupMenjador` :param llista: una llista (:py:class:`list`) de noms d'alumnes que s'han quedat a dinar un dia concret :return: Cap paràmetre. És una funció modificadora que actualitza `grup` a partir de `llista`, afegint 1 dia al nombre de dies que els alumnes s'han quedat al menjador per tots els noms de `llista`. Si un alumne no pertany al grup, l'afegeix amb valor 1 dia. .. function:: llistar(grup) :param grup: una instància de la classe :class:`~menjador.GrupMenjador` :return: una llista (:py:class:`list`) formada per la llista ordenada lexicogràficament dels alumnes de `grup`. Utilitzeu el mètode :py:meth:`iter` de la classe :py:class:`~menjador.GrupMenjador`. .. function:: factura(grup, preudia) :param grup: una instància de la classe :class:`~menjador.GrupMenjador` :param preudia: un enter (:py:class:`int`) que representa el preu diari del servei de menjador :return: una llista (:py:class:`list`) ordenada lexicogràficament per nom d'alumnes, i formada per tuples `(nom, cost_servei)` on `cost_servei` és l'import de la factura de menjador de l'alumne comptant tots els dies en que ha usat el servei. A la llista només hi ha d'apareixer els alumnes que s'han quedat com a mínim un dia. Utilitzeu el mètode :py:meth:`iter_valids` de la classe :py:class:`~menjador.GrupMenjador`. Disposeu de més jocs de proves al fitxer :download:`test-menjador.txt` i :download:`test-gestio.txt`.