Hemos decidido extender la clase Cjt_estudiants que habéis visto en el laboratorio con una nueva funcionalidad que asigna automáticamente un número limitado de becas a los estudiantes aprobados con mejores notas, y en caso de empate a los estudiantes aprobados con mejores notas en orden descendente de DNI. Concretamente, hemos añadido dos métodos públicos a la clase Cjt_estudiants: 1) b_assignades, que devuelve el número de becas asignadas a estudiantes del conjunto (es decir, de estudiantes del conjunto que tienen beca); 2) pos_max_no_becat, que devuelve la posición del mejor candidato a obtener una beca del conjunto que todavía no tiene beca, si existe alguno, o -1 si no hay candidatos sin beca. Un estudiante es candidato a obtener una beca si está aprobado. Dados dos candidatos e1 y e2 diremos que e1 es mejor que e2 si e1 tiene mejor nota que e2, o si e1 y e2 tienen la misma nota y el DNI de e1 es mayor que el DNI de e2.
En todo momento el número de estudiantes con beca del conjunto n_bec será menor o igual que el número de becas disponibles MAX_BEC. Además n_bec nunca será superior al número de estudiantes aprobados na. Finalmente, si el número de estudiantes aprobados es mayor o igual que el número de becas disponibles MAX_BEC, el número de estudiantes con beca n_bec será igual a MAX_BEC.
Para implementar eficientemente esta funcionalidad hemos modificado la representación y la invariante de la clase Estudiant de la manera descrita en el archivo Estudiant.hh. En particular, representamos la información sobre si un estudiante tiene beca o no en los objetos de la clase Estudiant, y no en los objetos de clase Cjt_estudiants. Esto es, para asignar una beca al estudiante situado en la posición pos de vest hemos de utilizar la instrucción vest[pos].modificar_beca(true); y similarmente para comprobar si tiene beca o está aprobado. Leed con atención el archivo Estudiant.hh, especialmente las descripciones de los nuevos atributos, la invariante y las especificaciones de las operaciones nuevas. Las principales novedades de la clase Estudiant son:
También hemos modificado la representación y la invariante de la clase Cjt_estudiants de la manera descrita en el archivo Cjt_estudiants.hh. La principal novedad es que almacenamos la posición del mejor candidato no becado del conjunto en un nuevo atributo i_max_no_becat, de manera que si en algún momento hay una beca disponible conozcamos la posición del estudiante al cual hemos de asignar esta beca. Leed con atención el archivo Cjt_estudiants.hh, especialmente las descripciones de los nuevos atributos, la invariante y las especificaciones de las operaciones nuevas. Las principales novedades de la clase Cjt_estudiants.hh son:
Teniendo esto en cuenta debéis implementar eficientemente el siguiente método privado sin utilizar la operación sort de la biblioteca <algorithm>:
void recalcular_pos_max_no_becat();
/* Pre: cierto */
/* Post: Si hay candidatos no becados en el conjunto parámetro
implícito, el atributo i_max_no_becat contiene la posición del
mejor candidato no becado y su valor esta dentro del intervalo
0 <= i_max_no_becat < nest; si no hay candidatos sin beca, el
atributo i_max_no_becat es igual a -1. */
y el siguiente método público sin utilizar la operación sort de la biblioteca <algorithm>. Observad que cuando borramos un estudiante con beca del conjunto, su beca se asigna al mejor candidato no becado del conjunto, si hay alguno. Si el conjunto no contiene candidatos no becados, la beca del estudiante borrado no se asigna a ningún estudiante. Obviamente, si borramos un estudiante no becado, el número de estudiantes que tienen beca no se modifica.
void esborrar_estudiant(int x, bool& trobat);
/* Pre: cert */
/* Post: Si el parámetro implícito original contenía un estudiante con
DNI = x, trobat es true, el p.i. contiene los mismos estudiantes que
el original menos el estudiante con DNI = x, se han actualizado los
estudiantes becados del p.i. si ha sido necesario, y se ha actualizado
la posición del mejor candidato no becado del p.i. si ha sido necesario;
en otro caso, trobat es false y el p.i. es igual al original. */
Observación
Debéis entregar un fichero solucio.cc con una implementación eficiente de las operaciones recalcular_pos_max_no_becat y esborrar_estudiant que ha de tener el siguiente formato:
#include "Cjt_estudiants.hh"
void Cjt_estudiants::recalcular_pos_max_no_becat() {
... // código de la implementación
}
void Cjt_estudiants::esborrar_estudiant(int x, bool& trobat) {
... // código de la implementación
}
Copiad esta plantilla en vuestro solucio.cc y completadla. Vuestro solucio.cc no puede contener la implementación de otras operaciones de la clase.
En el apartado Public files del Jutge os proporcionamos material adicional comprimido en un fichero .tar. Podéis descomprimir este fichero con el comando
tar -xvf nom_fitxer.tar
Este material adicional contiene los siguientes ficheros:
Valoraremos positivamente que la solución no contenga instrucciones (especialmente bucles o llamadas a operaciones costosas) ni objetos (especialmente vectores o conjuntos) innecesarios, que no haga recorridos cuando debería hacer búsquedas, y que use correctamente las operaciones más eficientes de la clase siempre que sea posible. No se puede usar ninguna estructura de datos que no haya aparecido en las sesiones 1-4 de laboratorio.
La utilización de la operación sort de la biblioteca <algorithm> en el archivo solucio. cc comportará una calificación de 0 en la corrección manual del control.
Cuando hagáis envíos, el Jutge os indicará cuantos
juegos de pruebas pasa vuestro programa y de qué tipo (público o privado). El juego de
pruebas denominado público corresponde a los ficheros entrada.txt y
sortida_correcta.txt del apartado Public files.