Corrigé Bac
Sujet 2024 - Jour 1 - centres étrangers groupe 1 - Spécialité NSI - Corrigé

Sujet bac : annale 2024 – centres étrangers groupe 1 – jour 1

EXERCICE 1 (6 points)

$\bold{1}$

bannière astuce

Astuce

« Voisins » est une liste de listes. La première liste, d’index « 0 », correspond à la liste des voisins directs du nœud « 0 ». De la même manière, le seconde liste, d’index « 1 », correspond à la liste des voisins direct du nœud « 1 ». Et ainsi de suite.

$$\begin{aligned} &\text{Voisins}= [ [1,2,3,4],\\ &\quad\qquad\qquad[0,2,3],\\ &\quad\qquad\qquad[0,1],\\ &\quad\qquad\qquad[0,1],\\ &\quad\qquad\qquad[0] ] \end{aligned}$$

$\bold{2}$

Alt texte

$\bold{3}$

$$\begin{aligned} &\text{Voisins}= [ [1,2,3,4,5],\\ &\quad\qquad\qquad[0,2,3],\\ &\quad\qquad\qquad[0,1,5],\\ &\quad\qquad\qquad[0,1],\\ &\quad\qquad\qquad[0 ],\\ &\quad\qquad\qquad[0,2] ] \end{aligned}$$

$\bold{4}$

$\text{def voisin\textunderscore alea(voisins, s):}$

$\text{return voisins[s][random.randrange(len(voisins[s]))]}$

bannière astuce

Astuce

Remarque : si l’on considère que les graphes concernés par la fonction $\text{voisin\textunderscore alea}$ peuvent présenter un nœud isolé, c’est-à-dire sans voisin, un test sur la longueur de « voisins[s] » est nécessaire afin de traiter le cas d’un nœud isolé. Sinon, le cas d’un nœud isolé provoquerait une erreur.

$\bold{5}$

La définition de la fonction $\text{marche\textunderscore alea}$ fait appel à elle-même (en ligne 4).
C’est la caractéristique d’une fonction récursive.

$\bold{6}$

Cette fonction génère un trajet aléatoire, dans le graphe « voisins », à partir du nœud n° « i » et constitué de « $n$ » étapes. Elle renvoie le numéro du dernier nœud de ce trajet.
En rapportant cette fonction au contexte de l’exercice, celle-ci modélise le trajet aléatoire du virus qui gagne « $n$ » ordinateurs en partant de l’ordinateur « i » et affiche l’identité du $n$ième ordinateur visité.

$\bold{7}$

$\text{def simule(voisins, i, n\textunderscore pas):}$

$\text{result=[0] * lens(voisins)}$

$\text{for test in range n\textunderscore tests:}$

$\text{results[marche\textunderscore alea(voisins, I, n\textunderscore pas)]+=}1$

$\text{for noeud in range lens(voisins):}$

$\text{results[noeud] /= n\textunderscore tests}$

$\text{return results}$

bannière astuce

Astuce

On pourrait optimiser le code en remplaçant les 3 dernières lignes par :

$\text{return [noeud/n\textunderscore tests for noeud in results]}$

$\bold{8}$

On constate que près d’un tiers des 1 000 parcours aléatoires de 1 000 pas effectués par le virus à partir du nœud « 4 » se terminent au nœud « 0 », tous les autres nœuds n’atteignant pas ce score. Il semble donc prioritaire de protéger le nœud « 0 ».

$\bold{9}$

Proposition du code Python implémentant l’algorithme demandé :

$\char"0023\text{importation importation de la bibliothèque random}$
$\text{import random}$

$\char"0023\text{initialisation des données avec celles de l’énoncé}$
$$\begin{aligned} &\text{Voisins}= [ [1,2,3,4],\\ &\quad\qquad\qquad[0,2,3],\\ &\quad\qquad\qquad[0,1],\\ &\quad\qquad\qquad[0,1],\\ &\quad\qquad\qquad[0] ] \\ \end{aligned}$$
$\text{s =}1$

$\char"0023\text{définition de la fonction marche\textunderscore alea donnée en 4) de l’exercice}$
$\text{def marche\textunderscore alea(voisins, i, n):}$

$\text{if n ==}0$

$\text{return i}$

$\text{return marche\textunderscore alea(voisins, voisins[i][random.randrange(len(voisins[i]))], n-1)}$

$\char"0023\text{définition de la fonction demandée nommée temps\textunderscore contamination}$
$\text{def temps\textunderscore contamination(voisins, s) :}$

$\text{sommet = s}$

$\qquad\char"0023\text{initialisation du compteur de pas}$

$\text{pas =}0$

$\qquad\char"0023\text{initialisation de la liste des sommets contamines avec le premier sommet}$ $\qquad\text{passé en second argument de la fonction}$

$\text{contamines = [sommet]}$

