Hem decidit estendre la classe Cjt_estudiants que heu vist al laboratori amb una nova funcionalitat que selecciona automàticament els estudiants que poden fer el curs de reavaluació (és a dir, que estan admesos) tenint en compte que hi ha un nombre limitat de places disponibles MAX_PLA per aquest curs. Un estudiant pot optar al curs de reavaluació si té nota i la seva nota és major o igual a 4 i menor que 5. Les places del curs de reavaluació s’assignen per ordre descendent de nota entre els estudiants que poden optar al curs de reavaluació, i en cas d’empat, per ordre descendent de DNI. Això significa que, donats dos estudiants e1 i e2 que poden optar al curs de reavaluació, e1 tindria prefèrencia sobre e2 per a ser admès al curs de reavaluació si e1 té millor nota que e2, o si e1 i e2 tenen la mateixa nota i el DNI d’e1 és més gran que el DNI d’e2.
Concretament, hem afegit dos mètodes públics a la classe Cjt_estudiants: 1) n_admesos, que retorna el nombre d’estudiants del conjunt que estan admesos al curs de reavaluació; 2) pos_min_admes, que retorna la posició de l’estudiant admès al curs de reavaluació amb nota més petita, i en cas d’empat, amb nota i DNI més petits. Si cap estudiant del conjunt està admès al curs de reavaluació, pos_min_admes retorna -1.
En tot moment el nombre d’estudiants admesos n_admes serà menor o igual al nombre de places disponibles MAX_PLA. A més n_admes serà menor o igual al nombre d’estudiants que compleixen les condicions per optar al curs de reavaluació. Finalment, si el nombre d’estudiants que poden optar al curs de reavaluació és major o igual al nombre de places disponibles MAX_PLA, el nombre d’estudiants admesos n_admes serà igual a MAX_PLA.
Per implementar eficientment aquesta funcionalitat hem modificat la representació i l’invariant de la classe Estudiant de la manera descrita a l’arxiu Estudiant.hh. En particular, representem la informació sobre si un estudiant està admès al curs de reavaluació o no als objectes de la classe Estudiant, i no als objectes de classe Cjt_estudiants. Això vol dir que per admetre al curs de reavaluació a l’estudiant situat a la posició pos de vest hem de utilitzar la instrucció vest[pos].modificar_reaval(true); i semblantment per no admetre’l vest[pos].modificar_reaval(false);, comprovar si està admès vest[pos].admes_reaval() o si compleix les condicions per optar al curs de reavaluació vest[pos].cond_reaval(). Llegiu amb cura l’arxiu Estudiant.hh, especialment les descripcions dels nous atributs, l’invariant i les especificacions de les operacions noves. Les principals novetats de la classe Estudiant són:
També hem modificat la representació i l’invariant de la classe Cjt_estudiants de la manera descrita a l’arxiu Cjt_estudiants.hh. La principal novetat és que emmagatzemem la posició de l’estudiant admès al curs de reavaluació amb nota més petita, i en cas d’empat, amb nota i DNI més petits, en l’atribut i_min_admes. D’aquesta manera, quan afegim un estudiant a un conjunt on el nombre d’estudiants admesos al curs de reavaluació és igual al nombre de places disponibles, podrem determinar fàcilment si hem d’admetre el nou estudiant al curs de reavaluació o no. Es a dir, podrem comprovar si el nou estudiant compleix les condicions per optar al curs de reavaluació i si té millor nota o igual nota i DNI més gran que l’estudiant admès al curs de reavaluació amb nota més petita, o amb nota i DNI més petits, del conjunt original. Llegiu amb cura l’arxiu Cjt_estudiants.hh, especialment les descripcions dels nous atributs, l’invariant i les especificacions de les operacions noves. Les principals novetats de la classe Cjt_estudiants.hh són:
Tenint això en compte heu d’implementar eficientment el següent mètode privat sense utilitzar l’operació sort de la biblioteca <algorithm>:
void recalcular_pos_min_admes();
/* Pre: cert */
/* Post: Si hi ha estudiants admesos al curs de reavaluació al conjunt
paràmetre implícit, llavors l'atribut i_min_admes conté la posició a
vest[0...nest-1] de l'estudiant admès amb nota més petita, i en cas
d'empat de l'estudiant admès amb nota i DNI més petits; en cas contrari,
si no hi ha estudiants admesos al curs de reavaluació al p.i., l'atribut
i_min_admes és igual a -1. */
i el següent mètode públic sense utilitzar l’operació sort de la biblioteca <algorithm>. Noteu que quan afegim al conjunt un estudiant que compleix les condicions per optar al curs de reavaluació és possible que hi hagi places disponibles per al curs de reavaluació no assignades a altres estudiants, i en aquest cas hem d’admetre’l. Però també és possible que totes les places disponibles estiguin assignades a altres estudiants, i en aquest cas hem de determinar si el nou estudiant té prefèrencia sobre el estudiant admès amb nota més petita, o amb nota i DNI més petits, del conjunt original. Perquè si no hi ha places disponibles per ambdós, l’estudiant que tingui major preferència ha de passar a ser admès i l’estudiant amb menor preferència ha de passar a no ser admès.
void afegir_estudiant(const Estudiant& est, bool& trobat);
/* Pre: El nombre d'estudiants del paràmetre implícit es més petit
que la mida màxima permesa. */
/* Post: Si el p.i. original no contenia cap estudiant amb el DNI
d'est, trobat és false, s'ha afegit l'estudiant est al p.i., s'han
actualitzat els estudiants admesos al curs de reavaluació al p.i.
si ha estat necessari, i s'ha actualitzat la posició de l'estudiant
admès amb nota més petita, i en cas d'empat amb nota i DNI més petits,
si ha estat necessari. En cas contrari, trobat és true i el p.i. és
igual a l'original. */
Observació
Heu de lliurar un fitxer solucio.cc amb una implementació eficient de les operacions recalcular_pos_min_admes i afegir_estudiant que ha de tenir el següent format:
#include "Cjt_estudiants.hh"
void Cjt_estudiants::recalcular_pos_min_admes() {
... // codi de la implementació
}
void Cjt_estudiants::afegir_estudiant(const Estudiant& est, bool& trobat) {
... // codi de la implementació
}
Copieu aquesta plantilla en el vostre solucio.cc i completeu-la. El vostre solucio.cc no pot contenir la implementació d’altres operacions de la classe.
A l’apartat Public files del Jutge us proveïm amb material addicional 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:
Valorarem positivament que la solució no contingui instruccions (especialment bucles o crides a operacions costoses) ni objectes (especialment vectors o conjunts) innecessaris, que no faci recorreguts quan hauria de fer cerques, i que usi correctament les operacions més eficients de la classe sempre que sigui possible. No es pot emprar cap estructura de dades que no hagi aparegut a les sessions 1-4 de laboratori.
La utilització de l’operació sort de la biblioteca <algorithm> a l’arxiu solucio.cc comportarà una
qualificació de 0 a la correcció manual del control.
Quan feu els enviaments el Jutge us indicarà quants
jocs de proves passeu i de quin tipus (públic o privat). El joc de
proves anomenat públic correspon als fitxers entrada.txt i
sortida_correcta.txt de l’apartat Public files.