L'exercice consiste à écrire les classes demandées à partir :
- de diagrammes UML, disponibles dans le répertoire
uml
, - de la documentation Javadoc, disponible dans le répertoire
docs
, - de précisions éventuelles données ci-dessous.
La suite décrit étape par étape ce qui est attendu.
Le répertoire src
contient initialement :
- la classe
TimeUtilities
, qui est fournie complète (ainsi que sa documentation Javadoc) afin d'aider l'écriture des autres classes. - la classe
Main
, qui est fournie complète, et dont la sortie console est :
23:59:59
- ⬇️ Dupliquer (fork) ce dépôt et le cloner.
- 🔧 Configurer le projet (sdk >= 8, sources dans
src
) de sorte que l'applicationMain
puisse être compilée et exécutée. - ✅ Exécuter l'application et vérifier que la sortie console est conforme à ce qui est attendu (cf. ci-dessus).
- 🏷️ Effectuer un commit des fichiers de configuration modifiés, en indiquant
0-Configuration
comme message. - 🚀 Pousser immédiatement le commit sur Gitlab.
- 👀 Vérifier que le commit est bien disponible sur Gitlab.
TimeSlotClassDiagram.png
.
Cette classe contient des constantes et des méthodes utiles pour représenter et manipuler des heures.
Les heures sont par la suite exprimées en nombre de secondes écoulées depuis minuit.
Par exemple :
0
représente00:00:00
(minuit)7265
représente02:01:05
86399
représente23:59:59
La méthode timeToString
permet de représenter une heure (exprimée en nombre de secondes écoulées depuis minuit)
sous la forme d'une chaine de caractères (au format hh:mm:ss
).
La méthode stringToTime
permet de convertir une chaine de caractères (représentant une heure au format hh:mm:ss
)
en une heure (exprimée en nombre de secondes écoulées depuis minuit).
TimeSlot
représente un intervalle de temps (heure de debut et durée).
Les heures sont représentées en nombre de secondes écoulées depuis minuit.
La méthode overlaps
indique si un intervalle de temps (A
dans la suite) chevauche un autre intervalle de temps (B
dans la suite).
Il y a chevauchement si l'une des 4 conditions suivantes est vraie:
- l'heure de début de
B
est inférieure ou égale à l'heure de début deA
ET l'heure de fin deB
est strictement supérieure à l'heure de début deA
- l'heure de début de
B
est strictement inférieure à l'heure de fin deA
ET l'heure de fin deB
est supérieure ou égale à l'heure de fin deA
- l'heure de début de
B
est supérieure ou égale à l'heure de début deA
ET l'heure de fin deB
est inférieure ou égale à l'heure de fin deA
- l'heure de début de
B
est inférieure ou égale à l'heure de début deA
ET l'heure de fin deB
est supérieure ou égale à l'heure de fin deA
La méthode toString
retourne une description texte de l'intervalle de temps sous la forme "'[' debut ' -> ' fin']'"
,
où debut
et fin
sont les représentations des heures de début et fin au format hh:mm:ss
.
Cette application permet de valider rapidement le fonctionnement de la classe TimeSlot
.
Le scénario de validation est le suivant:
- création du time slot
[08:00:00 -> 11:00:00]
et stockage de sa référence dans une variabletimeSlot1
. - affichage dans la console du message
"Time slot 1: "
. - affichage dans la console de l'heure de début (au format
hh:mm:ss
, voirTimeUtilities
) précédée du message"Start time: "
. - affichage dans la console de l'heure de fin (au format
hh:mm:ss
) précédée du message"End time: "
. - affichage dans la console de la durée précédée du message
"Duration: "
. - affichage dans la console de la représentation texte du time slot.
- affichage dans la console si chevauchement avec
timeSlot1
précédé du message"TimeSlot1 overlaps: "
. - affichage dans la console d'une ligne vide.
- création du time slot
[06:00:00 -> 07:00:00]
et stockage de sa référence dans une variabletimeSlot2
. - affichage dans la console du message
"Time slot 2: "
. - affichage dans la console de l'heure de début (au format
hh:mm:ss
) précédée du message"Start time: "
. - affichage dans la console de l'heure de fin (au format
hh:mm:ss
) précédée du message"End time: "
. - affichage dans la console de la durée précédée du message
"Duration: "
. - affichage dans la console de la représentation texte.
- affichage dans la console si chevauchement avec
timeSlot1
précédé du message"TimeSlot1 overlaps: "
.
La sortie console attendue lors de l'exécution de cette application est :
Time slot 1:
Start time: 08:00:00
End time: 11:00:00
Duration: 10800
[08:00:00 -> 11:00:00]
TimeSlot1 overlaps: true
Time slot 2:
[06:00:00 -> 07:00:00]
TimeSlot1 starts before: false
TimeSlot1 ends after: true
TimeSlot1 overlaps: false
- 📝 Ecrire la classe
TimeSlot
. - 📝 Ecrire l'application
TimeSlotMain
. - ✅ Exécuter l'application et vérifier que la sortie console est conforme à ce qui est attendu (cf. ci-dessus).
- 🏷️ Effectuer un commit des classes
TimeSlot
etTimeSlottMain
, en indiquant1-TimeSlot
comme message. En cas de besoin, détailler le message de commit. - 🚀 Pousser immédiatement le commit sur Gitlab.
- 👀 Vérifier que le commit est bien disponible sur Gitlab.
AppointmentClassDiagram.png
.
Appointment
représente un rendez-vous, défini par un label et un intervalle de temps.
La méthode overlaps
indique si un rendez-vous (A
dans la suite) chevauche un autre rendez-vous (B
dans la suite).
Il y a chevauchement si les intervalles de temps de A
et B
se chevauchent.
La méthode toString
retourne une description texte du rendez-vous sous la forme "intervalle ' ' label"
,
où intervalle
est la représentation texte de l'intervalle de temps.
Cette application permet de valider rapidement le fonctionnement de la classe Appointment
.
Le scénario de validation est le suivant:
- création du time slot
[08:00:00 -> 11:00:00]
et stockage de sa référence dans une variabletimeSlot1
. - création du time slot
[11:00:00 -> 12:00:00]
et stockage de sa référence dans une variabletimeSlot2
. - création du time slot
[09:00:00 -> 10:00:00]
et stockage de sa référence dans une variabletimeSlot3
. - création d'un tableau regroupant les références des objets précédents, dans l'ordre,
et stockage de sa référence dans une variable
timeSlots
. - itération sur les time slots du tableau, et à chaque tour :
- affichage dans la console d'une ligne vide.
- affichage dans la console du numéro du time slot (à partir de
1
), précédé du message"Appointment "
et suivi de":"
. - création d'un rendez-vous avec le time slot courant et pour label
"appointment
suivi du numéro du tour (à partir de1
), et stockage de sa référence dans une variableappointment
. - affichage dans la console de la représentation texte du time slot (obtenu par appel de méthode sur le rendez-vous), précédé du message
"Time slot: "
. - affichage dans la console du label du rendez-vous (obtenu par appel de méthode sur le rendez-vous).
- affichage dans la console de la représentation texte du rendez-vous.
La sortie console attendue lors de l'exécution de cette application est :
Appointment 1:
Time slot: [08:00:00 -> 11:00:00]
appointment1
[08:00:00 -> 11:00:00] appointment1
Appointment 2:
Time slot: [11:00:00 -> 12:00:00]
appointment2
[11:00:00 -> 12:00:00] appointment2
Appointment 3:
Time slot: [09:00:00 -> 10:00:00]
appointment3
[09:00:00 -> 10:00:00] appointment3
- 📝 Ecrire la classe
Appointment
. - 📝 Ecrire l'application
AppointmentMain
. - ✅ Exécuter l'application et vérifier que la sortie console est conforme à ce qui est attendu (cf. ci-dessus).
- 🏷️ Effectuer un commit des classes
Appointment
etAppointmentMain
, en indiquant2-Appointment
comme message. En cas de besoin, détailler le message de commit. - 🚀 Pousser immédiatement le commit sur Gitlab.
- 👀 Vérifier que le commit est bien disponible sur Gitlab.
SessionScheduleClassDiagram.png
.
SessionSchedule
représente une session de rendez-vous, définie par un intervalle de temps et un ensemble de rendez-vous sur cet intervalle.
Le nombre maximal de rendez-vous par session est fixé à 4
.
La méthode addAppointment
permet d'ajouter un rendez-vous et retourne un booléen indiquant si l'ajout a été effectué.
L'ajout d'un rendez-vous échoue si au moins une des conditions suivantes est vraie :
- le nombre maximum de rendez-vous de la session est atteint
- l'heure de début du rendez-vous est strictement inférieure à celle de la session
- l'heure de fin du rendez-vous est strictement supérieure à celle de la session
- la durée du rendez-vous est nulle
- le rendez-vous chevauche un rendez-vous existant
La méthode getSortedAppointments()
retourne une copie du tableau des rendez-vous de la session.
Le tableau résultat :
- a pour taille exacte le nombre de rendez-vous,
- est trié par ordre croissant des heures de début des rendez-vous.
l'algorithme pour le tri à utiliser est celui du tri par sélection, rappelé ci-dessous :
procédure tri_selection(tableau t)
n ← longueur(t)
pour i de 0 à n - 2 inclus
min ← i
pour j de i + 1 à n - 1 inclus
si t[j] < t[min], alors min ← j
fin pour
si min ≠ i, alors échanger t[i] et t[min]
fin pour
fin procédure
La méthode toString
retourne une description texte de la session sous la forme :
[08:00:00 -> 12:00:00]: 2 appointment(s)
- [08:00:00 -> 09:00:00] an appointment
- [10:00:00 -> 11:00:00] another appointment
- la première ligne contient la représentation texte de la session, suivi de
:
et du nombre de rendez-vous. - les lignes suivantes représentent un rendez-vous par ligne précédé de
-
. Les rendez-vous sont triés par heure de début.
Dans le cas particulier où la session est libre, la méthode toString
retourne (free session)
.
Cette application permet de valider rapidement le fonctionnement de la classe SessionSchedule
.
Le scénario de validation est le suivant:
- création du time slot
[08:00:00 -> 12:00:00]
et stockage de sa référence dans une variabletimeSlot
. - création d'une nouvelle session à partir du time slot précédent, et stockage de sa référence dans une variable
session
. - affichage dans la console de la représentation texte de la session.
- création du time slot
[08:00:00 -> 10:00:00]
et stockage de sa référence dans une variabletimeSlot1
. - création du time slot
[07:00:00 -> 08:00:00]
et stockage de sa référence dans une variabletimeSlot2
. - création du time slot
[11:00:00 -> 12:00:00]
et stockage de sa référence dans une variabletimeSlot3
. - création du time slot
[10:00:00 -> 11:00:00]
et stockage de sa référence dans une variabletimeSlot4
. - création d'un tableau regroupant les références des 4 time slots précédents, dans l'ordre,
et stockage de sa référence dans une variable
appointmentTimeSlots
. - itération sur les time slots du tableau, et à chaque tour :
- affichage dans la console d'une ligne vide.
- affichage dans la console du numéro du time slot (à partir de
1
), précédé du message"appointment "
et suivi de":"
- création d'un rendez-vous avec le time slot courant et pour label
"appointment
suivi du numéro du tour (à partir de1
), et stockage de sa référence dans une variableappointment
. - affichage dans la console de la représentation texte du rendez-vous.
- affichage dans la console du résultat de l'ajout du rendez-vous, précédé du message
"added: "
.
- affichage dans la console d'une ligne vide.
- affichage dans la console de la représentation texte de la session.
La sortie console attendue lors de l'exécution de cette application est :
(free session)
appointment 1:
[08:00:00 -> 10:00:00] appointment1
added: true
appointment 2:
[07:00:00 -> 08:00:00] appointment2
added: false
appointment 3:
[11:00:00 -> 12:00:00] appointment3
added: true
appointment 4:
[10:00:00 -> 11:00:00] appointment4
added: true
[08:00:00 -> 12:00:00] : 3 appointment(s)
- [08:00:00 -> 10:00:00] appointment1
- [10:00:00 -> 11:00:00] appointment4
- [11:00:00 -> 12:00:00] appointment3
- 📝 Ecrire la classe
SessionSchedule
. - 📝 Ecrire l'application
SessionScheduleMain
. - ✅ Exécuter l'application et vérifier que la sortie console est conforme à ce qui est attendu (cf. ci-dessus).
- 🏷️ Effectuer un commit des classes
SessionSchedule
etSessionScheduleMain
, en indiquant3-SessionSchedule
comme message. En cas de besoin, détailler le message de commit. - 🚀 Pousser immédiatement le commit sur Gitlab.
- 👀 Vérifier que le commit est bien disponible sur Gitlab.