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)

1\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.

Voisins=[[1,2,3,4],[0,2,3],[0,1],[0,1],[0]]\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}

2\bold{2}

Alt texte

3\bold{3}

Voisins=[[1,2,3,4,5],[0,2,3],[0,1,5],[0,1],[0],[0,2]]\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}

4\bold{4}

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

return voisins[s][random.randrange(len(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 voisin_alea\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.

5\bold{5}

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

6\bold{6}

Cette fonction génère un trajet aléatoire, dans le graphe « voisins », à partir du nœud n° « i » et constitué de « nn » é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 « nn » ordinateurs en partant de l’ordinateur « i » et affiche l’identité du nnième ordinateur visité.

7\bold{7}

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

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

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

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

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

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

return results\text{return results}

bannière astuce

Astuce

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

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

8\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 ».

9\bold{9}

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

#importation importation de la bibliotheˋque random\char"0023\text{importation importation de la bibliothèque random}
import random\text{import random}

#initialisation des donneˊes avec celles de l’eˊnonceˊ\char"0023\text{initialisation des données avec celles de l’énoncé}
Voisins=[[1,2,3,4],[0,2,3],[0,1],[0,1],[0]]\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}
s =1\text{s =}1

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

if n ==0\text{if n ==}0

return i\text{return i}

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

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

sommet = s\text{sommet = s}

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

pas =0\text{pas =}0

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

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

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

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

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

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

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

pas +=1\text{pas +=}1

return pas\text{return pas}

#appel de la fonction avec les donneˊes fournies par l’eˊnonceˊ\qquad\char"0023\text{appel de la fonction avec les données fournies par l'énoncé}
print (temps_contamination(voisins, s))\text{print (temps\textunderscore contamination(voisins, s))}

EXERCICE 2 (6 points)

PARTIE A

1\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.

2\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.

3\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.

4\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

5\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

6\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 \toL2 (4 sauts)

Les autres, tels que par exemple L1 \to Routeur A \to Routeur H \to Routeur F \toRouteur 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.

7\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

8\bold{8}

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

9\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 10,1+0,1+0,11 0,1+0,1+0,1 soit 1,31,3.

10\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 10,1+0,1+0,11 0,1+0,1+0,1 soit 1,31,3.

10\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,11+1+0,1+0,1 soit 2,22,2.

EXERCICE 3 (8 points)

PARTIE A

1\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.

2\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.

3\bold{3}

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

4\bold{4}

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

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

5\bold{5}

Cette requête recherche dans la table « Emplacement\text{Emplacement} » (FROM Emplacement\text{FROM Emplacement}), les enregistrements dont le champ « tarif_journalier\text{tarif\textunderscore journalier} » a une valeur de 25 (WHERE tarif_journalier =25\text{WHERE tarif\textunderscore journalier =}25) et affiche les champs « id_emplacement\text{id\textunderscore emplacement} », « nom\text{nom} » et « localisation\text{localisation} » de ces enregistrements (SELECT id_emplacement, nom, localisation\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

6\bold{6}

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

7\bold{7}

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

8\bold{8}

SELECT Client.nom, Client.prenom, Reservation.nombre_personne, Reservation.date_arrivee,Reservation.date_depart, Emplacement.tarif_journalier\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} FROM Reservation\text{FROM Reservation}
JOIN Client ON Client.id_client = Reservation.id_client\text{JOIN Client ON Client.id\textunderscore client = Reservation.id\textunderscore client}
JOIN Emplacement ON Emplacement.id_emplacement = Reservation.id_emplacement\text{JOIN Emplacement ON Emplacement.id\textunderscore emplacement = Reservation.id\textunderscore emplacement}
AND Reservation.reservation÷textunderscore id = 18 ;\text{AND Reservation.reservation÷textunderscore id = 18 ;}

PARTIE B

9\bold{9}

Le terme « self\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.

10\bold{10}

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

11\bold{11}

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

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

aˋ reˊgler pour cette reˊservation """\text{à régler pour cette réservation """}

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

return reservation.nb_jours() *(2.20 * reservation.nombre_personne + emplacement.tarif_journalier)\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.

12\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.

13\bold{13}

Proposition de correction :

if not(len(annee) == 4) or not(2018 <= int(anneˊe) <= 2024):\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 int(anneˊe)\text{int(année)} proposée en correction ne provoquera jamais d’erreur.

14\bold{14}

  • Vérification du mois :

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

return false\text{return false}

  • Vérification du numéro :

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

return false\text{return false}

Ce contenu est réservé à nos inscrits. Il reste 50% à lire.
Inscrivez-vous gratuitement pour lire la suite
Inscrivez-vous pour lire la suite et accéder à nos vidéos, quiz, exercices, méthodes… Tout ce qu’il faut pour augmenter sa moyenne. 😉