Hemos decidido extender la clase
Cjt_estudiants que habéis visto en el
laboratorio con dos nuevas funcionalidades.
La primera funcionalidad calcula la nota global de un estudiante en
una asignatura a partir de sus notas en los exámenes parciales de dicha
asignatura, y asigna la nota global calculada a dicho estudiante. La
nota global de un estudiante puede ser
,
si se considera que la calificación global del estudiante en la
asignatura debe ser NP (No Presentado), o un valor real en el rango
[0 …Estudiant::nota_maxima()], que
corresponde a la suma ponderada de las notas del estudiante en los
exámenes parciales de la asignatura. Para realizar la evaluación global
de los estudiantes de una asignatura, la clase
Cjt_estudiants necesita representar cierta
información sobre dicha asignatura, en particular, el número de exámenes
parciales que se realizan en la asignatura y el peso de cada examen
parcial en la nota global de la asignatura. Por este motivo, hemos
añadido dos atributos nuevos a la clase
Cjt_estudiants: (1)
nombre_parcials de tipo entero, que representa
el número de exámenes parciales; y (2)
pesos_parcials de tipo
vectordouble,
que permite almacenar los pesos de los distintos exámenes parciales en
la nota global. En particular, el peso del examen parcial
-ésimo
es pesos_parcials[j-1] para todo
tal que
.
Concretamente, la evaluación global de un estudiante se realiza de la
siguiente manera. Si la suma de los pesos de los exámenes parciales a
los que no se ha presentado un estudiante es mayor que 0.5, la nota
global del estudiante debe ser -1 (que es el valor elegido para
representar la calificación ”No Presentado” en nuestra implementación
del tipo Cjt_estudiants). En otro caso, la
nota global del estudiante debe ser la suma ponderada de sus notas en
los exámenes parciales de la asignatura, que es igual a la suma de las
contribuciones a la nota global de los exámenes parciales a los que el
estudiante se ha presentado, donde la contribución del examen parcial
-ésimo
se obtiene multiplicando la nota del estudiante en el examen parcial
-ésimo
por el peso de dicho examen parcial.
Esta funcionalidad se implementa en la clase
Cjt_estudiants mediante el método privado
void avaluacio_global_iesim(int i);
/* Pre: 1 <= i <= mida()
El estudiante i-ésimo tiene notas asignadas para todos los exámenes
parciales de la asignatura. La nota de cada examen parcial puede ser
-1, si el estudiante no se ha presentado a dicho examen parcial, o
una nota válida en el rango [0...Estudiant::nota_maxima()]. */
/* Post: El estudiante i-ésimo pasa a tener asignada su nota global en
la asignatura, que puede ser -1, si se considera que su calificación
global debe ser NP (No Presentado), o una nota válida en el rango
[0...Estudiant::nota_maxima()] que corresponde a la suma ponderada
de sus notas en los exámenes parciales de la asignatura a los que
se ha presentado. */
Por ejemplo, si
es un objeto de la clase Cjt_estudiants que
representa los estudiantes de una asignatura con
exámenes parciales cuyos pesos son
[0.1, 0.15, 0.25, 0.25, 0.25] respectivamente,
y las notas en los exámenes parciales del tercer estudiante de
son {6.5, -1, 10, 6, 4} , después de la
llamada c.avaluacio_global_iesim(3), la nota
global del tercer estudiante de
debe ser 5.65. Del mismo modo, si las notas en los exámenes parciales
del quinto estudiante de
son {-1, 10, -1, 5, -1}, después de la llamada
c.avaluacio_global_iesim(5), la nota global
del quinto estudiante de
debe ser
(i.e. No Presentado).
La segunda funcionalidad añadida a la clase
Cjt_estudiants calcula y escribe en el canal
estándar de salida el subconjunto de exámenes parciales a los que se han
presentado todos los estudiantes que han aprobado la asignatura, es
decir, todos los estudiantes cuya nota global en la asignatura es mayor
o igual que
.
Esta funcionalidad se implementa en la clase
Cjt_estudiants mediante el método público
void parcials_presentats_aprovats() const;
/* Pre: Todos los estudiantes del parámetro implícito tienen notas
asignadas para todos los exámenes parciales y también tienen
asignada su nota global en la asignatura. La nota de cada examen
parcial puede ser -1, si el estudiante no se ha presentado a dicho
examen parcial, o una nota válida en el rango
[0...Estudiant::nota_maxima()]. */
/* Post: En el canal de salida estándar se han escrito los identificadores
de los exámenes parciales a los que se han presentado todos los
estudiantes que tienen una nota global en la asignatura mayor o igual
que 5. Los identificadores de estos exámenes parciales están ordendados
crecientemente. */
Por ejemplo, si
es un objeto de la clase Cjt_estudiants que
representa los estudiantes de una asignatura con
exámenes parciales en el que hay exactamente
estudiantes
con nota global mayor o igual que
,
y sabemos que de esos
estudiantes
no se ha presentado al primer examen parcial, y
y
no se han presentado al tercer examen parcial, después de la llamada
c.parcials_presentats_aprovats() se escribirá
en la pantalla el subconjunto
,
ya que los únicos exámenes parciales a los que se han presentado todos
los estudiantes aprobados son el segundo y el cuarto.
Para implementar estas funcionalidades hemos modificado también la
representación de la clase Estudiant de la
manera descrita en el archivo Estudiant.hh. En
particular, representamos las notas de un estudiante en dos atributos
nuevos: (1) nota_global de tipo
double; y (2)
notes_parcials de tipo
vectordouble.
Concretament, la nota del examen parcial
-ésimo
del estudiante parámetro implícito es
notes_parcials[j-1] para todo
en el rango
Teniendo esto en cuenta debéis implementar eficientemente el método
privado
avaluacio_global_iesim y el método público
parcials_presentats_aprovats. Debéis entregar
un archivo solucio.cc con una implementación
eficiente de estos dos métodos. En el caso del método público
parcials_presentats_aprovats podéis completar
la implementación parcial que os proponemos, o implementar este método
sin utilizar la implementación parcial propuesta.
Es posible superar algunos juegos de prueba (pero no todos)
implementando únicamente el método privado
avaluacio_global_iesim,
siempre y cuando no modifiquéis la implementación parcial del método
público parcials_presentats_aprovats que os
proporcionamos.
Dentro del material adicional que os proporcionamos en el apartado
Public files del problema del jutge encontraréis
el archivo plantilla.txt con las cabeceras de
ambos métodos y una implementación incompleta del método
parcials_presentats_aprovats: debéis renombrar
el archivo plantilla.txt de manera que se
llame solucio.cc, completarlo y enviarlo al
jutge.
Vuestro archivo solucio.cc no puede
contener la implementación de otros métodos de las clases
Estudiant o
Cjt_estudiants.
En el apartado Public files del jutge os proporcionamos material adicional en un fichero .tar. Podéis extraer el contenido de este fichero con la instrucción
tar -xvf nom_fitxer.tar
Este material adicional contiene los siguientes archivos:
plantilla.txt: es la plantilla del
archivo solucio.cc; debéis renombrar este archivo de manera que se llame
solucio.cc, completarlo y enviarlo al
jutge
Cjt_estudiants.hh: la especificación
Pre/Post de todos los métodos públicos y privados de esta nueva versión
de la clase Cjt_estudiants, así como la
definición de los atributos privados.
Cjt_estudiants.cc: la implementación de
todos los métodos de la clase Cjt_estudiants,
excepto la de los métodos que os pedimos.
Estudiant.hh: la especificación de la
nueva versión de la clase Estudiant y la
definición de sus atributos privados.
Estudiant.cc: la implementación de
todos los métodos de la clase
Estudiant.
pro2.cc: un programa principal que
podéis utilizar para probar los métodos públicos de esta nueva versión
de la clase Cjt_estudiants.
entrada.txt y
sortida_correcta.txt: archivo de entrada del
juego de pruebas público, y salida correcta para dicho juego.
llegeixme.txt: instrucciones para
generar el ejecutable del programa pro2.cc y
probarlo.
Valoraremos positivamente que la solución no contenga instrucciones
innecesarias (especialmente bucles o llamadas a operaciones costosas),
ni objetos (especialmente vectores o matrices) innecesarios, que no haga
recorridos cuando debería hacer búsquedas, y que use correctamente las
operaciones más adecuadas de las clases
Estudiant y
Cjt_estudiants siempre que sea posible. No se
puede usar ninguna estructura de datos que no haya aparecido en las
sesiones 1 a 4 de laboratorio.
Cuando hagáis envíos, el jutge os indicará cuantos juegos de pruebas
supera vuestro programa y de qué tipo (público o privado).
Tened en cuenta que es posible superar algunos juegos de
prueba (pero no todos) implementando únicamente el método
avaluacio_global_iesim, si no modificáis la
implementación parcial del método
parcials_presentats_aprovats que os
proporcionamos.