Hem decidit estendre la classe
Cjt_estudiants que heu vist al laboratori amb
una nova funcionalitat que permeti escriure els estudiants del paràmetre
implícit amb nota compresa dins del interval tancat [nota_inf, nota_sup]
verificant-se
0
nota_infnota_sup
nota_maxima(). Els estudiants s’escriuen en ordre ascendent per nota i,
en cas d’empat, en ordre ascendent per DNI.
Per implementar eficientment aquesta operació
hem modificat la representació i l’invariant de la classe de manera que els estudiants sense nota del atribut “vest” precedeixen als estudiants amb nota i estan ordenats creixentment per DNI, i els estudiants amb nota del atribut “vest” estan ordenats creixentment per nota i, en cas d’empat, creixentment per DNI.
hem incorporat un nou atribut
primer_est_amb_nota que conté la posició del
primer estudiant amb nota.
hem afegit tres operacions privades:
cerca_lineal_per_dni, cerca_dicot_per_dni i
cerca_dicot_per_nota_dni.
Tenint això en compte heu d’implementar eficientment el següent mètode privat:
int posicio_nota(double nota_b) const;
/* Pre: 0 <= nota_b <= nota_maxima() */
/* Post: el resultat és la posició del primer estudiant amb nota major
o igual que nota_b a vest[0...nest-1]. Si no hi ha estudiants amb
nota major o igual que nota_b, el resultat és nest. */
i els següents mètodes públics:
void afegir_estudiant(const Estudiant &est, bool &trobat);
/* Pre: el paràmetre implícit no està ple */
/* Post: trobat indica si el p.i. original conté un estudiant amb
el dni d'est; si trobat és cert no es modifica el p.i., i si
trobat és fals s'ha afegit l'estudiant est al paràmetre implícit */
void escriure_i(double nota_i, double nota_s) const;
/* Pre: 0 <= nota_i <= nota_s <= nota_maxima() */
/* Post: s'han escrit pel canal estàndard de sortida els estudiants
del paràmetre implícit amb nota dins del interval tancat
[nota_i, nota_s]. Els estudiants s'escriuen en ordre ascendent
per nota i en cas d'empat en ordre ascendent per DNI */
Heu de lliurar un fitxer solucio.cc amb una
implementació eficient de les operacions
posicio_nota, afegir_estudiant i
escriure_i que ha de tenir el següent
format:
#include "Cjt_estudiants.hh"
int Cjt_estudiants::posicio_nota(double nota_b) const {
... // codi de la implementació
}
void Cjt_estudiants::afegir_estudiant(const Estudiant &est, bool &trobat)
{
... // codi de la implementació
}
void Cjt_estudiants::escriure_i(double nota_i, double nota_s) const
{
... // 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
un nou atribut
primer_est_amb_nota i hem
modificat l’invariant de la representació de la classe
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 tres operacions
privades:
cerca_lineal_per_dni, cerca_dicot_per_dni i
cerca_dicot_per_nota_dni que podeu d’usar per
fer implementacions eficients.
Cjt_estudiants.cc: la implementació de
totes de 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. La novetat que presenta és una operació,
comp_nota_dni que permet comparar dos
estudiants per nota i en cas d’empat per DNI.
Estudiant.cc: la implementació dels
mètodes de la classe Estudiant.
pro2.cc: un programa principal que
podeu fer servir per provar les operacions públiques d’aquesta versió de
la classe Cjt_estudiants.
Valorarem positivament que la solució no contingui instruccions (especialment bucles o crides a operacions costoses) ni objectes (especialment vectors) 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 addicional ni implementar més operacions noves.
Important: lliurar repetidament solucions que no funcionin amb el sample públic és una pèrdua de temps. Al fitxer .tar del Public files teniu tot el material necessàri per provar el vostre codi abans de lliurar-lo.
Input
11 111 3.22 222 8.66 333 -12 444 4.22 555 3.66 888 7.66 999 349 123 4.22 234 9.66 345 5.5 890 10 -2 -3 5 10 -1 444 5.02 -1 456 1.06 -2 -1 899 10 -3 10 10 -1 745 -12 -1 342 22 -2 -4
Output
Conjunt: Estudiants sense nota 2 Estudiants amb nota 9 333 NP 999 NP 111 3.22 555 3.66 123 4.22 444 4.22 345 5.5 888 7.66 222 8.66 234 9.66 890 10 Interval [5, 10] 345 5.5 888 7.66 222 8.66 234 9.66 890 10 L'estudiant 444 ja hi era Conjunt: Estudiants sense nota 2 Estudiants amb nota 10 333 NP 999 NP 456 1.06 111 3.22 555 3.66 123 4.22 444 4.22 345 5.5 888 7.66 222 8.66 234 9.66 890 10 Interval [10, 10] 890 10 899 10 Conjunt: Estudiants sense nota 4 Estudiants amb nota 11 333 NP 342 NP 745 NP 999 NP 456 1.06 111 3.22 555 3.66 123 4.22 444 4.22 345 5.5 888 7.66 222 8.66 234 9.66 890 10 899 10