Épreuve pratique NSI

Sujet n° 15 · Session 2026 · 1 heure

Rappels de vaccination au cabinet vétérinaire

Un vétérinaire veut envoyer des SMS de rappel avant le vaccin annuel des chats. Le candidat nettoie des numéros de téléphone, teste une fonction de validation, écrit une requête SQL à deux jointures, puis corrige une recherche de date la plus récente.

  • Base de données SQLite
  • Requête SQL et jointures
  • Chaînes de caractères
  • Tests
  • Dictionnaires

Mise en situationLa base du cabinet

Le logiciel du cabinet enregistre les animaux, leurs propriétaires et les consultations dans trois tables de la base cabinet.sqlite :

proprietaire (id, nom, prenom, telephone)
animal       (id, espece, nom, date_naissance, id_proprietaire → proprietaire.id)
consultation (id, id_animal → animal.id, date, motif)

Les dates sont des chaînes au format AAAAMMJJ, ce qui permet de les comparer dans l'ordre alphabétique. Les espèces sont chat, chien, lapin et oiseau ; les motifs de consultation sont vaccination, chirurgie, maladie et bilan.

On se connecte avec conn = sqlite3.connect(DB_PATH), puis on exécute une requête avec un curseur : cursor = conn.cursor() et cursor.execute(requete, (parametre,)). Chaque ? de la requête est remplacé, dans l'ordre, par un élément du tuple. Les clauses SQL à utiliser sont SELECT, FROM, JOIN, ON, WHERE et ORDER BY.

La plateforme d'envoi de SMS requiert un numéro au format 06XXXXXXXX ou 07XXXXXXXX : 10 chiffres, sans espace, ni point, ni autre caractère. Or les téléphones ont été enregistrés sans distinguer mobiles et fixes, et dans des styles variés comme (0)6 12 34 56 78 ou 01.23.45.67.89. Rappel : '2'.isdigit() vaut True et 'C'.isdigit() vaut False.

Toutes les cellules de cette page partagent le même Python, comme un notebook : une fonction écrite à une question sert aux suivantes. Maj + Entrée exécute la cellule.

Pour l'examinateur

Repère

Dans le navigateur, la base est chargée en mémoire avec le module sqlite3 : les requêtes s'exécutent comme sur l'ordinateur.

1

Question 1Nettoyer un numéro

Écrire une fonction Python normalisation_tel qui prend un numéro de téléphone tel de type str en argument et qui renvoie le numéro de téléphone nettoyé en ne gardant que les chiffres. Exemples :

normalisation_tel("(0)2 12 99 90 12")  # renvoie "0212999012"
normalisation_tel("0.6.12.99.90.12")   # renvoie "0612999012"
normalisation_tel("0-6-12-9-90-1")     # renvoie "06129901"

Une fonction test_normalisation_tel est fournie.

Appel professeur

À demander au candidat

  1. Que renvoie votre fonction pour la chaîne vide ? Est-ce souhaitable ?
  2. Pourquoi parcourir les caractères avec isdigit plutôt qu'enchaîner des replace ?
Point de vigilance

Avec replace, il faudrait connaître tous les séparateurs possibles ; le test fourni contient même un prénom après le numéro.

2

Question 2Tester la validation

La fonction validation_tel(tel) prend comme argument un numéro de téléphone nettoyé, et renvoie un booléen selon que ce numéro est un numéro de téléphone portable valide ou non. Écrire un jeu de tests permettant de vérifier le bon fonctionnement de la fonction.

Appel professeur

À demander au candidat

  1. Citez deux de vos tests qui passent par des branches différentes de validation_tel. Pourquoi ceux-là ?
  2. Quel est le type de tel[1] != '6' and tel[1] != '7' ? Et celui de la valeur renvoyée par la fonction ?
Point de vigilance

Un bon jeu de tests passe par chaque return : longueur incorrecte, premier chiffre différent de 0, deuxième chiffre ni 6 ni 7, et des numéros valides en 06 et en 07.

3

Question 3Interroger la base

La vaccination se faisant tous les ans, le vétérinaire souhaite envoyer trois rappels aux propriétaires des chats ayant été vaccinés pour la dernière fois il y a entre 10 et 13 mois. On commencera par déterminer quels chats ont été vaccinés il y a moins de 13 mois, à l'aide de la fonction consultation_vaccination_chat(date).

Cette fonction doit récupérer toutes les consultations de motif vaccination des chats (espèce : chat) du cabinet, pour des dates supérieures à une date date, exprimée au format AAAAMMJJ. On souhaite récupérer l'id de l'animal, le nom de l'animal, le téléphone du propriétaire et la date de la consultation, triés par id d'animal puis date de consultation croissants.

En vous inspirant de la fonction proprietaires_animaux_nes_apres(date), écrire la fonction consultation_vaccination_chat(date). Des tests sont fournis dans la fonction test_consultation_vaccination_chat, votre fonction doit les passer.

Appel professeur

À demander au candidat

  1. Expliquez la jointure JOIN animal ON consultation.id_animal = animal.id. Que se passerait-il sans la clause ON ?
  2. Pourquoi un ? plutôt que d'écrire la date directement dans la chaîne SQL ?
  3. Pourquoi faut-il écrire (date,) avec une virgule ?
Point de vigilance

Deux jointures sont nécessaires : consultation → animal, puis animal → propriétaire.

Le tri porte sur l'identifiant de l'animal puis sur la date.

Résultats attendus
Consultations après le 23/09/2024
118
Première ligne
(16, 'Plume', '0.6.36.96.89.83', '20241024')
4

Question 4La dernière vaccination

La fonction derniere_vaccination prend en paramètre une liste de consultations au format précédent et renvoie un dictionnaire associant à l'id de chaque chat les informations de sa dernière (plus récente) consultation. Par exemple, pour Plume, dont les consultations datent du 20241024 et du 20251125, la valeur associée à la clé 16 doit être (16, 'Plume', '0.6.36.96.89.83', '20251125').

Cependant, la fonction ne produit pas les résultats attendus : les tests fournis dans la fonction test_derniere_vaccination échouent. Expliquer le problème rencontré, puis comment corriger cette fonction pour qu'elle passe les tests avec succès.

Appel professeur

À demander au candidat

  1. À quoi sert le dictionnaire derniere ? Quelle est la clé, quelle est la valeur ? Pourquoi l'id plutôt que le nom ?
  2. Quelle ligne est fautive, et quelle erreur de logique contient-elle ?
  3. Les consultations arrivent triées par animal puis par date. Comment ce tri permettrait-il de simplifier la fonction ?
Point de vigilance

Un seul opérateur à changer : < garde la plus ancienne consultation, il faut > pour la plus récente.

Résultats attendus
Chats vaccinés après le 23/09/2024
96

Le fichier du candidat

Le jour de l'épreuve, le candidat travaille dans un seul fichier. Ce bouton rassemble vos cellules dans l'ordre, telles qu'elles sont à l'écran, en un veto.py à ouvrir dans votre éditeur habituel.

Chargement de Python…