Ce sujet propose de concevoir une application permettant de faciliter la gestion du système d’information d’un camping municipal.
Les informations nécessaires sont stockées dans une base de données relationnelle
composée de trois relations :
Dans une représentation textuelle d'une base de données relationnelle, les clés primaires sont soulignées et les clés étrangères sont précédés du caractère "#".
La première fonctionnalité sera de récupérer les informations nécessaires au calcul du montant à régler.
Question 1
Dans cette question, on se limitera au cas particulier du client dont l'identifiant est \(1\).
Réaliser les requêtes SQL suivantes :
Obtenir le nom, le prénom et la ville du client dont l'identifiant est \(1\) :
Obtenir l'emplacement, le nombre de personnes et les dates de départ et d'arrivée de chaque réservation associée au client dont l'identifiant est \(1\), classées de la plus récente à la plus ancienne :
Question 2
Dans cette question, on généralise les requêtes de la question précédente pour n'importe quel client. Les variables requete_1 et requete_2 correspondent aux requêtes SQL définies en question 1 mais elles doivent s'adapter à l'identifiant passé en paramètre de la méthode __init__.
Le module sql_camping permet d'exécuter en python des requêtes sur la base de données qui gère le camping.
Une fois importée, la fonction help donne les indications pour utiliser ce module.
Compléter les méthodes suivantes qui permettent l'instanciation de la classe Client.
classe Reservation
On donne la description suivante de la classe Reservation :
On souhaite écrire une fonction qui renvoie le montant dû par ce client pour cet emplacement et pour cette durée de séjour.
Sachant qu’au tarif journalier de location de l’emplacement il faut ajouter une taxe de séjour de \(2,20\) € par jour et par personne.
On donnera le résultat arrondi au centime près.
round ?
La fonction intégrée round permet d'arrondir un nombre donné.
La fonction prend en paramètres un nombre à virgule ainsi qu'un nombre de décimales et renvoie la valeur arrondie à ce nombre de décimales près.
🐍 Console Python
>>> round(65.1745,2)65.17>>> round(65.1795,1)65.2
Exemple de calcul du montant à régler pour un client ayant réservé pour \(4\) personnes pendant \(12\) jours un emplacement à \(30\) € la journée :
>>> 30*12+4*2.20*12465.6
classe Emplacement
On donne la description suivante de la classe Emplacement :
classDiagram
class Emplacement {
+str nom
+float tarif_journalier
}
Le code de cette classe est déjà chargée en mémoire.
Comparaison de nombres flottants
Lorsqu'on écrit a = x ou x est un nombre réel, la valeur de a enregistrée en machine est une valeur approchée de x (quelques fois la valeur exacte).
Cette valeur approchée a la forme d'un nombre flottant (le type float en Python). En conséquence, alors que des calculs et des comparaisons peuvent être effectués de manière exacte sur des réels, ils ne le sont que de manière approchée sur leur représentation en machine.
On peut donc obtenir par exemple, avec a = x et b = y, l'expression a == b évaluée à True alors que x et y sont différents.
C'est pourquoi les tests ne vérifient pas l'égalité des résultats et des valeurs attendues mais leur proximité.
Ainsi, on peut vérifier que \(\sqrt{2} \approx 1,414214\) en faisantassertabs(1.414214-sqrt(2))<1e-6. Ce test vérifie que les deux valeurs sont proches à \(10^{-6}\) près.
###(Dés-)Active le code après la ligne # Tests (insensible à la casse) (Ctrl+I)
Entrer ou sortir du mode "deux colonnes" (Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran" (Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
La deuxième fonctionnalité sera de déterminer le taux d'occupation sur une année de chaque emplacement.
Question 4
Compléter la requête qui permet de récupérer les noms d'emplacement ainsi que les dates d'arrivée et de départ pour toutes les réservations qui se sont finis en 2025.
Prédicat BETWEEN
Le prédicat BETWEEN permet de comparer la valeur d'un champ par rapport à une borne inférieure et une borne supérieure (bornes incluses).
Exemple
CoeffBETWEEN1AND2
Format de date
Les dates sont au format AAAA-MM-JJ.
Une fonction taux_occupation a été écrite, qui prend en paramètre une année et qui renvoie un dictionnaire qui associe chaque nom d'emplacement avec son taux d'occupation, exprimé en pourcentage.
Cependant des erreurs ont été commises.
Corriger les erreurs de la fonction.
fonction occupations
La fonction occupations prend en paramètre une chaîne de caractères représentant l'année et renvoie la liste des occupations, chaque occupation étant un tuple contenant le nom de l'emplacement, la date d'arrivée et la date de départ.
Cette fonction est déjà chargée en mémoire.
###(Dés-)Active le code après la ligne # Tests (insensible à la casse) (Ctrl+I)
Entrer ou sortir du mode "deux colonnes" (Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran" (Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
# Tests(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)