Hem decidit estendre la classe Cjt_estudiants que heu vist al laboratori amb una nova funcionalitat que assigna automàticament un nombre limitat de beques als estudiants aprovats amb millors notes i, en cas d’empat, als estudiants aprovats amb millors notes en ordre descendent per DNI. Concretament, hem afegit dos mètodes públics a la classe Cjt_estudiants: 1) b_assignades, que retorna el nombre de beques assignades a estudiants del conjunt (és a dir, el nombre d’estudiants del conjunt que tenen beca); 2) pos_max_no_becat, que retorna la posició del millor candidat a obtenir una beca del conjunt que encara no té beca, si existeix algú, o -1 si no hi ha candidats sense beca. Un estudiant és candidat a obtenir una beca si està aprovat. Donats dos candidats e1 i e2 direm que e1 és millor que e2 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.
En tot moment el nombre d’estudiants amb beca del conjunt n_bec serà més petit o igual al nombre de beques disponibles MAX_BEC. A més n_bec serà més petit o igual al nombre d’estudiants aprovats na. Finalment, si el nombre de estudiants aprovats és major o igual al nombre de beques disponibles MAX_BEC, el nombre d’estudiants amb beca del conjunt n_bec serà igual a MAX_BEC.
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 té beca o no als objectes de la classe Estudiant, i no als objectes de classe Cjt_estudiants. Això vol dir que per assignar una beca a l’estudiant situat a la posició pos de vest hem d’utilitzar la instrucció vest[pos].modificar_beca(true); i semblantment per comprovar si té beca o està aprovat. 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ó del millor candidat no becat del conjunt en un nou atribut i_max_no_becat, de manera que si en algun moment hi ha una beca disponible coneguem la posició de l’estudiant al qual li hem d’assignar aquesta beca. 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_max_no_becat();
/* Pre: cert */
/* Post: Si hi ha candidats sense beca al conjunt paràmetre implícit,
l'atribut i_max_no_becat conté la posició del millor candidat no becat
i el seu valor està dins de l'interval 0 <= i_max_no_becat < nest; si
no hi ha candidats sense beca, l'atribut i_max_no_becat és igual a -1. */
i el següent mètode públic sense utilitzar l’operació sort de la biblioteca <algorithm>. Noteu que quan esborrem un estudiant amb beca del conjunt, la seva beca s’assigna al millor candidat no becat del conjunt, si n’hi ha cap. Si el conjunt no conté candidats no becats, la beca de l’estudiant esborrat no s’assigna a cap estudiant. Obviament, si esborrem un estudiant no becat, el nombre d’estudiants que tenen beca no es modifica.
void esborrar_estudiant(int x, bool& trobat);
/* Pre: cert */
/* Post: Si el paràmetre implícit original contenia un estudiant amb
DNI = x, trobat és true, el p.i. conté els mateixos estudiants
que l'original menys l'estudiant amb DNI = x, s'han actualizat
els estudiants becats del p.i. si ha estat necessari, i s'ha
actualitzat la posició del millor candidat no becat del p.i. si
ha estat necessari; en cas contrari, trobat és false 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_max_no_becat i esborrar_estudiant que ha de tenir el següent format:
#include "Cjt_estudiants.hh"
void Cjt_estudiants::recalcular_pos_max_no_becat() {
... // codi de la implementació
}
void Cjt_estudiants::esborrar_estudiant(int x, 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.