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 estudiantat (fitxer estudiantat.py).

  1. Implementeu la classe Assignatura donada la seva especificació:

    class estudiantat.Assignatura(codi_asig, credits)

    Construeix una instància de la classe a partir del codi i del nombre de crèdits de l’assignatura.

    Atributs

    codi

    El codi de l’assignatura (str)

    ncredits

    El nombre de crèdits de l’assignatura (float)

    Aquesta classe suporta el mèdode 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:

    >>> a = Assignatura('240675', 4.5)
    >>> a.ncredits
    4.5
    >>> a.codi
    '240675'
    >>> str(a)
    'Assignatura 240675 4.5 crèdits'
    
    

    Disposeu de més tests al fitxer test-assignatura.txt.

  2. Implementeu la classe Expedient que representa l’expedient acadèmic d’un estudiant. Vegeu-ne l’especificació:

    class estudiantat.Expedient

    Construeix un expedient inicialment buit, sense capa nota.

    Mètodes

    total_credits()

    Retorna el nombre total de crèdits de l’expedient, sumant els de totes les assignatures

    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ó 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 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 Assignatura, no se’n deriva per herència.

    Vegeu per exemple:

    >>> e = Expedient()
    >>> e.total_credits()
    0
    >>> a = Assignatura('20888', 4.5)
    >>> a in e
    False
    >>> len(e)
    0
    >>> e[a] = 5.0
    >>> len(e)
    1
    >>> e[a]
    5.0
    >>> e.mitjana()
    5.0
    >>> a in e
    True
    
    

    Disposeu de més tests al fitxer test-expedient.txt.

  3. Ara, implementeu la classe Alumne que representa les dades d’un alumne (nom i grup al que pertany). Vegeu-ne l’especificació:

    class estudiantat.Alumne(nom_alumne, grup)

    Construeix una instància de la classe a partir del nom de l’alumne i el grup al que pertany.

    nom

    El nom de l’alumne (str)

    grup

    El nom del grup al que pertany l’alumne (str)

    Aquesta classe suporta el mèdode 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:

    >>> a = Alumne('Tomàs Rodríguez Fonollosa', '1A')
    >>> a.nom
    'Tomàs Rodríguez Fonollosa'
    >>> a.grup
    '1A'
    >>> print(str(a))
    Tomàs Rodríguez Fonollosa Grup: 1A
    
    

    Disposeu de més tests al fitxer test-alumne.txt.

  4. La classe AlumneExpedient es deriva per herència de la classe Alumne i li afegeix un atribut addicional, l’expedient acadèmic de l’alumne, una instància de la classe Expedient. Inicialment, l’expedient és buit, sense cap assignatura. Vegeu:

    class estudiantat.AlumneExpedient(nom_alumne, grup)

    Construeix una instància de la classe a partir del nom de l’alumne i el grup al que pertany.

    Atributs (a més dels de la classe base)

    expedient

    L’expedient de l’alumne (Expedient), inicalment buit.

    Mètodes (a més dels de la classe base)

    mitjana()

    Retorna la nota mitjana de l’expedient de l’alumne.

    Vegeu per exemple:

    >>> al1 = AlumneExpedient('Tomàs Rodríguez Fonollosa', '1A')
    >>> isinstance(al1, Alumne) and isinstance(al1, AlumneExpedient)
    True
    >>> al1.nom
    'Tomàs Rodríguez Fonollosa'
    >>> al1.grup
    '1A'
    >>> print(str(al1))
    Tomàs Rodríguez Fonollosa Grup: 1A
    >>> len(al1.expedient)
    0
    >>> asig1 = Assignatura('45678', 4.5)
    >>> al1.expedient[asig1] = 6.7
    >>> al1.mitjana() == al1.expedient.mitjana()
    True
    >>> al1.mitjana() 
    6.7
    
    

    Per a implementar el mètode mitjana() cal que utilitzeu el mètode de mateix nom de la classe Expedient. Disposeu de més tests al fitxer test-alume-expedient.txt.

  5. Finalment, en el fitxer gestio.py implementeu la funció següent:

    gestio.notes_alumnes(llista)
    Paràmetres:

    llista – una llista (list) d’instàncies de la classe Alumne o AlumneExpedient.

    Retorna:

    una nova llista (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 AlumneExpedient)

    Per a resoldre aquest exercici podeu utilitzar la funció de python isinstance(). Disposeu de jocs de proves al fitxer test-gestio.txt.

Trobareu una solució dels exercicis a estudiantat.py i gestio.py.