Está en la página 1de 5

Ejercicio de Programación Orientada a Objetos

Curso 2019/2020
Entrega 2 – Ejercicio 1

El objetivo del ejercicio es el desarrollo de un sistema de consultas telemáticas (referéndums) en


las que se puede plantear más de una pregunta y las respuestas posibles serán “si”, “no” o “en
blanco”.
Previo. Gestión de fechas.
Para la realización del ejercicio es necesario utilizar fechas. A continuación, se dan algunas
indicaciones:
- Para representar las fechas utilizaremos la clase java.time.LocalDate, que implementa
una fecha sin información de la zona horaria de acuerdo al sistema de calendario ISO-8601,
en el formato (por defecto) de año-mes-día, por ejemplo, 2019-10-24.
- La clase LocalDate no dispone de constructores. Para crear objetos se utiliza el método de
clase of, que recibe como parámetro el año, mes (como un entero o un valor del
enumerado Month) y día. Por ejemplo:
LocalDate fecha = LocalDate.of(2019, 10, 24);
LocalDate fecha = LocalDate.of(2019, Month.OCTOBER, 24);
- El método de clase now crea un objeto con la fecha actual.
- Para comparar fechas están disponibles los métodos isAfter, isBefore e isEqual.
- El método plusDays recibe como parámetro el número de días que se quiere sumar a la
fecha que es el objeto receptor de la llamada y devuelve un nuevo objeto LocalDate con
el resultado de la operación.
- Los objetos LocalDate son inmutables, por lo que cualquier operación de cambio de fecha
(suma/resta de años, días o meses) devuelve un nuevo objeto con el resultado.
1. Funcionalidad básica
Un elector representa una persona que puede votar en una consulta. Las propiedades que
caracterizan a un elector son el dni, el nombre y la fecha de nacimiento. Todas las propiedades se
establecen en la construcción y no pueden cambiar una vez establecidas. Todas ellas se pueden
consultar. Implementa el método toString para poder mostrar todas las propiedades de un
elector.
Una consulta representa un evento en el que se puede votar a las preguntas que se plantean. Las
posibles opciones de voto, o respuestas a las preguntas, son “si”, “no” o “en blanco” (enumerado).
Las propiedades que caracterizan a una consulta son:
- Título: cadena de texto que describe el objetivo de la consulta. Esta propiedad se puede
modificar.
- Censo: conjunto de electores.
- Número de preguntas: entero que establece el número de preguntas que contendrá la
consulta.
- Preguntas: lista de cadenas de texto que representan las preguntas que se plantean en la
consulta. El orden en la colección determina el número de la pregunta en la consulta,
1/5
teniendo en cuenta que la pregunta de la posición 0 será la pregunta número 1, y así
sucesivamente.
- Preparada: propiedad booleana que indica que están todas las preguntas establecidas y se
puede comenzar la consulta.
- Votos: mapa que asocia los dnis de los electores que han votado con una lista que contiene
las respuestas emitidas para cada pregunta. Por ejemplo, {SI, NO, EN_BLANCO} significa
que a la pregunta 1 se ha votado que sí, que a la pregunta 2 se ha votado que no, mientras
que la pregunta 3 se ha dejado en blanco.
- Número de votos emitidos. Se corresponde con el número de entradas del mapa de votos.
- Número de electores en el censo.
- Índice de participación: se corresponde con el cociente entre el número de votos emitidos
y el número de electores en el censo.
El constructor de la consulta recibe como parámetro el título de la consulta y el número de
preguntas. En la construcción se deben inicializar todas las colecciones.
La funcionalidad que ofrece la clase que representa una consulta es:
- Añadir electores: recibe como parámetro una lista variable de electores (argumento
variable) y los añade al censo.
- Añadir una pregunta: recibe como parámetro el número y el texto de la pregunta. En
primer lugar se tiene que comprobar si el número de la pregunta está dentro del rango de
preguntas de la consulta. Si el número de la pregunta es correcto se añade a la colección. Si
la pregunta ya existe se reemplaza. El método devuelve un valor booleano indicando si la
pregunta se ha añadido con éxito.
- Eliminar una pregunta: recibe como parámetro el número de la pregunta que se quiere
borrar. Devuelve un valor booleano para indicar si la pregunta ha sido eliminada.
- Obtener el elector asociado a un dni. En caso de no encontrarlo devolverá el valor nulo.
- Comprobar si un elector está en el censo. Para ello recibe como parámetro el dni y
devuelve true si existe un elector con ese dni en el censo, false en caso contrario.
- Comprobar si un elector ha votado. Recibe como parámetro el dni y comprueba si hay un
voto emitido (esto es, una entrada en el mapa de votos) asociado a ese dni.
- Obtener el escrutinio de una pregunta: este método recibe como parámetro el número de
la pregunta y devuelve un mapa que asocie a cada posible respuesta el número de votos,
esto es, devolvemos el número de “sies”, el número de “noes” y el número de votos en
blanco emitidos para esa pregunta. Por ejemplo, supongamos que el mapa de votos de la
consulta que se ha creado es el de la figura:

