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
i
que poden optar al curs de reavaluació,
tindria prefèrencia sobre
per a ser admès al curs de reavaluació si
té millor nota que
,
o si
i
tenen la mateixa nota i el DNI
d’
és més gran que el DNI
d’.
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:
hem incorporat un nou atribut reaval
que permet representar informació sobre si l’estudiant paràmetre
implícit està admès al curs de reavaluació o no;
hem afegit el consultor admes_reaval
que permet consultar si l’estudiant paràmetre implícit està admès al
curs de reavaluació o no;
hem afegit el modificador
modificar_reaval que permet modificar la
informació sobre si l’estudiant paràmetre implícit està admès al curs de
reavaluació o no;
hem afegit el consultor cond_reaval que
permet comprovar si l’estudiant paràmetre implícit compleix les
condicions per optar al curs de reavaluació;
hem afegit el mètode static i públic
major_nota_dni que permet comparar dos
estudiants per nota i en cas d’empat per DNI;
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:
hem incorporat un nou atribut static i
constant MAX_PLA que especifica el nombre de
places disponibles pel curs de reavaluació;
hem incorporat un nou atribut n_admes
que conté el nombre d’estudiants del conjunt admesos al curs de
reavaluació;
hem afegit un consultor n_admesos que
permet consultar el valor de l’atribut
n_admes, és a dir, el nombre d’estudiants
admesos;
hem incorporat un nou atribut
i_min_admes que conté la posició a
vest de l’estudiant admès al curs de
reavaluació amb menor prefèrencia. Si hi ha estudiants admesos al curs
de reavaluació, l’atribut i_min_admes conté la
posició de l’estudiant admès amb nota més petita, i en cas d’empat, amb
nota i DNI més petits, i el seu valor està dins de l’interval
0 i_min_admes nest;
en cas contrari, si no hi ha estudiants admesos al curs de reavaluació,
llavors i_min_admes és igual a -1.
hem afegit el consultor públic
pos_min_admes, per consultar 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 hi ha estudiants admesos al curs
de reavaluació al conjunt retorna
i_min_admes1,
i si no hi ha estudiants admesos al conjunt retorna -1.
i hem afegit el modificador privat
recalcular_pos_min_admes per recalcular el
valor de l’atribut i_min_admes quan sigui
necessari.
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. */
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:
Cjt_estudiants.hh: l’especificació
Pre/Post de totes les operacions públiques i privades d’aquesta nova
versió de la classe Cjt_estudiants, així como
la definició dels camps privats. Fixeu-vos que hem afegit
tres atributs
n_admes, i_min_admes i
MAX_PLA, i que hem modificat
l’invariant de la representació de
Cjt_estudiants. És molt
important que la implementació de les operacions que us hem encarregat
tingui en compte i preservi l’invariant de la
representació. Fixeu-vos també que hi ha operacions
noves: el modificador privat
recalcular_pos_min_admes, els consultors
pùblics n_admesos, places_disp, pos_min_admes,
i el modificador públic
afegir_estudiant.
Cjt_estudiants.cc: la implementació de
totes les operacions de la nova versió de la classe
Cjt_estudiants tret de les operacions que us
demanem.
Estudiant.hh: l’especificació de la
classe Estudiant i la definició dels seus
atributs. Les principals novetats que presenta són un atribut
reaval que indica si l’estudiant paràmetre
implícit està admès al curs de reavaluació, els consultors públics
admes_reaval, cond_reaval i
major_nota_dni, i el modificador públic
modificar_reaval.
Estudiant.cc: la implementació dels
mètodes de la classe Estudiant.
pro2.cc: un programa principal que
podeu fer servir per provar els mètodes públics d’aquesta versió de la
classe Cjt_estudiants.
llegeixme.txt: instruccions per a
generar l’executable del programa pro2 i
provar-lo.
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.