Hemos decido extender la clase Cjt_estudiants que habéis visto en el laboratorio con una nueva funcionalidad que selecciona automáticamente los estudiantes que pueden hacer el curso de re-evaluación (es decir, que están admitidos) teniendo en cuenta que hay un número limitado de plazas disponibles MAX_PLA para este curso. Un estudiante puede optar al curso de re-evaluación si tiene nota, y su nota es mayor o igual a 4 y menor que 5. Las plazas del curso de re-evaluación se asignan por orden decreciente de nota entre los estudiantes que pueden optar al curso de re-evaluación, y en caso de empate por orden decreciente de DNI. Esto significa que, dados dos estudiantes e1 y e2 que pueden optar al curso de re-evaluación, e1 tendría preferencia sobre e2 para ser admitido al curso de re-evaluación 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.
Hemos añadido dos métodos públicos a la clase Cjt_estudiants: 1) n_admesos, que devuelve el número de estudiantes del conjunto que están admitidos al curso de re-evaluación; 2) pos_min_admes, que devuelve la posición del estudiante admitido al curso de re-evaluación con menor nota, y en caso de empate con menor nota y menor DNI. Si ningún estudiante del conjunto está admitido al curso de re-evaluación, pos_min_admes devuelve -1.
En todo momento, el número de estudiantes admitidos n_admes será menor o igual que el número de plazas disponibles MAX_PLA. Además n_admes nunca será superior al número de estudiantes que cumplen las condiciones para optar al curso de re-evaluación. Finalmente, si el número de estudiantes que pueden optar al curso de re-evaluación es mayor o igual que el número de plazas disponibles MAX_PLA, el número de estudiantes admitidos n_admes será igual a MAX_PLA.
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 está admitido al curso de re-evaluación o no en los objetos de la clase Estudiant, y no en los objetos de clase Cjt_estudiants. Esto quiere decir que para admitir al curso de re-evaluación al estudiante situado en la posición pos de vest hemos de utilizar la instrucción vest[pos].modificar_reaval(true); y similarmente para no admitirlo vest[pos].modificar_reaval(false);, comprobar si está admitido vest[pos].admes_reaval() o si cumple las condiciones para optar al curso de re-evaluación vest[pos].cond_reaval(). 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 estudiante admitido al curso de re-evaluación con menor nota, y en caso de empate con menor nota y menor DNI, en el atributo i_min_admes. De este modo, cuando añadamos un estudiante a un conjunto donde el número de estudiantes admitidos al curso de re-evaluación es igual al número de plazas disponibles, podremos determinar fácilmente si debemos admitir al nuevo estudiante al curso de re-evaluación o no. Es decir, podremos comprobar si el nuevo estudiante cumple las condiciones para optar al curso de re-evaluación y si tiene mejor nota o igual nota y mayor DNI que el estudiante admitido al curso de re-evaluación con menor nota, o con menor nota y menor DNI, del conjunto original. 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_min_admes();
/* Pre: cierto */
/* Post: Si hay estudiantes admitidos al curso de re-evaluación en el
conjunto parámetro implícito, entonces el atributo i_min_admes contiene
la posición en vest[0...nest-1] del estudiante admitido con menor nota
y, en caso de empate del estudiante admitido con menor nota y menor DNI;
si no hay estudiantes admitidos al curso de re-evaluación en el p.i.,
el atributo i_min_admes es igual a -1. */
y el siguiente método público sin utilizar la operación sort de la biblioteca <algorithm>. Observad que cuando añadimos al conjunto un estudiante que cumple las condiciones para optar al curso de re-evaluación es posible que haya plazas disponibles para el curso de re-evaluación no asignadas a otros estudiantes del conjunto, en cuyo caso debemos admitirlo. Pero también es posible que todas las plazas disponibles esten asignadas a otros estudiantes, y en ese caso debemos determinar si el nuevo estudiante tiene preferencia sobre el estudiante admitido con menor nota, o con menor nota y menor DNI, del conjunto original. Ya que si no hay plazas disponibles para los dos, el que tenga mayor preferencia debe pasar a ser admitido y el de menor preferencia pasar a no ser admitido.
void afegir_estudiant(const Estudiant& est, bool& trobat);
/* Pre: El número de estudiantes del parámetro implícito es menor que
la medida máxima permitida. */
/* Post: Si el p.i. original no contenía ningún estudiante con el DNI
de est, trobat es false, se ha añadido el estudiante est al p.i., se
han actualizado los estudiantes admitidos al curso de re-evaluación en
el p.i. si ha sido necesario, y se ha actualizado la posición del
estudiante admitido con menor nota, y en caso de empate con menor nota
y menor DNI, si ha sido necesario. En caso contrario, trobat es true 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_min_admes y afegir_estudiant que ha de tener el siguiente formato:
#include "Cjt_estudiants.hh"
void Cjt_estudiants::recalcular_pos_min_admes() {
... // código de la implementación
}
void Cjt_estudiants::afegir_estudiant(const Estudiant& est, 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.