A ver, lo primero es analizar el enunciado y detectar "entidades".
Las "entidades" son quienes intervienen en el problema/programa y debemos decidir si necesitamos modelarlas como clases individuales.
Hay tenemos dos posibles entidades.
Estacionamiento. ¿Vamos a querer saber cosas de él?
Sí, por ejemplo vamos a querer saber cuantas plazas tiene. Así que tendremos una clase llamada
Estacionamiento
Plazas. ¿Vamos a querer saber cosas de ellas?
Sí, vamos a querer saber si están ocupadas o libres. Si están ocupadas, vamos a querer saber a que hora se ocupó, o sea, cuándo comenzó el servicio y querremos saber cuándo dejó de estar ocupada para calcular el costo del servicio.
Así que tendremos una clase llamada
Plaza
El enunciado incluso nos dice que tipo de relación va a haber entre estas dos entidades:
La clase
Estacionamiento va a contener una cantidad determinada de objetos
Plaza. Y esta cantidad la va a decidir el usuario del programa.
Para modelar esto una posible forma es hacer que
Estacionamiento tenga como atributo una array de objetos
Plaza. Y el tamaño de este array lo decidirá el usuario cuando el programa se inicie.
Sigamos viendo más cosas del enunciado.
Plaza ya sabemos que será una clase.
Pero hay otra entidad, la entidad
automóvil. ¿Vamos a querer saber cosas de los automóviles?
¿Queremos saber su matrícula, su color, su marca, modelo, cantidad de plazas, tamaño, peso..?
Pues no, en principio no nos interesa nada de esto.
Así que la entidad
automóvil NO será una clase de nuestro programa.
De la frase anterior, si hay algo que nos interesa:
Esto nos indica un posible atributo para la clase
Plaza, un atributo que indique si está ocupada o no, y puesto que son dos posibles opciones, si o no, verdadero o falso, parece claro que será un atributo boolean.
Sigamos:
De aquí deducimos dos atributos más para
Plaza Hora de inicio de ocupación, y hora de fin de la ocupación.
Estos atributos se "autodefinen", o sea son automáticos. Podemos deducir que habrá un método para indicarle al objeto
Plaza que se ha estacionado un coche. Y este método tendrá que hacer cosas como registrar la hora de ese momento, cambiar el valor del atributo booleano y eliminar cualquier posible valor guardado en el atributo que registra la hora de quedarse libre, ya que ahora mismo está ocupada.
Para guardar el tiempo de ocupación y desocupación, se puede usar la clase LocalTime que ofrece la API de Java.
Otro método hará lo inverso, indicarle a Plaza que se ha quedado libre, cambiar de nuevo el boolean y registrar la hora de este momento.
Que más...
Aquí es evidente. Vamos a tener una clase llamada
CalculadoraCosto que será quien calcule el costo del servicio. No se nos da más pistas de como debe funcionar esta clase, así que queda a merced de nuestra imaginación.
A priori, parece lógico que esta clase deberá tener un atributo que indique cuánto cuesta una hora de estacionamiento, o el minuto, o el segundo...
En un programa real, lo lógico sería cobrar por horas o por minutos.
Sin embargo, al ser este un ejercicio de prueba, quizás nos interese cobrar por segundos. Más que nada porque vamos a querer comprobar los importes que se calculan al ocupar y desocupar plazas.
Y si cobramos por horas, no vamos a estar horas y horas con el programa funcionando para ver distintos cálculos je je...
La clase
CalculadoraCosto, para poder hacer el cálculo, tendrá que recibir el tiempo que ha estado ocupada una determinada plaza. Así que tendrá un método que reciba este tiempo ocupado, compute el costo del servicio según la tarifa establecida y retorna este resultado.
Por último:
Aquí nos indica una funcionalidad que debe ofrecer la clase
Estacionamiento, es decir, tendrá un método que recorra todo el array de objetos
Plaza y nos informe de su estado actual.
Bien, recapitulando. Parece ser que al menos vamos a tener estas tres clases:
Plaza,
Estacionamiento y
CalculadoraCosto
Ya podemos ponernos a escribirlas.
La clase
Plaza hemos dicho que tendría
tres atributos:
boolean para indicar si está ocupada o no.
inicio de la ocupación, podemos usar la clase LocalTime
fin de la ocupación, también sirve LocalTime
Los
métodos que podemos necesitar.
Informar de si la plaza está ocupada o no.
Basta con retornar el valor del atributo boolean.
Iniciar la ocupación de la plaza.
Que registre la hora actual en el "inicio de ocupación", cambie el valor del boolean a true y elimine cualquier posible valor anterior del atributo "fin de ocupación"
Finalizar la ocupación de la plaza
Registrar la hora actual en "fin de ocupación" y cambiar el valor del boolean a false. El atributo "inicio de ocupación" no debe modificarse en este momento, porque necesitaremos su valor registrado para luego calcular el tiempo que ha estado ocupada la plaza.
Informar del tiempo que ha estado ocupada
Basta comparar los objetos LocalTime de fin e inicio de ocupación y retornar los segundos de diferencia entre ellos, ya que hemos decidido cobrar por segundo en este ejercicio.
Una forma sencilla de calcular la diferencia de segundos es pedirle a cada LocalTime que nos devuelva "el segundo del día en que registró su tiempo".
Es decir, 1 día tiene 86.400 segundos en total. Cada momento del día equivale a uno de estos segundos. Pues obteniendo el segundo correspondiente a cada LocalTime y calculando la diferencia entre ellos, sabremos cuántos segundos ha estado la plaza ocupada.
Además de estos métodos, nos puede interesar sobreescribir el método toString() que TODAS las clases de Java heredan automáticamente.
Este método se usa para retornar un String que describa el estado y/o los atributos de este objeto en concreto. Es decir, que mensaje queremos mostrar en pantalla que describa a cada
Plaza.
El enunciado pedía tener una opción para mostrar el estado de todas las
Plazas. De esto, se va a encargar la clase
Estacionamiento, pero podemos facilitárselo si a las Plazas les configuramos un String que automáticamente describa su estado.
Para ello, podemos sobreescribir (override) toString() y hacer que, si el booleano dice que la plaza está libre, retornar un String indicándolo.
Y si está ocupada, el String indicará esto y además podemos hacer que indique la hora en que se inició la ocupación.
Esta podría ser la clase
Plaza
Leetela y asegurate de que entiendes cada línea. Lo que no entiendas, pregúntalo.
Ahora, intenta tú modelar las siguientes clases.
Recuerda que
Estacionamiento tendrá un array de
Plaza como atributo.
Y que el tamaño de ese array lo decide el usuario al iniciar el programa, así que el constructor de
Estacionamiento puede recibir por parámetro el valor que haya indicado el usuario en el programa principal, y con este valor, inicializar el array con el tamaño deseado.
Ha de tener métodos para indicarle a cada plaza cuando se ocupa o se libera. Así que al menos estos métodos necesitará recibir el número de plaza a ocupar/liberar (que equivaldría a la posición del array que ocupa cada plaza)
Otro método ha de informar del estado de todas las plazas. Es decir, recorrer todo el array y mostrar en pantalla un texto que describa el estado de cada plaza. Por esto, a
Plaza le hemos dado un método
toString(). Así, la clase
Estacionamiento no tendrá que consultar los atributos de cada plaza para informar por pantalla, le va a bastar con imprimir lo que reciba del método
toString()
Inténtalo, comienza un código, da igual si acaba siendo un desastre.
Cuando no sepas continuar, muestra aquí lo que hayas conseguido y te ayudamos a completarlo. Pero tienes que intentarlo tú primero.
Un saludo.