Tous les sujets du Bac 2024 · Toutes les annales du Bac de Numérique et Sciences Informatiques
Sujet du Bac Numérique et Sciences Informatiques 2024 · Centres étrangers (Afrique) Jour 1
Sujet du Bac de Numérique et Sciences Informatiques 2024, Centres étrangers (Afrique) Jour 1 : 6 exercices corrigés. Thèmes : Programmation orientée objet.
Thèmes du sujet : Programmation orientée objet : classes, attributs, méthodes · Graphes : modélisation, implémentations et parcours · Bases de données relationnelles, SGBD et langage SQL · Réseaux : adressage IP et sous-réseaux · Protocoles de routage : RIP et OSPF · Mise au point des programmes : bugs, assertions et tests
Exercice 1 · Graphes : modélisation, implémentations et parcours
EXERCICE 1 (6 points)
Cet exercice porte sur la programmation Python, la programmation dynamique, les graphes et les réseaux.
On cherche à lutter contre un virus informatique qui essaie de contourner les protocoles de sécurité en migrant régulièrement vers un autre ordinateur, en choisissant à chaque fois au hasard sa nouvelle cible parmi les ordinateurs accessibles. On cherche à savoir quels ordinateurs protéger afin de lutter de manière la plus efficace possible avec des ressources limitées.
On considère le réseau informatique suivant, composé de 5 ordinateurs numérotés: 0, 1, 2, 3 et 4.
1.
On représente ce réseau informatique par un graphe que l'on stocke sous forme de listes de voisins. Compléter la définition de la variable voisins.
voisins = [[1, 2, 3, 4],
[0, 2, 3],
[0, 1],
[...],
[...]]
On ajoute au réseau actuel un sixième ordinateur, numéroté 5. Cet ordinateur n'est accessible que des ordinateurs numérotés 0 et 2.
2.
Dessiner le nouveau graphe.
3.
Donner la nouvelle définition de la variable voisins.
4.
Compléter la fonction voisin_alea qui prend en paramètre un graphe voisins sous forme de listes de voisins et un entier s représentant un sommet et qui renvoie un entier représentant un voisin de s choisi aléatoirement. On pourra utiliser la fonction random.randrange(n) qui renvoie un nombre aléatoire entre 0 inclus et n exclus.
def voisin_alea(voisins, s):
On donne la fonction marche_alea suivante:
def marche_alea(voisins, i, n):
if n == 0:
return i
return marche_alea(voisins, voisin_alea(voisins, i), n-1) 5.
Justifier que la fonction marche_alea est une fonction récursive.
6.
Décrire ce que modélise cette fonction, en rapport avec le contexte de l'exercice.
7.
Compléter la fonction simule qui simule n_tests fois le déplacement d'un virus pendant n_pas étapes, démarrant au sommet i, et qui renvoie une liste contenant en position j le nombre de fois que le virus a terminé son parcours au sommet j, divisé par n_tests.
def simule(voisins, i, n_tests, n_pas):
results = [0] * len(voisins)
8.
L'appel simule(voisins, 4, 1000, 1000) renvoie la valeur suivante:
[0.328, 0.195, 0.18, 0.12, 0.059, 0.118].
Déduire de ce résultat l'ordinateur du réseau qu'il est le plus rentable de protéger.
Au début, on suppose que le virus n'est présent que sur un ordinateur. À chaque étape, il contamine tous ses voisins non déjà contaminés. On cherche à savoir combien de temps prend ce virus pour se propager à tout le réseau.
9.
Un graphe voisins représente un réseau, et s représente un sommet de départ. Proposer un algorithme pour déterminer le temps, en étape, que met un virus à se propager dans l'intégralité d'un réseau.
Exercice 2 - Partie A · Réseaux : adressage IP et sous-réseaux
EXERCICE 2 (6 points)
Cet exercice porte sur les réseaux et les protocoles de routage.
Rappels:
Une adresse IPv4 est composée de 4 octets, soit 32 bits. Elle est notée a.b.c.d, où a, b, c et d sont les valeurs décimales des 4 octets et nommée « notation décimale pointée ».
La notation a.b.c.d/n, appelée notation CIDR (Classless Inter Domain Routing), signifie que les n premiers bits à gauche de l’adresse IP représentent la partie « réseau », les bits à droite qui suivent représentent la partie « machine ».
L’adresse IPv4 dont tous les bits de la partie « machine » sont à 0 est appelée « adresse du réseau ».
L’adresse IPv4 dont tous les bits de la partie « machine » sont à 1 est appelée « adresse de diffusion ».
On considère le réseau représenté ci-dessous:
Partie A: Adresses IP
1.
Les machines du réseau local L1 indiquent un masque de sous réseau sur 24 bits en notation CIDR, soit 255.255.255.0 en notation décimale pointée.
Donner le masque de sous réseau en notation décimale pointée des machines du réseau L2 (masque de sous réseau de 16 bits).
Concernant le réseau local L2:
2.
Donner l'adresse du réseau.
3.
Donner l'adresse de diffusion.
4.
Donner le nombre maximum de machines pouvant être connectées à ce réseau.
Exercice 2 - Partie B · Protocoles de routage : RIP et OSPF
EXERCICE 2 (6 points)
Cet exercice porte sur les réseaux et les protocoles de routage.
Rappels:
Une adresse IPv4 est composée de 4 octets, soit 32 bits. Elle est notée a.b.c.d, où a, b, c et d sont les valeurs décimales des 4 octets et nommée « notation décimale pointée ».
La notation a.b.c.d/n, appelée notation CIDR (Classless Inter Domain Routing), signifie que les n premiers bits à gauche de l’adresse IP représentent la partie « réseau », les bits à droite qui suivent représentent la partie « machine ».
L’adresse IPv4 dont tous les bits de la partie « machine » sont à 0 est appelée « adresse du réseau ».
L’adresse IPv4 dont tous les bits de la partie « machine » sont à 1 est appelée « adresse de diffusion ».
On considère le réseau représenté ci-dessous:
Partie B: Protocoles de routage
On donne ci-dessous des extraits des tables de routage des routeurs:
Routeur
Réseau destinataire
Passerelle
Interface
A · L2 · 53.10.10.2 · 53.10.10.1
B · L2 · 193.55.24.6 · 193.55.24.5
C · L2 · 193.55.24.10 · 193.55.24.9
D · L2 · Connecté · 172.16.255.254
E · L2 · 42.4.10.14 · 42.4.10.13
F · L2 · 42.4.10.10 · 42.4.10.9
G · L2 · 53.10.10.13 · 53.10.10.14
H · L2 · 53.10.10.6 · 53.10.5
5.
À l'aide des extraits des tables de routage ci-dessus, donner un chemin (c'est-à-dire nommer les routeurs traversés) suivi par un message envoyé du réseau L1 vers le réseau L2.
La liaison entre les routeurs H et D est rompue:
6.
Sachant que le protocole de routage RIP est utilisé (distance en nombre de sauts), donner les nouveaux chemins que pourra suivre un message allant de L1 vers L2.
7.
Choisir un des chemins de la question précédente. Donner les routeurs dont la règle de routage à destination de L2 est obligatoirement modifiée. Après avoir examiné tous les routeurs, écrire sur votre copie les règles de routage modifiées en conséquence.
La liaison entre les routeurs H et D est rétablie.
Pour tenir compte du débit des liaisons, on décide d'utiliser le protocole OSPF (distance liée au coût des liaisons) pour effectuer le routage.
Le coût d'une liaison est donné ici par la formule:
où est la bande passante de la connexion en bit par seconde.
Les valeurs des bandes passantes de chaque liaison entre les routeurs sont données ci-dessous:
Liaison
Bande passante
Liaison
Bande passante
A-B · 1 Gbit/s · D-H · 100 Mbit/s
A-H · 1 Gbit/s · D-E · 10 Gbit/s
A-G · 1 Gbit/s · E-F · 10 Gbit/s
B-C · 1 Gbit/s · F-H · 1 Gbit/s
C-H · 100 Mbit/s · F-G · 10 Gbit/s
C-D · 1 Gbit/s · G-H · 1 Gbit/s
8.
Calculer le coût des liaisons pour les 3 valeurs de bande passante qui apparaissent dans le tableau ci-dessus.
9.
Déterminer alors le chemin que suivra un message allant de L1 vers L2 et donner son coût.
10.
La liaison entre les routeurs G et F est rompue. Déterminer le nouveau chemin suivi par un message allant de L1 vers L2 et donner son coût.
Exercice 3 - Partie A · Bases de données relationnelles, SGBD et langage SQL
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.
Partie A
1.
Citer deux avantages à utiliser une base de données relationnelle plutôt qu'un fichier texte ou un fichier tableur.
2.
Quelle doit être la caractéristique d'un attribut pour pouvoir être utilisé en tant que clé primaire ?
3.
Dans la relation Reservation, quel est le rôle des clés étrangères id_client et id_emplacement ?
4.
Donner le schéma relationnel de la relation Emplacement en précisant la clé primaire et le type de chacun des attributs.
5.
À partir de l'extrait du contenu de la relation Emplacement donner le résultat de la requête ci-dessous:
SELECT id_emplacement, nom, localisation
FROM Emplacement
WHERE tarif_journalier = 25;
6.
Écrire une requête permettant de donner le nom et le prenom de tous les clients habitant à 'Strasbourg'.
7.
Écrire une requête permettant d'ajouter un nouveau client:
id_client 42;
nom 'CODD';
prénom 'Edgar';
adresse '28 rue des Capucines';
ville 'Lyon';
pays 'France';
numéro de téléphone '0555555555'.
8.
Écrire une requête SQL permettant de récupérer les informations ci-dessous concernant la réservation dont l'identifiant id_reservation est 18:
Client.nom
Client.prenom
Reservation.nombre_personne
Reservation.date_arrivee
Reservation.date_depart
Emplacement.tarif_journalier
Exercice 3 - Partie B (Questions 9 à 11) · Programmation orientée objet : classes, attributs, méthodes
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.
Partie B
Dans cette partie, on souhaite éditer une facture correspondant au séjour d'un client. Pour cela, on dispose d'une fonction Python qui récupère auprès de la base de données, à la manière de la question 8, les informations concernant la réservation voulue et renvoie le résultat sous forme d'un tuple contenant trois objets respectivement des classes Client, Reservation et Emplacement.
from datetime import datetime
class Client:
def __init__(self, nom, prenom, adresse, ville, pays,
telephone):
self.nom = nom
self.prenom = prenom
self.adresse = adresse
self.ville = ville
self.pays = pays
self.telephone = telephone
class Reservation:
def __init__(self, id_reservation, nombre_personne,
date_arrivee, date_depart):
self.id_reservation = id_reservation
self.nombre_personne = nombre_personne
self.date_arrivee = date_arrivee
self.date_depart = date_depart
def nb_jours(self):
""" renvoie, à l'aide de l'attribut days de la classe
timedelta, un entier correspondant
au nombre de jours passés au camping."""
return (self.date_depart - self.date_arrivee).days
class Emplacement:
def __init__(self, nom, tarif_journalier):
self.nom = nom
self.tarif_journalier = tarif_journalier
9.
Expliquer pourquoi le terme self est utilisé comme paramètre pour les méthodes des classes Client, Reservation et Emplacement.
10.
Instancier une variable client01 de la classe Client représentant un client se nommant CODD Edgar habitant au 28 rue des Capucines à Lyon, France, ayant pour numéro de téléphone le 0555555555.
On considère un tuple constitué de trois objets, respectivement dans cet ordre, des classes Client, Reservation et Emplacement. 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.
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 * 12
465.6
11.
Compléter la ligne 5 de la fonction montant_a_regler.
def montant_a_regler(triplet):
""" renvoie le montant en euros
à régler pour cette réservation """
client, reservation, emplacement = triplet
return...
return
Exercice 3 - Partie B (Questions 12 à 14) · Mise au point des programmes : bugs, assertions et tests
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.
Tu peux aussi réviser par thème
Entraîne-toi sur un thème avec les exercices des sujets de toutes les années.
- Bases de données relationnelles, SGBD et langage SQL · 11 exercices · 70 % de chances de tomber
- Programmation orientée objet : classes, attributs, méthodes · 8 exercices · 50 % de chances de tomber
- Arbres : vocabulaire, mesures et algorithmique · 6 exercices · 45 % de chances de tomber
- Réseaux : adressage IP et sous-réseaux · 7 exercices · 40 % de chances de tomber
- Protocoles de routage : RIP et OSPF · 6 exercices · 40 % de chances de tomber
- Graphes : modélisation, implémentations et parcours · 4 exercices · 35 % de chances de tomber