$\qquad\char"0023\text{condition d'arrêt de la fonction : lorsque le nombre de sommets visités}$ $\qquad\text{est égal au nombre de sommets du graphe "voisins »}$

$\text{while len(contamines) != len(voisins) :}$

$\text{sommet = marche\textunderscore alea(voisins, sommet, 1)}$

$\text{if sommet not in contamines :}$

$\text{contamines += [sommet]}$

$\text{pas +=}1$

$\text{return pas}$

$\qquad\char"0023\text{appel de la fonction avec les données fournies par l'énoncé}$
$\text{print (temps\textunderscore contamination(voisins, s))}$

EXERCICE 2 (6 points)

PARTIE A

$\bold{1}$

Les 16 bits positionnés à 1 correspondent à 255.255 pour la partie gauche de la notation décimale pointée.
La partie machine, qui se situe à droite de la notation décimale pointée, doit être à zéro.
Le masque de sous-réseau en notation décimale pointé est donc : 255.255.0.0.

$\bold{2}$

L’adresse du réseau local L2 se déduit du masque de sous-réseau appliqué aux adresses des machines de ce sous-réseau.
On trouve ainsi : 172.16.0.0/16.

$\bold{3}$

L’adresse de diffusion du réseau local L2 correspond à la partie gauche représentant l’adresse de ce sous-réseau, donc 172.16, et la partie droite dont tous les bits sont positionnés à 1 soit 255.255.
L’adresse de diffusion du réseau local L2 est donc : 172.16.255.255/16.

$\bold{4}$

Le nombre maximum de machines pouvant être connectées au réseau local L2 correspond au nombre maximum d’adresses que l’on peut affecter entre 0.1 et 255.255 (partie droite de l’adresse réseau dont il faut exclure la valeur 0.0 réservée à l’adresse réseau et la valeur 255.255 réservée à l’adresse de diffusion).
Cela fait donc en tout 256 * 256 – 2 = 65634.

Partie B

$\bold{5}$

L1 $\to$ Routeur A $\to$ Interface 53.10.10.1 $\to$ Interface 53.10.2 $\to$ Routeur H $\to$ Interface 53.10.10.5 $\to$ Interface 53.10.10.6 $\to$ Routeur D $\to$ Interface 172.16.255.254 $\to$ L2

$\bold{6}$

Deux chemins possibles :

  • L1 $\to$ Routeur A $\to$ Routeur B $\to$ Routeur C $\to$ Routeur D $\to$ L2 (4 sauts)
  • L1 $\to$ Routeur A $\to$ Routeur H $\to$ Routeur C $\to$ Routeur D $\to$L2 (4 sauts)

Les autres, tels que par exemple L1 $\to$ Routeur A $\to$ Routeur H $\to$ Routeur F $\to$Routeur E $\to$ Routeur D $\to$ L2 présentent plus de sauts.
Le protocole RIP reposant sur le nombre de sauts, celui-ci suivra l’un des deux seuls chemins ne présentant que 4 sauts.

$\bold{7}$

Prenons le chemin L1 $\to$ Routeur A $\to$ Routeur B $\to$ Routeur C $\to$ Routeur D $\to$ L2.
Le seul routeur dans ce chemin dont les tables de routage sont impactées par la rupture de la liaison entre le routeur « H » et le routeur « D » est le routeur « A », dont la règle de routage pour joindre L2 doit être modifiée comme suit :

Routeur Réseau destinataire Passerelle Interface
A L2 193.55.24.2 193.55.24.1

$\bold{8}$

Bande passante Coût de la liaison
10 Gbits/s $(10^9)/(10^{10}) =0,1$
1 Gbits/s $(10^9)/(10^9) =1$
100 Mbits/s $(10^9)/(10^8) =10$

$\bold{9}$

En privilégiant les liaisons à plus faible coût, on détermine assez rapidement que le chemin déterminé par le protocole OSPF entre L1 et L2 est le suivant :

Alt texte

Le coût total de ce chemin est donc de $1 0,1+0,1+0,1$ soit $1,3$.

$\bold{10}$

On continue à privilégier les liaisons à plus faible coût.
On détermine alors le nouveau chemin suivant :

Alt texte

Le coût total de ce chemin est donc de $1 0,1+0,1+0,1$ soit $1,3$.

$\bold{10}$

On continue à privilégier les liaisons à plus faible coût.
On détermine alors le nouveau chemin suivant :

IMAGE 03

Le coût total de ce chemin alors de $1+1+0,1+0,1$ soit $2,2$.

EXERCICE 3 (8 points)

PARTIE A

$\bold{1}$

L’usage d’une base de données relationnelle présente de nombreux avantages, dont les suivants :

  • cela évite la saisie d’informations redondantes et, par la même occasion, les risques d’incohérence ;
  • cela permet d’effectuer des recherches complexes de façon rapide et fiable.

$\bold{2}$

Pour qu’un attribut soit utilisé en tant que clé primaire d’une relation, les occurrences de cet attribut ne doivent prendre que des valeurs uniques dans cette relation.

