.. py:module:: estudiantat Classes assignatura, expedient i alumne ======================================= En aquest exercici, s'implementaran diverses classes destinades a representar els conceptes d'assignatura, alumne i expedient acadèmic. També es treballarà el concepte d'herència. Totes les classes s'han d'implementar en el mòdul :py:mod:`estudiantat` (fitxer :file:`estudiantat.py`). #. Implementeu la classe :py:class:`Assignatura` donada la seva especificació: .. py:class:: Assignatura(codi_asig, credits) Construeix una instància de la classe a partir del codi i del nombre de crèdits de l'assignatura. .. rubric:: Atributs .. attribute:: codi El codi de l'assignatura (:py:class:`str`) .. attribute:: ncredits El nombre de crèdits de l'assignatura (:py:class:`float`) Aquesta classe suporta el mèdode :py:func:`str` que retorna una expressió de tipus: `Assignatura:codi x.x crèdits` on `codi` és el codi de l'assignatura i `x.x` el seu nombre de crèdits. Vegeu per exemple: .. literalinclude:: test-assignatura.txt :language: python3 :start-after: --ini-enunciat :end-before: --fi-enunciat Disposeu de més tests al fitxer :download:`test-assignatura.txt `. #. Implementeu la classe :py:class:`Expedient` que representa l'expedient acadèmic d'un estudiant. Vegeu-ne l'especificació: .. py:class:: Expedient Construeix un expedient inicialment buit, sense capa nota. .. rubric:: Mètodes .. py:method:: total_credits Retorna el nombre total de crèdits de l'expedient, sumant els de totes les assignatures .. py:method:: mitjana Retorna la nota mitjana de l'expedient, ponderant cada nota pel nombre de crèdits de l'assignatura Aquesta classe suporta les **operacions** següents: +--------------------------+-----------------------------------------------------+ | Operació | Resultat | +==========================+=====================================================+ | ``e[asig]`` | Retorna la nota de l'assignatura `asig` de | | | l'expedient `e`. Es compleix: `asig in e`. | +--------------------------+-----------------------------------------------------+ | ``e[asig] = nota`` | Assigna la nota `nota` a l'assignatura de nom | | | `asig` de l'expedient `e`. Si l'assignatura no era | | | a l'expedient `e`, l'afegeix. | +--------------------------+-----------------------------------------------------+ La classe suporta la funció :py:func:`len` que retorna el nombre d'assignatures de l'expedient i el mètode **in** que indica si una assignatura és a l'expedient. Les assignatures són instàncies de la classe :py:class:`Assignatura`. La classe ha de tenir un atribut **privat** que representarà les notes de les assignatures, per exemple, un diccionari amb claus les assignatures i valors les notes. Alerta que la classe és contenidora d'instàncies de la classe :py:class:`Assignatura`, **no** se'n deriva per herència. Vegeu per exemple: .. literalinclude:: test-expedient.txt :language: python3 :start-after: --ini-enunciat :end-before: --fi-enunciat Disposeu de més tests al fitxer :download:`test-expedient.txt `. #. Ara, implementeu la classe :py:class:`Alumne` que representa les dades d'un alumne (nom i grup al que pertany). Vegeu-ne l'especificació: .. py:class:: Alumne(nom_alumne, grup) Construeix una instància de la classe a partir del nom de l'alumne i el grup al que pertany. .. attribute:: nom El nom de l'alumne (:py:class:`str`) .. attribute:: grup El nom del grup al que pertany l'alumne (:py:class:`str`) Aquesta classe suporta el mèdode :py:func:`str` que retorna una expressió de tipus: `nom Grup: ngrup` on `nom` és el nom de l'alumne i `ngrup` el nom del seu grup. Vegeu per exemple: Vegeu per exemple: .. literalinclude:: test-alumne.txt :language: python3 :start-after: --ini-enunciat :end-before: --fi-enunciat Disposeu de més tests al fitxer :download:`test-alumne.txt `. #. La classe :py:class:`AlumneExpedient` es deriva per herència de la classe :py:class:`Alumne` i li afegeix un atribut addicional, l'expedient acadèmic de l'alumne, una instància de la classe :py:class:`Expedient`. Inicialment, l'expedient és buit, sense cap assignatura. Vegeu: .. py:class:: AlumneExpedient(nom_alumne, grup) Construeix una instància de la classe a partir del nom de l'alumne i el grup al que pertany. .. rubric:: Atributs (a més dels de la classe base) .. attribute:: expedient L'expedient de l'alumne (:py:class:`Expedient`), inicalment buit. .. rubric:: Mètodes (a més dels de la classe base) .. method:: mitjana Retorna la nota mitjana de l'expedient de l'alumne. Vegeu per exemple: .. literalinclude:: test-alumne-expedient.txt :language: python3 :start-after: --ini-enunciat :end-before: --fi-enunciat Per a implementar el mètode :py:meth:`mitjana` cal que utilitzeu el mètode de mateix nom de la classe :py:class:`Expedient`. Disposeu de més tests al fitxer :download:`test-alume-expedient.txt `. .. py:module:: gestio :noindex: #. Finalment, en el fitxer :file:`gestio.py` implementeu la funció següent: .. function:: notes_alumnes(llista) :param llista: una llista (:py:class:`list`) d'instàncies de la classe :py:class:`Alumne` o :py:class:`AlumneExpedient`. :return: una nova llista (:py:class:`list`) de tuples (nom alumne, nota mitjana) per tots els alumnes de la llista donada que tenen un expedient (és a dir que són instàncies de :py:class:`AlumneExpedient`) Per a resoldre aquest exercici podeu utilitzar la funció de python :py:func:`isinstance`. Disposeu de jocs de proves al fitxer :download:`test-gestio.txt`. Trobareu una solució dels exercicis a :download:`estudiantat.py ` i :download:`gestio.py `.