Exercice 3 - Partie B (Questions 12 à 14) · Bac Numérique et Sciences Informatiques Centres étrangers (Afrique) 2024 (jour 1)
Thème : Mise au point des programmes : bugs, assertions et tests · Tiré du sujet Jour 1 (2024)
Énoncé
EXERCICE 3 (8 points)
Cet exercice porte sur la programmation Python, la programmation orientée objet, les bases de données relationnelles et les requêtes SQL.
L'objectif est 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. On pourra utiliser les mots-clés SQL suivants: AND, FROM, INSERT, INTO, JOIN, ON, SELECT, SET, UPDATE, VALUES, WHERE.
Voici le schéma des deux premières relations:
Client ( id_client, nom, prenom, adresse, ville, pays, telephone)
Reservation ( id_reservation, #id_client, #id_emplacement, nombre_personne, date_arrivee, date_depart)
Dans ce schéma:
la clé primaire de chaque relation est définie par son attribut souligné;
les attributs précédés de # sont les clés étrangères.
La troisième relation est appelée Emplacement et elle contient tous les emplacements du camping. Le tableau ci-dessous en donne un extrait.
Le camping a adopté le format 'AAAA-MMM-xxx' composé des trois chaînes de caractères ci-dessous:
'AAAA' une année comprise entre 2018 et 2024;
'MMM' les trois premières lettres du mois en anglais;
'xxx' désigne trois chiffres.
On décide d'écrire une fonction facture_est_valide pour tester si une chaîne de caractères représente un numéro de facture valide ou non. Voici quelques exemples du comportement attendu de la fonction facture_est_valide.
>>> facture_est_valide('2024-MAY-230')
True
>>> facture_est_valide('2012-MAY-230')
False
>>> facture_est_valide('2024-MAI-230')
False
>>> facture_est_valide('2024-JUN-23')
False
On considère le programme suivant:
calendrier = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN',
'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC']
def separe(chaine):
"""renvoie une liste constituée de chaînes qui étaient
séparées par le caractère - """
return chaine.split('-')
def que_des_chiffres(chaine):
"""renvoie vrai si chaine n'est constituée que
des caractères de 0 à 9 faux sinon"""
for car in chaine:
if not(car in "012345789"):
return False
return True
def facture_est_valide(chaine):
"""renvoie vrai si chaine est une chaîne de
caractères conforme au modèle de facture"""
partie = separe(chaine)
if not(len(partie) == 3):
return False
annee, mois, numero = partie[0], partie[1], partie[2]
if not(que_des_chiffres(annee)):
return False
if not(len(annee) == 4) or not(2018 <= annee <= 2024):
return False
# Reste à faire vérifier les mois MMM
...
# Reste à faire vérifier le numéro xxx
...
return True
On rappelle que la fonction split en Python divise une chaîne de caractères en une liste de sous-chaînes en fonction d'un séparateur spécifié.
Par exemple, 'Bonjour-le-monde'.split('-') donne comme résultat ['Bonjour', 'le', 'monde'].
12.
Expliquer pourquoi une erreur se produit à l'exécution de la fonction facture_est_valide donnée ci-dessus.
13.
Proposer une correction du code pour que cette erreur ne se produise plus.
14.
Compléter le code afin de vérifier les mois (ligne 28) et le numéro (ligne 30) dans la fonction facture_est_valide. Pour chaque vérification, il est possible d'insérer une ou plusieurs lignes.

Corrigé
Corrigé proposé par AprenAI (non officiel)
12. Expliquer pourquoi une erreur se produit à l'exécution de la fonction facture_est_valide donnée ci-dessus.
Réponse : La variable annee est de type str (chaîne de caractères). À la ligne 25, l'expression `2018 <= annee <= 2024` tente de comparer des entiers avec une chaîne de caractères, ce qui déclenche une erreur de type (TypeError en Python 3).
13. Proposer une correction du code pour que cette erreur ne se produise plus.
Réponse : ```python if not(len(annee) == 4) or not(2018 <= int(annee) <= 2024): return False ``` ```python annee = int(annee) ```
Les réponses des 2 questions restantes et l’explication pas à pas sont réservées aux membres Premium. Premium
Résous-le ici : correction automatique, indices et corrigé détaillé.