ArrayList<String>
String dni
respuestas P1 P2 P3
“34567892” SI NO EN_BLANCO
“27456213”
SI SI SI

2/5
El mapa de escrutinio de la pregunta 2 sería:

SI 1
NO 1
EN_BLANCO 0

- Votar. Esta operación recibe como parámetro el dni del elector que va a emitir su voto y
una lista con las respuestas para cada una de las preguntas. Este método devuelve un valor
booleano para indicar si se ha podido votar o no. De manera general, para poder votar se
tiene que cumplir que: 1) la consulta esté preparada, 2) la consulta esté activa, 3) el elector
esté en el censo, 4) que el elector no haya votado ya y 5) que el tamaño de la lista de
respuestas que se van a votar coincida con el número de preguntas de la consulta. Si se
cumplen estas condiciones se añade un nuevo voto asociando el dni del elector con la lista
de respuestas por las que vota a cada pregunta. Para la implementación de este método se
debe aplicar el concepto de programación del método plantilla, dado que se tiene que
apoyar en la implementación del método que consulta si la consulta está activa que
depende de las subclases.
- Versión sobrecargada del método ‘votar’ que recibe como parámetro el dni del elector y un
argumento variable con las respuestas a cada pregunta.
- Versión sobrecargada del método ‘votar’ que sólo recibe como parámetro el dni del elector
y se entiende que vota “en blanco” a todas las preguntas de la consulta.

2. Tipos de consultas
La clase que representa las consultas incluye una nueva propiedad denominada activa. Se trata de
una propiedad que indica si la consulta está abierta para poder emitir un voto. La forma de
comprobar si una consulta está activa depende de cada tipo de consulta.
El sistema ofrece dos tipos de consultas: consulta ordinaria y consulta selectiva, cada una con unas
condiciones particulares a la hora de votar y diferentes formas de determinar si la consulta está
activa.
Una consulta ordinaria representa un tipo de consulta que permite que un elector pueda cambiar
el voto, esto es, si un elector que ya ha votado vuelve a hacerlo, se anulará previamente el voto
que ya está registrado y tramitará el nuevo voto. En el caso de que el nuevo voto no sea válido (no
se cumplen alguno de los requisitos establecidos a la hora de votar) se debe restaurar el voto que
se había anulado.
Una consulta ordinaria dispone de las funcionalidades para abrir y cerrar la consulta en cualquier
momento. Por tanto, una consulta ordinaria está activa si está abierta. En el momento de la
construcción la consulta estará cerrada hasta que se abra explícitamente.
Una consulta selectiva es un tipo de consulta que establece como restricción a la hora de votar
que algunas preguntas sólo puedan responderlas las personas nacidas antes de una determinada
fecha. O lo que es lo mismo, las personas nacidas en una fecha posterior a la establecida para la
consulta no pueden contestar a determinadas preguntas, lo que equivale a dejarlas “en blanco”.

