Volem gestionar les notes d’un conjunt d’estudiants. Cada estudiant té un cert nombre de notes parcials, incloent la possibilitat de què algunes siguin “no presentat”. La nota definitiva d’un estudiant és la mitjana ponderada de les seves notes parcials respecte a una col·lecció de pesos determinats, publicats a la Guia Docent i per tant ben coneguts. Tots els estudiants del conjunt tenen el mateix nombre de notes parcials, que coincideix amb el nombre de pesos de la col·lecció.
Més formalment, si un estudiant té n notes parcials, la seva nota definitiva (també anomenada nota ponderada) és
nota_def = |
|
si alguna de les notes parcials amb pes més gran que 0 és diferent de “no presentat”. En cas contrari, la nota definitiva és “no presentat”. Noteu que les notes parcials “no presentat” compten com a 0 a la fòrmula.
Per circumstàncies extraordinàries, cada estudiant pot optar en un moment donat a que se li apliqui una col·lecció de pesos alternativa per calcular la nota definitiva. La nova opció treu pes a algunes de les notes parcials per donar més pes a la darrera nota parcial. Per això, aquesta opció s’anomena avaluació final.
S’han adaptat les classes Cjt_estudiants i Estudiant, que heu vist al laboratori, per donar suport a la gestió de les notes (fixeu-vos als nous camps i a les noves operacions). Noteu també que hem definit una classe nova, anomenada Ponderacio, que representa una col·lecció de pesos.
Aquest exercici consisteix en implementar dues operacions. La primera, que no pertany a cap classe, serveix per calcular la nota ponderada d’un estudiant. Hem optat per la següent especificació:
double calcular_nota_ponderada(const Estudiant& e, const Ponderacio& p1, const Ponderacio& p2)
/* Pre: e.nombre_notes_parcials() = p1.nombre_pesos() = p2.nombre_pesos() > 0 */
/* Post: el resultat és la nota ponderada d'e aplicant-li p1 a les seves
notes si no ha demanat avaluació final i p2 en cas contrari; si e no té
cap nota, el resultat és -1.0 */
La segona, que pertany a la classe Cjt_estudiants, s’especifica així:
pair<Estudiant,double> Cjt_estudiants::max_nota_ponderada(const Ponderacio& p1, const Ponderacio& p2)
/* Pre: el p.i. no és buit; el nombre de notes parcials dels elements del
p.i. és > 0 i és igual al nombre de pesos de p1 i de p2 */
/* Post: el primer component del resultat és l'element del p.i. amb una nota
ponderada més gran, on als estudiants que no han demanat avaluació final
se'ls aplica p1 i a la resta se'ls aplica p2; en cas d'empat el resultat
és el de DNI més petit; el segon component és la màxima nota ponderada */
Observació
Heu de lliurar un fitxer solucio.cc amb una implementació eficient de les dues operacions. Resultaran d’especial interès les noves operacions de la classe Estudiant. Fixeu-vos preferentment a les especificacions!
A l’apartat Public files del Jutge (icona del gatet) us proveïm amb una plantilla pel fitxer solucio.cc que només cal reanomenar i completar. A més, hi trobareu material addicional, tot comprimit en un fitxer .tar. Podeu descomprimir aquest fitxer amb la comanda
tar -xvf nom_fitxer.tar
Aquest material addicional consisteix en els següents fitxers:
És fonamental que la solució sigui eficient en temps i espai. No es pot emprar cap estructura de dades que no hagi aparegut a les sessions 1-4 de laboratori.
Quan feu els enviaments el Jutge us indicarà quants jocs de proves passeu i de quin tipus (public o privat).
Hi ha dos jocs de proves públics i dos de privats. El primer joc públic només prova la primera operació.
Input
2 50 50 25 75 llegir 3 222 8 4 666 0 6 777 -1 -1 escriure nota_ponderada_i-esim 1 nota_ponderada_i-esim 2 nota_ponderada_i-esim 3 llegir 5 222 9 5.5 666 -2 4 444 -1 9 333 6 4 555 0.5 -1 escriure nota_ponderada_i-esim 1 nota_ponderada_i-esim 2 nota_ponderada_i-esim 3 nota_ponderada_i-esim 4 nota_ponderada_i-esim 5 demanar_aval_final_i-esim 2 demanar_aval_final_i-esim 4 escriure nota_ponderada_i-esim 2 nota_ponderada_i-esim 4 fi
Output
Conjunt: DNI: 222 AVAL FINAL?: NO notes parcials: 8.00 4.00 DNI: 666 AVAL FINAL?: NO notes parcials: 0.00 6.00 DNI: 777 AVAL FINAL?: NO notes parcials: NP NP La nota ponderada de l'estudiant 1-esim es 6.00 La nota ponderada de l'estudiant 2-esim es 3.00 La nota ponderada de l'estudiant 3-esim es NP Conjunt: DNI: 222 AVAL FINAL?: NO notes parcials: 9.00 5.50 DNI: 333 AVAL FINAL?: NO notes parcials: 6.00 4.00 DNI: 444 AVAL FINAL?: NO notes parcials: NP 9.00 DNI: 555 AVAL FINAL?: NO notes parcials: 0.50 NP DNI: 666 AVAL FINAL?: NO notes parcials: NP 4.00 La nota ponderada de l'estudiant 1-esim es 7.25 La nota ponderada de l'estudiant 2-esim es 5.00 La nota ponderada de l'estudiant 3-esim es 4.50 La nota ponderada de l'estudiant 4-esim es 0.25 La nota ponderada de l'estudiant 5-esim es 2.00 Conjunt: DNI: 222 AVAL FINAL?: NO notes parcials: 9.00 5.50 DNI: 333 AVAL FINAL?: SI notes parcials: 6.00 4.00 DNI: 444 AVAL FINAL?: NO notes parcials: NP 9.00 DNI: 555 AVAL FINAL?: SI notes parcials: 0.50 NP DNI: 666 AVAL FINAL?: NO notes parcials: NP 4.00 La nota ponderada de l'estudiant 2-esim es 4.50 La nota ponderada de l'estudiant 4-esim es 0.12
Input
5 10 25 25 15 25 10 0 25 15 50 llegir 2 2222 5 1 1 1 1 3333 3 4 4 4 4 escriure nota_ponderada_i-esim 1 nota_ponderada_i-esim 2 nota_maxima_ponderacio llegir 4 444 9 5.5 7 4 6 666 -1 9 -1 4 -1 222 -1 9 -1 4 8.25 333 2 -1 6 8 9.75 escriure nota_ponderada_i-esim 1 nota_ponderada_i-esim 2 nota_ponderada_i-esim 3 nota_ponderada_i-esim 4 nota_maxima_ponderacio demanar_aval_final_i-esim 2 demanar_aval_final_i-esim 4 escriure nota_ponderada_i-esim 1 nota_ponderada_i-esim 2 nota_ponderada_i-esim 3 nota_ponderada_i-esim 4 nota_maxima_ponderacio llegir 1 777 -1 -1 -1 -1 -1 escriure nota_ponderada_i-esim 1 nota_maxima_ponderacio demanar_aval_final_i-esim 1 escriure nota_ponderada_i-esim 1 nota_maxima_ponderacio fi
Output
Conjunt: DNI: 2222 AVAL FINAL?: NO notes parcials: 5.00 1.00 1.00 1.00 1.00 DNI: 3333 AVAL FINAL?: NO notes parcials: 3.00 4.00 4.00 4.00 4.00 La nota ponderada de l'estudiant 1-esim es 1.40 La nota ponderada de l'estudiant 2-esim es 3.90 L'estudiant amb nota maxima del conjunt és DNI: 3333 AVAL FINAL?: NO notes parcials: 3.00 4.00 4.00 4.00 4.00 I la seva nota ponderada és 3.90 Conjunt: DNI: 222 AVAL FINAL?: NO notes parcials: NP 9.00 NP 4.00 8.25 DNI: 333 AVAL FINAL?: NO notes parcials: 2.00 NP 6.00 8.00 9.75 DNI: 444 AVAL FINAL?: NO notes parcials: 9.00 5.50 7.00 4.00 6.00 DNI: 666 AVAL FINAL?: NO notes parcials: NP 9.00 NP 4.00 NP La nota ponderada de l'estudiant 1-esim es 4.91 La nota ponderada de l'estudiant 2-esim es 5.34 La nota ponderada de l'estudiant 3-esim es 6.12 La nota ponderada de l'estudiant 4-esim es 2.85 L'estudiant amb nota maxima del conjunt és DNI: 444 AVAL FINAL?: NO notes parcials: 9.00 5.50 7.00 4.00 6.00 I la seva nota ponderada és 6.12 Conjunt: DNI: 222 AVAL FINAL?: NO notes parcials: NP 9.00 NP 4.00 8.25 DNI: 333 AVAL FINAL?: SI notes parcials: 2.00 NP 6.00 8.00 9.75 DNI: 444 AVAL FINAL?: NO notes parcials: 9.00 5.50 7.00 4.00 6.00 DNI: 666 AVAL FINAL?: SI notes parcials: NP 9.00 NP 4.00 NP La nota ponderada de l'estudiant 1-esim es 4.91 La nota ponderada de l'estudiant 2-esim es 7.78 La nota ponderada de l'estudiant 3-esim es 6.12 La nota ponderada de l'estudiant 4-esim es 0.60 L'estudiant amb nota maxima del conjunt és DNI: 333 AVAL FINAL?: SI notes parcials: 2.00 NP 6.00 8.00 9.75 I la seva nota ponderada és 7.78 Conjunt: DNI: 777 AVAL FINAL?: NO notes parcials: NP NP NP NP NP La nota ponderada de l'estudiant 1-esim es NP L'estudiant amb nota maxima del conjunt és DNI: 777 AVAL FINAL?: NO notes parcials: NP NP NP NP NP I la seva nota ponderada és NP Conjunt: DNI: 777 AVAL FINAL?: SI notes parcials: NP NP NP NP NP La nota ponderada de l'estudiant 1-esim es NP L'estudiant amb nota maxima del conjunt és DNI: 777 AVAL FINAL?: SI notes parcials: NP NP NP NP NP I la seva nota ponderada és NP