$\bold{3}$

Les clés étrangères « $\char"0023\text{id\textunderscore client}$ » et « $\char"0023\text{id\textunderscore emplacement}$ » dans la relation « $\text{Reservation}$ » permettent de rattacher un client et un emplacement à une réservation donnée.
Ainsi, la clé étrangère « $\char"0023\text{id\textunderscore client}$ » fait référence à la clé primaire « $\text{id\textunderscore client}$ » de la relation « $\text{Client}$ ». La table « $\text{Client}$ » est ainsi mise en relation avec la table « $\text{Reservation}$ ».
De la même manière, la clé étrangère « $\char"0023\text{id\textunderscore emplacement}$ » fait référence à la clé primaire « $\text{id\textunderscore emplacement}$ » de la relation « $\text{Emplacement}$ ». La table « $\text{Emplacement}$ » est ainsi mise en relation avec la table « $\text{Reservation}$ ».

$\bold{4}$

Schéma relationnel de la relation « $\text{Emplacement}$ » :

$\text{Emplacement (id\textunderscore emplacement : INT , nom : CHAR, localisation : CHAR, tarif\textunderscore journalier: FLOAT)}$

$\bold{5}$

Cette requête recherche dans la table « $\text{Emplacement}$ » ($\text{FROM Emplacement}$), les enregistrements dont le champ « $\text{tarif\textunderscore journalier}$ » a une valeur de 25 ($\text{WHERE tarif\textunderscore journalier =}25$) et affiche les champs « $\text{id\textunderscore emplacement}$ », « $\text{nom}$ » et « $\text{localisation}$ » de ces enregistrements ($\text{SELECT id\textunderscore emplacement, nom, localisation}$).
Le résultat qu’affiche cette requête est par conséquent :

Id_emplacement nom localisation
1 myrtille A4
4 mandarine B1
6 melon A2

$\bold{6}$

$\text{SELECT nom, prenom}$
$\text{FROM Client}$
$\text{WHERE ville =′Strasbourg′}$

$\bold{7}$

$\text{INSERT INTO Client}$
$\text{VALUES (42, ′CODD′, ′Edgar′, ′28 rue des Capucines′, ′Lyon′, ′France′, ′0555555555′) ;}$

$\bold{8}$

$$\begin{aligned} &\text{SELECT Client.nom, Client.prenom, Reservation.nombre\textunderscore personne, Reservation.date\textunderscore arrivee,} \\ &\text{Reservation.date\textunderscore depart, Emplacement.tarif\textunderscore journalier} \end{aligned}$$ $\text{FROM Reservation}$
$\text{JOIN Client ON Client.id\textunderscore client = Reservation.id\textunderscore client}$
$\text{JOIN Emplacement ON Emplacement.id\textunderscore emplacement = Reservation.id\textunderscore emplacement}$
$\text{AND Reservation.reservation÷textunderscore id = 18 ;}$

PARTIE B

$\bold{9}$

Le terme « $\text{self}$ » fait référence à l’instance courante. Celle-ci est passée en paramètre à des méthodes de la classe dont elle est issue.

$\bold{10}$

$\text{client01 = Client(′CODD′, ′Edgar′, ′28 rue des Capucines′, ′Lyon′, ′France′, ′0555555555′}$

$\bold{11}$

$\text{def montant\textunderscore a\textunderscore regler(triplet):}$

$\text{""" renvoie le montant en euros}$

$\text{à régler pour cette réservation """}$

$\text{client, reservation, emplacement = triplet}$

$\text{return reservation.nb\textunderscore jours() *(2.20 * reservation.nombre\textunderscore personne + emplacement.tarif\textunderscore journalier)}$

bannière astuce

Astuce

Remarque : le nombre de jours de réservation dans le calcul dont le résultat est retourné a été mis en facteur.

$\bold{12}$

L’erreur se produit au niveau de la ligne de code 25 dans laquelle la variable « année » fait l’objet d’une comparaison avec les entiers 2018 et 2024. En effet, cette comparaison échoue car le type de la variable « année » est une chaîne de caractère. La comparaison d’une chaîne de caractères à un entier provoque donc une erreur.

$\bold{13}$

Proposition de correction :

$\text{if not(len(annee) == 4) or not(2018 <= int(année) <= 2024):}$

bannière astuce

Astuce

Remarque : le fait que dans les deux lignes de code précédentes (23 et 24) on ait vérifié que la chaîne « année » ne soit constituée que de chiffres nous garantit que l’instruction $\text{int(année)}$ proposée en correction ne provoquera jamais d’erreur.

$\bold{14}$

  • Vérification du mois :

$\text{if not (mois in calendrier):}$

$\text{return false}$

  • Vérification du numéro :

$\text{if not(len(numero) == 3) or not(que\textunderscore des\textunderscore chiffres(numero)):}$

$\text{return false}$