3/5
Por tanto, este tipo de consulta añade tres propiedades nuevas:
- fecha umbral: fecha que selecciona qué electores pueden contestar (una respuesta
diferente a “en blanco”) a determinadas preguntas.
- preguntas condicionadas: conjunto con los números de las preguntas condicionadas por la
fecha umbral.
- Censo autorizado: conjunto de electores que pueden responder a todas las preguntas. Esto
es, los que su fecha de nacimiento es anterior a la fecha umbral.
Los nacidos con posterioridad a la fecha umbral sólo tienen la opción de dejar “en blanco” las
preguntas condicionadas, mientras que los nacidos antes de la fecha umbral pueden responder
con cualquiera de las posibles respuestas. Por ejemplo, si se establece como fecha umbral
1/1/2000, y como número de pregunta condicionada la 3, esto significa que los electores que han
nacido en una fecha posterior al uno de enero del año 2000, tienen que contestar “en blanco” a la
pregunta 3 (lo que equivale a que no pueden responder a esa pregunta).
A la hora de votar se tiene que comprobar la edad del elector para, en su caso, comprobar si las
respuestas a las preguntas condicionadas son “en blanco”. En el caso de no cumplirse, el método
deberá devolver false. En el caso de que se cumplan las condiciones particulares de voto de una
consulta selectiva, se tendrá que registrar el voto atendiendo a las condiciones generales de una
consulta.
Además, la consulta selectiva añade como propiedad la fecha en la que se celebra la consulta. Este
tipo de consulta sólo se mantiene activa durante este día, por tanto, una consulta selectiva está
activa si la fecha actual coincide con la fecha de celebración. Esta propiedad se puede cambiar
sólo si la fecha que se va a establecer es posterior a la fecha actual. El método devuelve un valor
booleano para indicar si se ha realizado el cambio.
El constructor de la consulta selectiva recibirá como parámetro, además del título de la consulta,
la fecha umbral y la fecha de celebración. La fecha de celebración se puede omitir y se entenderá
que es el día siguiente de la creación.
La funcionalidad de la clase incluye un método para establecer el conjunto de los números de las
preguntas condicionadas como un argumento variable. Sólo serán aceptados aquellos números
que se correspondan con números de preguntas de la consulta. Los números que no sean válidos
serán descartados.

3. Copia de las consultas

Implementa el método clone en las clases que representan las consultas de acuerdo con la
semántica de su especificación y siguiendo las recomendaciones de la asignatura. Debe tenerse en
cuenta que:
- Es necesario evitar los casos de aliasing que no sean correctos, en especial los relativos a
las colecciones.
- La copia de una consulta debe tener las mismas preguntas y el mismo censo, pero no se
habrá emitido ningún voto.
- Es conveniente redefinir el método clone en las subclases para aplicar la regla covariante.

4/5
4. Programa
Implementa la clase Programa con un método main que contenga la siguiente funcionalidad:
- Crea los electores:
o "Juan Martínez" con dni "17456789" y fecha de nacimiento 16/12/1998.
o "Pedro López" con dni "34567890" y fecha de nacimiento 18/3/1998.
o “Ana Abenza" con dni "23456812" y fecha de nacimiento 1/5/1995.
o “María Gómez” con dni “23754612” y fecha de nacimiento 1/9/1994.
- Crea una consulta ordinaria que tenga por título “Sobre los exámenes en la universidad” de
dos preguntas.
- Añade a la consulta ordinaria las preguntas:
1. “¿Debemos volver a la convocatoria de septiembre?”
2. “¿Se deben hacer parciales en todas las cuatrimestrales?”
- Crea una consulta selectiva que tenga por título “Sobre las fiestas patronales”, de dos
preguntas, que se celebre hoy y tenga como fecha umbral el 31/12/1997.
- Añade a la consulta selectiva las preguntas:
1. “¿Se debe cerrar el centro el día del patrón?”
2. “¿Se deben recuperar las clases que se pierden en las fiestas?”
- Establece como pregunta condicionada la 1.
- Crea una lista de consultas y añade las dos consultas que se han creado.
- Recorre las consultas y para cada consulta:
o Añade todos los electores a la consulta.
o Abre la consulta si es ordinaria.
o Juan vota “si” a todas las preguntas.
o Pedro vota en blanco a todas las preguntas.
o Ana vota “si” a la primera y “no” a la segunda.
o María vota “no” a todas las preguntas.
o Muestra por la consola:
▪ El título de la consulta.
▪ Si es una consulta selectiva el censo autorizado.
▪ El número de votos emitidos.
▪ El escrutinio para cada pregunta.
- Crea una lista de consultas llamada copias y añade una copia de cada una de las consultas
existentes.
- Recorre la lista de las copias y muestra por la consola la información de cada una de ellas
(toString).
NOTA: implementa el método toString en la jerarquía de consultas.

5/5

También podría gustarte