Control - Torn 1 (Primavera 2017) X27643


Statement
 

pdf   zip   tar

html

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:

  • hem incorporat un nou atribut amb_beca que permet representar informació sobre si l’estudiant paràmetre implícit té beca o no;
  • hem afegit el consultor te_beca que permet comprovar si l’estudiant paràmetre implícit té beca o no;
  • hem afegit el modificador modificar_beca que permet modificar la informació sobre si l’estudiant paràmetre implícit té beca o no;
  • hem afegit el consultor aprovat que permet comprovar si l’estudiant paràmetre implícit està aprovat o no;
  • 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ó 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:

  • hem incorporat un nou atribut static i constant MAX_BEC que especifica el nombre de beques disponibles;
  • hem incorporat un nou atribut n_bec que conté el nombre d’estudiants que tenen beca del paràmetre implícit, que equival al nombre de beques assignades a estudiants del p.i. de les MAX_BEC beques disponibles;
  • hem afegit un consultor b_assignades que permet consultar el valor de l’atribut n_bec;
  • hem incorporat un nou atribut i_max_no_becat que conté la posició del millor candidat no becat del paràmetre implícit. Si hi ha candidats no becats al paràmetre implícit, llavors 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; en cas contrari, és a dir, si no hi ha candidats sense beca, el valor de l’atribut i_max_no_becat és igual a -1;
  • hem afegit el consultor públic pos_max_no_becat, per consultar la posició del millor candidat no becat. Si hi ha candidats sense beca al conjunt paràmetre implícit retorna i_max_no_becat+1, i si no hi ha candidats sense beca retorna -1.
  • i hem afegit el modificador privat recalcular_pos_max_no_becat per recalcular el valor de l’atribut i_max_no_becat 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_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:

  • 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 atributs privats. Fixeu-vos que hem afegit tres atributs n_bec, i_max_no_becat i MAX_BEC, 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 quatre operacions noves: el modificador privat recalcular_pos_max_no_becat i els consultors públics bec_disp, b_assignades, pos_max_no_becat.
  • 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. Les principals novetats que presenta són un atribut amb_beca que indica si s’ha concedit una beca a l’estudiant paràmetre implícit, i els mètode públics aprovat, te_beca, modificar_beca i major_nota_dni.
  • 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.

Information
Author
Professors de PRO2
Language
Catalan
Other languages
Spanish
Official solutions
C++
User solutions
C++